sqlserver 实例迁移手册
本清单旨在帮助DBA在迁移 SQL Server 的时候,不要遗漏一些环节,以免造成数据不一致,保证迁移过程的平稳顺利。
整体方案
- 整体迁移采用 系统数据库 + 用户数据库迁移,适用于login及job较多、不知道linked server密码的场景
- 若有数据库配置了 Log Shipping,则建议 完整备份 + 差异备份 的方式补齐数据,切不可做日志备份(会破坏日志传送任务)
准备工作
- 第1步,梳理主库涉及的域名,梳理需要刷DNS的站点(运维负责)
- 第2步,梳理是否有特殊的配置,比如 发布订阅、镜像、日志传送、bcp或dts同步、Linked Server(涉及驱动)、ssis任务、Analysis或Reporting服务、实例字符集等
- 第3步,老的主库进行系统数据库备份,建议 之后不要再修改账号及job等配置
注:若有 linked server 指向oracle,迁移到新机器之后,测试连接会提示主密钥解密出错,所以还需要迁移服务主密钥
--.系统数据库备份
backup database master to disk = 'd:\master.bak' with compression,stats=1
backup database msdb to disk = 'd:\msdb.bak' with compression,stats=1
backup database model to disk = 'd:\model.bak' with compression,stats=1
--.备份服务主密钥
BACKUP SERVICE MASTER KEY TO FILE = 'd:\SMK.key' ENCRYPTION BY PASSWORD = 'sa#123'
- 第4步,新的主库恢复 master
C:\Windows\system32>net stop mssqlserver
C:\Windows\system32>net start mssqlserver /m
C:\Windows\system32>sqlcmd -S localhost
1> restore database master from disk = 'd:\master.bak' with replace
2> go
C:\Windows\system32>net start mssqlserver
- 第5步,若更换了机器,则需要修复 @@SERVICENAME 与 @@SERVERNAME 不一致的问题。注意,必须重启 SQL Server 服务才会生效
SELECT @@ServerName,SERVERPROPERTY('ServerName')
IF @@SERVERNAME <> SERVERPROPERTY('ServerName')
BEGIN
DECLARE @srvname sysname
SET @srvname = @@SERVERNAME
EXEC sp_dropserver @server = @srvname
SET @srvname = CAST( SERVERPROPERTY('ServerName') as sysname)
EXEC sp_addserver @server = @srvname , @local = 'LOCAL'
END
- 第6步,新的主库恢复 msdb
USE master;
GO
ALTER DATABASE msdb SET SINGLE_USER WITH NO_WAIT
RESTORE DATABASE msdb FROM DISK = 'd:\msdb.bak' WITH REPLACE;
ALTER DATABASE msdb SET MULTI_USER WITH NO_WAIT
- 第7步,新的主库恢复 model
USE master;
GO
RESTORE DATABASE model FROM DISK = 'd:\model.bak' WITH REPLACE;
- 第8步,新的主库禁用job
--.批量禁用job
SELECT 'EXEC msdb.dbo.sp_update_job @job_name=N'''+name+''', @enabled=0'
FROM msdb.dbo.sysjobs
- 第9步,恢复服务主密钥,并测试 linked server
USE master;
RESTORE SERVICE MASTER KEY FROM FILE = 'd:\SMK.key' DECRYPTION BY PASSWORD = 'sa#123' FORCE
- 第10步,针对用户数据库,进行一次完整备份与恢复
--.1.备份老的主库
backup database xxx to disk = 'd:\xxx.full.bak' with compression,stats=1
--.2.恢复到新的主库
restore database xxx from disk = 'd:\xxx.full.bak' with norecovery,stats=1
维护窗口期
- 第1步,停止相关站点&服务(运维负责)
- 第2步,禁用定时任务,暂停bcp或dts同步任务(如果有)
- 第3步,禁用老主库的账号、作业,并杀掉用户连接,确保无数据变更
--.批量禁用login
SELECT name,type_desc,'ALTER LOGIN ['+name+'] DISABLE'
FROM sys.sql_logins WHERE is_disabled = 0 and name <> 'sa'
--.批量禁用job
SELECT 'EXEC msdb.dbo.sp_update_job @job_name=N'''+name+''', @enabled=0'
FROM msdb.dbo.sysjobs
--.批量杀掉连接
select 'kill ' + CAST(s.spid AS NVARCHAR(100)) AS kill_spid, s.spid, s.kpid, s.hostprocess,
s.status AS s_status, es.status AS es_status, s.blocked, s.open_tran, es.transaction_isolation_level AS L,
s.waittype, s.waitresource, s.waittime, DB_NAME(s.dbid) as dbname, s.loginame, s.hostname, s.program_name,
s.login_time AS s_login_time, es.login_time AS es_login_time, s.last_batch,
es.last_request_start_time, es.last_request_end_time, s.cmd, es.row_count, qt.text
from sys.sysprocesses as s
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS qt
right outer join sys.dm_exec_sessions es on s.spid=es.session_id
where spid>50
order by s.login_time desc
- 第4步,针对用户数据库,进行一次差异备份与恢复,补齐增量数据(若配置了日志传送则不能使用日志备份与恢复)
--.1.备份老的主库
backup database xxx to disk = 'd:\xxx.diff.bak' with compression,stats=1,differential
--.2.恢复到新的主库
restore database xxx from disk = 'd:\xxx.diff.bak' with norecovery,stats=1
- 第5步,针对用户数据库,恢复结束后,新的主库打开使用
restore database xxx with recovery
- 第6步,启用新主库的账号、作业
--.批量启用login
SELECT name,type_desc,'ALTER LOGIN ['+name+'] ENABLE'
FROM sys.sql_logins WHERE is_disabled = 1 and name <> 'sa'
--.批量启用job
SELECT 'EXEC msdb.dbo.sp_update_job @job_name=N'''+name+''', @enabled=1'
FROM msdb.dbo.sysjobs
- 第7步,配置新的日志传送(如果有,建议使用 norecovery 参数,可以跳过初始化)
--.1.恢复完整备份
restore database xxx from disk = 'd:\xxx.full.bak' with norecovery,stats=1
--.3.恢复差异备份
restore database xxx from disk = 'd:\xxx.diff.bak' with norecovery,stats=1
- 第8步,调整bcp或dts同步任务(如果有)
- 第9步,将新域名指向新IP,启动相关站点&服务(运维负责)
- 第10步,迁移完成
后期工作
- 第1步,[新主库] 如果窗口期内错过了某些job的执行,则根据情况补偿任务(重新执行或其他)
- 第2步,[老主库] 确认数据库无新的连接,关闭sqlserver服务
- 第3步,[新主库] 持续关注错误日志