使用 MySQL Shell 进行 MySQL 单机到 InnoDB Cluster 的数据迁移实践

迁移背景与环境

原来都是用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 节点配置较低,成为整个集群的性能瓶颈,在正式迁移前需要先将其从集群中移除:

  1. 登录主节点的 MySQL Shell:
mysqlsh --user=root --password='pwd' --uri localhost:3306

  1. 移除低配置节点:javascript
c = dba.getCluster()
c.removeInstance('172.23.3.79:3306',{force:true})

  1. 验证集群状态,确保节点已成功移除:
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
});

迁移后的集群调整

数据导入完成后,需要将之前移除的节点重新加入集群:

  1. 确认集群状态正常:
c = dba.getCluster()
c.status()

  1. 添加节点到集群(使用 clone 方式进行数据同步):
c.addInstance('172.23.3.79', {recoveryMethod: 'clone'})

总结

使用 MySQL Shell 的 util.dumpInstance 和 util.loadDump 工具进行数据迁移,相比传统的 mysqldump 具有以下优势:

  1. 多线程操作,迁移速度更快
  2. 可以排除不需要的表,提高迁移效率
  3. 内置进度显示,便于监控迁移过程
  4. 更好地支持 InnoDB Cluster 环境

在迁移包含性能不均衡节点的集群时,先移除低配置节点可以避免迁移过程中出现的性能瓶颈和节点卡死问题,待迁移完成后再将节点重新加入集群,

### 关于 InnoDB Cluster 多节点部署与 MySQL Router 的配置 #### 配置概述 InnoDB Cluster 是一种基于 Group Replication 技术的高可用性解决方案,它允许用户通过最少三台服务器来构建一个分布式数据库环境。为了增强其功能并简化客户端连接管理,通常会结合 MySQL Router 使用[^3]。 #### 节点角色定义 在一个典型的 InnoDB Cluster 中,存在三种主要类型的节点: 1. **Cluster 节点**: 安装有 MySQLMySQL Shell 的核心数据存储单元。 2. **Route 管理节点**: 提供负载均衡和自动故障转移支持的服务端组件,需安装 `keepalived`、`mysql-shell`、`mysql-router` 及其他必要工具[^1]。 3. **Client 访问层**: 用户应用程序通过此层访问集群中的活动主节点或只读副本。 #### MySQL Router 设置指南 以下是针对多节点环境中 MySQL Router 的具体配置流程: ##### 步骤一:启动 MySQL Router 实例 在每台 Route 管理节点上执行如下命令以初始化 MySQL Router 并指向已建立好的 InnoDB Cluster: ```bash mysqlrouter --bootstrap root@<primary-cluster-node>:3306 \ --conf-use-gr-cache --force \ --user=mysqlrouter ``` 这里 `<primary-cluster-node>` 应替换为当前活跃的主要集群成员地址[^2]。 ##### 步骤二:验证路由服务状态 确认 MySQL Router 是否正常工作以及监听哪些端口: ```sql SHOW VARIABLES LIKE 'default_mysql_port'; SELECT * FROM performance_schema.router_instances; ``` 默认情况下,MySQL Router 将开放 6446 (Classic Protocol Read/Write),6447 (X Protocol Read/Write),6448 (Classic Protocol ReadOnly) 和 6449 (X Protocol ReadOnly)[^4]。 ##### 步骤三:调整权限设置(可选) 如果遇到因主机名限制而导致的身份认证失败问题,则需要修改全局用户的访问范围至任意 IP 地址 `%`, 同时重新加载授权表单以便立即生效: ```sql ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY '<new-password>'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'; FLUSH PRIVILEGES; ``` 注意,在生产环境下建议创建专用的应用程序账户而非直接授予超级管理员全部控制权[^5]。 #### 故障恢复机制说明 当某个 Cluster 成员发生意外宕机事件后,Keepalived 组件能够迅速检测到这一变化并通过虚拟IP(Virtual IP Address,VIP)迁移操作完成无缝切换过程,从而保障业务连续性和用户体验不受影响。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值