一、概述

官方文档中对relay_log_recovery参数的解释
Enables automatic relay log recovery immediately following server startup. The recovery process creates a new relay log file, initializes the SQL thread position to this new relay log, and initializes the I/O thread to the SQL thread position. Reading of the relay log from the master then continues.

上面的英文看不懂,没关系,后面有大白话的翻译加实验,不怕你不懂。
现在我们考虑一个问题,假设当从库意外宕机后,同时从库的relay log也一起损坏了,而主库的日志已经传到了从库,只是从库还没有来得及应用这些日志,那么从库该如何处理?

二、结论

1. 在从库中将relay_log_recovery不设置或者设置为off,如果碰到上面的情形,从库会丢失那些没有应用的日志,主从会不一致。
2. 在从库中将relay_log_recovery设置为on,假如果碰到上面的情形,从库会自动放弃所有未执行的relay log,重新生成一个relay log,并将从库的io线程的position重新指向新的relay log。并将sql线程的position退回到跟io线程的position保持一致,重新开始同步,这样在从库中事务不会丢失。这个参数建议开启。是不是很绕,没关系,看实验。

三、实验

1. 实验环境介绍

mysql版本:5.7.25,操作系统版本:centos6.10
主库ip:10.40.16.61,从库ip:10.40.16.62
从库的参数文件中加入了参数skip-slave-start,防止从库自动启动slave。

2. 将relay_log_recovery设置为off

默认情况这个参数就是off,所以无须设置

查看主库状态

查看从库状态

从上面的输出可以看到,当前主从是同步的,而且从库的relay_log_recovery参数是OFF

关闭从库的sql线程
(root@localhost)[hello]> stop slave sql_thread;

主库随意做几个更改
(root@localhost)[hello]> insert into t1 values(20);
(root@localhost)[hello]> insert into t1 values(30);

在主库查看t1表

在从库查看t1表

查看主库状态

查看从库状态

