На главную

.:: Меню ::.
Новости
Программы
Статьи
Полезные ссылки

Сжатие SQL баз

Разделы Статьи / SQL / MS SQL Server /

Назад

Саймон Сю

  Как перехитрить упрямые журналы и заставить их сжиматься по команде?

Чтобы сжать заданный файл данных или файл журнала указанной базы данных в SQL Server 7.0, можно воспользоваться предложением DBCC Shrinkfile. Однако профессиональные пользователи SQL Server часто спрашивают меня, почему при использовании команды DBCC Shrinkfile сжатие журнала транзакций не происходит немедленно, и как вообще уменьшить размеры журнала транзакций.

При запуске команды DBCC Shrinkfile в SQL Server 7.0 сжатие файлов журналов не происходит тотчас. Дело в том, что операция DBCC Shrinkfile производится только при достижении контрольной точки или же при резервном копировании журнала транзакций. SQL Server разбивает каждый физический файл журнала на несколько сегментов, называемых виртуальными файлами журнала (virtual log files, VLF). Они и образуют журнал транзакций. Файлы VLF усекаются в двух случаях: либо при достижении контрольной точки, либо после снятия с них резервной копии. В произвольный момент времени можно обнаружить файлы VLF, у которых в начале, в середине или в конце файла журнала находится свободное или повторно используемое пространство памяти. Только тогда, когда файлы VLF, которые SQL Server пометил как разрешающие сжатие, располагаются в конце файла журнала, команда DBCC Shrinkfile может удалить VLF и сжать файл журнала. Поскольку SQL Server может сжать файл журнала только до границы виртуального файла журнала, невозможно сжать файл журнала до размера, меньшего, чем размер виртуального файла журнала. Даже если файл журнала не используется. Более подробно о виртуальных файлах журнала написано в SQL Server Books Online-BOL.

ЛИСТИНГ 1: Сценарий сжатия файла журнала.

/* Для получения идентификатора файла, который требуется сжать, запустите запрос "SELECT fileid, name,filename FROM <db_name>..sysfiles" */

USE <db_name> 
GO
DBCC shrinkfile(<fileid>,notruncate)
DBCC shrinkfile(<fileid>,truncateonly)
CREATE TABLE t1 (char1 char(4000))
GO
DECLARE @i int
SELECT @i = 0
WHILE (1 = 1)
BEGIN
WHILE (@i < 100)
BEGIN
INSERT INTO t1 values (`a`)
SELECT @i = @i +1
END
TRUNCATE TABLE t1
backup log <db_name> with truncate_only
END
GO
 
Новости сайта

Друзья сайта
Русский сайт системы KooBoo CMS

PROИТ - Office 365, AD, Active Directory, Sharepoint, C#, Powershell

Хостинг предоставлен VEDU.RU - Поволжским
Образовательным
Порталом





 © Центр ИТ, СИОТО, 2002-2009. Разработчики: webmaster(a)vedu.ru