Как обновить тестовый экземпляр SQL-сервера с производственными данными без использования полных резервных копий

У меня есть два сервера MS SQL 2005, один для производства и один для тестирования, и оба имеют модель восстановления Full. Я восстанавливаю резервную копию производственной базы данных на тестовом сервере, а затем пользователь вносит изменения.

Я хочу иметь возможность:

  • Отбросьте все изменения, внесенные на тестовый SQL-сервер
  • Примените все транзакции, которые произошли на производственном сервере SQL, поскольку тестовый сервер был первоначально восстановлен, чтобы два сервера имели одинаковые данные

Я не хочу делать полное восстановление базы данных из файла резервной копии, поскольку это занимает слишком много времени с нашей базой данных + 200 ГБ, особенно когда все измененные данные меньше 1 ГБ.

РЕДАКТИРОВАТЬ

Основываясь на приведенных ниже предложениях, я попытался восстановить базу данных с помощью NoRecovery, но вы не можете создать моментальный снимок базы данных, находящейся в этом состоянии.

Я также попытался восстановить его в режиме Standby Read only, который работает, и я могу сделать снимок базы данных, а затем применить журналы транзакций к исходному db, но я не могу сделать базу данных доступной для записи снова, пока есть снимки против нее.

Бег:

restore database TestDB with recovery 

Результаты со следующей ошибкой:

 Msg 5094, Level 16, State 2, Line 1 The operation cannot be performed on a database with database snapshots or active DBCC replicas 

Во-первых, как только вы восстановите резервную копию и установите базу данных на «восстановленную», вот и все: вы никогда не сможете применить к ней другую резервную копию журнала транзакций.

Однако есть моментальные снимки базы данных. Я никогда их не использовал, но я считаю, что вы можете использовать их для этой цели. Я думаю, вам нужно восстановить базу данных, оставить ее в режиме «не восстановлено» – определенно не в режиме ожидания, – и затем создать на ней снимки. (Или это зеркалирование? Я читал об этом много лет назад, но у меня не было причин использовать его.)

Затем, когда вы хотите обновить базу данных, вы удаляете моментальный снимок, восстанавливаете «следующий» набор резервных копий журнала транзакций и создаете свежий снимок.

Однако я не думаю, что это будет работать очень хорошо. Выше и за пределами служебных обязанностей по управлению и обслуживанию, если тестеры / разработчики делают много изменений, ваш снимок базы данных может стать очень большим, даже больше, чем исходная база данных, и это пространство на жестком диске, используемое в дополнение к " оригинальной "базы данных. Для редко измененных баз данных это может сработать, но для больших OLTP-систем у меня есть серьезные сомнения.

Так что вы действительно хотите, это копия Production, которая будет сделана в Test. Во-первых, у вас должна быть текущая резервная копия продукции где-то?. Обычно в базе данных этот полный размер резервных копий производится в воскресенье вечером, а затем дифференциальные резервные копии производятся каждую ночь в течение недели.

Возьмите резервную копию в воскресенье и восстановите ее как другое имя базы данных на своем сервере, скажем, TestRestore. Вы должны быть в состоянии отбросить это в 17:00, и это займет около 10 часов. Если требуется больше времени, см. Раздел Оптимизация резервного копирования и восстановления производительности в SQL Server.

Когда вы приходите утром восстановить последнюю дифференциальную резервную копию с предыдущей ночи, это не займет много времени.

Затем удалите пользователей из базы данных Test и переименуйте Test to TestOld (кому-то что-то понадобится), а затем переименуйте базу данных TestRestore в базу данных Test. См. Раздел Как переименовать базу данных SQL Server.

Решение с длинным диапазоном состоит в том, чтобы выполнять доставку журналов с производства на TestRestore. В одно мгновение вы можете переименовать вещи и иметь новую тестовую базу данных.

Для отката проще всего использовать виртуальную машину и не сохранять изменения при ее закрытии. Чтобы скопировать изменения между производством и тестом, можно ли восстановить резервные копии дифференциальных резервных копий или резервных копий журнала транзакций с производства на тестовую базу данных?

Пробовав все предложения, предлагаемые здесь, я не нашел средств для выполнения того, что я изложил в вопросе с помощью SQL. Если кто-то найдет способ и опубликует его или предложит другое предложение, я был бы счастлив попробовать что-то еще, но на данный момент, похоже, нет способа это сделать.

Поставщики хранилищ (как netapp) предоставляют возможность иметь записываемые снимки. Это дает вам возможность создавать моментальный снимок в течение нескольких секунд на производстве, выполнять ваши тесты и снижать / воссоздавать моментальный снимок. Это долгосрочное решение, но … Оно работает

На Server1 существует работа, которая сжимает последнюю полную резервную копию. На сервере Server2 выполняется задание, которое выполняет следующие шаги: копирует сжатый файл на локальный диск. Декомпрессирует файл, чтобы обеспечить полную резервную копию. Убивает все сеансы в базе данных, для восстановления Восстановление базы данных Устанавливает модель восстановления на привилегии Simple Grants db_owner для разработчиков

Ссылка: http://weblogs.sqlteam.com/tarad/archive/2009/02/25/How-to-refresh-a-SQL-Server-database-automatically.aspx

  • Создание упрощенных версий базы данных на другом сервере
  • Как отсортировать строку в sql-сервере
  • Запись в базу данных sql в accpac
  • INSERT INTO работает намного медленнее со временем в SQL Server 2012
  • Как сохранить весь возврат данных по определенному запросу в таблице в одной строке в SQL Server 2005/2008
  • Почему файл .dbmdl проекта моего DB изменяется, даже когда я не вношу изменений в проект?
  • T-SQL со случайным возвратом нескольких строк, где ожидается
  • Как показать тип CLOB в SELECT в SQL Server?
  • Определить, что база данных в настоящее время зеркалирует или нет?
  • Изменение одного типа данных на другой во всех столбцах SQL Server в Java
  • Обращение с различными ConnectionStates перед открытием SqlConnection
  • Давайте будем гением компьютера.