站点图标 起风网

复制信息记录表|全方位认识 mysql 系统库

复制信息记录表|全方位认识 mysql 系统库缩略图

复制信息记录表|全方位认识 mysql 系统库

2020-12-04 00:00
来源:老叶茶馆

原标题:复制信息记录表|全方位认识 mysql 系统库

在上一期《时区信息记录表|全方位认识 mysql 系统库》中,我们详细介绍了mysql系统库中的时区信息记录表,本期我们将为大家带来系列第七篇《复制信息记录表|全方位认识 mysql 系统库》,下面请跟随我们一起开始 mysql 系统库的系统学习之旅吧!

1、复制信息表概述

复制信息表用于在从库在复制主库的数据期间,用于保存从主库转发到从库的二进制日志事件、记录有关中继日志当前状态和位置的信息。一共有三种类型的日志,如下:

设置relay_log_info_repository和master_info_repository设置为TABLE可以提高数据库本身或者所在主机意外终止之后crash recovery的能力(这两张表是innodb表,可以保证crash之后表中的位置信息不丢失),且可以保证数据一致性。

从库crash时,SQL线程可能还有一部分relay log重放延迟,另外,IO线程的位置也可能正处于一个事务的中间,并不完整,所以必须在从库上启用参数relay-log-recovery=ON,启用该参数之后,从库crash recovery时会清理掉SQL线程未重放完成的relay log,并以SQL线程的位置为准重置掉IO线程的位置重新从主库请求。

这两张表在数据库实例启动时如果无法被mysqld初始化,则mysqld允许继续启动,但会在错误日志中写入警告信息,这种情况在MySQL从不支持该表的版本升级到支持该表的版本时常常遇见。

PS:

2、复制信息表详解

由于本期所介绍的表中存放的复制信息,在我们日常的数据库维护过程当中尤其重要,所以,下文中会在每张表的介绍过程中适度进行一些扩展。

2.1. slave_master_info该表提供查询IO线程读取主库的位置信息,以及从库连接主库的IP、账号、端口、密码等信息。

root@localhost : mysql 01:08:29> select * from slave _master_infoG;

*************************** 1. row ***************************

Number _of_lines: 25

Master _log_name: mysql-bin.000292

Master _log_pos: 194

Host: 192.168.2.148

User_name: qfsys

User_password: letsg0

Port: 3306

Connect_retry: 60

Enabled_ssl: 0

Ssl_ca:

Ssl_capath:

Ssl_cert:

Ssl_cipher:

Ssl_key:

Ssl _verify_server_cert: 0

Heartbeat: 5

Bind:

Ignored _server_ids: 0

Uuid: ec123678-5e26-11e7-9d38-000c295e08a0

Retry_count: 86400

Ssl_crl:

Ssl_crlpath:

Enabled _auto_position: 0

Channel_name:

Tls_version:

1 row in set (0.00 sec)

表字段与show slave status输出字段、master.info文件中的行信息对应关系及其表字段含义如下:

