拾遗笔记

clone db in sqlserver

-- 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 = 'meiji_0421_null'

-- 生成的备份文件的位置
-- the backup filename
DECLARE @BackupFile varchar(2000)
SET @BackupFile = 'c:\meiji_jixf4.dat'

-- 新数据库的名字
-- the new database name
DECLARE @TestDB varchar(200)
SET @TestDB = 'meiji_jixf4'
-- 新数据库所用到的日志文件及数据文件的名字,不包含后缀字
-- 下文会自动追加后缀名
-- the new database files without .mdf/.ldf
DECLARE @RestoreFile varchar(2000)
SET @RestoreFile = 'c:\meiji_jixf4'


-- ****************************************************************
--                    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'



-- backup database  [HAIHUA_MRP_Test_jujt(20110905)] TO DISK = N'C:\HAIHUA_MRP_Test_jujt.bak'  
-- go

-- rESTORE DATABASE jixf23
-- FROM
-- DISK = N'C:\HAIHUA_MRP_Test_jujt.bak'
-- WITH
-- MOVE 'HAIHUA_MRP_TEST1' TO 'D:\jixf_data23.mdf',
-- MOVE 'HAIHUA_MRP_TEST1_log' TO 'D:\jixf_data23_log.ldf',stats=5


-- rESTORE DATABASE jixf23
-- FROM DISK = N'C:\HAIHUA_MRP_Test_jujt.bak'
-- WITH
-- MOVE 'HAIHUA_MRP_TEST1' TO 'D:\jixf_data23.mdf',
-- MOVE 'HAIHUA_MRP_TEST1_log' TO 'D:\jixf_data23_log.ldf',stats=5

-- RESTORE HEADERONLY FROM DISK = N'C:\HAIHUA_MRP_Test_jujt.bak'

-- 20110921
-- rESTORE DATABASE HAIHUA_MRP_Test_WANGZL_20110921
-- FROM
-- DISK = N'c:\haihua\HAIHUA_MRP_TEST_20110921_BAK.bak'
-- WITH
-- MOVE 'HAIHUA_MRP_TEST1' TO 'c:\haihua\Temp\db\jixf_data56.mdf',
-- MOVE 'HAIHUA_MRP_TEST1_log' TO 'c:\haihua\Temp\db\jixf_data56_log.ldf',stats=5



-- rESTORE DATABASE HAIHUA_MRP_Test_WANGZL_20110921
-- FROM 
-- DISK = N'c:\haihua\HAIHUA_MRP_TEST_20110921_BAK.bak'
-- WITH
-- MOVE 'HAIHUA_MRP_TEST1' TO  'c:\haihua\Temp\db\jixf_data56.mdf',
-- MOVE 'HAIHUA_MRP_TEST1_log' TO 'c:\haihua\Temp\db\jixf_data56_log.ldf',stats=5

-- RESTORE HEADERONLY FROM DISK =N'c:\haihua\HAIHUA_MRP_TEST_20110921_BAK.bak'

Comments

comments powered by Disqus