设为首页 收藏本站
查看: 723|回复: 0

[经验分享] SQL Server 数据库最小宕机迁移方案

[复制链接]

尚未签到

发表于 2015-6-29 17:49:11 | 显示全部楼层 |阅读模式
  一、目的
  在做SQL Server数据库维护的时候,当上司要求我们把几十G的数据文件搬动到其它服务器,并且要求最小宕机时间的时候,我们有没什么方案可以做到这些要求呢?
  在这里我们假设这两台机器并不是在一个机房上,这样看起来我们的解决方案才更有意义,如果你那么好运这两台机器在同一个局域网,那么恭喜你,你可以多很多的方案可以做到。
  
  二、分析与设计思路
  其实我们假设的环境有两个特点:第一个是数据库文件比较大;第二个就是我们的传送文件的速度可能会比较慢。也许这传送速度我们是没有办法了,但是我们可以就从文件的大小这个问题出发,结合SQL Server的特性,这样就有了下面的解决方案了。
  为了使宕机时间最短,我们这里使用了完整备份差异备份来迁移数据库,在白天的时候对需要迁移的数据库进行一次完整备份(XXX_full.bak),并把备份文件拷贝(这里可以使用FTP软件进行断点续传)到目标服务器进行还原,等到下班时间之后再进行一次差异备份(XXX_diff.bak),再把这个差异备份拷贝到目标服务器,在完整还原的基础上再进行差异还原。
  这里的宕机时间 = 差异备份时间 + 传送差异备份文件时间 + 还原差异备份文件时间,这宕机时间是不是让你感觉这时间很短呢?
  
  三、参考脚本
  注意修改下面脚本中数据库的名称,还有绝对路径。



--1:完整备份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_full
BACKUP DATABASE ['+@dbname+']
TO  DISK = ''D:\DBBackup\'+@dbname+'_full.bak''
WITH NOFORMAT, NOINIT,  NAME = '''+@dbname+'-完整数据库备份'',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO'
print @sql


--生成的SQL
--DataBaseName_full
BACKUP DATABASE [DataBaseName]
TO  DISK = 'D:\DBBackup\DataBaseName_full.bak'
WITH NOFORMAT, NOINIT,  NAME = 'DataBaseName-完整数据库备份',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO




--2:完整备份还原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM  DISK = ''D:\DBBackup\'+@dbname+'_full.bak''  WITH  FILE = 1,  
MOVE N''DataBase_Name'' TO N''D:\DataBase\'+@dbname+'.mdf'',  
MOVE N''DataBase_Name_log'' TO N''D:\DataBase\'+@dbname+'_log.ldf'',  
NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO'
print @sql


--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM  DISK = 'D:\DBBackup\DataBaseName_full.bak'  WITH  FILE = 1,  
MOVE N'DataBase_Name' TO N'D:\DataBase\DataBaseName.mdf',  
MOVE N'DataBase_Name_log' TO N'D:\DataBase\DataBaseName_log.ldf',  
NORECOVERY,  NOUNLOAD,  REPLACE,  STATS = 10
GO




--3:差异备份
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--'+@dbname+'_diff
BACKUP DATABASE ['+@dbname+']
TO  DISK = N''D:\DBBackup\'+@dbname+'_diff.bak''
WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'''+@dbname+'-差异数据库备份'',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
'
print @sql


--生成的SQL
--DataBaseName_diff
BACKUP DATABASE [DataBaseName]
TO  DISK = N'D:\DBBackup\DataBaseName_diff.bak'
WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'DataBaseName-差异数据库备份',
SKIP, NOREWIND, NOUNLOAD,  STATS = 10
GO
  



--4:差异备份还原
declare @dbname varchar(100)
declare @sql nvarchar(max)
set @dbname = 'DataBaseName'
set @sql = '
--RESTORE '+@dbname+'_full
RESTORE DATABASE ['+@dbname+']
FROM  DISK = ''D:\DBBackup\'+@dbname+'_diff.bak''  WITH  FILE = 1,  
NOUNLOAD,  STATS = 10
GO'
print @sql


--生成的SQL
--RESTORE DataBaseName_full
RESTORE DATABASE [DataBaseName]
FROM  DISK = 'D:\DBBackup\DataBaseName_diff.bak'  WITH  FILE = 1,  
NOUNLOAD,  STATS = 10
GO
  
  四、后记
也许到了这里应该结束了,但是往往事与愿违,有的时候我们的数据库文件的大小并不是几十G的,那么我们应该如何做呢?是否还有其他的解决方案呢?

我之前就移动过700G的数据文件,不过给我移动的时间比较充足,我是通过数据库的作业进行愚公移山的,搬数据到新的服务器上的,这样的好处就是对之前的数据库进行优化,比如进行数据库参数的设置,比如表分区,在对之前数据库影响尽量小的情况进行数据搬迁。详细的过程下次再写吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-81683-1-1.html 上篇帖子: MS Sql Server中存储过程与触发器的安全隐患 下篇帖子: WIN 2003 Server配置SQL Server 2005远程连接体验
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表