master.info文件中的行数 mysql.slave_master_info表字段 show slave status命令输出字段 字段含义描述
1 Number_of_lines [None] 表示master.info中的信息行数或者slave_master_info表中的信息字段数
2 Master_log_name Master_Log_File 表示从库IO线程当前读取主库最新的binlog file名称
3 Master_log_pos Read_Master_Log_Pos 表示从库IO线程当前读取主库最新的binlog position
4 Host Master_Host 表示从库IO线程当前正连接的主库IO或者主机名
5 User_name Master_User 表示从库IO线程用于连接主库用户名
6 User_password [None] 表示从库IO线程用于连接主库的用户密码
7 Port Master_Port 表示从库IO线程所连接主库的网络端口
8 Connect_retry Connect_Retry 表示从库IO线程断线重连主库的间隔时间,单位为秒,默认值为60
9 Enabled_ssl Master_SSL_Allowed 表示主从之间的连接是否支持SSL
10 Ssl_ca Master_SSL_CA_File 表示CA(Certificate Authority )认证文件名
11 Ssl_capath Master_SSL_CA_Path 表示CA(Certificate Authority )认证文件路径
12 Ssl_cert Master_SSL_Cert 表示SSL认证证书文件名
13 Ssl_cipher Master_SSL_Cipher 表示用于SSL连接握手中可能使用到的密码列表
14 Ssl_key Master_SSL_Key 表示SSL认证的密钥文件名
15 Ssl_verify_server_cert Master_SSL_Verify_Server_Cert 表示是否需要校验server的证书
16 Heartbeat [None] 表示主从之间的复制心跳包的间隔时间,单位为秒
17 Bind Master_Bind 表示从库可用于连接主库的网络接口,默认为空
18 Ignored_server_ids Replicate_Ignore_Server_Ids 表示从库复制需要忽略哪些server-id,注意:这是一个列表,第一个数字表示需要忽略的实例server-id总数
19 Uuid Master_UUID 表示主库的UUID
20 Retry_count Master_Retry_Count 表示从库最大允许重连主库的次数
21 Ssl_crl [None] SSL证书撤销列表文件的路径
22 Ssl_crl_path [None] 包含ssl证书吊销列表文件的目录路径
23 Enabled_auto_position Auto_position 表示从库是否启用在主库中自动寻找位置的功能(使用1时启动自动寻找位置,如果使用auto_position=0,则不会自耦东找位置)
24 Channel_name Channel_name 表示从库复制通道名称,一个通道代表一个复制源
25 Tls_Version Master_TLS_Version 表示在Master上的TLS版本号

2.2. slave_relay_log_info
该表提供查询SQL线程重放的二进制文件对应的主库位置和relay log当前最新的位置。

root@localhost : mysql 10:39:31> select * from slave _relay_log_infoG

*************************** 1. row ***************************

Number _of_lines: 7

Relay _log_name: /home/mysql/data/mysqldata1/relaylog/mysql-relay-bin.000205

Relay _log_pos: 14097976

Master _log_name: mysql-bin.000060

Master _log_pos: 21996812

Sql_delay: 0

Number _of_workers: 16

Id: 1

Channel_name:

1 row in set (0.00 sec)

表字段与show slave statu s输出字段、relay-log.info文件中的行信息对应关系及其表字段含义如下:

relay-log.info文件中的行数 mysql.slave_relay_log_info表字段 show slave status命令输出字段 字段含义描述
1 Number_of_lines [None] 表示relay-log.info中的信息行数或者slave_relay_log_info表中的信息字段数,用于版本化表定义
2 Relay_log_name Relay_Log_File 表示当前最新的relay log文件名称
3 Relay_log_pos Relay_Log_Pos 表示当前最新的relay log文件对应的最近一次完整接收的event的位置
4 Master_log_name Relay_Master_Log_File 表示SQL线程当前正在重放的中继日志对应的主库binlog 文件名
5 Master_log_pos Exec_Master_Log_Pos 表示SQL线程当前正在重放的中继日志对应主库binlog 文件中的位置
6 Sql_delay SQL_Delay 表示延迟复制指定的从库必须延迟主库多少秒
7 Number_of_workers [None] 表示从库当前并行复制有多少个worker线程
8 Id [None] 用于内部唯一标记表中的每一行记录,目前总是1
9 Channel_name Channel_name 表示从库复制通道名称,用于多源复制,一个通道对应一个主库源

什么是中继日志:

在什么情况下会产生新的中继日志文件。

SQL线程在执行完relay log之后,会自行决定何时清理掉这些已经执行完成的relay log文件,但如果使用FLUSH LOGS语句或mysqladmin flush-logs命令强制滚动中继日志时,SQL线程可能会同时清理掉已经执行完成的relay log文件。

