如何在SQL Server 2008 Express中的同一服务器上克隆SQL Server数据库?

时间:2010-09-30 09:16:24

标签: sql-server sql-server-2008-express

我有一个MS SQL Server 2008 Express系统,其中包含一个我想“复制和重命名”的数据库(用于测试目的),但我不知道实现这一目的的简单方法。

我注意到在R2版本的SQL Server中有一个复制数据库向导,但遗憾的是我无法升级。

有问题的数据库是围绕着一个演出。 我试图恢复我要复制到新数据库的数据库的备份,但没有运气。

14 个答案:

答案 0 :(得分:326)

  1. 安装Microsoft SQL Management Studio,您可以从Microsoft的网站免费下载:

    2008版

    Microsoft SQL Management Studio 2008是SQL Server 2008 Express with Advanced Services

    的一部分

    2012版

    点击download button并查看ENU\x64\SQLManagementStudio_x64_ENU.exe

    2014版

    点击download button并查看MgmtStudio 64BIT\SQLManagementStudio_x64_ENU.exe

  2. 打开 Microsoft SQL Management Studio

  3. 将原始数据库备份到.BAK文件(db - > Task - > Backup)。
  4. 使用新名称(克隆)创建空数据库。请注意以下注释,因为这是可选的。
  5. 单击以克隆数据库并打开还原对话框(参见图像) restore dialog
  6. 选择设备并添加步骤3中的备份文件。 add backup file
  7. 将目标更改为测试数据库 change destination
  8. 更改数据库文件的位置,必须与原始文件不同。您可以直接在文本框中输入,只需添加后缀即可。 (注意:订单很重要。选择复选框,然后更改文件名。) change location
  9. 检查WITH REPLACE和WITH KEEP_REPLICATION with replace

答案 1 :(得分:105)

右键单击要克隆的数据库,单击Tasks,然后单击Copy Database...。按照向导完成。

答案 2 :(得分:82)

您可以尝试分离数据库,在命令提示符下将文件复制到新名称,然后附加两个数据库。

在SQL中:

USE master;
GO 
EXEC sp_detach_db
    @dbname = N'OriginalDB';
GO

在命令提示符下(为了这个例子,我简化了文件路径):

copy c:\OriginalDB.mdf c:\NewDB.mdf
copy c:\OriginalDB.ldf c:\NewDB.ldf

再次在SQL中:

USE master;
GO
CREATE DATABASE OriginalDB
    ON (FILENAME = 'C:\OriginalDB.mdf'),
       (FILENAME = 'C:\OriginalDB.ldf')
    FOR ATTACH;
GO
CREATE DATABASE NewDB
    ON (FILENAME = 'C:\NewDB.mdf'),
       (FILENAME = 'C:\NewDB.ldf')
    FOR ATTACH;
GO

答案 3 :(得分:26)

事实证明我曾试图从备份中恢复错误。

最初我创建了一个新数据库,然后尝试在此处恢复备份。 我应该做的以及最终的工作是打开恢复对话框并在目标字段中键入新数据库的名称。

因此,简而言之,从备份中恢复可以解决问题。

感谢所有反馈和建议人员

答案 4 :(得分:16)

这是我使用的脚本。有点棘手,但它的工作原理。在SQL Server 2012上测试。

DECLARE @backupPath nvarchar(400);
DECLARE @sourceDb nvarchar(50);
DECLARE @sourceDb_log nvarchar(50);
DECLARE @destDb nvarchar(50);
DECLARE @destMdf nvarchar(100);
DECLARE @destLdf nvarchar(100);
DECLARE @sqlServerDbFolder nvarchar(100);

SET @sourceDb = 'db1'
SET @sourceDb_log = @sourceDb + '_log'
SET @backupPath = 'E:\tmp\' + sourceDb + '.bak' --ATTENTION: file must already exist and SQL Server must have access to it
SET @sqlServerDbFolder = 'E:\DB SQL\MSSQL11.MSSQLSERVER\MSSQL\DATA\'
SET @destDb = 'db2'
SET @destMdf = @sqlServerDbFolder + @destDb + '.mdf'
SET @destLdf = @sqlServerDbFolder + @destDb + '_log' + '.ldf'

BACKUP DATABASE @sourceDb TO DISK = @backupPath

RESTORE DATABASE @destDb FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDb     TO @destMdf,
   MOVE @sourceDb_log TO @destLdf