查看从库的relay log
[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000010

可以看到主库已经将日志传送到relay log中了,只是从库没有执行而已。现在模拟从库意外宕机。
[root@mysqlb relaybin]# reboot

等从库节点启动完毕后删除从库最后的relay log
[root@mysqlb relaybin]# rm -f slave-relay-bin.000010

然后启动从库
[root@mysqlb relaybin]# service mysql start

查看relay log目录,发现又生成了一个slave-relay-bin.000010

去看看这个重新生成的slave-relay-bin.000010内容
[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000010

可以看到啥都没有,这是因为数据库在重启的时候,会自动重新生成一个relay log,但是这个特性跟上面提到的参数relay_log_recovery没有任何关系

再去从库看看当前的从库状态

发现与重启前的状态信息是的一致的

启动从库的slave线程,再去从库看看当前的从库状态

可以看到从库又开始同步了,而且Exec_Master_Log_Pos=Read_Master_Log_Pos,还重新生成了一个slave-relay-bin.000011

再去从库看当前的slave log

[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000010

[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000011

可以看到都是些空事务,也就是从库对于那些还没有执行的语句,全部抛弃了。强制将Exec_Master_Log_Pos移到了Read_Master_Log_Pos。

主库

从库

看到了吧,t1表中的20和30这两条记录就丢失了。

2. 将relay_log_recovery设置为on

在从库参数文件中设置参数(relay_log_recovery = 1)并重启从库

查看主库状态

查看从库状态

停掉重库的sql线程
(root@localhost)[hello]> stop slave sql_thread;

主库做点改动,这次选用t2表

从库查看t2表

从库查看状态

从库查看slave log
[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000013

可以看到日志已经进入到slave log中了

现在模拟从库意外宕机,等启动后删除从库最新的relay log,跟第一个实验步骤一致
[root@mysqlb relaybin]# reboot
[root@mysqlb relaybin]# rm -f slave-relay-bin.000013
[root@mysqlb relaybin]# service mysql start

查看从库的状态

可以看到Read_Master_Log_Pos已经由重启前的5429退回到了5124,跟Exec_Master_Log_Pos保持一致。

查看从库的relay log

[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000013

从库照例又生成了一个slave-relay-bin.000013,不过这个依然是个空日志

启动从库的slave线程
(root@localhost)[hello]> start slave;

查看从库的状态

可以看到Exec_Master_Log_Pos没变,Read_Master_Log_Pos增长了,我就在这里不明白,为什么sql线程不去执行日志呢,而且还多了一个线程System lock?

查看relay log

[root@mysqlb relaybin]# mysqlbinlog -vv slave-relay-bin.000014

可以看到启动slave线程后,又生成了一个新的relay log,而且之前没有执行的relay log条目的确又进到这个新的relay log中了。但是此刻sql线程并没有执行relay log,应该就是system lock在作怪。

放大招,重启从库来达到释放锁的目的,再启动slave线程

可以看到现在Slave_SQL_Running_State已经不是System lock了。

在从库查看t2表的数据

可以看到数据并没有任何丢失,由此证明在从库中将relay_log_recovery设置为ON,能避免由于从库relay log损坏导致的主从不一致的情形。

四、总结

在从库中最好将relay_log_recovery设置为ON。如果有哪位高手知道system lock是个什么情况,期待您的留言。写作不易,如果帮到了你,希望你点个赞,鼓励下博主。

Mysql - 关于relay_log_recovery参数的测试的更多相关文章

  1. MySQL 各种超时参数的含义

    MySQL 各种超时参数的含义 今日在查看锁超时的设置时,看到show variables like '%timeout%';语句输出结果中的十几种超时参数时突然想整理一下,不知道大家有没有想过,这么 ...

  2. mysql支持的数据类型及其测试

    原文:mysql支持的数据类型及其测试 1.基础知识 1.1如何来查看mysql的帮助手册 ?int Help float; 1.2创建表的规则 CREATE TABLE [IF NOT EXISTS ...

  3. MySQL Binlog常用参数

    ====================================================================== MySQL Binlog常用参数 log_bin 设置此参 ...

  4. MYSQL连接相关参数和状态值详解

    针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...

  5. MySQL命令行参数

    一,mysql命令行参数 Usage: mysql [OPTIONS] [database]   //命令方式 -?, --help          //显示帮助信息并退出 -I, --help   ...

  6. Mysql 8.0 新特性测试

    Mysql 8.0 新特性测试 Role MySQL8.0版本添加了role特性,role是一种逻辑概念是权限的集合,可以将一个或以上的权限赋予给role,再将role赋给user.Oracle,Po ...

  7. MySQL数据库实例参数对比脚本

    如何对比两个MySQL实例的参数情况,生产中常会有这样的需求,最近写了个python脚本,可基本实现该需求. 脚本 #!/usr/bin/python import MySQLdb,sys def f ...

  8. my SQL下载安装,环境配置,以及密码忘记的解决,以及navicat for mysql下载,安装,测试连接

    一.下载 在百度上搜索"mysql-5.6.24-winx64下载" 二.安装 选择安装路径,我的路径“C:\Soft\mysql-5.6.24-winx64” 三.环境配置 计算 ...

  9. mysql命令行参数(转)

    MySQL命令行参数 Usage: mysql [OPTIONS] [database] //命令方式  -?, --help //显示帮助信息并退出  -I, --help //显示帮助信息并退出  ...

随机推荐

  1. C#中的扩展方法(向已有类添加方法,但无需创建新的派生类型)

    C#中的扩展方法 扩展方法使你能够向现有类型"添加"方法,而无需创建新的派生类型.重新编译或以其他方式修改原始类型. 扩展方法是一种特殊的静态方法,但可以像扩展类型上的实例方法一样 ...

  2. Python之配置文件处理

      在平时的工程中,我们在构建工程时,常常需要用到配置文件,用来配置项目的一些信息,比如数据库,请求网址,文件夹,线程.进程数等信息,这样就可以方便我们通过修改配置文件中的参数来很好地完成整个项目的功 ...

  3. PythonI/O进阶学习笔记_3.1面向对象编程_python的多态和鸭子类型

    前言: 与第一篇的面向对象内容不同的是,第一篇中的面向对象更多的是与类.对象结合起来的概念粗浅理解,就是在编程历史中诞生的一种思想方法. 这篇的面向对象编程,更多落实到在语言设计实现中,是如何体现面向 ...

  4. Leetcode之二分法专题-35. 搜索插入位置(Search Insert Position)

    Leetcode之二分法专题-35. 搜索插入位置(Search Insert Position) 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引.如果目标值不存在于数组中,返回它将会 ...

  5. Docker资源管理

    一台宿主机可以放多个容器,默认的情况下,Docker 没有对容器进行硬件资源的限制,当容器负载过高时会尽可能的占用宿主机资源,所以有时候我们需要对容器的资源使用设置一个上限,今天我们就来看看如何管理 ...

  6. 动态数组& allocator

    问题来源 在编写程序的时候,对数组."二维数组"的分配的删除掌握的不是很清楚,不能正确的进行定义初始化. 以及在使用vector的时候,如何正确的定义及初始化 注意!!! 尽量使用 ...

  7. Mongodb操作2-windows系统安装数据库

    1.下载mongodb 本人提供的是64位的下载地址 百度云盘连接 :链接:https://pan.baidu.com/s/1fp6aB5rvLa9dD4q4YysIXQ 提取码:ekr2    并送 ...

  8. testlink+vertrigoServ搭建测试用例管理系统

    1.testlink简介 Testlink是一个开源的基于web的测试用例管理系统,主要功能是测试用例的创建.管理和执行,并且提供了一些简单的统计功能. 目前的公司没有专用的测试用例管理系统,为了测试 ...

  9. light 1205 - Palindromic Numbers(数位dp)

    题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1205 题解:这题作为一个数位dp,是需要咚咚脑子想想的.这个数位dp方程可能不 ...

  10. HDU5461 Largest Point 思维 2015沈阳icpc

    Largest Point Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...