Уменьшение размера базы или лога SQL
>> 12 июля 2012 г.
После определенных манипуляций с базой возникают ситуации, когда размер ее файлов превышает разумные пределы (либо, как у меня, в два раза больше положенного 103 Гб вместо 65 Гб, и это только файл базы данных). Данная ситуация разрешается простым шринком.
Прежде, чем выполнять шринк базы необходимо выполнить архивацию, но не всей базы, а именно файла транзакций. Только после завершения этой процедуры можно смело выполнять команду shrink, и результат будет достигнут. Надо сказать, что процедура архивации нужна только, если для базы данных установлена модель архивирования Full. В модели Simple log-файл автоматически помечается, как свободный для использования и команда shrink работает без проблем, в модели Full файл становится свободным для использования только после backup-а соответствующего файла.
Приведенные ниже варианты кода довольно просты:
- DBCC shrinkdatabase(N’имя_базы’, TRUNCATE_ONLY); — усечение всей базы
- use [имя_базы] DBCC SHRINKFILE (N’имя_базы_Data’, 101); — усечение только файла данных до размера 101 мб
- use [имя_базы] DBCC SHRINKFILE (N’имя_базы_Log’, 0); — усечение только файла транзакций до размера 0 мб
Но при выполнении этой операции могут возникнуть проблемы. Проявляются они в основном на тех базах данных, для которых установлена модель архивирования Full (для модели Simple проблем, как правило, не возникает, далее поясним почему). В сообщениях об ошибке говорится о том, что log-файл находится в использовании, поэтому операцию выполнить невозможно — это более чем удивительно, поскольку обычно процесс шринка производится при завершенной работе пользователей (никто не обращается к базе). Монитор соединений так же показывает отсутствие какой-либо активности.
Прежде, чем выполнять шринк базы необходимо выполнить архивацию, но не всей базы, а именно файла транзакций. Только после завершения этой процедуры можно смело выполнять команду shrink, и результат будет достигнут. Надо сказать, что процедура архивации нужна только, если для базы данных установлена модель архивирования Full. В модели Simple log-файл автоматически помечается, как свободный для использования и команда shrink работает без проблем, в модели Full файл становится свободным для использования только после backup-а соответствующего файла.
Итого, для усечения размера файлов базы SQL 2005 имеет следующий код:
Use ИмяБазы
BACKUP Log[ИмяБазы] WITH TRUNCATE_ONLY
DBCC SHRINKFILE ('ИмяФайлаЛогическое')
BACKUP Log[ИмяБазы] WITH TRUNCATE_ONLY
DBCC SHRINKFILE ('ИмяФайлаЛогическое')
Та же операция для SQL 2008 будет выглядеть по другому. Так как нет такого ключа как TRUNCATE_ONLY для команды BACKUP, то можно использовать временный перевод базы режим бекапирования SIMPLE, выполнить усечение файла, и вернуть режим FULL. конечно если изначально такой и был:
USE ИмяБазы
ALTER DATABASE ИмяБазы SET RECOVERY SIMPLE
DBCC SHRINKFILE ('ИмяФайлаЛогическое', 10);
ALTER DATABASEИмяБазы SET RECOVERY FULL
ALTER DATABASE ИмяБазы SET RECOVERY SIMPLE
DBCC SHRINKFILE ('ИмяФайлаЛогическое', 10);
ALTER DATABASEИмяБазы SET RECOVERY FULL
Так же, после проведенных манипуляций никогда не помешает сделать проверку базы. Как обычно переводим базу в монопольный режим (Если
необходимо использовать аргументы REPAIR, выполните инструкцию DBCC
CHECKDB без параметра восстановления, чтобы узнать требуемый уровень
восстановления, и только потом восстановления)
exec sp_dboption 'ИмяБазы','single user','true';
dbcc checkdb ('ИмяБазы',REPAIR_REBUILD);
exec sp_dboption 'ИмяБазы ','single user','false';
dbcc checkdb ('ИмяБазы',REPAIR_REBUILD);
exec sp_dboption 'ИмяБазы ','single user','false';
Полезные ссылки:
0 коммент.:
Отправить комментарий