前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[MYSQL案例][003] mariadb 5.5迁移到mysql8.0

[MYSQL案例][003] mariadb 5.5迁移到mysql8.0

原创
作者头像
大大刺猬
发布2023-05-13 12:20:21
发布2023-05-13 12:20:21
84900
代码可运行
举报
文章被收录于专栏:大大刺猬大大刺猬
运行总次数:0
代码可运行

环境/读前须知

源端

目标端

mariadb 5.5.x

mysql 8.0.x

分析

跨大版本迁移, 建议使用逻辑导出导入

mysqldump官方自带的, 单线程, 速度较慢.

mydumper 第三方工具, 支持多线程(某个别表大的话, 速度不明显).

迁移步骤

源库创建同步用户(可选)

代码语言:javascript
代码运行次数:0
复制
create user 'repl'@'%' identified by 'repl'; 
grant all on *.* to 'repl'@'%';
flush privileges;

源库开启binlog(需要重启)

如果源库开启了binlog, 则跳过这一步

如果源库未开启binlog, 则需要修改配置文件,并重启mariadb(源库)

代码语言:javascript
代码运行次数:0
复制
log-bin=mysql_binlogname

源库设置binlog格式为row格式(不需要重启)

代码语言:javascript
代码运行次数:0
复制
set global binlog_format=ROW;

源库导出数据

代码语言:javascript
代码运行次数:0
复制
mysqldump --single-transaction --master-data --databases db1,db2,db3 > t20230513.sql

参数说明

--single-transaction 按照事务导出数据

--master-data 导出文件包含 CHANGE MASTER TO 语句

--databases db1,db2,db3 指定导出数据db1,db2,db3

--host 指定主机

--port 指定端口

--user 指定用户

--password 指定密码

导出数据文件大小可能会比实际的数据文件大, 因为是逻辑导出的. (几乎没有update,delete)

如果数据文件有很多空页, 则导出的文件会比实际的小(增删改较频繁的情况 )

拷贝数据到目标库

代码语言:javascript
代码运行次数:0
复制
scp t20230512.sql IP:/root

目标端导入数据

代码语言:javascript
代码运行次数:0
复制
mysql -hDEST_IP -p123456 < t20230512.sql

目标库修改gtid_mode

因为mariadb5.5无gtid_mode, 所以目标端也要关闭gtid_mode

GTID_MODE=ON时, 不支持匿名事务(源库没得gtid,所以都是默认的匿名事务)

GTID_MODE=OFF时, 只支持匿名事务

GTID_MODE=ON_PERMISSIVE时, 新事务使用gtid,但也支持匿名事务

GTID_MODE=OFF_PERMISSIVE

gtid切换顺序只能是如下箭头所示

代码语言:javascript
代码运行次数:0
复制
ON <--> ON_PERMISIVE <--> OFF_PERMISIVE <--> OFF

gtid_mode

Source OFF

Source OFF_PERMISSIVE

Source ON_PERMISSIVE

Source ON

Replica OFF

Y

Y

N

N

Replica OFF_PERMISSIVE

Y

Y

Y

Y*

Replica ON_PERMISSIVE

Y

Y

Y

Y*

Replica ON

N

N

Y

Y*

代码语言:javascript
代码运行次数:0
复制
set @@GLOBAL.GTID_MODE = ON_PERMISSIVE;

官网说明:https://dev.mysql.com/doc/refman/8.0/en/replication-mode-change-online-concepts.html

在目标库搭建主从

找到log_file和log_pos

代码语言:javascript
代码运行次数:0
复制
head -100 t20230512.sql | grep 'CHANGE MASTER' 
代码语言:javascript
代码运行次数:0
复制
CHANGE MASTER TO
         MASTER_HOST='172.17.32.44',  -- 源库IP, 本环境的mariadb
         MASTER_PORT=3306,  -- 源库端口
         MASTER_USER='repl', -- 主从账号
         MASTER_PASSWORD='repl', -- 主从密码
         master_log_file='mysql_binlogname.000001',  -- mysqldump导出时的log_file
		master_log_pos=332213432; -- mysqldump导出时的 log_pos
		
start slave;
show slave status\G

设置主库为只读(停机起始时间)

设置主库为只读, 就不会新产生二进制日志了. 可以等从库接收完binlog了再设置

代码语言:javascript
代码运行次数:0
复制
set global read_only=ON;

判断从库是否接收完binlog, 可以在从库执行show slave status , 看到如下信息则为接收完binlog

Slave_IO_State: Waiting for source to send event

等待目标库(从库) 同步完数据

使用show slave status看到如下信息, 则为数据同步完成

Slave_SQL_Running_State: Replica has read all relay log; waiting for more updates

目标库停止主从

代码语言:javascript
代码运行次数:0
复制
stop slave;
reset slave all;

校验数据是否一致(可选)

1. 抽查数据

代码语言:javascript
代码运行次数:0
复制
select xx from tablename where id = n;

2.验证部分表

代码语言:javascript
代码运行次数:0
复制
checksum table db1.t3; -- 比较主从库相同表的hash值

3.pt-table-checksum

代码语言:javascript
代码运行次数:0
复制
pt-table-checksum -h172.17.32.47 -uroot -p123456 -P3306 --no-check-binlog-format 

应用切换到目标库(停机结束时间)

总结和注意事项

通过搭建主从的方式迁移数据, 停机时间最短, 但是也较为麻烦.

8.0的数据字典和5.5的差别很大, 不建议导出数据字典, 建议只导出需要的数据.

8.0 有很多不一样的地方, 比如参数, 可以看官网: https://dev.mysql.com/doc/mysqld-version-reference/en/optvar-changes-8-0.html

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 环境/读前须知
  • 分析
  • 迁移步骤
    • 源库创建同步用户(可选)
    • 源库开启binlog(需要重启)
    • 源库设置binlog格式为row格式(不需要重启)
    • 源库导出数据
    • 拷贝数据到目标库
    • 目标端导入数据
    • 目标库修改gtid_mode
    • 在目标库搭建主从
    • 设置主库为只读(停机起始时间)
    • 等待目标库(从库) 同步完数据
    • 目标库停止主从
    • 校验数据是否一致(可选)
    • 应用切换到目标库(停机结束时间)
  • 总结和注意事项
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档