前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[MYSQL案例][024] mysql 5.7/8.0主从 迁移切换 到mysql8.0 主从(MHA)

[MYSQL案例][024] mysql 5.7/8.0主从 迁移切换 到mysql8.0 主从(MHA)

原创
作者头像
大大刺猬
发布2023-12-12 22:53:46
2720
发布2023-12-12 22:53:46
举报
文章被收录于专栏:大大刺猬大大刺猬

背景

源环境A1: mysql 8.0 主从 未使用gtid (迁移部分数据)

源环境A2: mysql 5.7 PXC 未使用gtid (迁移部分数据)

目标环境B1: 8.0 主从(MHA) 使用GTID (存在数据)

目标环境B2: 8.0 主从(MHA) 使用GTID (存在数据)

迁移关系如下

代码语言:markdown
复制
A1 --> B1  (使用GTID)
A2 --> B2  (不使用GTID)

停机时间尽可能短

分析

迁移部分数据, 目标端还有数据, 基本上就确定使用mysqldump工具来做了

停机时间尽可能短, 那就是搭建主从同步剩余数据了.

部分要求开启/关闭gtid, 就需要导数据之前做.

5.7 到8.0 需要注意的事项, 比如字符集,排序规则,sql_mode,默认密码认证插件,空间等 这里就不多说了.

基本上思路就是:

1. 启用/关闭GTID

2. 导出数据到目标环境

3. 搭建主从

4. 数据校验

5. 切换

迁移过程

本来应该分开写的, 但为了节省篇幅, 就放一起了, 不同的我单独说一下就是.

开启或者关闭GTID

本次需要开启A1gtid 和关闭B2gtid.

在线开关gtid信息都比较简单. 官网有完整的教程, 直接复制就行. 这里多提一句, 注意同步配置文件

主从环境开启GTID: https://dev.mysql.com/doc/refman/8.0/en/replication-mode-change-online-enable-gtids.html

主从环境关闭GTID: https://dev.mysql.com/doc/refman/8.0/en/replication-mode-change-online-disable-gtids.html

迁移数据

源端导出数据:

建议放后台, 怕会话超时, 导出进程就挂了....

代码语言:shell
复制
nohup mysqldump -hxxxxx -uroot -pxxxx --master-data=2 --single-transaction --quick --max-allowed-packet=1073741824 --events --routines  --triggers --databases dbnamexxxx > dbnamexxxx_20231212.sql 2>dbnamexxxx_20231212.error &

导出时间参考: 导出.sql文件 100GB 1小时 (SSD)

目标端导入数据:

也是建议放后台

代码语言:shell
复制
nohup mysql -uroot -pxxxx -Pxxxx  <  dbnamexxxx_20231212.sql  >  impdp20231212.log 2>&1 &

导入时间参考: 100G 2小时 (SSD)

注意:

1. mysql 8.0的mysqldump导出的.sql文件 是有set session sql_log_bin=0 的, 所以不会写入binlog, 目标端环境是主从, 所以还要在从库也导出, 或者修改.sql文件去掉 sql_log_bin=0.

2. 检查下event, 这玩意是个坑, 可能导致主从不一致(后面要做源和目标的主从), 在从库非只读的情况下. (当前目标环境 存在其它业务使用, 所以不能设置只读. 所以得临时禁掉event)

迁移账号

由于是迁移部分业务库, 没得mysql库,目标端还存在数据, 所以得单独导出业务账号

注: 要放到导完数据后操作, 因为授权语句可能包含表的授权

导出建用户语句

之前有讲过类似的操作: https://cloud.tencent.com/developer/article/2298700

代码语言:shell
复制
MYSQL_CONN="mysql -hxxx -pxxx -NB" 
echo """select concat('show create user \"',user,'\"@\"',host,'\";') from mysql.user where user not in('mysql.session','mysql.sys','root');""" | $MYSQL_CONN|$MYSQL_CONN

我这里排除了root账号, 实际环境根据自己的需求来

导出授权语句

代码语言:shell
复制
MYSQL_CONN="mysql -hxxx -pxxx -NB" 
echo """select concat('show grants for \"',user,'\"@\"',host,'\";') from mysql.user where user not in('mysql.session','mysql.sys','root');""" | $MYSQL_CONN|$MYSQL_CONN

