Quelle est la meilleure façon de copier une base de données ?

Lorsque je veux faire une copie d'une base de données, je crée toujours une nouvelle base de données vide, puis j'y restaure une sauvegarde de la base de données existante. Cependant, je me demande si c'est vraiment le moyen le moins sujet aux erreurs, le moins compliqué et le plus efficace de le faire ?

请先 登录 后评论

3 réponses

Justin Walgran

Il est possible de sauter l'étape de création de la base de données vide. Vous pouvez créer la nouvelle base de données dans le cadre du processus de restauration.

C'est en fait le moyen le plus simple et le meilleur que je connaisse pour cloner une base de données. Vous pouvez éliminer les erreurs en scriptant le processus de sauvegarde et de restauration plutôt qu'en l'exécutant via SQL Server Management Studio

Vous pouvez explorer deux autres options :

  1. Détachez la base de données, copiez le fichier .mdf et rattachez-le.
  2. Utilisez SQL Server Integration Services (SSIS) pour copier tous les objets

Je suggère de s'en tenir à la sauvegarde et à la restauration et à l'automatisation si nécessaire.

请先 登录 后评论
Brendan

Voici un script sql dynamique que j'ai utilisé dans le passé. Il peut être encore modifié mais il vous donnera les bases. Je préfère le scripter pour éviter les erreurs que vous pouvez faire avec Management Studio :


Declare @OldDB varchar(100)
Declare @NewDB varchar(100)
Declare @vchBackupPath varchar(255)
Declare @query varchar(8000)


/*Test code to implement 
Select @OldDB = 'Pubs'
Select @NewDB = 'Pubs2'
Select @vchBackupPath = '\dbserverC$Program FilesMicrosoft SQL ServerMSSQL.1MSSQLBackuppubs.bak'
*/

SET NOCOUNT ON;

Select @query = 'Create Database ' + @NewDB
exec(@query)

Select @query = '
Declare @vBAKPath varchar(256)
declare @oldMDFName varchar(100)
declare @oldLDFName varchar(100)
declare @newMDFPath varchar(100)
declare @newLDFPath varchar(100)
declare @restQuery varchar(800)

select @vBAKPath = ''' + @vchBackupPath + '''
select @oldLDFName = name from ' + @OldDB +'.dbo.sysfiles where filename like ''%.ldf%''
select @oldMDFName = name from  ' + @OldDB +'.dbo.sysfiles where filename like ''%.mdf%''
select @newMDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''ROWS''
select @newLDFPath = physical_name from ' + @NewDB +'.sys.database_files where type_desc = ''LOG''

select @restQuery = ''RESTORE DATABASE ' + @NewDB + 
' FROM DISK = N'' + '''''''' + @vBAKpath + '''''''' + 
'' WITH MOVE N'' + '''''''' + @oldMDFName + '''''''' +  
'' TO N'' + '''''''' + @newMDFPath + '''''''' +  
'', MOVE N'' + '''''''' + @oldLDFName + '''''''' +  
'' TO N'' + '''''''' + @newLDFPath + '''''''' +  
'', NOUNLOAD, REPLACE, STATS = 10''

exec(@restQuery)
--print @restQuery'


exec(@query)





请先 登录 后评论
Brett Veenstra

La sauvegarde et la restauration sont la méthode la plus simple que je connaisse. Vous devez être prudent entre les serveurs car les informations d'identification de sécurité ne sont pas fournies avec la base de données restaurée.

请先 登录 后评论