Как восстановить базу данных SQL Server и одновременно сжать ее файлы?
Допустим, у меня есть база данных SQL Server, файлы данных которой были созданы с начальным размером 100 ГБ, но она содержит только 10 ГБ данных. Размер резервной копии базы данных составит всего 10 ГБ.
Я хочу восстановить эту резервную копию на другом сервере (или в другой базе данных на том же сервере), но не хочу, чтобы она занимала то же место на диске, что и исходный (100 ГБ), что и происходит по умолчанию.
Я не могу сжать исходную базу данных перед созданием резервной копии (это производственная база данных, и ей нужно столько предварительно выделенного пространства); Я мог бы уменьшить восстановленную базу данных после того, как восстановление выполнено, но я бы действительно предпочел, чтобы она не занимала 100 ГБ при этом; кроме того, в этом конкретном сценарии у меня не так много свободного дискового пространства, поэтому восстановление никуда не денется.
Можно ли как-нибудь восстановить базу данных, и она будет занимать столько же места, сколько реальные данные, которые она содержит?
3 ответа
Нет, прости - ни за что. Восстановление восстанавливает файлы, как они были в резервной копии. Schinking должен быть сделан после этого или до того, как взять резервную копию.
Если у вас недостаточно места на диске, вы можете поместить файл.bak в общий сетевой ресурс и восстановить его оттуда. Должно работать, если на вашем сервере запущен sql-сервер с учетной записью домена, и предоставить этой папке достаточно прав для чтения файла.
Другой вариант, который ранее был в корзине офигенных орехов (но полезен только в том случае, если у вас запущен sql server 2008 r2), заключается в том, что SQL Server поддерживает создание файлов базы данных напрямую в общий ресурс без использования флага трассировки, и я могу сказать, из личного опыта у вас это работает! Таким образом, вы можете сделать восстановление с помощью MOVE для общего ресурса.
Вообщем нет. Несколько случайных идей, которые могут или не могут быть вам полезны:
- Если вам абсолютно не нужны данные из этой конкретной резервной копии, вы можете создать новую (пустую) базу данных целевого размера и использовать групповые копии (или службы SSIS) для передачи всех таблиц из текущей (действующей) базы данных в вашу копию.
- Существуют сторонние инструменты (например, Redgate Compare), которые могут помочь автоматизировать подобные вещи, если это больше, чем разовая операция.
- Некоторые сторонние программы резервного копирования (например, Quest Litespeed) могут выполнять "восстановление на уровне объектов", которое может восстанавливать отдельные таблицы или другие объекты в новой (пустой) базе данных. Даже если резервная копия не была создана с использованием Litespeed, я считаю, что продукт должен работать с резервными копиями Native SQL.
Наконец, мне тоже нравится некоторая "просторная комната" в моих производственных базах данных, но 90 ГБ без 100 ГБ звучит немного экстремально. Следующие шаги могут дать вам то, что вам нужно, и не должны влиять на производство:
- Запустить
DBCC SHRINKFILE ('myfile.MDF', TRUNCATEONLY)
в файле производственных данных для временного освобождения любого свободного места в конце файла (TRUNCATEONLY не требует интенсивного ввода-вывода и не фрагментирует индексы) - Если файл журнала также большой, запустите
DBCC SHRINKFILE
в файле журнала производства во время низкой активности, сразу после создания резервной копии журнала. - Запустите вашу резервную копию
- Сделать
ALTER DATABASE MODIFY FILE
повторно увеличить файл производственных данных до исходного размера.
Не должно быть никакого производственного воздействия, используя эти шаги. Единственный риск состоит в том, что некоторые данные оказываются в самом конце 100-гигабайтного файла данных, и в этом случае Шаг (1) не освобождает много, если есть место.