查看master库的binlog是否开启
1 | show variables like 'log_%'; |
查看master的所有binlog文件的名称和大小
1 | show master logs; |
查看master状态,即最后(最新)一个binlog日志文件的文件名称,及其最后一个操作事件的End Position值
在主库上执行如下命令:
1 | show master status; |
查看主库master的所有从库
在主库master上执行如下命令,可以查看master的所有从库:
1 | select * from information_schema.processlist as p where p.command = 'Binlog Dump'; |
或者
1 | show slave hosts; |
刷新binlog日志,自此刻开始产生一个新编号的binlog日志文件
1 | flush logs; |
重置(清空)所有binlog日志
1 | reset master; |
查看当前有哪些线程在运行,排查有问题的操作动作
1 | show processlist; |
如下为各列的含义和用途:
id #一个标识,并非操作系统中的线程ID哦,你要kill一个语句的时候很有用
user #显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句
host #显示这个语句是从哪个ip的哪个端口上发出的
db #显示这个进程目前连接的是哪个数据库
command #显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接 (connect)
time #此这个状态持续的时间,单位是秒
state #显示使用当前连接的sql语句的状态
info #显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据
备注:我们可以执行命令mysqladmin processlist
或直接查询information_schema.processlist
表来查看同样的内容。
使用show binlog events命令来读取并解析binlog日志
1 | show binlog events\G; --查询并解析第一个(最早)的binlog日志内容 |
举例来说,
Pos:204,End_log_pos:365表示,该event是记录在mysql-bin.000001文件的第204字节和第365字节之间。
使用mysqlbinlog /path/to/mysql-binlog-file工具来读取并解析binlog日志
1 | mysqlbinlog /var/lib/mysql/mysql-bin.000001 |
通过show slave status命令查看从库的同步状态
在slave节点上执行如下命令,
1 | show slave status\G; |
如下为各字段的含义:
Slave_IO_State #Slave IO线程的执行状态
Master_User #被用于连接主服务器的当前用户
Master_Port #当前的主服务器接口
Connect_Retry #--master-connect-retry选项的当前值
Master_Log_File #Slave I/O线程当前正在读取的主服务器二进制日志文件的名称
Read_Master_Log_Pos #在当前的主服务器二进制日志中,Slave I/O线程已经读取的位置
Relay_Log_File #Slave SQL线程当前正在读取和执行的中继日志relaylog文件的名称
Relay_Log_Pos #在当前的中继日志relaylog中,Slave SQL线程已读取和执行的位置
Relay_Master_Log_File #由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称
Slave_IO_Running #Slave I/O线程是否被启动并成功地连接到主服务器上(状态信息为Yes/No)
Slave_SQL_Running #Slave SQL线程是否被启动(状态信息为Yes/No)
Replicate_Do_DB #使用--replicate-do-db选项指定的需要同步的数据库名称
Replicate_Ignore_DB #使用--replicate-ignore-db选项指定不需要同步的数据库名称
Replicate_Do_Table,Replicate_Ignore_Table,Replicate_Wild_Do_Table,Replicate_Wild_Ignore_Table #使用--replicate-do-table,--replicate-ignore-table,--replicate-wild-do-table和--replicate-wild-ignore_table选项指定的需要同步或不需要同步的数据库表名称
Last_Errno,Last_Error #被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示
Relay_Log_Space #所有原有的中继日志结合起来的总大小
Seconds_Behind_Master #本字段是Slave数据库实例“落后”Master数据库多少的一个指示(即延迟,单位为秒)
备注:在日常MySQL数据运维中,我们需要判断主从复制的状态是否正常。通常来说,只需要Slave_IO_Running参数和Slave_SQL_Running参数都为Yes的情况下,并且Seconds_Behind_Master延迟小于一定数值的时候,我们就可以认定mysql主从是同步的。
另外,对于MySQL 5.7+及MariaDB来说,它们支持“多源复制”,也即是“多主库对应一个从库”的复制结构,那么对于slave库来说,同时会从多个主库上复制数据,也即有多个Slave IO线程和SQL线程,那么直接执行show slave status
会返回为空,此时可以执行如下命令来查看slave的同步状态:
1 | show all slaves status \G; --查看所有slave的复制状态,也是在Slave节点上执行 |
关闭或启动slave IO线程或SQL线程
1 | start slave; --启动slave |
删除主从配置的设置
我们使用change master to
命令来配置主从同步关系,假设我们不仅想停止主从同步,而且想删除这种主从同步的关系。可以使用如下的操作的方法:
1 | stop slave; --停掉slave的同步 |
备注:如果使用reset slave
仅仅会重置主从同步的状态,并没有删除主从同步的配置。而reset slave all
则会删除主从同步配置。
对于在MySQL 5.7+及MariaDB来说,支持“多源复制”,我们想停掉某一个slave的方式如下:
1 | stop slave 'xx_db'; |
其他闲杂知识
在MySQL 5.7+中增加了很多的表,用来对主从同步复制进行管理,即在performance_schema
数据库中以replication_
开头的一些数据库表。