答案 5 :(得分:9)

使用MS SQL Server 2012,您需要执行3个基本步骤:

  1. 首先,生成仅包含源数据库结构的.sql文件

    • 右键单击源数据库,然后单击任务,然后生成脚本
    • 按照向导并在本地保存.sql文件
  2. 其次,将源数据库替换为.sql文件

    中的目标数据库
    • 右键单击目标文件,选择新查询 Ctrl-H 或(编辑 - 查找并替换 - 快速更换
  3. 最后,填充数据

    • 右键单击目标数据库,然后选择任务导入数据
    • 数据源下拉设置为" .net框架数据提供程序,用于SQL Server " +在DATA ex:Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
    • 下设置连接字符串文本字段
    • 对目的地
    • 执行相同操作
    • 检查您要转移的表格或复选框除了"来源:..."检查所有这些
  4. 你已经完成了。

答案 6 :(得分:8)

这里提到的解决方案都不适合我 - 我正在使用SQL Server Management Studio 2014。

相反,我必须取消选中"在恢复之前进行尾部日志备份" "选项"中的复选框screen:在我的版本中,默认情况下会检查它,并阻止完成Restore操作。 取消选中后,恢复操作会继续进行而不会出现问题。

enter image description here

答案 7 :(得分:6)

在SQL Server 2008 R2中,将数据库作为文件备份到文件夹中。     然后选择“数据库”文件夹中显示的还原选项。     在向导中,在目标数据库中输入所需的新名称。     并选择restore frrom文件并使用刚刚创建的文件。     我jsut做了它并且它非常快(我的DB很小,但仍然) 巴勃罗。

答案 8 :(得分:4)

如果数据库不是很大,您可以查看SQL Server Management Studio Express中的“脚本数据库”命令,这些命令位于资源管理器中数据库项本身的上下文菜单中。

你可以选择所有脚本;当然,你想要对象和数据。然后,您将整个脚本保存到单个文件中。然后您可以使用该文件重新创建数据库;只需确保顶部的USE命令设置为正确的数据库。

答案 9 :(得分:3)

解决方案基于此评论:https://stackoverflow.com/a/22409447/2399045。 只需设置设置:DB名称,临时文件夹,db文件夹。 在运行之后,您将获得带有名称的数据库副本" sourceDBName_yyyy-mm-dd"格式。

-- Settings --
-- New DB name will have name = sourceDB_yyyy-mm-dd
declare @sourceDbName nvarchar(50) = 'MyDbName';
declare @tmpFolder nvarchar(50) = 'C:\Temp\'
declare @sqlServerDbFolder nvarchar(100) = 'C:\Databases\'

--  Execution --
declare @sourceDbFile nvarchar(50);
declare @sourceDbFileLog nvarchar(50);
declare @destinationDbName nvarchar(50) = @sourceDbName + '_' + (select convert(varchar(10),getdate(), 121))
declare @backupPath nvarchar(400) = @tmpFolder + @destinationDbName + '.bak'
declare @destMdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '.mdf'
declare @destLdf nvarchar(100) = @sqlServerDbFolder + @destinationDbName + '_log' + '.ldf'

SET @sourceDbFile = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 0)

SET @sourceDbFileLog = (SELECT top 1 files.name 
                    FROM sys.databases dbs 
                    INNER JOIN sys.master_files files 
                        ON dbs.database_id = files.database_id 
                    WHERE dbs.name = @sourceDbName
                        AND files.[type] = 1)

BACKUP DATABASE @sourceDbName TO DISK = @backupPath

RESTORE DATABASE @destinationDbName FROM DISK = @backupPath
WITH REPLACE,
   MOVE @sourceDbFile     TO @destMdf,
   MOVE @sourceDbFileLog  TO @destLdf

答案 10 :(得分:3)

您可以只创建一个新数据库,然后转到任务,导入数据,然后将要复制的数据库中的所有数据导入到刚创建的数据库中。

答案 11 :(得分:2)

使用导入/导出向导的另一种方法,首先创建一个空数据库,然后选择源服务器和源数据库,然后在目标中选择相同的具有目标数据库的服务器(使用您最初创建的空数据库),然后点击完成

它将创建所有表并将所有数据传输到新数据库中,

答案 12 :(得分:2)

