mysql主从复制
1、原理
mysql主从复制,将数据库中所有数据实时的备份到另一个机器上,防止数据丢失。
过程:
A.当一个事务在主库被提交时, 会产生gtid号, 并记录至主库的binlog日志中
B.从库的IO线程读取主库的log_dump_thread进程所传输的bin_log日志, 并将结果记录至从库的relay log中
C.从库的SQL线程读取relay log记录的gtid号, 然后对比本地的bin_log日志, 存在即代表执行过, 不存在则SQL线程会执行该事务, 并记录到本地的bin_log日志中
2、环境准备
关闭防火墙、selinux
3、部署主从复制
分别在主库、从库的机器上编辑mysql配置文件,添加如下内容:
vim /mysql/conf/mysql.conf
gtid-mode = ON
log-slave-updates = 1
server_id = 1 每台机器的id不能相同,一般主库为1,从库顺延
log-bin = MySQL-bin
enforce_gtid_consistency = 1
log-bin-index = MySQL-bin.index
重启数据库:systemctl restart mysqld
在主库建立同步用户:
mysql> grant replication slave on *.* to rep@"192.168.88.%" identified by '123Abc..';
建立rep用户,授予192.168.88.0.%网段的机器登录的权限
登录从库配置:
mysql> change master to
-> master_host='192.168.88.151', 主库ip地址
-> master_user='rep', 同步用户账号
-> master_password='123Abc..', 同步用户账户密码
-> master_port=3306, 主库mysql端口
-> master_auto_position=1;
在从库开启主从复制:
mysql> start slave;
4、验证主从复制状态
从库:
mysql> show slave status\G;
如果Slave_IO_Running及Slave_SQL_Running均显示Yes,则表明主从复制配置成功
主库:
mysql> show master status;
5、主从复制状态详解
从库执行:
mysql> show slave status\G;
*************************** 1. row ***************************
SHOW PROCESSLIST输出的State字段的拷贝,当前显示状态表示正视图连接主库服务器:
Slave_IO_State: Waiting for master to send event
连接的主库服务器ip:
Master_Host: 192.168.88.151
被用于连接主服务器的当前用户:
Master_User: rep
连接的主库服务器mysql端口:
Master_Port: 13309
Connect_Retry: 60
I/O线程当前正在读取的主服务器二进制日志文件的名称:
Master_Log_File: MySQL-bin.000002
在当前的主服务器二进制日志中,I/O线程已经读取的位置:
Read_Master_Log_Pos: 224793231
SQL线程当前正在读取和执行的relay-log日志文件的名称
Relay_Log_File: db2-test-server-relay-bin.000003
在当前的relay-log日志中,SQL线程已读取和执行的位置:
Relay_Log_Pos: 224793444
由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称:
Relay_Master_Log_File: MySQL-bin.000002
I/O线程是否被启动并成功地连接到主库服务器上,显示Yes表明连接成功,如果显示No或connecting则表示连接异常:
Slave_IO_Running: Yes
SQL线程是否运行正常,显示Yes表明SQL线程运行正常,显示No表明SQL线程运行异常:
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、Last_Error分别表示为最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中进行记录:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置:
Exec_Master_Log_Pos: 224793231
所有原有的中继日志结合起来的总大小:
Relay_Log_Space: 224793661
Until_Condition具有以下值:
None:表示没有指定UNTIL子句,返回值为空
Master:表示如果从库服务器正在读取,直到达到主服务器的二进制日志的给定位置为止前的状态
Relay:如果从库服务器正在读取,直到达到其relay-log日志的给定位置为止前的状态
Until_Condition: None
Until_Log_File和Until_Log_Pos分别表示用于指示日志文件名和位置值,日志文件名和位置值定义了SQL线程在哪个点中止执行:
Until_Log_File:
Until_Log_Pos: 0
表示被从库服务器用于连接主库服务器的参数:
显示Yes,表示允许对主库服务器进行ssl的连接
显示为No,表示不允许对主库服务器进行ssl的连接
显示为Ignored,表示允许SSL连接,但是从库服务器没有让ssl支持启用
Master_SSL_Allowed: No
Master_SSL_CA_File:
Master_SSL_CA_Path:
Master_SSL_Cert:
Master_SSL_Cipher:
Master_SSL_Key:
Seconds_Behind_Master表示从库服务器的SQL线程与IO线程产生的延迟时间,单位为秒。如果没有延迟,则表示为0;如果从库IO线程未运行或与主库服务器未连接,则显示为NULL。注意,不能通过此项观察出主库服务器与从库服务器之间的网络延迟时间,即使从库服务器的IO线程落后于主库服务器,只要从库服务器的SQL线程足够快速,那么也是显示为0。
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: efb164d3-30ea-11ed-8463-000c29994063
Master_Info_File: /mysql/data/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: efb164d3-30ea-11ed-8463-000c29994063:1-1395
Executed_Gtid_Set: efb164d3-30ea-11ed-8463-000c29994063:1-1395
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Master_TLS_Version:
1 row in set (0.00 sec)
主库执行:
mysql> show master status\G;
*************************** 1. row ***************************
File: MySQL-bin.000002
Position: 224793231
由数据库参数binlog_do_db列出的数据库填充:
Binlog_Do_DB:
由数据库参数binlog_ignore_db填充,如果以上任何配置中都不存在值,那么所有数据库中的写入活动都会被列入二进制日志中:
Binlog_Ignore_DB:
显示在主库上执行全局事务标识符:
Executed_Gtid_Set: efb164d3-30ea-11ed-8463-000c29994063:1-1395
1 row in set (0.00 sec)
监控mysql主从复制状态是否异常,需要关注以下几个参数是否正常:
Slave_IO_Running
Slave_SQL_Running
Last_Errno
Last_Error
Last_SQL_Errno
Last_SQL_Error
Seconds_Behind_Master
附:mysql主从复制部署过程排错
1、若Slave_IO显示异常时:
2、若SQL_Runing显示异常时:
注意:selinux、firewalld必须要关闭