基本环境:官方社区版MySQL 5.7.21 Row+Gtid
开启sysbench压测,使用mysqldump备份数据库,执行truncate操作,恢复数据到truncate前的时间点
1、切换日志,记录当前位置

# 3306切换日志
mydba@192.168.85.132,3306 [sbtest]> flush binary logs;
Query OK, 0 rows affected (0.07 sec)
# 3306查看当前位置
mydba@192.168.85.132,3306 [sbtest]> show master status;
+------------------+----------+--------------+------------------+-----------------------------------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-----------------------------------------------+
| mysql-bin.000013 | 194 | | | 60863f8d-01af-11e8-bfdf-000c29c1025c:1-185088 |
+------------------+----------+--------------+------------------+-----------------------------------------------+
row in set (0.00 sec)

2、开启sysbench压测

[root@ZST1 ~]# sysbench --version
sysbench 1.0.
[root@ZST1 ~]# sysbench --threads= --events= --time= --rate= --report-interval= \
--db-driver=mysql --db-ps-mode=disable \
--mysql-host=192.168.85.132 --mysql-port= --mysql-user=mydba --mysql-password= \
--mysql-db=sbtest --tables= --table-size= \
oltp_read_write run ================================ 后期补充 ================================
#下载安装
wget --content-disposition https://packagecloud.io/akopytov/sysbench/packages/el/7/sysbench-1.0.10-1.el7.x86_64.rpm/download.rpm
yum localinstall sysbench-1.0.-.el7.x86_64.rpm # sysbench命令语法
sysbench [options]... [testname] [command]
● testname:oltp_*.lua、fileio、cpu、memory、threads、mutex
● command:prepare、run、cleanup、help /usr/share/sysbench/ sysbench 1.0.x 建议使用这个目录下的lua脚本
/usr/share/sysbench/tests/include/oltp_legacy/ 保留兼容旧版本写法的lua脚本 $ cat sysbench.sh
#!/bin/bash
## sh sysbench.sh port command port=$
command=$ #适合于sysbench 1.0.x
sysbench --threads= --events= --time= --rate= --report-interval= \
--db-driver=mysql --db-ps-mode=disable \
--mysql-host=127.0.0.1 --mysql-port=${port} --mysql-user=mydba --mysql-password= \
--mysql-db=sbtest --tables= --table-size= \
oltp_read_write ${command} ##适用于old
#sysbench /usr/share/sysbench/tests/include/oltp_legacy/oltp.lua \
#--mysql-host=127.0.0.1 --mysql-port=${port} --mysql-user=mydba --mysql-password= \
#--db-driver=mysql --mysql-db=sbtest --oltp-tables-count= --oltp-table-size= \
#--oltp-read-only=off --oltp-test-mode=complex --rand-type=uniform --rand-init=on \
#--threads= --rate= --time= --events= --report-interval= --percentile= ${command}
================================ 后期补充 ================================

先prepare再run,窗口有输出后,使用mysqldump进行备份。sysbench详细使用参考https://github.com/akopytov/sysbench
3、使用mysqldump备份数据库

# 3306备份数据
[root@ZST1 ~]# mysqldump --login-path= --single-transaction --master-data= -A >/data/backup/all_dump_1323306_`date +%Y%m%d`.sql

sysbench创建的表为innodb引擎,在本例中使用mysqldump能确保备份数据的一致性。详细说明参考:MySQL备份可能遇到的坑
4、删除数据

# 3306删除数据
mydba@192.168.85.132,3306 [sbtest]> truncate table sbtest1;

执行truncate操作后恍然发现数据删除错误,现在需要将数据恢复到truncate前的时间点(⊙_⊙)
首先我们使用第3步的备份恢复到较近的时间点,结合备份之后产生的binary log恢复到truncate时刻。这里为了方便,仅恢复sbtest数据库到3308实例
5、单库恢复

# 单库恢复(手动将gtid_purged变量注释)
[root@ZST1 backup]# mysql --login-path= sbtest -o </data/backup/all_dump_1323306_`date +%Y%m%d`.sql
ERROR () at line : Unknown database 'replcrash'

为什么会报这个错?
-o, --one-database:Ignore statements except those that occur while the default database is the one named at the command line.
指定-o参数,仅执行默认数据库(use dbname)与命令行指定dbname相同的脚本
查看备份出来脚本

# vim打开备份脚本搜索关键字replcrash
[root@ZST1 backup]# vim /data/backup/all_dump_1323306_`date +%Y%m%d`.sql
..
-- Current Database: `replcrash`
-- CREATE DATABASE /*!32312 IF NOT EXISTS*/ `replcrash` /*!40100 DEFAULT CHARACTER SET utf8 */; USE `replcrash`; --
-- Table structure for table `py_user`
-- DROP TABLE IF EXISTS `py_user`;
...

虽然有create database replcrash语句,但是它没在use sbtest下面,那么它的默认数据库与命令行中的不同,因此create database replcrash不会执行。紧接着后面一句use replcrash就会找不到对应db,在3308实例创建备份文件中包含的用户数据库

