SQL数据库完全复制
很少摸 Windows 环境下的东西,最近被个 MS SQL Server 的数据库搞得头大。实在不像 MySQL 那样用起来轻车熟路, OrZ …
本来以为企业管理器里面既然提供了 DTS 数据导入/导出 的功能,直接使用 DTS 指定源和目标库就可以完全复制数据库到远程服务器上了。结果发现除了表的基本结构和数据,字段约束、键值、默认值等都没过去。最终还是要靠直接磁盘拷贝数据文件了事。
如果数据库服务可以停下来的话,最快的方法是直接拷贝对应的 .mdf 和 .ldf 文件(在企业管理器选择数据库右键看属性的“数据文件”项确定文件名);然后执行T-SQL命令(比如新的目标数据库名为 test ):
— 如果 test 数据库已经存在,需要先把其分离。
— 如果已经有应用连接到该数据库的话,使用以下语句强制断开现有连接
ALTER DATABASE test
SET SINGLE_USER
WITH ROLLBACK IMMEDIATE;
— 分离tst数据库
EXEC sp_detach_db
@dbname = \’test\’,
@skipchecks = \’true\’— 把拷贝出来的 .mdf 文件和 .ldf 文件作为 test 数据库的数据文件挂上去
EXEC sp_attach_db
@dbname = \’test\’,
@filename1 = \’e:\db\test.mdf\’,
@filename2 = \’e:\db\test.ldf\’— 如果不想使用原来的 .ldf 文件,也可以单独挂 .mdf 文件
EXEC sp_attach_single_file_db
@dbname = \’test\’,
@physname = \’e:\db\test.mdf\’
如果当前数据库处于生产环境不允许关闭服务的话,可以使用 BACKUP / RESTORE 的方法来完成复制工作:
— 把数据库名为realdb的数据库备份到指定的磁盘文件
— 用 WITH FORMAT 参数对bak文件进行格式化,以便进行完整重写
BACKUP DATABASE realdb TO DISK = \’E:\db\BAK_FOR_realdb.bak\’ WITH FORMAT
— 用 RESTORE FILELISTONLY 命令查看数据库备份文件里面的
— 数据文件和日志文件的逻辑名称,用于下一步的命令
RESTORE FILELISTONLY FROM DISK = \’E:\db\BAK_FOR_realdb.bak\’— 使用备份文件创建一个新的数据库, realdb_dat 和 realdb_log
— 分别是上面使用 RESTORE FILELISTONLY 命令查出的数据文件逻辑
— 名称
RESTORE DATABASE test
FROM DISK = \’E:\db\BAK_FOR_realdb.bak\’
WITH MOVE \’realdb_dat\’ TO \’E:\db\test.mdf\’,
MOVE \’realdb_log\’ TO \’E:\db\test.ldf\’
GO