mysql binlog线程恢复_使用MySQL SQL线程回放Binlog实现恢复

[toc]

1. 需求部分

1.1 基于MySQL复制同步特性,尝试使用Replication的SQL线程来回放binlog,可基于以下逻辑模拟场景

做全量xtrabackup备份模拟日常备份

执行sysbench压测4张表,20个线程,压测10分钟,模拟大量binlog

删除实例模拟数据库被误删除或硬件故障(binlog需要保留)

使用xtrabackup恢复全量备份

使用MySQL Replication SQL线程回放binlog(提示:恢复前需要将relay_log_recocery参数设置为0)

1.2 基于题目1.1,考虑是否可以做到以下场景的恢复

只恢复单个库的数据

只恢复单个表的数据

将数据恢复到指定的GTID或者position点(如恢复到误操作drop之前的GTID)

是否可以通过参数调整提升回放效率,列出提升效率的参数并实际测试用SQL线程回放binlog和直接使用mysqlbinlog回放binlog的性能对比

2.操作部分

2.1 环境准备及故障模拟

使用mysqlbinlog将binlog文件实时转储到备份目录(当前环境备份目录配置在/data/mysql/backup)

[root@10-186-61-162 ~]# mkdir -p /data/mysql/backup/binlog

[root@10-186-61-162 ~]# mysqlbinlog --raw --read-from-remote-server -h10.186.61.162 -urepl -pxxx -P3306 --result-file=/data/mysql/backup/binlog/ mysql-bin.000001 --stop-never --stop-never-slave-server-id=100 &

生成sysbench测试数据,创建4张表,每张各100W数据库并压测一分钟模拟数据变化

## 插入基础数据

[root@10-186-61-162 ~]# sysbench /usr/local/share/sysbench/oltp_read_write.lua --db-ps-mode=disable --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sysbench --mysql-password=xxx --mysql-db=sbtest --tables=4 --table-size=1000000 --report-interval=1 --time=600 --threads=20 prepare

## 执行sysbench压测模拟数据变化,压测1分钟

[root@10-186-61-162 ~]# sysbench /usr/local/share/sysbench/oltp_read_write.lua --db-ps-mode=disable --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sysbench --mysql-password=xxx --mysql-db=sbtest --tables=4 --table-size=1000000 --report-interval=1 --time=60 --threads=20 run

执行物理备份模拟每天的全量备份

[root@10-186-61-162 ~]# innobackupex --host=10.186.61.162 --port=3306 --user=backup --password=xxx /data/mysql/backup/

继续执行压测,模拟备份后的数据变化,压测10分钟,模拟大量binlog

[root@10-186-61-162 ~]# sysbench /usr/local/share/sysbench/oltp_read_write.lua --db-ps-mode=disable --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=sysbench --mysql-password=xxx --mysql-db=sbtest --tables=4 --table-size=1000000 --report-interval=1 --time=600 --threads=20 run

停止并删除数据库数据库模拟误操作或硬件故障

[root@10-186-61-162 ~]# systemctl stop mysql_3306

[root@10-186-61-162 ~]# rm -rf /data/mysql/data/*

2.2 数据恢复

还原xtrabackup全量备份

[root@10-186-61-162 ~]# cd /data/mysql/backup

[root@10-186-61-162 backup]# innobackupex --apply-log 2020-03-02_17-39-07/

[root@10-186-61-162 backup]# innobackupex --defaults-file=/etc/my.cnf --copy-back 2020-03-02_17-39-07/

将binlog转换为relay log并拷贝到数据目录以便SQL线程回放数据

[root@10-186-61-162 backup]# cd /data/mysql/backup/binlog/

## 将binlog重命名为relay log

[root@10-186-61-162 binlog]# rename mysql-bin mysql-relay mysql-bin*

## 创建relay log index文件

[root@10-186-61-162 binlog]# ls ./mysql-relay.0000* >mysql-relay.index

## 拷贝relay log到数据目录

[root@10-186-61-162 binlog]# cp mysql-relay.* /data/mysql/data/

## 修改数据目录权限

[root@10-186-61-162 binlog]# chown -R mysql:mysql /data/mysql/data/

修改relay_log_recovery参数,设置为0并启动数据库,relay_log_recovery为1时,relay log会在复制线程启动时被清除重新拉

## 获取备份文件中的binlog位点信息及GTID点对应的relay log文件

[root@10-186-61-162 ~]# cd /data/mysql/backup/2020-03-02_17-39-07/

[root@10-186-61-162 2020-03-02_17-39-07]# cat xtrabackup_binlog_info

mysql-bin.00000780456866f41abe78-5c62-11ea-abf1-02000aba3da2:1-52013

## 启动数据库

[root@10-186-61-162 2020-03-02_17-39-07]# systemctl start mysql_3306

## change master指定一个空的主库,创建SQL线程

root@localhost[(none)]> reset master;

## 指定备份文件中对应的binlog位点

root@localhost[(none)]> CHANGE MASTER TO MASTER_HOST='1.1.1.1',RELAY_LOG_FILE='mysql-relay.000007',RELAY_LOG_POS=80456866;

