一、目的
在做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的数据文件,不过给我移动的时间比较充足,我是通过数据库的作业进行愚公移山的,搬数据到新的服务器上的,这样的好处就是对之前的数据库进行优化,比如进行数据库参数的设置,比如表分区,在对之前数据库影响尽量小的情况进行数据搬迁。详细的过程下次再写吧。
相关推荐
Sql Server数据库备份的另类解决方案
本免费小工具适用于迁移SQLServer数据库(从低版本到高版本,或者从A服务器到B服务器)。只要提前做好配置和准备,不管用户库的数据量有多大,每次迁移需要停止业务的时间都可以控制在5分钟之内(操作熟练的话,2...
解决sqlserver数据库迁移后用户映射不上的问题
SqlServer数据库同步方案详解 SqlServer数据库同步方案详解 SqlServer数据库同步方案详解
酒店管理系统,连接SQLServer 数据库 C++/Qt酒店管理系统,连接SQLServer 数据库 C++/Qt酒店管理系统,连接SQLServer 数据库 C++/Qt酒店管理系统,连接SQLServer 数据库 C++/Qt酒店管理系统,连接SQLServer 数据库 ...
sqlserver数据库SSH配置1
用java实现从SQLSERVER到ORACLE的数据库迁移
MS SQL SERVER数据库安装程序。如有人修改,希望能将修改后程序EMAIL给我一份,谢谢。
JS访问SQL Server数据库代码 这是我自己的代码,能用不就不用说了
Sqlserver数据库迁移,一个小项目。
基于Java和SQL Server数据库的简易图书馆管理系统,优秀数据库课设! 基于Java和SQL Server数据库的简易图书馆管理系统,优秀数据库课设! 基于Java和SQL Server数据库的简易图书馆管理系统,优秀数据库课设! 基于...
MyBatis通过 JDBC连接 SQL server 数据库 最小例子, 数据库为SQL server 2005,没有引用多余的库
自动化 wincc连接sql server数据库脚本,不需要wincc授权,直连sql server数据库。解决归档导出问题
SQL Server数据库健康检查 巡检报告
VBA连接SQLSERVER数据库实例
sql server 数据库案例+C#sql server 数据库案例+C#
SQLServer数据库的备份和还原详解SQLServer数据库的备份和还原详解
opc服务器kepserver读取SQL Server数据库具体方法
如何查看sql server数据库连接数
能过MFC连接SQL Server数据库,也可以远程进行连接,但是要加把server=改成ip,端口