以编程方式克隆SQL Server数据库

时间:2016-06-30 13:12:42

标签: sql-server tsql

我正在尝试编写一个复制和重命名数据库的SQL脚本。我将它分成两部分作为独立的功能,因此恢复给我带来了困难。例如,这与我现在的情况差不多。

BACKUP DATABASE [@dbName] 
TO DISK = 'path' WITH COPY_ONLY;

RESTORE DATABASE [@newDbName] 
FROM DISK = 'path';

如何更改此项以自动复制?

3 个答案:

答案 0 :(得分:1)

RESTORE FILELISTONLY   
FROM 'path'

答案 1 :(得分:0)

所以评论和答案对我来说很有帮助,但这就是我所确定的:

BACKUP DATABASE [OldDBName] TO DISK = 'path' WITH COPY_ONLY;
if (objectProperty(object_id('tmp_restore'), 'IsProcedure') is not null)
    drop procedure dbo.tmp_restore
GO
CREATE PROCEDURE dbo.tmp_restore
  @backup_path NVARCHAR(MAX)
AS
BEGIN
    SET NOCOUNT ON;
    RESTORE FILELISTONLY FROM DISK = @backup_path;
END
GO
CREATE TABLE #TEMP(
    LogicalName VARCHAR(64),            PhysicalName VARCHAR(130),
    [Type] VARCHAR(1),                  FileGroupName VARCHAR(64),
    Size DECIMAL(20, 0),                MaxSize DECIMAL(25,0), 
    FileID bigint,                      CreateLSN DECIMAL(25,0), 
    DropLSN DECIMAL(25,0),              UniqueID UNIQUEIDENTIFIER,  
    ReadOnlyLSN DECIMAL(25,0),          ReadWriteLSN DECIMAL(25,0),
    BackupSizeInBytes DECIMAL(25,0),    SourceBlockSize INT,
    filegroupid INT,                    loggroupguid UNIQUEIDENTIFIER,
    differentialbaseLSN DECIMAL(25,0),  differentialbaseGUID UNIQUEIDENTIFIER,
    isreadonly BIT,     ispresent BIT,  TDEThumbpr DECIMAL)

Insert into #TEMP exec dbo.resware_tmp_restore @backup_path = 'path';
GO
DECLARE @NameData VARCHAR(64)
DECLARE @NameLog VARCHAR(64)
Set @NameData = (Select LogicalName from #TEMP t where t.Type like 'D')
Set @NameLog = (Select LogicalName from #TEMP t where t.Type like 'L')
RESTORE DATABASE [newDBName] FROM DISK = 'path'
    WITH RECOVERY,
    MOVE @NameData TO 'path_Data.mdf',
    MOVE @NameLog TO 'path_Log.ldf'
GO
DROP TABLE #TEMP

显然Old / NewDBName和路径必须用适当的值填充,但这应该有效。

答案 2 :(得分:0)

克隆SQL Server数据库的另一种方法是使用SQL Server容器。

Windocks支持所有版本SQL Server 2008以后的容器,您只需将mdf,ndf,ldf文件复制到映像,然后使用它来提供相同但隔离的实例。

Windocks还发布了对完整数据库克隆的集成支持以及对大型数据库环境的支持。

Windocks

提供免费的社区版

披露:我是WinDocks的联合创始人