使用場景
用戶當前使用云下自建MySQL作為數據存儲中心,希望能遷移至天翼云DRDS。另外除了自建MySQL適用外,其他場景MySQL也適用,比如從其他云廠商的MySQL遷移,本方法同樣適用,只需要確保“中間機器”網絡能連通您的MySQL即可。
約束限制
- 為了保證數據完整性,需要先停止業務再進行數據遷移。
- 不支持以自動新建庫或新建表的方式導入數據,因此,導入數據前務必先在DRDS控制臺創建好相同名稱的邏輯schema、邏輯表,然后再連接DRDS進行數據導入。
- 導入數據到DRDS之前,務必創建用戶并分配schema權限給用戶。
遷移前準備
- 準備可以訪問云下MySQL的主機(假設為中間機器1)。
- 確保該主機與云下MySQL所在主機網絡聯通。也可以直接復用MySQL主機,即同一臺機器。
- 該主機必須安裝MySQL官方客戶端,MySQL客戶端版本建議為5.7。
- Redhat系列Linux安裝命令:yum install mysql mysql-devel。
- Debian系列Linux安裝命令:apt install mysql-client-5.7 mysql-client-core-5.7。
- 該主機的磁盤空間必須足夠存放臨時轉儲文件(SQL文件)。
- 開通DRDS 實例,并創建數據庫用戶、邏輯schema、邏輯表等,配置DRDS相分組屬性等。
- 通過開通DRDS 實例。
- 開通MySQL實例,根據業務需求決定開通一個或多個。
- 通過DRDS控制臺,關聯上述開通的一個或多個MySQL實例到DRDS 實例。關聯后,需要重啟所有節點。
- 通過DRDS控制臺創建數據庫用戶。
- 配置DRDS分組屬性。設置prohibitCrossTransaction為false,表示允許執行跨節點update/delete語句。
- 準備可以訪問云上DRDS的主機(假設為中間機器2)。
- 確保該主機與云上DRDS所在主機網絡聯通(比如同VPC下的ECS,或者DRDS綁定彈性公網IP,機器能訪問該彈性公網IP)。
- 該主機必須安裝MySQL官方客戶端,MySQL客戶端版本建議為5.7。
- Redhat系列Linux安裝命令:yum install mysql mysql-devel。
- Debian系列Linux安裝命令:apt install mysql-client-5.7 mysql-client-core-5.7。
說明中間機器1和中間機器2可以是同一臺機器,也可以是不同機器。如果是同一臺機器,則該機器的網絡務必既能連通云下MySQL,也要能連通DRDS實例。如果不是同一臺機器,則兩臺中間機器務必保證網絡互通(用于SQL文件傳輸)。
表結構遷移(準備工作)
-
通過DRDS控制臺創建schema(建議編碼為utfb8mb4)。schema名稱保持和云下MySQL一致。
-
導出MySQL上的表結構。
-
導出時針對每一個需要導出的庫導出一個單獨的SQL文件(也可以每個表單獨一個文件),避免覆蓋。
命令如下:mysqldump -h {DB_IP} -P {DB_PORT} -u {DB_USER} -p --no-data --compact {DB_NAME} {TABLE_NAME} > {mysql_table_info.sql}參數解釋如下:
參數 說明 備注 DB_IP 待導出數據的MySQL數據庫IP。 必填。 DB_PORT 待導出數據的MySQL數據庫端口。 必填。 DB_USER 待導出數據的MySQL數據庫用戶名。 必填。 DB_NAME 數據庫名稱。 必填。 TABLE_NAME 表名。 可選。本場景不需要該參數,即一次導出一個庫的所有表。如有必要,可以多個同類型的表,用空格隔開。建議只導出與業務相關的表。 mysql_table_info.sql 生成的結構文件名。 必填。請確保每次導出的文件名不同,建議以“邏輯庫名”+“”+“邏輯表名”+“”+“info”格式命名,以免被覆蓋。建議后綴為.sql。 --no-data 不導出數據。 本場景保留。 --compact 關閉注釋和頭尾信息,同時開啟以下選項:
--skip-add-drop-table
--skip-add-locks
--skip-comments
--skip-disable-keys
--skip-set-charset本場景保留。 -
針對以上生成的每個表結構sql文件,請注意務必手動打開文檔并刪除所有注釋(用/* /的就是注釋語句),比如 / !40101 SET @saved_cs_client = @@character_set_client */。
-
通過DRDS控制臺在上面schema下創建邏輯表,表類型可以是單片表、分片表、全局表,請用戶根據表用途及數據量增長趨勢合理選擇表類型。表名及表結構保持和云下MySQL的表一致。 將步驟3、4中生成的表結構SQL語句拷貝到“schema管理-庫表管理-DDL任務”執行建表語句,等待所有SQL執行完畢,在“庫表管理”頁面為所有表設置分片算法。(如果表過多,可以分批粘貼進去執行。)
-
通過DRDS控制臺為上述創建的用戶分配schema權限(建議至少SELECT、UPDATE、INSERT、DELETE)。
導出數據
-
通過mysqldump工具導出云下MySQL數據。導出時針對每一個需要導出的庫導出一個單獨的SQL文件(也可以每個表單獨一個文件),避免覆蓋。
導出命令:mysqldump -h {DB_IP} -P {DB_PORT} -u {DB_USER} -p --single-transaction --hex-blob --complete-insert --set-gtid-purged=OFF --quick --no-create-info --skip-comments --skip-add-locks --add-locks=false --skip-tz-utc [--where=""] {DB_NAME} {TABLE_NAME} > {mysql_table_data.sql}參數解釋如下:
參數 說明 備注 DB_IP 待導出數據的MySQL數據庫IP。 必填。 DB_PORT 待導出數據的MySQL數據庫端口。 必填。 DB_USER 待導出數據的MySQL數據庫用戶名。 必填。 DB_NAME 數據庫名稱。 必填。 TABLE_NAME 表名。 可選。本場景不需要該參數,即一次導出一個庫的所有表。如有必要,可以多個同類型的表,用空格隔開。建議只導出與業務相關的表。 mysql_table_data.sql 生成的表數據文件名。 必填。請確保每次導出的文件名不同,建議以“邏輯庫名”+“”+“邏輯表名”+“ ”+“data”格式命名,以免數據被覆蓋。建議后綴為.sql --complete-insert 使用完整的insert語句(包含列名稱)。 本場景保留。 --single-transaction 該選項在導出數據之前提交一個BEGIN SQL語句,BEGIN 不會阻塞任何應用程序且能保證導出時數據庫的一致性狀態。它只適用于多版本存儲引擎,僅InnoDB。 本場景保留。 --quick 不緩沖查詢,直接導出到標準輸出。避免大數據情況內存爆漲。 本場景保留。 --hex-blob 使用十六進制格式導出二進制字符串字段。如果有二進制數據就必須使用該選項。 本場景保留。 --no-create-info 只導出數據,而不添加CREATE TABLE 語句。導出數據時使用。 本場景保留。 --skip-comments 關閉附加注釋信息。 本場景保留。 --skip-lock-tables 在不鎖表的情況下導出數據。某些參數會默認開啟加鎖聲明,因此建議在數據導出語句末尾增加此參數。 本場景保留。 --add-locks=false 導出的數據文件中不加鎖表的聲明。 本場景保留。 --skip-add-locks 在導出數據時,控制加鎖動作,以避免因耗能引起的性能問題。 本場景保留。 --set-gtid-purged=OFF 若使用的MySQL版本為8.0或5.7,則需要配置該參數。若5.6及以下,不用該參數。 本場景保留。 --where 只轉儲給定的WHERE條件選擇的記錄。 可選。 -
針對上述導出的SQL文件,需要去掉不必要的信息,保持文件中盡量只包括insert語句。去掉的信息包括:不必要的注釋。
導入數據
-
將上面導出的所有SQL文件,上傳到可以訪問DRDS實例的主機上。
-
針對每個庫(schema)分別導入SQL到DRDS實例上。
-
通過mysql客戶端直連DRDS ,執行以下命令將數據導入DRDS。
命令如下:mysql -f -h {DBPROXY_IP} -P {DBPROXY_PORT} -u {DDPROXY_USER} -p {DB_NAME} < {mysql_table_data.sql}參數解釋如下:
參數 說明 備注 DBPROXY_IP 待導入的DRDS的VIP。 必填。 DBPROXY_PORT 待導入的DRDS的端口。 必填。 DDPROXY_USER 待導入的DRDS的用戶名。 必填。 DB_NAME 邏輯schema名稱。 必填。 mysql_table_data.sql 待導入的SQL文件。 必填。
驗證數據
通過MySQL客戶端直連MySQL和DRDS實例 ,分別查詢表數據進行數據驗證,比如查詢表記錄總數是否相等。