源环境A1: mysql 8.0 主从 未使用gtid (迁移部分数据)
源环境A2: mysql 5.7 PXC 未使用gtid (迁移部分数据)
目标环境B1: 8.0 主从(MHA) 使用GTID (存在数据)
目标环境B2: 8.0 主从(MHA) 使用GTID (存在数据)
迁移关系如下
A1 --> B1 (使用GTID)
A2 --> B2 (不使用GTID)
停机时间尽可能短
迁移部分数据, 目标端还有数据, 基本上就确定使用mysqldump工具来做了
停机时间尽可能短, 那就是搭建主从同步剩余数据了.
部分要求开启/关闭gtid, 就需要导数据之前做.
5.7 到8.0 需要注意的事项, 比如字符集,排序规则,sql_mode,默认密码认证插件,空间等 这里就不多说了.
基本上思路就是:
1. 启用/关闭GTID
2. 导出数据到目标环境
3. 搭建主从
4. 数据校验
5. 切换
本来应该分开写的, 但为了节省篇幅, 就放一起了, 不同的我单独说一下就是.
本次需要开启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
建议放后台, 怕会话超时, 导出进程就挂了....
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)
也是建议放后台
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
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账号, 实际环境根据自己的需求来
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)
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语句(可以根据需要排除大表或者不需要校验的表)
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
然后源和目标同时执行即可
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
diff checksum_result_source.log checksum_result_dest.log
1. 业务断开连接
2. 把业务账号锁了. 再show processlist看下, 把未断完的连接kill掉(业务很大可能回露停...)
alter user xxxxx account lock;
select * from information_schema.processlist where db='xxxx';
如果源端没有其它业务使用了的话, 建议设置read_only. 最好把super_read_only也设置上.
3. 记录当前binlog信息
show master status\G
4. 等待主从同步完成
目标环境主库查看
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 删除。