Previous topicNext topic
Help > SQL Server > Database >
复制数据库
复制数据库

1. 使用情形

如果某个程序已经比较成熟,现在有个新的客户,需要同样或近似的功能。显然我们不能把二个客户的数据放在同一个数据库里。那么我们需要先备份现有的数据库,再从备份的数据库,将之恢复成另一个名称的数据库。
这与单纯的”恢复数据库“不一样,因为,”恢复数据库“ 完成的是将一个备份恢复至另一个Sql server上,数据库名称与备份的源数据库名称一样。而复制数据库,恢复后的数据库名称是可以指定的。

2. 相应的存储过程

    1. -- =============================================  
    2. -- Author:      <hANK ZHU    >  
    3. -- Create date: <2018-12=04>  
    4. -- Description: <Create a new DB by another DB's bak file, which is used to duplicat a old DB>  
    5. -- =============================================  
    6. CREATE PROCEDURE Proc_duplicate_DB   
    7.     @oldDbName AS NVARCHAR(60)  -- = 'WING_WXC'  
    8.     ,@newDbName AS NVARCHAR(60)  -- = 'WING_WXT'  
    9.     ,@bakFile AS NVARCHAR(1000) --  = 'D:\40_dbBackup\Wing_WXC2018-12-03.bak'  
    10. AS  
    11. BEGIN  
    12.     SET NOCOUNT ON;  
    13.   
    14.       
    15.     IF OBJECT_ID('tempDB..#t'IS NOT NULL  
    16.     DROP TABLE #t  
    17.   
    18.     SELECT name  
    19.         , CASE WHEN CHARINDEX('MDF', physical_name)>1 THEN 'MDF' WHEN CHARINDEX('LDF', physical_name)>1 THEN 'LOG'ELSE NULL END AS FileType  
    20.         , physical_name   
    21.     INTO #t  
    22.     FROM sys.master_files WHERE name = @oldDbName OR name = @oldDbName + '_LOG'  
    23.   
    24.     DECLARE @oldMDF AS NVARCHAR(1000)  
    25.     DECLARE @oldLDF AS NVARCHAR(1000)  
    26.     DECLARE @newMDF AS NVARCHAR(1000)  
    27.     DECLARE @newLDF AS NVARCHAR(1000)  
    28.   
    29.     SELECT @oldMDF = Physical_Name FROM #t WHERE FileType = 'MDF'  
    30.     SELECT @oldLDF = Physical_Name FROM #t WHERE FileType = 'LOG'  
    31.   
    32.     SELECT @newMDF = REPLACE(@oldMDF, @oldDbName, @newDbName)  
    33.     SELECT @newLDF = REPLACE(@oldLDF, @oldDbName, @newDbName)  
    34.   
    35.   
    36.     DECLARE @sql AS NVARCHAR(MAX)  
    37.     SET @sql = 'RESTORE DATABASE [' + @newDbName + ']  
    38.     FROM DISK = ''' + @bakFile + '''  
    39.     WITH NOUNLOAD, REPLACE, STATS = 10,  
    40.     MOVE ''' + @oldDbName + ''' TO ''' + @newMDF+ ''',  
    41.     MOVE ''' + @oldDbName + '_LOG'' TO ''' + @newLDF+ '''  
    42.     ALTER DATABASE '+ @newDbName +' MODIFY FILE(NAME = '+ @oldDbName + ', NEWNAME = '+ @newDbName+ ')  
    43.     ALTER DATABASE '+ @newDbName +' MODIFY FILE(NAME = '+ @oldDbName + '_LOG, NEWNAME = ' + @newDbName+ '_LOG)  
    44.     '  
    45.     PRINT @sql  
    46.     --EXECUTE (@SQL)  
    47.   
    48.     IF OBJECT_ID('temp..#t'IS NOT NULL  
    49.     DROP TABLE #t  
    50.   
    51. END  

3. 运行上述存储过程(必要时带上该数据库的库名)。示例如下:

  1. EXEC dbo.Proc_duplicate_DB @oldDbName=N'BestAMD' -- nvarchar(60)  
  2.   , @newDbName=N'JOMOO' -- nvarchar(60)  
  3.   , @bakFile=N'D:\40_dbBackup\BestAMD2022-12-06.bak' -- nvarchar(1000)  

上述代码是将数据库名为”BestAMD“ 的备份文件,生成一个名称为 ”JOMOO“的数据库,执行上述代码,得到下面的语句

将产生的代码再执行一次,即可

4. Versions:

2022-12-06


  URL:duplicateDB.htm