Criando um clone de um banco de dados do SQL Server via backup / restore

2

Estou tentando 'clonar' um banco de dados do SQL Server fazendo um backup do modelo e restaurando-o para o novo nome. No entanto, há algo que estou perdendo ou algo que não entendo sobre fazer backups. Isso é o que eu tenho até agora:

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

No entanto, o arquivo de backup não é criado e o comando de restauração falha com

Backup device 'C' does not exist

Por que está tentando encontrar um dispositivo chamado 'C' e não o caminho completo? Para onde vai o meu backup? O que estou perdendo?

EDITAR:

Agora está criando o arquivo conforme necessário, mas o comando de restauração ainda está reclamando que o dispositivo de backup não existe:

Backup device 'C:\backupdirectory\TemplateDb_2012111125632.bak' does not exist. To view existing backup devices, use the sys.backup_devices catalog view. To create a new backup device use either sp_addumpdevice or SQL Server Management Studio.

o que devo adicionar como o dispositivo de backup? Preciso criar um dispositivo de backup específico para cada backup que eu faço?

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'
    
por thecoop 11.01.2012 / 16:12

1 resposta

3

Você precisa declarar um comprimento para @backupName . Se você deixar o comprimento desligado em sua declaração, então o padrão será 1 caractere. É por isso que você está vendo um caminho truncado.

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

Você também precisa corrigir seu RESTORE . Por exemplo:

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

Você precisaria substituir os nomes de arquivos lógicos e físicos conforme apropriado para o seu ambiente. As diretivas WITH MOVE são necessárias, pois o banco de dados de origem ainda estará on-line e usando os arquivos físicos originais. Se o seu banco de dados de origem não estivesse mais online, você poderia se safar do que tinha.

    
por 11.01.2012 / 16:25