云计算之路:数据库迁移方案

云计算之路系列博文分享的是我们将网站从IDC机房迁移至云计算平台(阿里云)的实际经历,目前处于准备阶段,这次分享的是数据库的迁移方案。

在整个迁移过程中,只有数据库迁移过程中的数据同步阶段会影响网站的正常访问,所以迁移方案重点考虑的是尽可能缩短数据同步所需的时间。我们采用的方法是备份/上传/恢复数据库完全备份+备份/上传/恢复数据库日志。备份/上传/恢复数据库完全备份不影响网站的正常访问,通过备份/上传/恢复数据库日志将数据同步至最新。

具体操作步骤如下:

1. 禁用所有备份计划任务

由于数据库日志的备份是基于最近一次完全备份,如果计划任务中有完全备份任务可能会干扰迁移过程中的日志备份。

2. 对数据库进行完全备份

数据库的Recovery Model要是Full。数据库日志的恢复就是基于该完全备份,这个备份时间越晚,日志恢复时所需要恢复的数据就越少,恢复速度就越快。

操作SQL语句示例:

BACKUP DATABASE [db1] TO  DISK = N'D:\FullBackup\db1.bak' WITH NOFORMAT, INIT, 
NAME = N'db1-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

BACKUP DATABASE [db2] TO  DISK = N'D:\FullBackup\db2.bak' WITH NOFORMAT, INIT,
NAME = N'db2-Full Database Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

...

3. 将数据备份文件上传至阿里云上的数据库服务器

由于阿里云上传带宽没有限制,上传会很快完成。

4. 在阿里云上的数据库服务器上恢复完全备份(RESTORE WITH STANDBY)

由于云服务器硬盘写入速度慢,这个恢复时间会很长。但再长也没关系,原因见下面括号中的文字。

操作SQL语句示例:

RESTORE DATABASE [db1] FROM  DISK = N'E:\Backup\db1.bak' WITH  FILE = 1,  
MOVE N'db1_Data' TO N'D:\Data\db1.MDF',  MOVE N'db1_Log' TO N'E:\Logs\db1.LDF',  
STANDBY = N'E:\Standby\ROLLBACK_UNDO_db1.BAK',  NOUNLOAD,  STATS = 10
GO

RESTORE DATABASE [db1] FROM  DISK = N'E:\Backup\db2.bak' WITH  FILE = 1,  
MOVE N'db1_Data' TO N'D:\Data\db2.MDF',  MOVE N'db2_Log' TO N'E:\Logs\db2.LDF',  
STANDBY = N'E:\Standby\ROLLBACK_UNDO_db2.BAK',  NOUNLOAD,  STATS = 10
GO

...

(以上操作期间不影响网站的正常运行)

5. 禁止所有数据库写入/更新操作

接下来要备份数据库日志,应用程序不能对数据库有任何写入/更新操作。目前想到的最快的操作方法是通过防火墙禁用1433端口的访问。

6. 备份原数据库服务器上的数据库日志

操作SQL语句示例:

BACKUP LOG [db1] TO  DISK = N'D:\LogBackup\db1.bak' WITH NOFORMAT, INIT,  
NAME = N'db1 Log  Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

BACKUP LOG [db2] TO  DISK = N'D:\LogBackup\db2.bak' WITH NOFORMAT, INIT,  
NAME = N'db2 Log  Backup', SKIP, NOREWIND, NOUNLOAD, COMPRESSION,  STATS = 10
GO

...

7. 将日志备份文件上传至阿里云上的数据库服务器

8. 在阿里云的数据库服务器上恢复日志备份(RESTORE WITH RECOVERY

操作SQL语句示例:

RESTORE LOG [db1] FROM  DISK = N'E:\Backup\Logs\db1Log.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO

RESTORE LOG [db2] FROM  DISK = N'E:\Backup\Logs\db2Log.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 10
GO

...

9. 关联数据库用户帐户

在阿里云上的数据库服务器上将登录帐户与各数据库的用户帐户关联(登录帐户在迁移之前已经建立好)。

操作SQL语句示例:

EXEC sp_change_users_login 'Update_One', 'user1', 'user1'
EXEC sp_change_users_login 'Update_One', 'user2', 'user2'
...

(以上操作期间不能正常访问网站)

10. 恢复网站正常运行

以上操作步骤已进行过成功演练。

posted @ 2013-02-25 09:26  博客园团队  阅读(6167)  评论(7编辑  收藏  举报