2.3. slave_worker_info该表提供查询多线程复制时的worker线程状态信息,与performance_schema.replication_applier_status_by_worker表的区别是:slave_worker_info表记录worker线程重放的relay log和主库binlog位置信息,而performance_schema.replication_applier_status_by_worker表记录的是worker线程重放的GTID位置信息。

root@localhost : mysql 01:09:39> select * from slave _worker_info limit 1G;

*************************** 1. row ***************************

Id: 1

Relay _log_name:

Relay _log_pos: 0

Master _log_name:

Master _log_pos: 0

Checkpoint _relay_log_name:

Checkpoint _relay_log_pos: 0

Checkpoint _master_log_name:

Checkpoint _master_log_pos: 0

Checkpoint_seqno: 0

Checkpoint _group_size: 64

Checkpoint _group_bitmap:

Channel_name:

1 row in set (0.00 sec)

表字段含义。

该表中记录的内容对从库多线程复制crash recovery至关重要,所以下文对该表中记录的内容如何作用于crash recovery过程进行一些必要的说明。
从库多线程复制如何做复制分发。

从库多线程复制的crash recovery。

每一个事务在分发到worker线程之后,都会分配一个编号,这个编号在某一段时间内,都是相对固定的,这个编号一旦被分配,就不会再改变。在事务被某个worker线程执行完成之后,它的位置信息就会被flush一次,这与5.5版本中的relay_log_info记录的原理是类似的(relay_log_info中存放了从库当前SQL线程重放的位置),但是现在是多线程,每个worker线程的执行位置不能直接存放在relay_log_info中了,relay_log_info中存放的是所有worker线程汇总之后的位置,每个worker线程独立的位置信息存放在了mysql.slave_worker_info表中,在该表中,有多少个并行复制线程,就有多少行记录(如果是多主复制,则每个复制通道都有slave_parallel_workers变量指定的记录数)。mysql.slave_worker_info表中,Checkpoint开头的字段记录了每个worker线程的检查点相关的信息(这里与innodb存储引擎的检查点不同,但是概念相通),worker线程的检查点的作用是什么呢?

PS:
如果在主从复制架构中,有2个以上的从库,且从库永远不做提升主库的操作时,可以使用如下方法优化从库延迟(在该场景下,从库无需担心数据丢失问题,因为有另外一个从库兜底+不做主从切换,只需要专心提供快速应用主库binlog与只读业务即可)。

2.4. gtid_executed
前面介绍的三张表中,存放的都不包括GTID信息,在数据库运行过程中,GTID相关的信息是保存在performance_schema下的相关表中,详见”全方位认识 performance_schema”系列文章《复制状态与变量记录表 | performance_schema全方位介绍》。
但是performance_schema下的表都是内存表,记录的信息是易失的。gtid_executed表才是GTID信息的持久表,该表提供查询与当前实例中的数据一致的GTID集合(该表用于存储所有事务分配的 GTID集合,GTID集合由UUID集合构成,每个UUID集合的组成为:uuid:interval[:interval]…,例如 :28b13b49-3dfb-11e8-a76d-5254002a54f2:1-600401,
3ff62ef2-3dfb-11e8-a448-525400c33752:1-110133)

从MySQL 5.7.5开始,GTID存储在mysql数据库的名为gtid_executed的表中。
对于每个GTID集合,默认情况下值记录每个GTID集合的起始和结束的事务号对应的GTID,该表只在数据库初始化或者执行update_grade升级的时候创建,不允许手工创建于修改。当实例本身有客户端访问数据写入或者有从其他主库通过复制插件同步数据的时候,该表中会有新的GTID记录写入,另外,该表中的记录还会在binlog滚动或者实例重启的时候被更新(日志滚动时该表需要把除了最新的binlog之外其他binlog中的所有GTID结合记录到该表中,实例重启时,需要把所有的binlog中的GTID集合记录到该表中)。
由于有mysql.gtid_executed表记录GTID(避免了binlog丢失的时候丢失GTID历史记录),所以,从5.7.5版本开始,在复制拓扑中的从库允许关闭binlog,也允许在binlog开启的情况下关闭log_slave_updates变量。
由于GTID必须要再gtid_mode为ON或者为ON_PERMISSIVE时才会生成,所以自然该表中的记录也需要依赖于gtid_mode变量为ON或ON_PERMISSIVE时才会进行记录,另外,该表中是否实时存储GTID,取决于binlog日志是否开启,或者binlog启用时是否启用log_slave_updates变量,如下:

