Как восстановить базу данных 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 ГБ звучит немного экстремально. Следующие шаги могут дать вам то, что вам нужно, и не должны влиять на производство:

  1. Запустить DBCC SHRINKFILE ('myfile.MDF', TRUNCATEONLY) в файле производственных данных для временного освобождения любого свободного места в конце файла (TRUNCATEONLY не требует интенсивного ввода-вывода и не фрагментирует индексы)
  2. Если файл журнала также большой, запустите DBCC SHRINKFILE в файле журнала производства во время низкой активности, сразу после создания резервной копии журнала.
  3. Запустите вашу резервную копию
  4. Сделать ALTER DATABASE MODIFY FILE повторно увеличить файл производственных данных до исходного размера.

Не должно быть никакого производственного воздействия, используя эти шаги. Единственный риск состоит в том, что некоторые данные оказываются в самом конце 100-гигабайтного файла данных, и в этом случае Шаг (1) не освобождает много, если есть место.

Другие вопросы по тегам