mysql主从原理(异步复制)
(2019-01-21 17:28:51)分类: mysql主从及监控 |
主从复制作用:数据分布(异机或异地)---负载均衡----备份----高可用和故障转移----升级测试.
主从原理:
主服务器的一个工作线程: DUMP线程,作用:接收到从库发来的请求后,负责给slave服务器发送二进制日志 从服务器的两个工作线程: I/O线程: 作用:负责读取主服务器的二进制日志,并将其保存到自己的中继日志文件中。 SQL线程: 作用:来复制执行中继日志。 注意从库的IO线程和SQL线程是分开的,互不影响.
|
主从参数介绍:
binlog-do-db =
# binlog-ignore-db =
# max_binlog_size = 2048M
# binlog_format =
ROW transaction-isolation =
READ-COMMITTED expire_logs_days = 7 # binlog保留多少天,看公司计划安排 server-id = 111
# binlog_cache_size = #
binlog sync_binlog = 1
# innodb_flush_log_at_trx_commit
= 1 # innodb_support_xa = 1 从库参数: log_slave_updates
# replicate-do-db =
# replicate-ignore-db =
# replicate-do-table =
# replicate-ignore-table
= server-id = 112
# relay-log-recover = 1 # I/O
thread crash safe relay_log_info_repository =
TABLE # SQL thread crash safe Skip-slave-start=1 master
info Relay_log_info主要记录SQL线程回放relay_log位置的信息. show variables like '%relay_log_info%'; 查看主库拥有的从库的个数: 可以有多个从库,但从库之间的uuid不能一致,若一致,可以修改配置文件中的service_id,删除数据文件中的auto.cnf,再重新开启数据库. read_only=1 super_read_only 搭建主从后,开启read_only,保证从库其他用户不写入数据 |
主从全新搭建过程:
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化. change master to master_host='192.168.88.2',master_user='rep',master_password='rep', master_log_file='mysql-bin.000002',master_log_pos=154,MASTER_PORT=3307; 其中master_log_file和master_log_pos是主库show master status的结果. 开启主从复制: 查看主从状态: unlock table; |
主从状态(show slave status\G;)字段含义:
主从状态字段含义mysql> show slave status\G; *************************** 1. row *************************** Slave_IO_State: Waiting for master to send event Master_Host: 192.168.60.22 Master_User: rep Master_Port: 3306
Connect_Retry: 60
Master_Log_File:
mysql-bin.000006
Read_Master_Log_Pos: 1173
Relay_Log_File: hadoop02-relay-bin.000002
Relay_Log_Pos: 1336
Relay_Master_Log_File: mysql-bin.000006
Slave_IO_Running: Yes-----------------此状态必须YES Slave_SQL_Running: Yes-----------------此状态必须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: 1173----当前中继日志的回放位置. Relay_Log_Space: 1512
Seconds_Behind_Master: 0 主从参数说明: Slave_IO_state:显示当前IO线程的状态,一般情况下就是显示等待主服务器发送二进制日志。 Master_log_file:显示当前同步的主服务器的binlog日志。 Read_master_log_pos:显示主服务器上binlog的pos点。 上面两个参数决定了目前主库的binlog的位置. Relay_master_log_file:当前中继日志同步的主库的哪个binlog日志。 Relay_log_file:显示当前写入的中继日志。 Relay_log_pos:显示当前写入到中继日志的pos点。 上面两个参数决定了中继日志的写入位置. Slave_IO_running:从服务器中IO线程的运行状态,yes代表正常 Slave_SQL_running:从服务器中sql线程的运行状态,YES代表正常 上面两参数决定了主从是否正常 Exec_Master_log_pos:表示从库SQL线程应用中继日志的pos点。可Read_master_log_pos相比较,若相等,则表示无延迟. |
|
主从有问题跳一步语句
set global sql_slave_skip_counter=1; start slave; |
myisam搭建主从
flush tables with read lock; 主库数据备份:必用参数 --single-transaction —master-data /usr/local/mysql/bin/mysqldump
-uroot -pLR9fjxm3g -S /tmp/mysql3307.sock -A --single-transaction
--master-data=2
传输到从库: scp /tmp/20160303all2.sql
从库恢复:在从库恢复主库备份过得数据文件 mysql -uroot -p -S /tmp/mysql3307.sock 或者进入数据库后使用source命令(建议使用source命令,因为source命令会打印结果) 查找主库pos: 使用head命令查找前35行备份文件,然后找到描述master head -n 35 /tmp/20160303all2.sql CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000007', MASTER_LOG_POS=88940; 从库进行指定: change master to master_host='192.168.95.100',master_user='rep',master_password='rep', master_log_file='mysql-bin.000007',master_log_pos=88940,MASTER_PORT=3307; 开启:start slave 进行start slave后,从库会有一个追逐主库的过程,在追完主库后,可以进行业务的迁移或者作为从库使用. |
并行复制原理及版本变迁的主从变化
5.5版本 单线程复制 5.6版本 并行复制,只实现库级别的并行复制,业务,不会跨库访问 但大多数操作都是单库多表,而不是多库多表,意义不大. 5.7 8.0
|
主从延迟的判定
1.show slave status显示参数Seconds_Behind_Master不为0,这个数值可能会很大,
2.Read_Master_Log_Pos和Exec_Master_Log_Pos显示bin-log的编号相差很大,说明bin-log在从库上没有及时同步,所以近期执行的bin-log和当前IO线程所读的bin-log相差很大 3.、MySQL的从库数据目录下存在大量mysql-relay-log日志,该日志同步完成之后就会被系统自动删除,存在大量日志,说明主从同步延迟很厉害. |
主从产生延迟的原因和解决方法
|
一般主从问题总结
IO线程出问题:
1.主库的binlog问题 比如找不到主库的binlog 2.主库的权限不对,IO connectiong... 3.relay log写入可能出问题,具体出问题的位置,看报错 SQL线程出问题: 1.主键冲突 2.从库少数据 3.主从的数据的格式不对(int char vvarchar) ERROR 1062 :从库插入数据,发生唯一性冲突 ERROR 1032:从库找不到要删除的数据 ERROR 1452:无法在外键的表中插入或者更新参考主键没有的数据 |
主从一致问题原理(IO|SQL线程高可靠性)
|
主从跨版本搭建数据库需要注意的情况:
2. mariadb和mysql的binlog格式不一样,不能进行主从的搭建 |