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日志可以被多个线程读,每次读一个数据库的数据。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)