技术分享 | slave_relay_log_info 表认知的一些展开
nanshan 2024-10-20 07:35 9 浏览 0 评论
slave_relay_log_info 表是这样的:
mysql> select * from mysql.slave_relay_log_info\G *************************** 1. row *************************** Number_of_lines: 7 Relay_log_name: ./mysql-relay.000015 Relay_log_pos: 621 Master_log_name: mysql-bin.000001 Master_log_pos: 2407 Sql_delay: 0 Number_of_workers: 16 Id: 1 Channel_name:
slave_relay_log_info 表存储 slave sql thread 的工作位置。
在从库启动的时候时,读取 slave_relay_log_info 表中存储的位置,并把值传给 "show slave status" 中的 Relay_Log_File、Relay_Log_Pos,下次 "start slave" 是从这个位置开始继续回放 relay log。
slave_relay_log_info 表存储的是持久化的状态、show slave status 输出的是内存中的状态:
- 两者输出的位置可能不一样
- stop slave 或者正常关闭 mysqld,都会将内存中的状态持久化到磁盘上(slave_relay_log_info表中)
- 启动 mysqld 时会读取磁盘状态,初始化给内存状态
- start slave 时生效的是内存状态
slave io thread 按照 Master_Log_File、Read_Master_Log_Pos 位置读取主库的 binlog,并写入到本地 relay log(注意这两个位点信息保存在 slave_master_info 表中);slave sql thread 按照 Relay_Log_Name、Relay_Log_Pos 位置进行 realy log 的回放。
但是同一个事务在从库 relay log 中的 position 和主库 binlog 中的 position 是不相等的,slave_relay_log_info 表通过 Master_log_name、Master_log_pos 这两个字段记录了 relay log 中事务对应在主库 binlog 中的 position。
我们得知道如果 slave io thread 重复、遗漏的读取主库 binlog 写入到 relay log 中,sql thread 也会重复、遗漏地回放这些 relay log。也就是说从库的数据是否正确,io thread 的位置是否正确也非常重要。
在 MySQL 5.6 以前,复制位点信息只能存储在数据目录的 master.info 文件中,在回放事务后更新到文件中(默认每次回放10000个事务更新,受参数 sync_relay_log_info 控制)。即使每个事务都更新文件,意外宕机时也没法保证持久性一致性。
MySQL 5.6 开始,可以设置 --relay-log-info-repository=TABLE,将 slave sql thread 的工作位置存储在 mysql.slave_relay_log_info 表中,如果这个表是 InnoDB 这样的支持事务的引擎,则从库每回放一个事务时都会在这个事务里同时更新 mysql.slave_relay_log_info 表,使得 sql thread 的位置与数据保持一致。事实上在 5.6.0-5.6.5 的版本,slave_relay_log_info 表默认使用的是 MyISAM 引擎,之后的版本才改为 InnoDB,不过再考虑到 MySQL 5.6.10 才 GA,这个坑踩过的人应该不多。
更新机制
引用手册:
sync_relay_log_info = 0 If relay_log_info_repository is set to FILE, the MySQL server performs no synchronization of the relay- log.info file to disk; instead, the server relies on the operating system to flush its contents periodically as with any other file. If relay_log_info_repository is set to TABLE, and the storage engine for that table is transactional, the table is updated after each transaction. (Thesync_relay_log_info setting is effectively ignored in this case.) If relay_log_info_repository is set to TABLE, and the storage engine for that table is not transactional, the table is never updated. sync_relay_log_info = N > 0 If relay_log_info_repository is set to FILE, the slave synchronizes its relay-log.info file to disk (using fdatasync()) after every N transactions. If relay_log_info_repository is set to TABLE, and the storage engine for that table is transactional, the table is updated after each transaction. (Thesync_relay_log_info setting is effectively ignored in this case.) If relay_log_info_repository is set to TABLE, and the storage engine for that table is not transactional, the table is updated after every N events.
一般的运维规范都会要求 relay_log_info_repository=TABLE,默认值 sync_relay_log_info=10000 此时会失效,变成每回放一个事务都会在这个事务里同时更新 mysql.slave_relay_log_info 表,保证持久性,以最终保证复制的数据一致。当然 InooDB 的持久性需要 innodb_flush_log_at_trx_commit=1 来保证。
前面有一句话“也就是说从库的数据是否正确,io thread 的位置是否正确也非常重要”。简单来说 io thread 位置保存在 slave_master_info 表中,其实设置和 relay_log_info_repository 类似,不同的是它的持久化保障通常与性能冲突很大:
- 必须设置 master_info_repository = TABLE 和 sync_master_info=1,刷盘的单位是 binlog event 而不是事务,写放大很严重,性能损耗大
所以通常 sync_master_info 使用默认值 10000, io thread 的位置无法保证持久化,也就没法保证正确。MySQL 有另一个参数 relay_log_recovery 提供一种机制来保证 mysqld crash 后 io thread 位置的准确性,稍后进行介绍。
master_auto_position
master_auto_position 的作用是根据从库的 Executed_Gtid_Set 自动寻找主库上对应 binlog 位置,这是在 GTID 出现后的一个功能。
这里思考一个问题:开启 master_auto_position 后,slave io thread 能直接根据从库的 Executed_Gtid_Set 定位主库上 binlog 的位置吗?还需要 slave_relay_log_info、slave_master_info 表中记录的位点信息吗?
其实 slave_relay_log_info、slave_master_info 表依然发挥作用:
- 当第一次或者 reset slave 后,执行 start slave,io thread 将从库的 Executed_Gtid_Set 发往主库,获取到对应的 File、Position,之后更新到从库的 slave_relay_log_info、slave_master_info 表中
- 当 slave_relay_log_info、slave_master_info 表中存在位置信息后,此后无论是重启复制还是重启 mysqld,都是直接从这两个地方获取 File、Position,并从这里开始读取 binlog 和回放 relay log
注意:执行 "reset slave" 会删除从库上的 relay log,并且重置 slave_relay_log_info 表,即重置复制位置。如果 master_auto_position=0,下次启动复制时会从新开始获取并回放主库的 binlog,造成错误。
relay_log_recovery
当启用 relay_log_recovery,mysqld 启动时,recovery 过程会生成一个新的 relay log,并初始化 slave sql thread 的位置,表现为:
- slave_relay_log_info 表的 Relay_Log_Name 值更新为最新的日志名, Relay_Log_Pos 值更新为一个固定值 4(应该是头部固定信息占 4个偏移量)
- 内存状态即 show slave status 输出中的 Relay_Log_File、Relay_Log_Pos,也更新成上面一样的
并且 slave io thread 的位置也会初始化,表现为:
- slave_master_info 表中的 Master_log_name、Master_log_pos 不会改变
- 内存状态即 show slave status 输出中的 Master_Log_File、Read_Master_Log_Pos,会更新为 slave_relay_log_info 表中 Master_Log_Name、Master_Log_Pos
io thread 这个位置的初始化思路就是:既然以前记录的位置不确定是否准确,那就直接不要了。sql thread 回放到哪,我就从哪开始重新拿主库的 binlog,这样准没错。一个事务在 relay log 中的 position 对应到主库 binlog 的 position 是这样来确定的:
- slave_relay_log_info 表中的 Relay_log_name 与 Master_log_name,Relay_Log_Pos 与 Master_Log_Pos 始终一一对应,代表同一个事务的位置。
所以,即使 sync_master_info 表的持久化无法保证,relay_log_recovery 也会将 io thread 重置到已经回放的那个位置。
relay_log_recovery 的另一个作用是防止 relay log 的损坏,因为默认 relay log 是不保证持久化的(也不推荐设置 sync_relay_log=1),当操作系统或者 mysqld crash 后,sql thread 可能会因为 relay log 的损坏、丢失导致错误。
一些结论
- 当开启 GTID 和 master_auto_position,并设置 relay_log_recovery=1,即使 relay_log_info_repository 设置为 file,操作系统或者 mysqld crash 后,mysqld 下次重启启动复制都能保证数据与主库一致。即使 slave_relay_log_info 表中记录的位置不是最新的,sql thread 可能会重复回放一部分事务,但是从库已经存在这些事务的 GTID,这部分重复的事务会被跳过。
- 当未开启 GTID 和 master_auto_position,必须要设置 relay_log_info_repository=table、relay_log_recovery=1,操作系统或者 mysqld crash 后,mysqld 下次重启启动复制才能保证数据与主库一致。
相关推荐
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
-
Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
-
服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
-
服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
-
服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
-
服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
-
服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
-
服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
-
服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
-
服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
-
RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...
- 「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例
-
服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...
- 服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?
-
服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...
- 服务器数据恢复—Linux+raid5服务器数据恢复案例
-
服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...
- 服务器数据恢复—Sql Server数据库数据恢复案例
-
服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...
- 服务器数据恢复—阿里云ECS网站服务器数据恢复案例
-
云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)