原理:
MySQL主从复制的工作原理如下:
1. 主服务器产生Binlog日志
当主服务器的数据库发生数据修改操作时,如INSERT、UPDATE、DELETE语句执行,主服务器会记录这些操作的日志信息到二进制日志文件中。
2. 从服务器读取Binlog日志
从服务器会向主服务器发送请求,主服务器把自己产生的Binlog日志信息发送给从服务器。
3. 从服务器应用Binlog日志
从服务器接收到Binlog日志后,会按照日志顺序执行这些日志里记录的操作,使数据库的数据保持一致。
4. IO线程和SQL线程
主从复制在从服务器上有两个线程来完成同步工作:
- IO线程:负责与主服务器通信,拉取二进制日志事件。
- SQL线程:负责解析并执行从IO线程读取的二进制日志事件,使得slave端数据实时与master保持同步。
5. relay log
从IO线程读取到的日志记录会写入中继日志(relay log),然后由SQL线程读取并解析执行,实现数据库操作同步。
6. 并发插入处理
对于并发插入,采用自增步长策略。主从数据库的id生成取不同offset,防止主从id重复。
7. SQL处理
复杂的SQL语句如事务或触发器等,先记录日志,之后在slave端执行,保证数据一致性。
总之,通过主服务器产生binlog日志,从服务器不断拉取并执行,就能实现主从数据实时同步的目的。两台数据库的数据将实时保持一致。
操作:
一、主从复制概述
MySQL主从复制是通过日志同步的方式,实现主库数据库修改同步到从库数据库。它可以用于读写分离、负载均衡、故障恢复等场景。主从复制基于MySQL的binlog日志功能实现。
二、环境准备
采用的MySQL版本为5.7,采用Linux操作系统。主从服务器硬件配置相同,软件环境均安装latest版本MySQL。
三、主库配置
- 配置my.cnf开启二进制日志log_bin;
- 设置唯一的server_id;
- 创建用户与权限用于主从同步;
server-id = 1 #id要唯一
log-bin = mysql-bin #开启binlog日志
auto-increment-increment = 1 #在Ubuntu系统中MySQL5.5以后已经默认是1
auto-increment-offset = 1
四、从库配置
- 配置my.cnf开启二进制日志;
- 设置唯一的server_id;
- 创建用户与权限用于主从同步;
server-id = 3 #这个设置3
log-bin = mysql-bin #开启binlog日志
auto-increment-increment = 1 #这两个参数在Ubuntu系统中MySQL5.5以后都已经默认是1
auto-increment-offset = 1
五、数据同步
主库锁表操作:
FLUSH TABLES WITH READ LOCK
5. 在主库使用mysqldump备份数据;
mysqldump -uroot -p123 --routines --single_transaction --master-data=2 --databases weibo > weibo.sql
6. 恢复备份到从库;
7.source /tmp/ weibo.sql;
8. 查看日志位点信息; SHOW MASTER STATUS;
-
从库配置变更点同步主库; SHOW SLAVE STATUS\G
-
启动从库IO、SQL线程;
UNLOCK TABLES;
六、验证同步
查看Slave状态变量是否一致,在从库查看是否同步新增数据
七、处理常见问题
断线后自动同步、binlog错误处理、SQL线程报错等问题解决办法
八、总结
此次通过mysqldump+binlog日志方式实现了MySQL主从配置,支持读写分离和故障恢复。
以上内容系统性地介绍了MySQL主从配置的全过程,可作为主从实践参考。如有不足,还请指出,共同进步。