Якщо файл журналу транзакції містить невикористане простір, можна звільнити його, зменшивши розмір журналу. Цей процес називається стисненням файлу журналу.
Стиснення може проводитися тільки в тому випадку, якщо база даних знаходиться в оперативному режимі і поки вільний хоча б один віртуальний файл журналу. У ряді випадків стиснення неможливо до тих пір, поки не виконана наступна операція усічення журналу.
Зазвичай усічення відбувається автоматично в рамках простої моделі відновлення, коли створюється резервна копія бази даних, а також в рамках моделі повного відновлення, коли створюється резервна копія журналу транзакції. Однак усічення може бути відкладено через низку причин. Додаткові відомості див. У розділі Фактори, що можуть викликати затримку усічення журналу.
Стиснення файлу журналу (без стиснення файлів бази даних)
Моніторинг подій стиснення файлу журналу
To monitor log space
при якому його фізичний розмір зменшується за рахунок видалення одного або більше неактивних віртуальних файлів журналу. Одиницею виміру при зменшенні розміру завжди є віртуальний файл журналу. Наприклад, якщо є файл журналу розміром 600 мегабайт (МБ), розділений на шість віртуальних журналів по 100 МБ, розмір файлу журналу може зменшуватися на число, кратне 100 МБ. Розмір файлу може бути зменшений до розміру 500 МБ або 400 МБ, але не може бути зменшений до розміру 433 МБ або 525 МБ. Віртуальний файл журналу, який зберігає будь-які активні записи журналу, тобто активний віртуальний файл журналу є частиною логічного журналу, і його не можна видалити. Додаткові відомості див. У розділі Фізична архітектура журналу транзакцій.
Компонент Database Engine вибирає розмір віртуального файлу журналу динамічно при його створенні або розширенні. Додаткові відомості див. У розділі Фізична архітектура журналу транзакцій.
Поточний розмір файлу журналу дорівнює загального обсягу сторінок, що використовуються у віртуальних файлами журналу. Зверніть увагу, що ці сторінки не використовуються файлами журналу. Віртуальні файли журналу, які містять частину логічного журналу, не можуть бути звільнені. Якщо все віртуальні файли в журналі містять частини логічного журналу, стиснення файлу неможливо до тих пір, поки усічення журнали не помітить один або кілька віртуальних файлів журналу як неактивні.
Операція стиснення файлу дозволяє видаляти тільки неактивні віртуальні файли журналу. Якщо цільовий розмір не визначений, то операція стиснення файлу видаляє тільки неактивні віртуальні файли журналів, що знаходяться за останнім активним віртуальним файлом журналу до файла. Якщо цільовий розмір заданий, то віддаляється тільки ту кількість віртуальних файлів, яке відповідає цільовому розміру (але не перевищує його). Після стиснення розмір файлу журналу зазвичай трохи більше цільового розміру, але ніколи не менше. Віртуальні файли журналу ускладнюють прогнозування того, наскільки його можна стиснути фактично.
При стисненні будь-якого файлу простір звільняється в кінці файлу. При стисненні файлу журналу транзакцій в кінці файлу журналу звільняється достатня кількість віртуальних лог-файли. Це відбувається, щоб журнал зменшився до розміру, заданого користувачем. Аргумент target_size. заданий користувачем, округляється до наступної найбільшої межі віртуального файлу. Наприклад, якщо для файлу в 600 МБ, який містить шість віртуальних файлів журналу розміром по 100 МБ, користувач вказує аргумент target_size. рівний 325 МБ, останні два віртуальних файлу журналу видаляються, і новий розмір файлу стає рівним 400 МБ.
Операція DBCC SHRINKDATABASE або DBCC SHRINKFILE негайно робить спробу стиснути фізичний файл журналу до необхідного розміру:
Якщо жодна з частин логічного журналу віртуальних файлів журналу не має права продовжувати позначку target_size. віртуальні файли журналу, що знаходяться після позначки target_size. звільняються, і інструкція DBCC успішно виконується без повідомлень.
Якщо частина логічного журналу розширює позначку target_size. компонент SQL Server Database Engine максимально звільняє простір і видає інформаційне повідомлення. У повідомленні йдеться про те, які дії необхідно виконати, щоб видалити логічний журнал з віртуальних журналів в кінці файлу. Після виконання цих дій можна повторно виконати інструкцію DBCC для звільнення простору, що залишилося.
Припустимо, що є файл журналу розміром 600 МБ, який містить шість віртуальних файлів журналу, має логічний журнал, що починається в віртуальному журналі 3 і закінчується в віртуальному журналі 4. Виконується інструкція DBCC SHRINKFILE з аргументом target_size. рівним 275 МБ (т. е. три чверті віртуального журналу 3).
Віртуальні журнали 5 і 6 звільняються негайно, так як вони не містять частини логічного журналу. Однак для досягнення зазначеного значення аргументу target_size віртуальний файл журналу 4 також повинен бути звільнений, але це неможливо, так як він містить кінцеву частину логічного журналу. Після звільнення віртуальних файлів журналу 5 і 6 компонент Database Engine заповнює решту віртуального файлу журналу 4 фіктивними записами. Це призводить до зміщення кінця файлу журналу в кінець віртуального файлу журналу 1. У більшості систем все транзакції, що починаються в віртуальному файлі журналу 4, будуть зафіксовані за кілька секунд. Це означає, що вся активна частина журналу переміщається в віртуальний файл журналу 1. Тепер файл журналу виглядає приблизно так:
Інструкція DBCC SHRINKFILE також видає інформаційне повідомлення, в якому говориться, що вона не може звільнити все необхідне простір і для звільнення простору, що залишилося може бути виконана інструкція BACKUP LOG. Після переміщення активної частини віртуального файлу журналу 1 інструкція BACKUP LOG зробить усічення всього логічного журналу, що знаходиться в віртуальному файлі журналу 4:
Так як віртуальний файл журналу 4 більше не містить частини логічного журналу, можна виконати ту ж інструкцію DBCC SHRINKFILE з аргументом target_size. рівним 275 МБ. Віртуальний файл журналу 4 після цього звільняється, і розмір фізичного файлу журналу зменшиться до необхідного розміру.
Певні чинники, наприклад тривала транзакція, можуть підтримувати активність віртуальних файлів журналу протягом тривалого часу. Це обмежує можливості стиснення журналу або навіть не допускає його. Додаткові відомості див. У розділі Фактори, що можуть викликати затримку усічення журналу.