基于Joe回答的脚本(分离,复制文件,附加)。

  1. 以管理员帐户运行Managment Studio。
  2. 没有必要,但执行时可能会拒绝访问。

    1. 配置sql server以执行xp_cmdshel
    2. EXEC sp_configure 'show advanced options', 1
      GO
      RECONFIGURE
      GO
      EXEC sp_configure 'xp_cmdshell', 1
      GO
      RECONFIGURE
      GO
      
      1. 运行脚本,但之前在@dbName@copyDBName变量中键入数据库名称。
      2. USE master;
        GO 
        
        DECLARE @dbName NVARCHAR(255) = 'Products'
        DECLARE @copyDBName NVARCHAR(255) = 'Products_branch'
        
        -- get DB files
        CREATE TABLE ##DBFileNames([FileName] NVARCHAR(255))
        EXEC('
            INSERT INTO ##DBFileNames([FileName])
            SELECT [filename] FROM ' + @dbName + '.sys.sysfiles')
        
        -- drop connections
        EXEC('ALTER DATABASE ' + @dbName + ' SET OFFLINE WITH ROLLBACK IMMEDIATE')
        
        EXEC('ALTER DATABASE ' + @dbName + ' SET SINGLE_USER')
        
        -- detach
        EXEC('EXEC sp_detach_db @dbname = ''' + @dbName + '''')
        
        -- copy files
        DECLARE @filename NVARCHAR(255), @path NVARCHAR(255), @ext NVARCHAR(255), @copyFileName NVARCHAR(255), @command NVARCHAR(MAX) = ''
        DECLARE 
            @oldAttachCommand NVARCHAR(MAX) = 
                'CREATE DATABASE ' + @dbName + ' ON ', 
            @newAttachCommand NVARCHAR(MAX) = 
                'CREATE DATABASE ' + @copyDBName + ' ON '
        
        DECLARE curs CURSOR FOR 
        SELECT [filename] FROM ##DBFileNames
        OPEN curs  
        FETCH NEXT FROM curs INTO @filename
        WHILE @@FETCH_STATUS = 0  
        BEGIN
            SET @path = REVERSE(RIGHT(REVERSE(@filename),(LEN(@filename)-CHARINDEX('\', REVERSE(@filename),1))+1))
            SET @ext = RIGHT(@filename,4)
            SET @copyFileName = @path + @copyDBName + @ext
        
            SET @command = 'EXEC master..xp_cmdshell ''COPY "' + @filename + '" "' + @copyFileName + '"'''
            PRINT @command
            EXEC(@command);
        
            SET @oldAttachCommand = @oldAttachCommand + '(FILENAME = "' + @filename + '"),'
            SET @newAttachCommand = @newAttachCommand + '(FILENAME = "' + @copyFileName + '"),'
        
            FETCH NEXT FROM curs INTO @filename
        END
        CLOSE curs 
        DEALLOCATE curs
        
        -- attach
        SET @oldAttachCommand = LEFT(@oldAttachCommand, LEN(@oldAttachCommand) - 1) + ' FOR ATTACH'
        SET @newAttachCommand = LEFT(@newAttachCommand, LEN(@newAttachCommand) - 1) + ' FOR ATTACH'
        
        -- attach old db
        PRINT @oldAttachCommand
        EXEC(@oldAttachCommand)
        
        -- attach copy db
        PRINT @newAttachCommand
        EXEC(@newAttachCommand)
        
        DROP TABLE ##DBFileNames
        

答案 13 :(得分:2)

来自 SSMS:

1 - 将原始数据库备份到 .BAK 文件(your_source_db -> 任务 -> 备份)。

2 - 右键单击​​“数据库”和“恢复数据库”

3 - 设备 > ...(按钮)> 添加 > 选择 your_source_db.bak

4 - 在“常规”选项卡的“目的地”部分,将“数据库”中的 your_source_db 重命名为 new_name_db

5 - 在“文件”选项卡中,勾选“将所有文件重定位到文件夹”,

  • 在“恢复为”列中重命​​名两个 lignes 以与 new_name_db (.mdf, _log.ldf) 保持一致

6 - 在“选项”选项卡的“恢复选项”部分中,勾选两个第一个选项(“覆盖...”、“保留...”)和“恢复状态”:“使用恢复进行恢复”< /p>

  • 还要确保在“Tail-Log backup”部分中的选项未被选中,以避免将源数据库保持在“恢复状态”!