雲計算之路系列博文分享的是我們將網站從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. 恢復網站正常運行
以上操作步驟已進行過成功演練。