## 查看指定的位点是否生效

root@localhost[(none)]> select * from mysql.slave_relay_log_info;

+-----------------+----------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+

| Number_of_lines | Relay_log_name | Relay_log_pos | Master_log_name | Master_log_pos | Sql_delay | Number_of_workers | Id | Channel_name |

+-----------------+----------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+

| 7 | ./mysql-relay.000007 | 80456866 | | 0 | 0 | 0 | 1 | |

+-----------------+----------------------+---------------+-----------------+----------------+-----------+-------------------+----+--------------+

## 只需要开启SQL线程对指定的relay log开始回放即可

root@localhost[(none)]> START SLAVE SQL_THREAD;

## 持续执行可看到binlog数据开始回放

root@localhost[(none)]> show slave status\G

## 待binlog恢复完成且数据校验无问题后后可将复制关系重置

root@localhost[(none)]> stop slave;

root@localhost[(none)]> reset slave;

root@localhost[(none)]> reset slave all;

2.3 只恢复单个库的数据

由于备份是全量备份,无法单库还原(如果已知表结构可使用可传输表空间方式单库还原),可先将全量恢复后对只对单库做binlog还原

只需在2.2数据恢复的基础上增加一条以下命令即可实现对sbtest单库的binlog还原

CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('sbtest.%');

2.4 只恢复单个表的数据

该步骤与单库还原类似,只需将复制过滤属性指定为具体的表,如

CHANGE REPLICATION FILTER REPLICATE_WILD_DO_TABLE = ('sbtest.sbtest1','sbtest.sbtest2');

可在开启binlog还原前后对sbtest1-4表做checksum,验证是否只有sbtest1和sbtest2做了binlog还原

checksum table sbtest1,sbtest2,sbtest3,sbtest4;

2.5 恢复到指定的GTID或position点

该步骤只需在2.2数据恢复的基础上,将START SLAVE SQL_THREAD改为START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS,如只恢复到GTID=499999

START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS = 'f41abe78-5c62-11ea-abf1-02000aba3da2:500000;

2.6 提升恢复效率的参数优化

set global sync_binlog=0;

set global innodb_flush_log_at_trx_commit=0;

set global slave_parallel_type=LOGICAL_CLOCK;

set global slave_parallel_workers=8;

关闭binlog

2.7 使用复制线程与使用mysqlbinlog恢复的效率对比

mysqlbinlog

恢复耗时 722s

SQL线程

恢复耗时 151s

2.8 总结

使用SQL线程恢复binlog数据相对比mysqlbinlog有以下优势

只需配置好复制让数据库自动恢复数据即可

可以使用MySQL并行复制特性,提升恢复效率

可以精细化的控制恢复的库表

可以指定恢复到具体的GTID点以及跳过误操作的GTID

2.9 恢复优化

假设一个每天凌晨备份,某天早上8点数据库被误操作drop了业务库,请说明恢复的流程

保持主库当前状态

使用主库的备份恢复一个实例

使用change master to后在启动开启START SLAVE SQL_THREAD UNTIL SQL_BEFORE_GTIDS方式让复制同步数据到drop操作之前

跳过drop操作的gtid

继续同步复制

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/340574.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

带有Prometheus的Spring Boot和测微表第6部分:保护指标

以前,我们使用Prometheus成功启动了Spring Boot应用程序。 Spring应用程序中的一个端点正在公开我们的指标数据,以便Prometheus能够检索它们。 想到的主要问题是如何保护此信息。 Spring已经为我们提供了强大的安全框架 因此,将其轻松用于…

列举python中常用的数据类型_列举Python常用数据类型并尽量多的写出其中的方法...

#1 把字符串的第一个字符大写string.capitalize()#2 返回一个原字符串居中,并使用空格填充至长度 width 的新字符串string.center(width)#3 返回 str 在 string 里面出现的次数,如果 beg 或者 end 指定则返回指定范围内 str 出现的次数string.count(str, beg0, endl…

mysql 二元分词_MySQL 中文分词原理

一,首先我们来了解一下其他几个知识点:1. Mysql的索引意义?索引是加快访问表内容的基本手段,尤其是在涉及多个表的关联查询里。当然,索引可以加快检索速度,但是它也同时降低了索引列的插入,删除…

python 元类 type_Python 使用元类type创建类对象常见应用详解

本文实例讲述了Python 使用元类type创建类对象。分享给大家供大家参考,具体如下:type("123") 可以查看变量的类型;同时 type("类名",(父类),{类属性:值,类属性2:值}) 可以创建一个类。在Python中不建议一个函数具有不同的功能(重载)…

使用AWS Elastic Beanstalk轻松进行Spring Boot部署

朋友不允许朋友写用户身份验证。 厌倦了管理自己的用户? 立即尝试Okta的API和Java SDK。 在几分钟之内即可对任何应用程序中的用户进行身份验证,管理和保护。 几乎所有应用程序都依赖于身份验证。 开发人员以及雇用他们的公司都想确认谁在发出请求&…

mysql报错乱码_连接mysql服务器报错时,出现乱码

