使用GTID方式轻松实现MySQL主从复制(仅支持Mysql5.7/8.0)
- 基于binlog搭建主从复制
1)、主从复制原理
用户写入数据到master数据库中
master数据库数据写入binlog文件中,通知到slave数据库
slave数据库的I/O线程从master数据库binlog读取数据到slave数据库的relay log中
slave数据库的SQL线程重放relaylog,也就是将数据还原到库中
2)、binlog 三种模式:
通过命令 show variables like ‘binlog_format’; 或 select @@binlog_format;可查看binlog日志模式;也可通过命令set binlog_format=STATEMENT或ROW或MIXED设置binlog模式;命令只是临时的,重启MySQL就会失效,永久设置需要在my.cnf的[msqld]下添加binlog_format=STATEMENT或ROW或MIXED
statement level模式:每一条修改数据的SQL记录到master的binlog中,这样会减少binlog数据量,slave只需根据SQL命令就可以同步数据,但是这只限于简单的SQL操作,如果有依赖宿主环境和复杂函数的SQL就不能正确同步数据了,如记录宿主机机器名等;
row level模式:master的binlog记录每一行数据被修改的形式,slave会做同样的修改,这样可以避免statement level的缺点,但会带来数据量大的问题,如一个简单的update SQL操作,statement level就是一条SQL记录,而row level要记录下所有影响行的数据;
mixed模式:会结合statement level和row level优点区分对待记录日志形式。其实新版本的MySQL已经对row level模式做了一定优化,比如对表定义的修改就以statement level形式记录。
3)、主从复制环境搭建:(如果有防火墙限制,可以先关闭防火墙)MySQL客户端可以是docker内登录或者其他连接MySQL的客户端
a. 主服务器配置如下:
- 开启binlog,MySQL8.0默认开启,可通过命令show variables like ‘log_bin%’;查看到log_bin为ON;如果默认为OFF,即关闭,需要在my.cnf的[msqld]下添加log_bin=mybinlog,mybinlog可以自定义修改,为binlog的basename;
- 设置server_id,在my.cnf的[msqld]下添加server_id=3316,保证集群中唯一;我本地用docker环境,配置的server_id为对外暴露的端口号;
最后编辑:Jeebiz 更新时间:2024-08-22 10:22