加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 14:57:08 所属栏目:MsSql教程 来源:网络整理
导读:--http://weblogs.asp.net/mschwarz/archive/2004/08/26/220735.aspx ? ?-- sqlserver ,根据已有数据库创建一个完全相同的数据库 --? 原理是先用backup 语句将当前数据库备份成一个备份文件 --? 然后用restore 命令恢复。中间过程中,会将数据文件与日志文

--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:tempbackup.dat' -- RESTORE HEADERONLY FROM DISK = 'C:tempbackup.dat' -- RESTORE LABELONLY FROM DISK = 'C:tempbackup.dat' -- RESTORE VERIFYONLY FROM DISK = 'C:tempbackup.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'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读