使用GTID方式轻松实现MySQL主从复制(仅支持Mysql5.7/8.0)

  1. 基于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  创建时间:2023-01-11 12:12
最后编辑:Jeebiz  更新时间:2024-08-22 10:22