mysql主从复制
主从复制原理:
主节点:主节点上有dump 线程,为每个slave的io线程启动一个dump线程,用于发送二进制日志
从节点:从节点的io线程向mater请求二进制日志,索要日志成功后把二进制日志保存在relay-log, sql 线程从中级日志中读取sql语句并在本地重现这个日志
执行过程详解:
1.从服务器执行change master to start slave 开启主从复制的开关
2.从服务器此时io线程会拿着授权用户信息来连接主服务器并请求从指定的binlog文件和pos点之后发送的内容
3.主服务器收到从服务器的io线程的请求,启动一个dump线程,分批读取logbin指定位置之后的语句和下一次需要用的logbin文件和pos点,发给从服务器
4.从服务器的io线程拿到logbin文件后,把文件存入relay-log下,并讲主服务器给的下次需要的binlog文件和pos 点pos一起保存
5.从服务器的sql线程检测到relay-log有变化,就读取并执行
主从复制的图片实例:
主从复制的配置:
主服务器:1.开启二进制日志
2.设置唯一的server-id
3.授权用户
4.查看pos点
例子:一主一从:
master服务器:192.168.213.4 slave服务器:192.168.213.5 主服务器配置: 1.开启二进制日志:log-bin=/data/mysqlbin/aa server-id=1 2.重启mysqld服务:systemctl restart mysqld 3.授权用户:grant replication slave on *.* repl0(创建的用户)@192.168.213.5(slave服务器ip) identified by "123456"; 4.查看master的二进制日志文件名和pos点:show master status; mysql> show master status; +-----------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------+----------+--------------+------------------+-------------------+ | aa.000001 | 1348 | | | | +-----------+----------+--------------+------------------+-------------------+ 从服务器: 1.设置server-id,不同于master的id 2.关闭二进制日志 3.登录mysql,且change master mysql> change master to master_host=192.168.213.4,master_password='123456',master_port=3306,master_log_file='aa.000001',master_log_pos=1348; #master_log_file=从master那查看的二进制日志文件名,master_log_pos=从master查看的pos点
4.开启主从:start slave;
5.查看主从状态:show slave status\G;
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.213.4
Master_User: repl
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: aa.000001
Read_Master_Log_Pos: 1348
Relay_Log_File: localhost-relay-bin.000003
Relay_Log_Pos: 313
Relay_Master_Log_File: aa.000001
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Master_Log_Pos: 1348
Relay_Log_Space: 1291
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Master_Server_Id: 1
Master_UUID: 8d7574c9-feb9-11eb-9e31-000c290639b2
Master_Info_File: /var/lib/mysql/master.info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
Master_Retry_Count: 86400
Master_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Master_SSL_Crl:
Master_SSL_Crlpath:
Retrieved_Gtid_Set:
Executed_Gtid_Set:
Auto_Position: 0
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
注意,如果查看主从状态发现,这样的,表示主库和从库数据存在不一致,需要把主库的数据导出复制给从库,在关闭主从,重新开启主从,在查看状态
mysql> stop slave;
Query OK, 0 rows affected (0.00 sec)
mysql> start slave
-> 一主多从配置案例:环境准备:master:192.168.213.4 从1:192.168.213.4
从2:192.168.213.6 master端配置: 开启二进制日志 配置server-id 从1配置: 关闭二进制日志 配置server-id #id号需要唯一不重复 重启mysqld服务 在master端授权用户和查看pos点 mysql> show master status; +-----------+----------+--------------+------------------+-------------------+ | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set | +-----------+----------+--------------+------------------+-------------------+ | aa.000002 | 154 | | | | +-----------+----------+--------------+--- 主服务器授权:mysql> grant replication slave on *.* to repl@'192.168.213.5/192.168.213.6' identified by '123456'; Query OK, 0 rows affected, 1 warning (0.00 sec) 两台从服务器执行:mysql> change master to master_host='192.168.213.4',master_user=repl,master_password='123456',master_log_file='aa.000002',master_llog_pos=615; Query OK, 0 rows affected, 2 warnings (0.01 sec)
从服务器执行start slave;
查看从服务器运行状态:两台从服务器可以看到Slave_IO_Running: Yes
Slave_SQL_Running: Yes的状态就行了
mysql> show slave status\G;
*************************** 1. row ***************************
Slave_IO_State: Waiting for master to send event
Master_Host: 192.168.213.4
Master_User: zhao
Master_Port: 3306
Connect_Retry: 60
Master_Log_File: aa.000005
Read_Master_Log_Pos: 2302
Relay_Log_File: server-relay-bin.000002
Relay_Log_Pos: 313
Relay_Master_Log_File: aa.000005
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
互为主从:只能主上写,从上读
配置就是两台服务器都开启二进制日志,其他配置一样
tips:如果需要从服务器的修改同步主服务器,需要在配置文件插入:log_slave_update=1
级联复制:
三台主机:主:192.168.213.4 从/主:192.168.213.5,作为4的从也作为6的主服务器 从:192.168.213.6
配置:主服务器开启二进制,配置server-id ,在主服务器授权5和6
从:192.168.213.5开启二进制日志配置server-id,配置change master to 192.168.213.4,且配置192.168.213.6的授权
从:192.168.213.6不用开启二进制不过需要配置server-id ,执行change master to 192.168.213.5
GTID复制:
配置文件:在mysqld配置下加入这样的,注意主从都徐娅添加gtid
gtid_mode=on
enforce_gtid_consistency
重启服务
在从服务器执行:
mysql> change master to master_user='zhao',master_password='123456',master_host='192.168.213.4',master_auto_position=1; #只是把pos点和log-file改成了master_auto_position
在查看就可以同步了
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了