通过备份/恢复创建 SQL Server 数据库的克隆

通过备份/恢复创建 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'

答案1

您需要声明 的长度@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指令是必需的,因为您的源数据库仍将在线并使用原始物理文件。如果您的源数据库不再在线,那么您可以继续使用您已有的数据库。

相关内容