页头用了header(content-type:text/html;charsetutf-8);try{$this->dbonew PDO($dsn,$dbuser,$dbpassword);}catch(Exception $e){echo $e->getMessage();}连接失败时会报错,但是乱码,IE下编码查看是UTF-8,但是是乱码,如果选…

自学python条件_自学Python2.8-条件(if、if...else)

自学Python2.8-条件(if、if...else)1.if 判断语句if语句是用来进行判断的,其使用格式如下:if 要判断的条件:条件成立时,要做的事情当“判断条件”成立(True)时,才执行语句;反之,则不执行。执行语句可以为多…

mac lion 安装 mysql_mac osx下安装mysql

操作系统版本:mac osx 10.11mysql版本:官网下载dmg v5.6.33 https://www.mysql.com/安装步骤1.双击dmg安装2.开启mysql服务系统偏好设置-底部-mysql-打开服务这个时候还不能使用mysql命令,需要配置mysql命令的路径。3.配置环境变量mysql的路…

python爬虫实训日志_Python学习学习日志——爬虫《第一篇》(BeautifulSoup)

爬虫简介(学习日志第一篇)一、爬虫介绍爬虫:一段自动抓取互联网信息的程序,从互联网上抓取对于我们有价值的信息。二、Pyyhon爬虫架构Python 爬虫架构主要由五个部分组成,分别是调度器、URL管理器、网页下载器、网页解析器、应用程序(爬取的有…

zookeeper 负载_ZooKeeper,策展人以及微服务负载平衡的工作方式

zookeeper 负载Zookeeper如何确保每个工人都能从工作委托经理那里愉快地完成工作。 Apache ZooKeeper是注册,管理和发现在不同计算机上运行的服务的工具。 当我们必须处理具有许多节点的分布式系统时,它是技术堆栈中必不可少的成员,这些节点…

mysql error handler_MySql错误处理(二) - Condition Handle

20.2.10.2. DECLARE处理程序DECLARE handler_type HANDLER FOR condition_value[,...] sp_statementhandler_type:CONTINUE| EXIT| UNDOcondition_value:SQLSTATE [VALUE] sqlstate_value| condition_name| SQLWARNING| NOT FOUND| SQLEXCEPTION| mysql_error_code这个语句指定…

方程组的直接解法和迭代法 python_数据与算法总结——基本数值算法2(线性方程组)...

4 基本数值算法4.2 线性方程组4.2.1 线性方程组的特性解的存在性和唯一性满足下面条件之一,A非奇异,可逆:如果b属于A的列向量张成的空间,则称方程组是相容的。范数需要满足次可加性(三角不等式)。对于n维矢…

高效的企业测试-集成测试(3/6)

本系列的这一部分将展示如何通过代码级以及系统级集成测试来验证我们的应用程序。 (代码级)集成测试 集成测试一词有时在不同的上下文中使用不同。 根据Wikipedia的定义,我指的是在代码级别上验证多个组件之间相互作用的测试。 通常&#x…

mysql level用法_MYSQL使用方法

1.查询一张表: select * from 表名;2.查询指定字段:select 字段1,字段2,字段3….from 表名;3.where条件查询:select 字段1,字段2,字段3 frome 表名 where 条件表达式…

python程序设计之文件_Python程序设计之文件操作(2)

print(sub_path)if os.path.isdir(sub_path):visitdir(sub_path)path1C:UsersQinHsiuPythonProjectsStringoovisitdir(path1)方法二:使用walk()函数来实现#方法二,通过walk()方法指定遍历目录def visidir2(path):if not os.path.isdir(path):print(error!,endn)retu…

带Prometheus的Spring Boot和测微表第4部分:基础项目

在以前的文章中,我们介绍了Spring Micrometer和InfluxDB。 所以你要问我为什么普罗米修斯。 原因是Prometheus在InfluxDB的拉模型与推模型上进行操作。 这意味着,如果将千分尺与InfluxDB一起使用,则在将结果推送到数据库中时肯定会有一些开…

前端如何实现网络速度测试功能_分析Web前端测试要点,从架构原理上进行分析,希望大家能够掌握...

基于Web前端分析过程,大概有十几个测试要点,我们今天主要来讲解结合前五个要点进行详细解说。前端测试点主要针对前端展开,什么叫前端分析呢?就是我们所有的分析和测试要点所站的视角都是针对客户端或者浏览器来对系统进行分析和测…

mysql数据库表中的类型_MySQL数据库中表类型MyISAM与InnoDB的区别

MyISAM 和 InnoDB 讲解InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能&#xf…

将Websocket与Spring Framework和Vuejs结合使用

Websocket是客户端和服务器之间的全双工(持久)连接,因此两者可以彼此共享信息,而无需重复建立新的连接。 这消除了从客户端重复轮询以从服务器获取更新的需要。 并非所有浏览器都支持Websocket,因此我们利用SockJS ja…

python函数和模块的使用方法_Python学习06_函数和模块的使用

引入在写有些代码的时候,会发现有些步骤重复了多次,他也不像循环,都是相同的东西在重复,而是指做某件事情的步骤方法,做事的人或对象发生了改变,但是方法却没有改变。要想写出高质量的代码,首先…