如何将MSKUWWEBDB(SQL Server 2008)的数据库及作业克隆至MSKUWWEBTEST
嘿,这个从SQL Server 2008到2012的克隆迁移需求我处理过好多次了,分数据库和作业两大块一步步来就很稳妥,我给你拆解下具体操作:
一、克隆所有数据库到目标服务器(MSKUWWEBTEST)
最可靠高效的方式是备份还原法,批量操作能节省大量时间:
1. 批量备份源服务器(MSKUWWEBDB)上的数据库
首先在源服务器上运行以下T-SQL脚本,批量备份除系统库外的所有数据库(如果需要迁移msdb,后面作业部分会用到):
DECLARE @BackupPath NVARCHAR(500) = N'\\两台服务器都能访问的共享路径\'; -- 比如局域网共享文件夹 DECLARE @SQL NVARCHAR(MAX) = N''; -- 生成所有用户数据库的备份命令 SELECT @SQL += N'BACKUP DATABASE [' + name + N'] TO DISK = ''' + @BackupPath + name + N'_' + CONVERT(NVARCHAR(20), GETDATE(), 112) + N'.bak'' WITH INIT, COMPRESSION; ' FROM sys.databases WHERE name NOT IN ('master', 'model', 'msdb', 'tempdb'); -- 排除系统库,根据需求调整 EXEC sp_executesql @SQL;
注意: 要确保SQL Server服务账号拥有共享路径的读写权限;COMPRESSION参数在SQL Server 2008及以上版本支持,能大幅减小备份文件体积。
2. 批量还原到目标服务器(MSKUWWEBTEST)
在目标服务器上运行以下脚本,批量还原备份的数据库,记得替换MOVE后的路径为目标服务器实际的数据/日志文件存储路径:
DECLARE @BackupPath NVARCHAR(500) = N'\\两台服务器都能访问的共享路径\'; DECLARE @SQL NVARCHAR(MAX) = N''; -- 生成还原命令,自动处理数据和日志文件的路径映射 SELECT @SQL += N'RESTORE DATABASE [' + b.database_name + N'] FROM DISK = ''' + m.physical_device_name + N''' WITH REPLACE, MOVE ''' + d.name + N''' TO ''D:\SQLData\' + b.database_name + N'.mdf'', -- 替换为目标数据路径 MOVE ''' + f.name + N''' TO ''E:\SQLLogs\' + b.database_name + N'.ldf''; -- 替换为目标日志路径 ' FROM msdb.dbo.backupset b JOIN msdb.dbo.backupmediafamily m ON b.media_set_id = m.media_set_id JOIN sys.master_files d ON b.database_name = d.database_name AND d.type = 0 -- 数据文件 JOIN sys.master_files f ON b.database_name = f.database_name AND f.type = 1 -- 日志文件 WHERE b.type = 'D' AND b.database_name NOT IN ('master', 'model', 'msdb', 'tempdb') ORDER BY b.backup_finish_date DESC; EXEC sp_executesql @SQL;
注意: REPLACE参数会覆盖目标服务器上同名的数据库,执行前确认是否需要保留现有数据。
二、克隆SQL Server作业到目标服务器
作业存储在msdb数据库的系统表中,有三种常用方法:
1. SSMS图形化导出作业(最简单)
适合新手或作业数量不多的情况:
- 打开源服务器的SSMS,展开SQL Server代理 -> 作业
- 右键作业 -> 导出作业,启动导出向导
- 在向导中选择目标服务器
MSKUWWEBTEST,勾选所有需要迁移的作业 - 若作业依赖操作员、警报等对象,记得一起导出;迁移后要检查作业的执行账号在目标服务器是否存在,否则需要调整权限。
2. T-SQL脚本批量生成作业创建语句
如果需要更灵活的控制,可以用以下脚本在源服务器生成所有作业的创建脚本,复制到目标服务器执行即可:
USE msdb; GO DECLARE @JobName NVARCHAR(128); -- 排除SQL Server默认的系统作业,按需调整 DECLARE JobCursor CURSOR FOR SELECT name FROM sysjobs WHERE name NOT LIKE 'SQL Server Agent%'; OPEN JobCursor; FETCH NEXT FROM JobCursor INTO @JobName; WHILE @@FETCH_STATUS = 0 BEGIN -- 生成单个作业的创建脚本 EXEC sp_generate_jobscript @job_name = @JobName; FETCH NEXT FROM JobCursor INTO @JobName; END CLOSE JobCursor; DEALLOCATE JobCursor;
注意: 生成的脚本里可能包含源服务器的特定配置(比如路径、服务器名称),执行前要仔细检查并替换为目标服务器的对应信息。
3. 备份还原msdb数据库(谨慎使用)
如果源服务器的msdb里只有你需要的作业,没有其他无关内容,可以直接备份源服务器的msdb并还原到目标服务器。但要注意:
- 目标服务器是2012,源是2008,还原后SQL Server会自动升级
msdb,兼容性没问题 - 这个操作会覆盖目标服务器原有的
msdb内容(包括现有作业、警报、操作员等),如果目标服务器已有业务相关内容,不建议用这个方法。
三、迁移后的验证工作
迁移完成后,一定要做这些验证确保一切正常:
- 检查所有数据库状态为在线,可以用
SELECT name, state_desc FROM sys.databases;查看 - 手动测试运行几个关键作业,确认没有权限错误、路径错误或依赖问题
- 检查数据库兼容性级别:源服务器是2008(兼容性级别100),可以考虑升级到2012的级别(110),但要先测试应用兼容性,执行:
ALTER DATABASE [你的数据库名] SET COMPATIBILITY_LEVEL = 110; - 迁移登录名:如果数据库有自定义SQL登录,需要同步登录名和密码,可使用
sp_help_revlogin脚本(能生成包含密码哈希的登录创建语句)
内容的提问来源于stack exchange,提问作者sanjeeth dsouza
相关产品推荐
相关产品推荐

