Каков наилучший способ создания рабочей копии базы данных SQL Server? - PullRequest
1 голос
/ 17 сентября 2009

У меня есть база данных SQL, которую я сейчас конвертирую из базы данных Access. Одной из функций базы данных Access является «Копировать базу данных», которая используется при работе на сайте dev - она ​​копирует все производственные данные путем физического копирования рабочего файла на сайт dev. Таким образом, все производственные данные, структура, запросы и все дублируются в версию dev. Это нужно делать только время от времени, когда мы тестируем, почему что-то происходит, и мы не хотим играть в производственные данные; не редко, но и не часто - возможно, один или два раза в месяц. Мне интересно, что другие люди сделали для этого при работе в SQL?

Я думаю, что мог бы сделать резервную копию БД с последующим восстановлением до версии DEV, но я не хочу, чтобы эта резервная копия мешала нормальным процессам резервного копирования. Есть ли способ сделать это из одной БД прямо в другую, вместо того, чтобы идти в файловую систему, и резервное копирование выглядит так, как будто это никогда не происходило (т. Е. РЕАЛЬНОЕ резервное копирование по-прежнему будет выполнять резервное копирование всех элементов, которые действительно должны были быть сохранены)?

Какие еще есть варианты? У меня есть SQL Compare и SQL Data Compare от Red Gate, но мне нужно предоставить эту функциональность определенным пользователям (с высокими привилегиями и доступом к сайту DEV), а у них их нет.

Ответы [ 5 ]

3 голосов
/ 17 сентября 2009

Хорошо, посмотрев немного, я пришел к выводу, что мне нужно пройти через файловую систему, но есть способ выполнить резервное копирование / восстановление, не влияя на обычный процесс резервного копирования, используя «Копировать». Только режим. Вот скрипт для этого:

BACKUP DATABASE [ProductionDB] 
TO DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH
    COPY_ONLY, 
    NOFORMAT, 
    INIT,  
    NAME = N'DB-Full Backup', 
    SKIP, 
    NOREWIND, 
    NOUNLOAD, 
    STATS = 10

RESTORE DATABASE [DevDB] 
FROM DISK = N'D:\ProductionDBToDevTransfer.bak' 
WITH 
    FILE = 1,  
    MOVE N'ProductionDB' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB.mdf',  
    MOVE N'ProductionDB_log' TO N'D:\Microsoft\SQL Server\MSSQL10.MSSQLSERVER\MSSQL\DATA\DevDB_log.ldf',  
    NOUNLOAD,  
    REPLACE,  
    STATS = 10

Обратите особое внимание на операторы MOVE в команде RESTORE ... по умолчанию RESTORE восстанавливает файлы в исходные резервные копии физических файлов, а НЕ в файлы Dev DB, несмотря на то, что вы восстановление в DEV db ... Я ПОЧТИ выяснил трудный путь, когда я сделал восстановление, и SSMS пожаловался, что файлы были использованы ДРУГОЙ БД ... OMG, как не интуитивно понятно.

2 голосов
/ 16 ноября 2009

Сценарий выше работает, но не меняет логическое имя файла для скопированного сервера. Поэтому, если вы попытаетесь запустить его снова, чтобы полностью изменить процесс, произойдет сбой в операторах MOVE.

Я немного изменил сценарий и придумал следующее, которое, кажется, работает для меня. Я новичок в этом, так что будьте осторожны!

DECLARE @SOURCEDB nvarchar(100)
DECLARE @SOURCEDBLOG nvarchar(100)
DECLARE @DESTINATIONDB nvarchar(100)
DECLARE @DESTINATIONDBLOG nvarchar(100)
DECLARE @BACKUPDIR nvarchar(100)
DECLARE @BACKUPFILE nvarchar(100)
DECLARE @BACKUPNAME nvarchar(100)
DECLARE @SQLDATADIR nvarchar(100)
DECLARE @SQLDATABACKUPFILE nvarchar(100)
DECLARE @SQLDATABACKUPLOGFILE nvarchar(100)