该表中的记录周期性执行压缩示例。

# 假设表中有如下实时记录的GTID记录

mysql> SELECT * FROM mysql.gtid_executed;

+ ————————————– + ———- —— + ————– +

| source_uuid |interval_start | interval_end |

| ————————————– + ———- —— + ————– |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |37| 37 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |38| 38 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |39| 39 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |40| 40 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |41| 41 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |42| 42 |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |43| 43 |

# 那么,每达到gtid_executed_compression_period变量定义的事务个数时,激活压缩功能,GTID被压缩为一行记录,如下

+ ————————————– + ———- —— + ————– +

| source_uuid |interval_start | interval_end |

| ————————————– + ———- —— + ————– |

| 3E11FA47-71CA-11E1-9E33-C80AA9429562 |37| 43 |

# 注意:当gtid_executed_compression_period系统变量设置为0时,周期性自动压缩功能失效,你需要预防该表被撑爆的风险

表字段含义。

对该表的压缩功能由名为 thread/sql/compress_gtid_table 的专用前台线程执行。
该线程使用SHOW PROCESSLIST无法查看,但它可以在performance_schema.threads表中查看到(线程 thread/sql/compress_gtid_table 大多数时候都处于休眠状态,直到每满gtid_executed_compression_period个事务之后,该线程被唤醒以执行前面所述的对mysql.gtid_executed表的压缩。然后继续进入睡眠状态,直到下一次满gtid_executed_compression_period个事务,然后被唤醒再次执行压缩,以此类推,无限重复此循环。但如果当关闭binlog或者启用binlog但关闭log_slave_updates变量时,gtid_executed_compression_period变量被设置为了0,那么意味着该线程会始终处于休眠状态且永不会唤醒),如下所示:

mysql> SELECT * FROM performance_schema.threads WHERE NAME LIKE ‘%gtid%’G

*************************** 1. row ***************************

THREAD_ID: 26

NAME: thread/sql/compress _gtid_table

TYPE: FOREGROUND

PROCESSLIST_ID: 1

PROCESSLIST_USER: NULL

PROCESSLIST_HOST: NULL

PROCESSLIST_DB: NULL

PROCESSLIST_COMMAND: Daemon

PROCESSLIST_TIME: 1509

PROCESSLIST_STATE: Suspending

PROCESSLIST_INFO: NULL

PARENT _THREAD_ID: 1

ROLE: NULL

INSTRUMENTED: YES

HISTORY: YES

CONNECTION_TYPE: NULL

THREAD _OS_ID: 18677

2.5. ndb_binlog_index该表提供查询ndb集群引擎相关的统计信息,由于国内较少使用NDB存储引擎,这里不做过多介绍,有兴趣的朋友可自行研究。https://dev.mysql.com/doc/refman/5.7/en/replication-gtids-concepts.html#replication-gtids-gtid-executed-table

“翻过这座山,你就可以看到一片海!“。坚持阅读我们的”全方位认识 mysql 系统库”系列文章分享,你就可以系统地学完它。谢谢你的阅读,我们下期不见不散!

返回搜狐,查看更多

责任编辑:

声明:该文观点仅代表作者本人,搜狐号系信息发布平台,搜狐仅提供信息存储空间服务。
阅读 ()

退出移动版