导入到目标环境的过程这里就略了.

迁移后数据同步

迁移后需要搭建主从同步原来的数据. 如果目标环境有同步其它环境数据的话, 注意加个channel

这步没得好说的, 直接change master就行. (注意是否使用gtid)

代码语言:sql
复制
select * from mysql.slave_master_info\G
change master to master_host=xxxx,master_user=’xx’,master_password=’xx’,master_auto_position=1;
start slave;
show slave status\G

如果是同步的部分库, 需要过滤下库表(不然其它库数据同步过来可能回报错)

CHANGE REPLICATION FILTER REPLICATE_DO_DB=(aaaa,bbbbb)

切换过程

切换之前要检查下网络问题(应用-->新环境数据库), 别切过去了, 才发现网络不通.

也要做好回退方案.(如果迁移后的测试数据不需要的话, 直接切回来就行.)

数据一致性校验 可以在业务停止之前先做一次

数据一致性校验

等延迟为0之后再做数据校验.

可以使用pt-table-checksum校验数据一致性, 但这里使用checksum table来校验(对数据库没得入侵)

懒得校验的话, 比较gtid也行

获取checksum语句(可以根据需要排除大表或者不需要校验的表)

代码语言:shell
复制
mysql -NB -e """set session group_concat_max_len=102400; select concat('checksum table ', group_concat(concat(table_schema,'.',table_name)),';') from information_schema.tables where table_schema='xxxxx' and table_type='BASE TABLE';""" > checksum_table_xxxxxx.sql 2>/dev/nunll

然后源和目标同时执行即可

代码语言:shell
复制
nohup mysql -hxxxx -uroot -pxxx < checksum_table_xxxxx.sql >checksum_result_source.log 2>checksum_result_source.error &
nohup mysql -hxxxx -uroot -pxxx < checksum_table_xxxxx.sql >checksum_result_dest.log 2>checksum_result_dest.error &

然后使用diff比较文件是否相同即可, 校验结果不同的表, 再单独checksum

代码语言:shell
复制
diff checksum_result_source.log checksum_result_dest.log


切换前

1. 业务断开连接

2. 把业务账号锁了. 再show processlist看下, 把未断完的连接kill掉(业务很大可能回露停...)

代码语言:sql
复制
alter user xxxxx account lock;
select * from information_schema.processlist  where db='xxxx';

如果源端没有其它业务使用了的话, 建议设置read_only. 最好把super_read_only也设置上.

3. 记录当前binlog信息

代码语言:sql
复制
show master status\G

4. 等待主从同步完成

目标环境主库查看

代码语言:sql
复制
show slave status\G

5. 取消目标环境只读

如果之前设置了的话, 记得取消下目标环境的read_only;

可以取消目标环境主库的主从了.(源端没得写入, 也可以先不取消)


切换

修改业务连接, 或者修改域名, 或者修改中间件的信息. 根据实际情况来.

切换后

业务测试

dba看下连接是否正常, 日志是否存在保存, 有必要的话, 可以巡检下.(表索引统计信息等)

回退方案

略. 基本上就是反向同步回去.

PXC不能反向同步回去, 可以使用my2sql/binlog2sql等工具解析为sql再同步回去

总结

mysql迁到mysql还算不复杂的.

1. mysql 8.0的mysqldump导出的.sql文件 是有set session sql_log_bin=0 的, 所以不会写入binlog, 目标端环境是主从, 所以还要在从库也导出, 或者修改.sql文件去掉 sql_log_bin=0.

2. 检查下event, 这玩意是个坑, 可能导致主从不一致(后面要做源和目标的主从), 在从库非只读的情况下. (当前目标环境 存在其它业务使用, 所以不能设置只读. 所以得临时禁掉event)

3. 仅同步需要的库: CHANGE REPLICATION FILTER REPLICATE_DO_DB=();

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 分析
  • 迁移过程
    • 开启或者关闭GTID
      • 迁移数据
        • 源端导出数据:
        • 目标端导入数据:
      • 迁移账号
        • 导出建用户语句
        • 导出授权语句
      • 迁移后数据同步
      • 切换过程
        • 数据一致性校验
          • 切换前
            • 切换
              • 切换后
              • 回退方案
              • 总结
              相关产品与服务
              云数据库 MySQL
              腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档