Итак, я пытаюсь «клонировать» базу данных 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
директивы необходимы, поскольку ваша исходная база данных все еще будет в сети и будет использовать исходные физические файлы. Если ваша исходная база данных больше не была в сети, вы могли бы уйти с тем, что у вас было.