# 创建用户数据库
mydba@192.168.85.132,3308 [sbtest]> create database replcrash;
mydba@192.168.85.132,3308 [sbtest]> create database sbtest;
# 重新恢复
[root@ZST1 backup]# mysql --login-path=1323308 sbtest -o </data/backup/all_dump_1323306_`date +%Y%m%d`.sql

等待片刻,上述命令仅恢复use sbtest里面的脚本
将恢复出来的sbtest.sbtest1拷贝一份数据到sbtest_bak.sbtest1

# 拷贝一份全备点的数据
mydba@192.168.85.132,3308 [sbtest]> create table sbtest_bak.sbtest1 select * from sbtest1;
ERROR 1786 (HY000): Statement violates GTID consistency: CREATE TABLE ... SELECT.
mydba@192.168.85.132,3308 [sbtest]> create table sbtest_bak.sbtest1 like sbtest1;
Query OK, 0 rows affected (0.02 sec)
mydba@192.168.85.132,3308 [sbtest]> insert into sbtest_bak.sbtest1 select * from sbtest1;
Query OK, 100 rows affected (0.00 sec)
Records: 100 Duplicates: 0 Warnings: 0 # 后续可以检测数据的一致性
[root@ZST1 ~]# mysqldbcompare --server1=mydba:mysql5721@192.168.85.132:3308 --server2=mydba:mysql5721@192.168.85.132:3308 --changes-for=server2 --difftype=sql sbtest:sbtest_bak --run-all-tests

6、找到truncate的位置

# 3306解析truncate位置
[root@ZST1 logs]# mysqlbinlog -vv --base64-output=decode-rows mysql-bin.
...
COMMIT/*!*/;
# at
# :: server id end_log_pos CRC32 0x582ae6bb GTID last_committed= sequence_number= rbr_only=no
SET @@SESSION.GTID_NEXT= '60863f8d-01af-11e8-bfdf-000c29c1025c:193543'/*!*/;
# at
# :: server id end_log_pos CRC32 0xe3231860 Query thread_id= exec_time= error_code=
use `sbtest`/*!*/;
SET TIMESTAMP=/*!*/;
/*!\C utf8 *//*!*/;
SET @@session.character_set_client=,@@session.collation_connection=,@@session.collation_server=/*!*/;
truncate table sbtest1
/*!*/;
# at
# :: server id end_log_pos CRC32 0xaa411397 GTID last_committed= sequence_number= rbr_only=yes
/*!50718 SET TRANSACTION ISOLATION LEVEL READ COMMITTED*//*!*/;
SET @@SESSION.GTID_NEXT= '60863f8d-01af-11e8-bfdf-000c29c1025c:193544'/*!*/;
# at # 3306查看备份位置
[root@ZST1 backup]# more /data/backup/all_dump_1323306_`date +%Y%m%d`.sql
...
-- GTID state at the beginning of the backup
-- SET @@GLOBAL.GTID_PURGED='60863f8d-01af-11e8-bfdf-000c29c1025c:1-188148'; -- Position to start replication or point-in-time recovery from
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000013', MASTER_LOG_POS=;

因此备份点到truncate之间需补充的数据为60863f8d-01af-11e8-bfdf-000c29c1025c:188149-193542
mysql-bin.000013 --start-position=5165474 --stop-position=14270546
7、恢复数据到truncate前的位置

# 恢复数据到truncate前的位置
[root@ZST1 logs]# mysqlbinlog mysql-bin. --start-position= --stop-position= |mysql --login-path=

此时3308实例已恢复到truncate操作点的一致性状态,那是不是就到此结束呢?
如果我们只需要还原数据到truncate时间点,那差不多完成~
如果我们需要跳过误删除的命令,其他操作继续,那就得考虑是否存在关联误删除的操作,以及这些操作对线上数据的影响是否能接受~
跳过误删除操作,应用后续日志

# 误删除对应的事务
60863f8d-01af-11e8-bfdf-000c29c1025c:
mysql-bin. --start-position= --stop-position= # 跳过误删除操作,应用后续日志
[root@ZST1 logs]# mysqlbinlog mysql-bin. --start-position= |mysql --login-path=
ERROR () at line : Duplicate entry '' for key 'PRIMARY'
[root@ZST1 logs]#

为什么会有重复条目?sysbench逻辑如下:
sysbench prepare:按照指定table-size往表sbtest*写入数据
sysbench run:根据key值(key受限于table-size)执行一系列的update、delete、insert操作,并且每一个delete..where key=keydel后面紧接着insert..values(keydel),每一次删除一条记录,马上写入相同键值的记录
sysbench cleanup:删除sbtest*表
由于binlog_format='row',在truncate后执行的delete没有找到对应记录,就不会记录binlog,但紧接着的insert却记录到binlog。在我们还原数据到truncate时间点前,应用truncate后的binlog时,在执行insert前没有delete操作时就会遇到Duplicat entry的现象。
如果binlog_format='statement'就不会出现这种情况(上述操作都能进行),但这并不影响我们推荐使用row格式~

