У меня есть база данных разработчика SQL Server 2005, которая является 30-гигабайтной копией live. Мы удалили некоторые данные, которые не нужны в dev, что приводит к уменьшению занимаемого файлового пространства до 20 ГБ. Таким образом, у нас есть около 33% неиспользованных.
Мне нужно освободить место, которое позволит нам иметь на сервере вторую БД разработчика (в зависимости от урезанной версии); однако, я не могу вернуть себе место, я сделал следующее:
Начальный размер файла
SMS2_Data
составляет 30 ГБ.DBCC SHRINKFILE (N'SMS2_Data' , 0, TRUNCATEONLY)
с последующим
DBCC SHRINKFILE (N'SMS2_Data' , 19500)
Нет радости Я попытался сделать резервную копию, создать новую БД с небольшим начальным размером, а затем восстановить, без удовольствия, так как начальный размер перезаписывается. Также попробовал:
ALTER DATABASE SMS2HazSub MODIFY FILE (NAME = 'SMS2_Data', SIZE = 20000)
Это ошибочно, сказав:
ИЗМЕНИТЬ ФАЙЛ не удалось. Указанный размер меньше текущего размера.
Я попытался 20800, а затем продолжал идти до 29000 (29 ГБ), и это все еще не позволит мне изменить его.
Сделали усадочной затем изменил режим восстановления с FULL
к SIMPLE
и обратно. Нет радости
Я думал, что это было связано с некоторыми TEXT
областями. У нас есть около 6 по всей системе. Так что в качестве теста я отбросил их все, а затем сделал сжатие файла и до сих пор без изменений.
Единственный оставленный вариант - повторно импортировать данные в другую БД. Это не практично, так как это должно быть сделано в реальной базе данных, которая несет слишком большой риск. Мы регулярно собираем копию действующей БД и перезаписываем dev / test. У нас есть что-то вроде 500 столов. Я хотел бы сделать это, не рискуя экспортировать данные в новую БД.
Я попытался переместить данные в другой файл, и он скопировал все, кроме 5% данных. Это то, что заставило меня попробовать все текстовые столбцы.
Сервер находится в режиме совместимости 90, но это SP2. Теперь я сделал 3 раза: переиндексировать все таблицы, создать резервную копию базы данных, сжать файл, сжать базу данных. Все еще нет радости.
EXECUTE sp_spaceused
возвращает:
database_name database_size unallocated space
SMS2Tests 31453.94 MB 13903.16 MB
reserved data index_size unused
16545568 KB 10602264 KB 4254360 KB 1688944 KB
источник
Я предполагаю, что у вас есть один файл базы данных с логическим именем SMS2_Data. У вас также есть один или несколько файлов журнала транзакций в базе данных.
У вас есть проблема, которую нельзя исправить в текущей копии базы данных. Важная информация, которую вы заявляете, заключается в том, что «исходный размер файла базы данных составляет 30 ГБ». К сожалению, этот файл нельзя сжать меньше, чем его первоначальный размер.
Как вы уже испытали, SHRINKDB и SHRINKFILE не дают вам то, что вы хотите. Эти команды следуют правилу уменьшения не меньше, чем правило оригинального размера. Таким образом, вы можете только уменьшить базу данных до исходного размера, а не меньше.
Резервное копирование и восстановление базы данных в существующую меньшую базу данных также не работает. Когда вы выполняете восстановление базы данных, файлы базы данных восстанавливаются до размеров файлов, которые были во время резервного копирования. И модель восстановления (простая, полная и т. Д.) Не имеет отношения к этой проблеме.
И последний пункт плохих новостей. Вы можете добавить другие файлы базы данных меньшего размера в базу данных, перенести все данные из файла размером 30 ГБ и затем удалить его. К сожалению, это тоже не сработает, потому что вы не можете удалить исходный файл из базы данных.
Итак, лучшее решение - скопировать данные в другую базу данных. У вас есть несколько вариантов здесь, и, возможно, вы уже знаете о них. Первым шагом является создание новой базы данных, размер которой меньше размера данных. Затем вы можете расширить размер базы данных до необходимого размера.
Вы можете рассматривать SSIS как способ передачи данных из одной базы данных в другую. Вы найдете задачу копирования базы данных, которая поможет вам. Вы можете использовать следующие шаги:
Дополнительная информация о задаче передачи базы данных служб SSIS .
источник
Некоторое неиспользуемое пространство в базе данных является нормальным.
Если у вас много больших записей (скажем, длинных строк), на страницах данных может быть много неиспользуемого пространства (поскольку одна запись обычно не разделяется между страницами).
Другое дело, что фактор заполнения - изначально кластерные индексы не создаются на 100% заполненными, чтобы избежать разбиения страниц (дорогая операция) при последующих вставках.
Если из базы данных было удалено много данных, пространство, ранее занимаемое этими данными, не будет автоматически возвращено - оно останется выделенным для таблицы.
Попробуйте вызвать
DBCC DBREINDEX (table_name, '', 100)
каждую таблицу в вашей базе данных - она перестроит все индексы с коэффициентом заполнения 100%, чтобы данные располагались как можно более компактно. Затем попробуйте снова сжать базу данных.источник
Я обнаружил, что сокращение базы данных SQL Server может быть проблематичным. Такое чувство, что ты должен сделать песню и танец рутины.
Это процесс, который я обычно прохожу:
Резервное копирование базы данных Shrink Резервное копирование файлов журнала и базы данных отдельно. Повторите резервное копирование, пока оно наконец не уменьшится.
Мне пришлось проделать этот процесс несколько раз, до трех раз, чтобы он наконец заработал. У нас была база данных размером более 68 ГБ с 98% неиспользуемого пространства. Несколько раз проходил через эту песню и танец, но в итоге он сократился до 1 ГБ.
источник
Я бы попытался уменьшить первоначальный размер mdf-файла до 29 000 МБ, а затем до 28 000, обнаруживая близкое попадание.
Неразумно ожидать уменьшения размера файла базы данных на 30% путем удаления 30% данных.
Вы можете оценить, сколько неиспользуемого пространства в вашей базе данных,
в контексте вашей базы данных (используйте yourdatabaename;)
Можете ли вы опубликовать результат ее выполнения?
Обновление:
я отправил свой связанный вопрос на этом:
источник