mysql主从复制原理
binlog日志,对数据库的增删改操作都会写入一个日志文件,记录这个操作的日志
8.0之前需要手动在my.ini 或 my.cnf文件下配置
#篇日志开启binlog日志,日志的文件前缀为mysqlbin---》生成的文件名如 mysqlbin.000001,mysqlbin.000002
log_bin=mysqlbin
#配置二进制日志的格式
binlog_format=STATEMENT
日志格式
STATEMENT
该日志格式在日志文件中记录的都是SQL语句(statement),每一条对数据进行修改的SQL都会记录在日志文件中,通过mysql提供的mysqlbinlog工具,可以清晰的查看到每条语句的文本。主从复制的时候,从库(slave)会将日志解析为原文本,并在从库重新执行一次。
ROW(8.0默认)
该日志格式在日志文件中记录的是每一行的数据变更,而不是记录SQL语句。比如,执行SQL语句:update tb_book set status = '1' ,如果是STATEMENT日志格式,在日志中会记录一行SQL文件,如果是ROW,由于是对全表进行更新,也就是每一行记录都会发生变更,ROW格式的日志中会记录每一行的数据变更。
MIXED
混合了statement 和 row两种格式
查看binlog日志
-- 查看mysql是否开启了binlog日志
show variables like 'log_bin';
-- 查看binlog日志的格式
show variables like 'binlog_format'
-- 查看所有日志
show binlog events;
-- 查看最新的日志
show master status;
-- 查询指定的binlog日志
show binlog events in 'binlog.000008';
-- 查询指定的binlog日志 从位置123开始
show binlog events in 'binlog.000008' from 123;
-- 清空全部binlog日志
reset master
主从复制的时候,主数据库把binlog日志复制给从数据库,从数据库的io线程把日志写入relay日志
然后从relay日志中把数据变更到数据表,从库整个过程是串行化的。
mysql5.6之前从库IO线程单线程,之后改成了多线程读取binlog日志。
从库上的数据会比主库慢一些。
主从同步问题:
主服务器宕机,日志还没来得及给从数据库,从变主,数据丢失。
mysql提供一个半同步复制,semi-sync复制,指定就是主库写入binlog日志之后,就会强制将此时数据同步到从库,从库讲日志写入本地relay log 之后,接着返回一个ack给主库,主库接收到至少一个从库的ack之后才会认为写操作成功。
并行复制
新版本relay日志可以被多个线程读,每次读一个数据库的数据。

浙公网安备 33010602011771号