--CHANGE THESE VALUES TO MATCH YOUR SYSTEM
SET @SOURCEDB = N'test'
SET @DESTINATIONDB = N'test-backup'
SET @BACKUPDIR = N'C:\SHARED\'
SET @SQLDATADIR = N'C:\Program Files\Microsoft SQL Server\MSSQL.1\MSSQL\Data\'

--CALCULATED VALUES
SET @SOURCEDBLOG = @SOURCEDB + N'_log'
SET @DESTINATIONDBLOG = @DESTINATIONDB + N'_log'
SET @BACKUPFILE = @BACKUPDIR + @SOURCEDB + N'-to-' + @DESTINATIONDB + N'.bak'
SET @BACKUPNAME = @SOURCEDB + N'-Full Backup'
SET @SQLDATABACKUPFILE = @SQLDATADIR + @DESTINATIONDB + N'.mdf'
SET @SQLDATABACKUPLOGFILE = @SQLDATADIR + @DESTINATIONDBLOG + N'.ldf'

--BACKUP THE DATABASE
BACKUP DATABASE @SOURCEDB
TO DISK = @BACKUPFILE
WITH
        COPY_ONLY, 
        NOFORMAT, 
        INIT,  
        NAME = @BACKUPNAME, 
        SKIP, 
        NOREWIND, 
        NOUNLOAD, 
        STATS = 10

--RESTORE THE BACKUP TO THE NEW DATABASE NAME
RESTORE DATABASE @DESTINATIONDB 
FROM DISK = @BACKUPFILE
WITH 
        FILE = 1,  
        MOVE @SOURCEDB TO @SQLDATABACKUPFILE,  
        MOVE @SOURCEDBLOG TO @SQLDATABACKUPLOGFILE,  
        NOUNLOAD,  
        REPLACE,  
        STATS = 10

--UPDATE THE LOGICAL FILE NAMES
DECLARE @TEMPLATE varchar(500)
DECLARE @SCRIPT varchar(500)
SET @TEMPLATE = N'ALTER DATABASE [{DBNAME}] MODIFY FILE (NAME = [{OLD}], NEWNAME = [{NEW}])'
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDB),'{NEW}',@DESTINATIONDB)
EXEC(@SCRIPT)
SET @SCRIPT = REPLACE(REPLACE(REPLACE(@TEMPLATE, '{DBNAME}', @DESTINATIONDB),'{OLD}',@SOURCEDBLOG),'{NEW}',@DESTINATIONDBLOG)
EXEC(@SCRIPT)
1 голос
/ 17 сентября 2009

Как правило, вы хотите восстановить всю базу данных из резервной копии. Попытка сделать это напрямую из работающей базы данных prod может вызвать проблемы с блокировкой для ваших пользователей. Вы можете сделать это с помощью служб SSIS, но это не простая и не быстрая настройка.

Другая возможность, если вы можете на некоторое время отключить prod (только если у вас есть период времени, когда пользователи не находятся в базе данных). Затем отсоедините базу данных. Отключите базу данных разработчиков и удалите ее. Скопируйте файл на сервер разработчика и снова присоедините обе базы данных. Это может быть быстрее, чем восстановление, но сейчас это редкая среда, в которой нет 24-часового доступа к данным на производстве.

Кстати, очень желательно иметь dev и prod на отдельных серверах.

И если вы восстанавливаете dev, вам нужно убедиться, что любые изменения dev, которые еще не были переданы в prod, записаны в сценарии, чтобы их можно было запустить сразу после восстановления. Лучше всего, если вы запишете все изменения в базе данных и сохраните их в системе контроля версий. Это облегчает это.

1 голос
/ 17 сентября 2009

Вы можете восстановить базу данных напрямую из другой базы данных.

Если вы используете SQL Management Studio, выберите «Из базы данных» вместо «С устройства» в диалоговом окне «Восстановление базы данных».

0 голосов
/ 17 сентября 2009

Мы делаем резервную копию производственных данных по требованию, а затем восстанавливаем резервную копию на компьютере разработчика.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...