微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

sqlserver ,根据已有数据库创建一个完全相同的数据库

--http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx

   -- sqlserver ,根据已有数据库创建一个完全相同的数据库 --  原理是先用backup 语句将当前数据库备份成一个备份文件 --  然后用restore 命令恢复。中间过程中,会将数据文件与日志文件 -- 的名字及数据库的名字进行更改,从而,实现clone . USE master GO --原始的数据库名称。比如此处我设成HAIHUA_MRP -- the original database (use 'SET @DB = NULL' to disable backup) DECLARE @DB varchar(200) SET @DB = 'HAIHUA_MRP' -- 生成的备份文件的位置 -- the backup filename DECLARE @BackupFile varchar(2000) SET @BackupFile = 'c:\HAIHUA_MRP_BACKUP.dat' -- 新数据库的名字 -- the new database name DECLARE @TestDB varchar(200) SET @TestDB = 'haihua_test1' -- 新数据库所用到的日志文件及数据文件的名字,不包含后缀字 -- 下文会自动追加后缀名 -- the new database files without .mdf/.ldf DECLARE @RestoreFile varchar(2000) SET @RestoreFile = 'c:\haihua_test1' -- **************************************************************** --                    no change below this line --  以下内容,不要修改 -- **************************************************************** DECLARE @query varchar(2000) DECLARE @DataFile varchar(2000) SET @DataFile = @RestoreFile + '.mdf' DECLARE @LogFile varchar(2000) SET @LogFile = @RestoreFile + '.ldf' IF @DB IS NOT NULL BEGIN SET @query = 'BACKUP DATABASE ' + @DB + ' TO disK = ' + QUOTENAME(@BackupFile,'''') EXEC (@query) END -- RESTORE FILELISTONLY FROM disK = 'C:\temp\backup.dat' -- RESTORE HEADERONLY FROM disK = 'C:\temp\backup.dat' -- RESTORE LABELONLY FROM disK = 'C:\temp\backup.dat' -- RESTORE VERIFYONLY FROM disK = 'C:\temp\backup.dat' IF EXISTS(SELECT * FROM sysdatabases WHERE name = @TestDB) BEGIN SET @query = 'DROP DATABASE ' + @TestDB EXEC (@query) END -- RESTORE HEADERONLY FROM disK = @BackupFile -- DECLARE @File int -- SET @File = @@ROWCOUNT DECLARE @Data varchar(500) DECLARE @Log varchar(500) SET @query = 'RESTORE FILELISTONLY FROM disK = ' + QUOTENAME(@BackupFile,'''') --- 这张临时表的结构与SET @query = 'RESTORE FILELISTONLY FROM disK = ' + QUOTENAME(@BackupFile,'''') --  命令的结果相同,目的只是为了保存上述结果到一张表,然后取得其中日志文件及数据文件的logicalName -- 因为在restore 时,会用到它将日志文件数据文件的位置进行更改 CREATE TABLE #restoretemp ( LogicalName varchar(500),PhysicalName varchar(500),type varchar(10),FilegroupName varchar(200),size int,maxsize bigint,fileid varchar(200),createlsn varchar(200),droplsn  varchar(200),uniqueid varchar(200),readonlylsn  varchar(200),readwritelsn varchar(200),backupsizeinbytes bigint,sourceblocksize int,filegroupid int,loggroupguid varchar(200),differentialbaselsn bigint,differentialbaseguid varchar(200),isreadonly bit,ispresent bit ) INSERT #restoretemp EXEC (@query) SELECT @Data = LogicalName FROM #restoretemp WHERE type = 'D' SELECT @Log = LogicalName FROM #restoretemp WHERE type = 'L' PRINT @Data PRINT @Log TruncATE TABLE #restoretemp drop table  #restoretemp SET @query = 'RESTORE DATABASE ' + @TestDB + ' FROM disK = ' + QUOTENAME(@BackupFile,'''') + ' WITH MOVE ' + QUOTENAME(@Data,'''') + ' TO ' + QUOTENAME(@DataFile,'''') + ',MOVE ' + QUOTENAME(@Log,'''') + ' TO ' + QUOTENAME(@LogFile,'''')   EXEC (@query) GO ------------------------------------------ --简单的示例,不具通用,但典型,上面的代码基本使用这面代码 -- backup database jixf to disk='d:jixf_data.bak' -- Restore FILELISTONLY FROM disK='d:\jixf_data.bak' -- rESTORE DATABASE jixf2 -- FROM disK='d:\jixf_data.bak' -- WITH -- MOVE 'jixf' TO 'D:\jixf_data2.mdf',-- MOVE 'jixf_log' TO 'D:\jixf_data2_log.ldf' -- rESTORE DATABASE jixf2 -- FROM disK='d:\jixf_data.bak' -- WITH -- MOVE 'jixf' TO 'D:\jixf_data2.mdf',-- MOVE 'jixf_log' TO 'D:\jixf_data2_log.ldf',stats=5 -- RESTORE HEADERONLY FROM disK ='d:\jixf_data.bak'

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