Назад | Перейти на главную страницу

Создание клона базы данных SQL Server с помощью резервного копирования / восстановления

Итак, я пытаюсь «клонировать» базу данных SQL Server, сделав резервную копию шаблона, а затем восстановив ее под новым именем. Однако я либо чего-то не понимаю, либо чего-то не понимаю в создании резервных копий. Вот что у меня есть на данный момент:

DECLARE @now DATETIME2(0) = GETDATE()

-- so backup file will be in C:\backupdirectory\TemplateDb_20120111145230.bak
DECLARE @backupName NVARCHAR = N'C:\backupdirectory\TemplateDb_'
 + CAST(DATEPART(year, @now) AS VARCHAR)
  + CAST(DATEPART(month, @now) AS VARCHAR)
   + CAST(DATEPART(day, @now) AS VARCHAR)
    + CAST(DATEPART(hour, @now) AS VARCHAR)
     + CAST(DATEPART(minute, @now) AS VARCHAR)
      + CAST(DATEPART(second, @now) AS VARCHAR)
       + '.bak'

BACKUP DATABASE TemplateDb
TO DISK = @backupName

RESTORE DATABASE ClonedDb FROM @backupName

Однако файл резервной копии не создается, и команда восстановления не выполняется с

Устройство резервного копирования "C" не существует

Почему он пытается найти устройство с именем «C», а не полный путь? Куда на самом деле собирается моя резервная копия? Что мне не хватает?

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

Теперь он создает файл по мере необходимости, но команда восстановления все еще жалуется, что устройство резервного копирования не существует:

Устройство резервного копирования "C: \ backupdirectory \ TemplateDb_2012111125632.bak" не существует. Для просмотра существующих устройств резервного копирования используйте представление каталога sys.backup_devices. Чтобы создать новое устройство резервного копирования, используйте процедуру sp_addumpdevice или SQL Server Management Studio.

что мне добавить в качестве резервного устройства? Нужно ли мне создавать определенное устройство резервного копирования для каждой резервной копии, которую я делаю?

RESTORE DATABASE ClonedDb FROM @backupName
WITH MOVE 'TemplateDb' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\ClonedDb.mdf',
MOVE 'TemplateDb_log' TO 'C:\Program Files\Microsoft SQL Server\MSSQL10_50.MSSQLSERVER\MSSQL\DATA\ClonedDb_log.ldf'

Вам нужно указать длину для @backupName. Если вы не укажете длину в объявлении, то по умолчанию она будет равна 1 символу. Вот почему вы видите усеченный путь.

DECLARE @backupName NVARCHAR(250) = N'C:\.......

Вам также необходимо исправить свой RESTORE. Например:

RESTORE DATABASE ClonedDb
FROM DISK=@backupName
WITH MOVE 'MyDB_Data' TO 'C:\SQLData\MyDB2.mdf',
MOVE 'MyDB_Log' TO 'C:\SQLLogs\MyDB2.ldf';

Вам нужно будет заменить логические и физические имена файлов в соответствии с вашей средой. В WITH MOVE директивы необходимы, поскольку ваша исходная база данных все еще будет в сети и будет использовать исходные физические файлы. Если ваша исходная база данных больше не была в сети, вы могли бы уйти с тем, что у вас было.