遷移背景與環境
原來都是用mysqldump,DTS或者cdc遷移,這次8.0用了下新工具感覺挺好用的,簡單快捷,30G數據不到
源環境:單機 MySQL 8.0,地址為 172.23.3.28
目標環境:InnoDB Cluster 集群(3 節點),其中主節點地址為 172.23.3.4
特殊情況:集群中一臺節點(172.23.3.79)配置較低,存在 "木桶效應" 導致節點頻繁卡死,需要在遷移前進行處理
遷移前的準備工作
由于集群中 172.23.3.79 節點配置較低,成為整個集群的性能瓶頸,在正式遷移前需要先將其從集群中移除:
- 登錄主節點的 MySQL Shell:
mysqlsh --user=root --password='pwd' --uri localhost:3306
- 移除低配置節點:javascript
c = dba.getCluster()
c.removeInstance('172.23.3.79:3306',{force:true})
- 驗證集群狀態,確保節點已成功移除:
c.status()
數據遷移實施步驟
1. 準備源數據庫
為保證數據一致性,先將源數據庫設置為只讀模式:
SET GLOBAL read_only = ON;
2. 使用 MySQL Shell 導出數據
通過 MySQL Shell 的 util.dumpInstance 工具從源庫導出數據到主節點目錄:
mysqlsh --user=migration --password='pwd' --uri 172.23.3.28:3306
在 MySQL Shell 交互模式中執行導出命令:
util.dumpInstance('/data/mysql_dump_dir', { threads: 8, // 使用8個線程加速導出showProgress: true, // 顯示導出進度consistent: true, // 保證數據一致性ocimds: false, // 非OCI環境excludeTables: [ // 排除不需要遷移的表"d.qttq","d.dept_temp",]
});
3. 處理用戶授權信息
為避免遷移過程中的授權錯誤,替換導出的用戶信息文件:
cp /usr/local/src/user.sql.bak /data/mysql_dump_dir/\@.users.sql
4. 導入數據到主節點
登錄目標集群的主節點,使用 util.loadDump 工具導入數據:
bash
mysqlsh --user=root --password=Scjzbd@123.com --uri 172.23.3.4:3306
在 MySQL Shell 交互模式中執行導入命令:
util.loadDump('/data/mysql_dump_dir', {threads: 32, // 使用32個線程加速導入showProgress: true, // 顯示導入進度deferTableIndexes: 'all', // 延遲創建索引以提高導入速度loadUsers: true, // 導入用戶信息resetProgress: true
});
遷移后的集群調整
數據導入完成后,需要將之前移除的節點重新加入集群:
- 確認集群狀態正常:
c = dba.getCluster()
c.status()
- 添加節點到集群(使用 clone 方式進行數據同步):
c.addInstance('172.23.3.79', {recoveryMethod: 'clone'})
總結
使用 MySQL Shell 的 util.dumpInstance 和 util.loadDump 工具進行數據遷移,相比傳統的 mysqldump 具有以下優勢:
- 多線程操作,遷移速度更快
- 可以排除不需要的表,提高遷移效率
- 內置進度顯示,便于監控遷移過程
- 更好地支持 InnoDB Cluster 環境
在遷移包含性能不均衡節點的集群時,先移除低配置節點可以避免遷移過程中出現的性能瓶頸和節點卡死問題,待遷移完成后再將節點重新加入集群,