遷移應用數據庫到MySQL Database on Azure
by Rong Yu
有用戶問怎么把他們應用的數據庫遷移到MySQL Database on Azure上,有哪些方式,有沒有需要注意的地方。今天我們來概括介紹一下遷移應用數據庫到MySQL Database on Azure的方式和需要考慮的事項。
應用的可遷移性
首先您可能會想您的應用是否可以順利的運行在MySQL Database on Azure上。MySQL Database on Azure兼容MySQL 5.5 和 MySQL 5.6,所以絕大部分應用可以不用做任何改動可以順利地運行在MySQL Database on Azure上。當然為了更好地在MySQL Database on Azure上運行您的應用,我們建議應用要有數據庫重連機制以保證良好的容錯性,避免由于數據庫短暫連不上的時候應用死掉,因為即使是高可用的云端的數據庫也不可避免有故障切換和服務器維護等會導致短暫數據庫連不上的情況出現。另外我們也建議盡量采用連接池和長連接來訪問數據庫,特別是對性能要求比較高的應用,詳細可以參考 如何高效連接到MySQL Database on Azure 。
另外一個需要注意的地方是MySQL Database on Azure不支持老的MYISAM引擎,可以參考這個FAQ, 為什么MySQL Database on Azure不支持MYISAM格式的數據庫? 了解為什么。在大多數情況下,您可以直接在建表的code里把MyISAM數據引擎改成InnoDB就可以了。
基于數據導入導出的遷移
如果您的系統可以接受較長時間(比如一二個小時)因系統遷移導致的downtime,您可以用比較簡單的數據庫導出和導入的方式進行數據庫的遷移。
具體步驟:
- 登錄Azure管理門戶,在MySQL Database on Azure上創建一個新的MySQL服務器并進行必要的配置比如每天的備份時間,具體步驟可以參考 http://www.windowsazure.cn/documentation/articles/mysql-database-get-started#step1 。
- 通過Azure管理門戶在新創建的MySQL服務器上創建要遷移的目標數據庫。具體步驟可以參考 http://www.windowsazure.cn/documentation/articles/mysql-database-get-started#step4 。
- 如果有多個數據庫賬號需要訪問原數據庫,您需要通過Azure管理門戶在新的數據庫服務器上創建對應的賬號。
- 如果數據庫比較大(比如超過1GB),我們建議在同一個Azure數據中心準備一臺VM這樣可以先把數據傳輸到VM上然后再導入到DB里。
- 在Azure上完成應用的除了數據庫之外的組件的部署(比如website)。
- 所有準備工作做好后,現在開始遷移。首先建議把應用關停或運行在只讀模式(如果支持),這樣以避免遷移過程中有新的數據。
- 從當前數據庫服務器導出應用數據庫到一個文件。您可以用您熟悉的工具比如mysqldump,workbench,等等。下面是用mysqldump導出數據庫的例子: >mysqldump --databases < 數據庫名 > --single-transaction --order-by-primary -r < 備份文件名 > --routines -h< 服務器地址 > -P< 端口號 > –u< 用戶名 > -p< 密碼 >
- 如果數據文件比較大,建議先把數據文件傳輸到Azure上的一臺VM上(應在同一個數據中心),您可以用您熟悉的數據傳輸工具(比如FTP或AzCopy等),這樣可以避免因網絡連接中斷導致整個數據傳輸過程失敗。如果備份文件很大,可以壓縮后上傳。
- 把數據庫數據導入到目標數據庫中。您可以用您熟悉的工具比如mysql.exe,workbench,等等。下面是用mysql.exe導入數據庫的例子
8.1 在您的客戶端通過mysql.exe連接新創建的MySQL服務器 (注意:如果您不是從Azure的VM上導入數據您需要把客戶端加入IP白名單中):
>mysql -h< 服務器地址 > -P< 端口號 > –u< 用戶名 > -p< 密碼 >
8.2 從SQL命令行導入數據:
>source < 備份文件名 >;
10. 把新部署的應用指向遷移好的數據庫上,并完成剩余的應用遷移的步驟。
基于數據同步的遷移
上面的數據庫遷移方式比較簡單,但缺點是會有較長時間的downtime,同時每一個遷移步驟要能夠很熟練的完成并能很好地預期時間,否則會對您的業務連續性帶來較大的影響。如果您不能接受遷移過程中有較長時間的downtime, 比如是公司的網站,或者希望分階段完成平滑的遷移,建議您用數據庫同步的方式把當前的生產數據庫同步到Azure上,MySQL Database on Azure提供了這個功能,在同步期間您的應用和當前的數據庫可以繼續工作不受影響。
建議的遷移步驟:
- 同步數據庫到MySQL Database on Azure,您可以把運行在MySQL Database on Azure上的數據庫服務器配置為從服務器。具體配置和同步數據庫的步驟請參考 如何配置數據同步復制到MySQL Database on Azure 。注意:您會需要打開當前的數據庫服務器的外部訪問,我們強烈建議您配置SSL并只允許外部通過SSL訪問。
- 在Azure上部署新的應用并指向新建的Azure上的數據庫。注意:此時由于Azure上的數據庫運行在只讀模式,應用的功能可能受限。
- 確認Azure上的從數據庫已達到同步的狀態。您可以根據復制頁面上的復制狀態和復制滯后來確認同步狀態。
4. 關停老的應用或者讓應用運行在只讀模式(如果支持只讀模式)。
5. 停止數據庫同步復制。您只需在下面的頁面上點擊“禁用”然后保存就可以。
注意:這個操作會重啟數據庫服務器。
6. 啟用新的應用。
常見問題
- 導入TRIGGER, PROCEDURE, VIEW, FUNCTION, 或EVENT 過程中報”Access denied; you need (at least one of) the SUPER privilege(s) for this operation” 錯誤。 檢查報錯的語句有否使用DEFINER并使用非當前用戶,比如DEFINER=`user`@`host`, 如果這樣的話MySQL是要求SUPER權限來執行該語句,由于MySQL Database on Azure不提供用戶SUPER權限(參考 http://www.windowsazure.cn/documentation/articles/mysql-database-operation-limitation ),導致運行該語句失敗。您只需要把DEFINER從該語句刪掉而使用缺省的當前用戶就可以了。
- MYSQL Database on Azure 的管理門戶只支持對用戶設置整個數據庫的讀寫權限,如果我現在的數據庫有對用戶權限更細化的設 置,遷移會成功嗎? 沒有問題,雖然我們的管理門戶 以及PowerShell /REST API在創建用戶或數據庫時只支持對整個數據庫設置讀寫權限,但您可以用“grant”語句對用戶權限進行更細化的設置。
小結
您可以看到MySQL Database on Azure支持基于數據庫導出導入的遷移和基于數據庫同步的遷移,用戶可以根據應用的特點和業務的要求選擇合適的遷移方式。另一點您可以看到這些遷移方式基本上也是MySQL用戶已經熟悉了的,而這也是我們研發MySQL Database on Azure的一個基本出發點。