sybench压测下模拟误truncate数据恢复的更多相关文章

  1. windows下Jmeter压测端口占用问题(亲测有效)

    windows下Jmeter压测端口占用问题 1 报错信息描述 压测的初期,在设置了 150qps/s 的并发数下压测几分钟后 Jmeter 就出现了如下报错. JAVA.NET.BINDEXCEPT ...

  2. windows下Jmeter压测端口占用问题

    https://blog.csdn.net/weixin_43757847/article/details/88188091 1 前情提要人脸识别项目中,云平台新增了人脸识别的校验接口.考虑到存在大量 ...

  3. <转>二十问全链路压测干货汇总(上)

    本文转载自:微信公众号-数列科技<二十问全链路压测干货汇总(上)> 最近几年全链路压测无疑成为了一个热门话题,在各个技术峰会上都可以看到它的身影. 一些大型的互联网公司,比如阿里巴巴.京东 ...

  4. 并发模式与 RPS 模式之争,性能压测领域的星球大战

    本文是<如何做好性能压测>系列专题分享的第四期,该专题将从性能压测的设计.实现.执行.监控.问题定位和分析.应用场景等多个纬度对性能压测的全过程进行拆解,以帮助大家构建完整的性能压测的理论 ...

  5. SpringBoot服务器压测对比(jetty、tomcat、undertow)

    1.本次对比基础环境信息如下: springboot版本1.5.10 centos虚机4c6G,版本7.4 centos实机2u16c40G,版本7.4,虚机运行在实机上 ab版本2.3 jprofi ...

  6. 压测 swoole_websocket_server 性能

    概述 这是关于 Swoole 入门学习的第十篇文章:压测 swoole_websocket_server 性能. 第九篇:Swoole Redis 连接池的实现 第八篇:Swoole MySQL 连接 ...

  7. jmeter分布式压测原理简介1

    1.什么叫分布式压测? 分布式压测:模拟多台机器向目标机器产生压力,模拟几万用户并发访问 2.分布式压测原理:如下 3.更多补充.....待添加

  8. charles抓包https/模拟弱网/设置断点重定向/压测

    charles几个常用功能   1,ios 抓包https网页:(如未配置,会显示unknown) 第一步是:给手机安装SSL证书 手机和电脑在同一wifi下,手机wifi配置http代理,ip是电脑 ...

  9. Jmeter之TCP取样器(模拟数据上报压测)

    TCP压测 场景:模拟硬件设备上报数据(登录,心跳,GPS定位数据/光感数据/电量数据),对这个功能进行压测 啰嗦一句:TCP压测很简单,只要调通了一个TCP,后续的逻辑判断就用逻辑控制器和正则处理就 ...

随机推荐

  1. Java和Spring邮件的发送

    方法一: java发送电子邮件:这里以发送qq邮件为例: package test; import java.util.Properties; import javax.mail.Authentica ...

  2. BZOJ3732Network——kruskal重构树+倍增+LCA/最小生成树+倍增

    题目描述 给你N个点的无向图 (1 <= N <= 15,000),记为:1…N. 图中有M条边 (1 <= M <= 30,000) ,第j条边的长度为: d_j ( 1 & ...

  3. BZOJ5010 FJOI2017矩阵填数(容斥原理)

    如果只考虑某个子矩阵的话,其最大值为v的方案数显然是vsize-(v-1)size.问题在于处理子矩阵间的交叉情况. 如果两个交叉的子矩阵所要求的最大值不同,可以直接把交叉部分划给所要求的最大值较小的 ...

  4. AOP 获取 RequestContextHolder

    转载: http://blog.csdn.net/lexang1/article/details/52619215 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  5. python 模块 - 序列化 json 和 pickle

    1,引入 之前我们学习过用eval内置方法可以将一个字符串转成python对象,不过,eval方法是有局限性的,对于普通的数据类型,json.loads和eval都能用,但遇到特殊类型的时候,eval ...

  6. python 和 scikit-learn 实现垃圾邮件过滤

    文本挖掘(Text Mining,从文字中获取信息)是一个比较宽泛的概念,这一技术在如今每天都有海量文本数据生成的时代越来越受到关注.目前,在机器学习模型的帮助下,包括情绪分析,文件分类,话题分类,文 ...

  7. 自学Zabbix14.1 二次开发API

    点击返回:自学Zabbix之路 点击返回:自学Zabbix4.0之路 点击返回:自学zabbix集锦 自学Zabbix14.1 二次开发API Zabbix API我们可以做很多,自己开发web界面. ...

  8. BZOJ 1195: [HNOI2006]最短母串

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 1346  Solved: 450[Submit][Status ...

  9. [noip][2017]

    Day1T1 30分思路: 倒着枚举答案z,用扩展欧几里得求解,如果能找到两个非负整数x,y使得ax+by=z则继续枚举,直到无解为止 100分: 最适用与考场上的做法,根据30分思路打表找规律. 3 ...

  10. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...