我有一个MS SQL Server 2008 Express系统,其中包含一个我想“复制和重命名”的数据库(用于测试目的),但我不知道实现这一目的的简单方法。
我注意到在R2版本的SQL Server中有一个复制数据库向导,但遗憾的是我无法升级。
有问题的数据库是围绕着一个演出。 我试图恢复我要复制到新数据库的数据库的备份,但没有运气。
答案 0 :(得分:326)
安装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
打开 Microsoft SQL Management Studio 。
答案 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个基本步骤:
首先,生成仅包含源数据库结构的.sql
文件
.sql
文件其次,将源数据库替换为.sql
文件
最后,填充数据
Data Source=Mehdi\SQLEXPRESS;Initial Catalog=db_test;User ID=sa;Password=sqlrpwrd15
你已经完成了。
答案 6 :(得分:8)
这里提到的解决方案都不适合我 - 我正在使用SQL Server Management Studio 2014。
相反,我必须取消选中"在恢复之前进行尾部日志备份" "选项"中的复选框screen:在我的版本中,默认情况下会检查它,并阻止完成Restore操作。 取消选中后,恢复操作会继续进行而不会出现问题。
答案 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回答的脚本(分离,复制文件,附加)。
没有必要,但执行时可能会拒绝访问。
EXEC sp_configure 'show advanced options', 1
GO
RECONFIGURE
GO
EXEC sp_configure 'xp_cmdshell', 1
GO
RECONFIGURE
GO
@dbName
和@copyDBName
变量中键入数据库名称。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 - 在“文件”选项卡中,勾选“将所有文件重定位到文件夹”,
6 - 在“选项”选项卡的“恢复选项”部分中,勾选两个第一个选项(“覆盖...”、“保留...”)和“恢复状态”:“使用恢复进行恢复”< /p>