Технологии Blogger.

Уменьшение размера базы или лога SQL

>> 12 июля 2012 г.

После определенных манипуляций с базой возникают ситуации, когда размер ее файлов превышает разумные пределы (либо, как у меня, в два раза больше положенного 103 Гб вместо 65 Гб, и это только файл базы данных). Данная ситуация разрешается простым шринком.

Приведенные ниже варианты кода довольно просты:
  • 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 ('ИмяФайлаЛогическое')

Та же операция для SQL 2008 будет выглядеть по другому. Так как нет такого ключа как TRUNCATE_ONLY для команды BACKUP, то можно использовать временный перевод базы режим  бекапирования SIMPLE, выполнить усечение файла, и вернуть режим FULL. конечно если изначально такой и был:

USE ИмяБазы
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';

Полезные ссылки:

Отправить комментарий

  © Blogger template Simple n' Sweet by Ourblogtemplates.com 2009

Back to TOP