一、Xtrabackup介绍

Percona-xtrabackup是由Percona公司开发的一个用于MySQL数据库物理热备的备份工具,支持MySQL、Percona server和MariaDB,开源免费,是目前较为受欢迎的主流备份工具。xtrabackup有两个主要的工具,分别是innobackupex和xtrabackup,xtrabackup只能备份InnoDB和XtraDB数据表,而innobackupex封装了xtrabackup,可以备份MyISAM数据表;据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具。MySQL冷备、mysqldump、MySQL热拷贝都无法实现对数据库进行增量备份。在实际生产环境中增量备份是非常实用的,如果数据大于50G或100G,存储空间足够的情况下,可以每天进行完整备份,如果每天产生的数据量较大,需要定制数据备份策略。例如每周完整备份,周一到周六增量备份。而Percona-Xtrabackup就是为了实现增量备份而出现的一款主流备份工具。

二、Xtrabackup优点
  • 备份过程快速、物理备份可靠
  • 备份过程不会打断正在执行的事务(无需锁表)
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动实现备份检验
  • 还原速度快
  • 可以流传将备份传输到另外一台机器上
  • 在不增加服务器负载的情况备份数据
三、Xtrabackup备份原理

Xtrabackup备份流程图:
MySQL之Xtrabackup备份还原与binlog恢复_数据文件

(1) innobackupex启动后,会先fork一个进程,用于启动xtrabackup,然后等待xtrabackup备份ibd数据文件;

(2)xtrabackup在备份innoDB数据是,有2种线程:redo拷贝线程和ibd数据拷贝线程。xtrabackup进程开始执行后,会启动一个redo拷贝的线程,用于从最新的checkpoint点开始顺序拷贝redo.log;

(3)再启动ibd数据拷贝线程,进行拷贝ibd数据。这里是先启动redo拷贝线程的。在此阶段,innobackupex进行处于等待状态(等待文件被创建);

(4)xtrabackup拷贝完成ibd数据文件后,会通知innobackupex(通过创建文件),同时xtrabackup进入等待状态(redo线程依旧在拷贝redo.log)

(5)innobackupex收到xtrabackup通知后,执行FLUSH TABLES WITH READ LOCK(FTWRL),取得一致性位点,然后开始备份非InnoDB文件(如frm、MYD、MYI、CSV、opt、par等格式的文件),在拷贝非InnoDB文件的过程当中,数据库处于全局只读状态。

(6)当innobackup拷贝完所有的非InnoDB文件后,会通知xtrabackup,通知完成后,进入等待状态;

(7)xtrabackup收到innobackupex备份完成的通知后,会停止redo拷贝线程,然后通知innobackupex,redo.log文件拷贝完成;

(8)innobackupex收到redo.log备份完成后,就进行解锁操作,执行:UNLOCK TABLES;

(9)最后innbackupex和xtrabackup进程各自释放资源,写备份元数据信息等,innobackupex等xtrabackup子进程结束后退出。

四、Xtrabackup的安装部署以及备份恢复实现

1、xtrabackup的安装

下载地址:Percona-XtraBackup
这里直接采用yum安装方式,一般而言我们在从库上做备份(percona-xtrabackup-24适用于mysql5.7及以下)

[root@slave ~]# yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm -y
[root@slave ~]# yum install percona-xtrabackup-24 -y
[root@slave ~]# rpm -qa |grep xtrabackup
percona-xtrabackup-24-2.4.23-1.el7.x86_64

Xtrabackup中主要包含两个工具:
xtrabackup:是用于热备innodb,xtradb表中数据的工具,不能备份其他类型的表,也不能备份数据表结构;
innobackupex:是将xtrabackup进行封装的perl脚本,提供了备份myisam表的能力。

常用选项:  
   --host     指定主机
   --user     指定用户名
   --password    指定密码
   --port     指定端口
   --databases     指定数据库
   --incremental    创建增量备份
   --incremental-basedir   指定包含完全备份的目录
   --incremental-dir      指定包含增量备份的目录   
   --apply-log        对备份进行预处理操作             

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。“准备”的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。

   --redo-only  不回滚未提交事务
   --copy-back  恢复备份目录

使用innobackupex备份时,其会调用xtrabackup备份所有的InnoDB表,复制所有关于表结构定义的相关文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相关文件,同时还会备份触发器和数据库配置信息相关的文件,这些文件会被保存到一个以时间命名的目录当中。在备份的同时,innobackupex还会在备份目录中创建如下文件:

xtrabackup_checkpoints    备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息:每个InnoDB页(通常为16k大小)都会包含一个日志序列号,即LSN,LSN是整个数据库系统的系统版本号,每个页面相关的LSN能够表明此页面最近是如何发生改变的。

xtrabackup_binlog_info    mysql服务器当前正在使用的二进制日志文件及备份这一刻位置二进制日志时间的位置。

xtrabackup_binlog_pos_innodb    二进制日志文件及用于InnoDB或XtraDB表的二进制日志文件的当前position。

xtrabackup_binary    备份中用到的xtrabackup的可执行文件;

backup-my.cnf    备份命令用到的配置选项信息:

在使用innobackupex进行备份时,还可以使用--no-timestamp选项来阻止命令自动创建一个以时间命名的目录:如此一来,innobackupex命令将会创建一个BACKUP-DIR目录来存储备份数据。
如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:如果要使用一个最小权限的用户进行备份,则可基于如下命令创建此类用户:

mysql> CREATE USER 'bkpuser'@'localhost' IDENTIFIED BY '123456';  #创建用户
mysql> REVOKE ALL PRIVILEGES,GRANT OPTION FROM 'bkpuser';  #回收此用户所有权限
mysql> GRANT RELOAD,LOCK TABLES,RELICATION CLIENT ON *.* TO 'bkpuser'@'localhost';  #授权刷新、锁定表、用户查看服务器状态
mysql> FLUSH PRIVILEGES;  #刷新授权表

注意:备份时需启动MySQL,恢复时需关闭MySQL,清空mysql数据目录且不能重新初始化,恢复数据后应该立即进行一次完全备份

2、xtrabackup全量备份与恢复

备份:

innobackupex --user=DBUSER --password=DBUSERPASS --defaults-file=/etc/my.cnf /path/to/BACKUP-DIR/

恢复:

innobackupex --apply-log /backup/2021-07-16_01-00-02/
innobackupex --copy-back --defaults-file=/etc/my.cnf  /backup/2021-07-16_01-00-02/

(1)准备(prepare)一个完全备份

一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或者已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处于不一致状态。"准备"的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使用得数据文件处于一致性状态。

innobackupex命令的--apply-log选项可用于实现上述功能,如下面的命令:

# innobackupex --apply-log /path/to/BACKUP-DIR

如果执行正确,其最后输出的几行信息通常如下:

210716 18:16:28 completed OK!

在实现"准备"的过程中,innobackupex通常还可以使用--user-memory选项来指定其可以使用的内存的大小,默认为100M.如果有足够的内存空间可用,可以多划分一些内存给prepare的过程,以提高其完成备份的速度。

(2)从一个完全备份中恢复数据

注意:恢复不用启动MySQL
innobackupex命令的--copy-back选项用于恢复操作,其通过复制所有数据相关的文件至mysql服务器DATADIR目录中来执行恢复过程。innobackupex通过backup-my.cnf来获取DATADIR目录的相关信息。

innobackupex --copy-back /path/to/BACKUP-DIR

修改数据库目录权限,当数据恢复至DATADIR目录以后,还需要确保所有的数据文件的属主和属组均为正确的用户,如mysql,否则在启动mysqld之前还需要事先修改数据文件的属主和属组。如:

chown -R mysql.mysql /data/mysql3306/

启动mysql服务

service mysql start

(3)实战练习

(1)全量备份

[root@slave ~]# screen
[root@slave ~]# innobackupex --defaults-file=/etc/my.cnf  --use-memory=4G  --host=localhost --user=backup --password=123456 --port=3306 /data/backup/mysqlbak
# 查看备份数据
[root@slave ~]# ll /data/backup/mysqlbak/2021-07-16_01-00-02/  
total 8449160
-rw-r----- 1 root root        517 Jul 16 17:30 backup-my.cnf  #备份用到的配置选项信息文件
-rw-r----- 1 root root       7419 Jul 16 17:29 ib_buffer_pool
-rw-r----- 1 root root 1073741824 Jul 17 14:16 ibdata1  #数据文件
-rw-r----- 1 root root 2147483648 Jul 17 14:16 ib_logfile0
-rw-r----- 1 root root 2147483648 Jul 16 17:40 ib_logfile1
-rw-r----- 1 root root 2147483648 Jul 16 17:40 ib_logfile2
-rw-r----- 1 root root   12582912 Jul 17 14:16 ibtmp1
drwxr-x--- 2 root root       4096 Jul 16 17:30 mysql
drwxr-x--- 2 root root       4096 Jul 16 17:29 performance_schema
drwxr-x--- 2 root root      36864 Jul 16 17:29 new
drwxr-x--- 2 root root      12288 Jul 16 17:30 sys
-rw-r----- 1 root root         26 Jul 16 17:30 xtrabackup_binlog_info  #mysql服务器当前正在使用的二进制日志文件和此时二进制日志时间的位置信息文件
-rw-r--r-- 1 root root         26 Jul 17 14:16 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root        147 Jul 17 14:16 xtrabackup_checkpoints  #备份的类型、状态和LSN状态信息文件
-rw-r----- 1 root root        568 Jul 16 17:29 xtrabackup_info
-rw-r----- 1 root root    8388608 Jul 16 17:40 xtrabackup_logfile    #备份的日志文件
-rw-r--r-- 1 root root          1 Jul 17 14:16 xtrabackup_master_key_id

将从库上备份的数据传送到一台空的专门用来做数据库灾备演练的服务器上

[root@slave ~]# scp -r /data/backup/mysqlbak/2021-07-16_01-00-02 192.168.0.118:/root/

(2)恢复
停止mysql服务

[root@db-recover ~]# /etc/init.d/mysqld stop  
Shutting down MySQL.. SUCCESS! 

合并数据,使数据文件处于一致性的状态

[root@db-recover ~]# innobackupex --apply-log /root/2021-07-16_01-00-02/      
210716 18:27:53 completed OK!

清空mysql目录中的全部数据

[root@db-recover ~]# rm -rf /data/mysql3306/data/*

确保my.cnf的数据目录路径和数据库服务器的数据目录路径一致,否则会报错。

[root@db-recover ~]# grep datadir /etc/my.cnf
datadir = /data/mysql3306/data

数据恢复

[root@db-recover ~]# innobackupex --copy-back /root/2021-07-16_01-00-02/
210716 18:30:53 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".
......
210716 18:36:08 completed OK!  
# 看到completed OK就是恢复正常了

查看数据目录,可以看到数据已经恢复,但是属主会有问题,需要进行修改,所以一般使用mysql的运行用户进行恢复,否则需要进行修改属主和属组信息

[root@db-recover ~]# ll /data/mysql3306/data/
total 7352504
-rw-r----- 1 root root         56 Jul 16 19:23 auto.cnf
-rw------- 1 root root       1676 Jul 16 19:23 ca-key.pem
-rw-r--r-- 1 root root       1112 Jul 16 19:23 ca.pem
-rw-r--r-- 1 root root       1112 Jul 16 19:23 client-cert.pem
-rw------- 1 root root       1680 Jul 16 19:23 client-key.pem
-rw-r----- 1 root root       7419 Jul 16 19:22 ib_buffer_pool
-rw-r----- 1 root root 1073741824 Jul 16 19:56 ibdata1
-rw-r----- 1 root root 2147483648 Jul 16 19:56 ib_logfile0
-rw-r----- 1 root root 2147483648 Jul 16 19:17 ib_logfile1
-rw-r----- 1 root root 2147483648 Jul 16 19:18 ib_logfile2
-rw-r----- 1 root root   12582912 Jul 17 14:22 ibtmp1
-rw-r----- 1 root root          6 Jul 16 19:23 db.pid
drwxr-x--- 2 root root       4096 Jul 16 19:22 root
drwxr-x--- 2 root root       4096 Jul 16 19:23 performance_schema
-rw------- 1 root root       1680 Jul 16 19:23 private_key.pem
-rw-r--r-- 1 root root        452 Jul 16 19:23 public_key.pem
-rw-r--r-- 1 root root       1112 Jul 16 19:23 server-cert.pem
-rw------- 1 root root       1676 Jul 16 19:23 server-key.pem
drwxr-x--- 2 root root      36864 Jul 16 19:22 new
drwxr-x--- 2 root root      12288 Jul 16 19:22 sys
-rw-r----- 1 root root         26 Jul 16 19:22 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root        568 Jul 16 19:22 xtrabackup_info
-rw-r----- 1 root root          1 Jul 16 19:22 xtrabackup_master_key_id

修改属主属组

[root@db-recover ~]# chown -R mysql.mysql /data/mysql3306/

启动mysql

[root@db-recover ~]# /etc/init.d/mysqld start
Starting MySQL. SUCCESS! 

查看数据是否恢复

[root@db-recover ~]# mysql -uroot -p -e "show databases;"  
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| new                |
+--------------------+

总结全库备份与恢复三步曲:
a. innobackupex全量备份,并指定备份目录路径;

b. 在恢复前,需要使用--apply-log参数先进行合并数据文件,确保数据的一致性要求;

c. 恢复时,直接使用--copy-back参数进行恢复,需要注意的是,在my.cnf中要指定数据文件目录的路径。

3、xtrabackup增量备份与恢复

  使用innobackupex进行增量备份,每个InnoDB的页面都会包含一个LSN信息,每当相关的数据发生改变,相关的页面的LSN就会自动增长。这正是InnoDB表可以进行增量备份的基础,即innobackupex通过备份上次完全备份之后发生改变的页面来实现。在进行增量备份时,首先要进行一次全量备份,第一次增量备份是基于全备的,之后的增量备份都是基于上一次的增量备份的,以此类推。

要实现第一次增量备份,可以使用下面的命令进行:

基于全量备份的增量备份与恢复

做一次增量备份(基于当前最新的全量备份)
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --incremental /data/backup/mysqlbak/ --incremental-basedir=/data/backup/mysqlbak/2021-07-16_01-00-02/
1. 准备基于全量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/mysqlbak/2021-07-16_01-00-02/
2. 准备基于增量
innobackupex --user=root --password=root --defaults-file=/etc/my.cnf --apply-log --redo-only /data/backup/mysqlbak/2021-07-16_01-00-02/ --incremental-dir=/data/backup/mysqlbak/
3. 恢复
innobackupex --copy-back --defaults-file=/etc/my.cnf /data/backup/mysqlbak/2021-07-16_02-00-02/

解释:
1. 2021-07-16_01-00-02指的是完全备份所在的目录。
2. 2021-07-16_02-00-02指定是第一次基于2021-07-16_01-00-02增量备份的目录,其他类似以此类推,即如果有多次增量备份。每一次都要执行如上操作。
需要注意的是,增量备份仅能应用于InnoDB或XtraDB表,对于MyISAM表而言,执行增量备份时其实进行的是完全备份。

"准备"(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
1.需要在每个备份 (包括完全和各个增量备份)上,将已经提交的事务进行"重放"。"重放"之后,所有的备份数据将合并到完全备份上。
2.基于所有的备份将未提交的事务进行"回滚"

(1)增量备份演示

# 全备数据
[root@slave ~]# innobackupex --user=root --password=123456 --host=127.0.0.1 /data/backup/mysqlbak/
# 创建测试数据库
[root@slave ~]# mysql -uroot -p
Enter password: 
mysql> create database test1;
Query OK, 1 row affected (0.03 sec)

mysql> use test1;
Database changed
mysql> create table testtb(id int);
Query OK, 0 rows affected (0.07 sec)

mysql> insert into testtb values(1),(2),(3);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from testtb;
+------+
| id   |
+------+
|    1 |
|    2 |
|    3 |
+------+
3 rows in set (0.00 sec)

mysql> quit;
Bye

# 使用innobackupex进行增量备份
[root@slave ~]# innobackupex --user=root --password=123456 --host=127.0.0.1 --incremental /data/backup/mysqlbak/ --incremental-basedir=/data/backup/mysqlbak/2021-07-16_01-00-02/
......
210717 15:38:05 Executing UNLOCK TABLES
210717 15:38:05 All tables unlocked
210717 15:38:05 [00] Copying ib_buffer_pool to /root/2021-07-17_15-35-03/ib_buffer_pool
210717 15:38:05 [00]        ...done
210717 15:38:05 Backup created in directory '/root/2021-07-17_15-35-03/'
MySQL binlog position: filename 'mybinlog.000001', position '170823740'
210717 15:38:05 [00] Writing /root/2021-07-17_15-35-03/backup-my.cnf
210717 15:38:05 [00]        ...done
210717 15:38:05 [00] Writing /root/2021-07-17_15-35-03/xtrabackup_info
210717 15:38:05 [00]        ...done
xtrabackup: Transaction log of lsn (75199632424) to (75199632529) was copied.
210717 15:38:05 completed OK!
# 查看备份数据
[root@slave ~]# ll  
total 0
drwxr-x--- 10 root root  4096 Jul 17 14:27 2021-07-17_14-22-41    #全量备份数据目录
drwxr-x--- 11 root root 12288 Jul 17 15:38 2021-07-17_15-35-03  #增量备份数据目录
# 查看全量备份的xtrabackup_checkpoints
[root@slave 2021-07-17_14-22-41]# cat xtrabackup_checkpoints
backup_type = full-backuped  #备份类型为全量备份
from_lsn = 0  #lsn从0开始
to_lsn = 75199625937  #lsn到75199625937结束
last_lsn = 75199625946
compact = 0
recover_binlog_info = 0
flushed_lsn = 75199625946

# 查看增量备份的xtrabackup_checkpoints
[root@slave 2021-07-17_15-35-03]# cat xtrabackup_checkpoints
backup_type = incremental  #备份类型为增量备份
from_lsn = 75199625937  #lsn从75199625937开始
to_lsn = 75199632520    #lsn到啊75199632520结束
last_lsn = 75199632529
compact = 0
recover_binlog_info = 0
flushed_lsn = 75199632433

(2)增量备份后数据恢复演示

(1)模拟mysql故障,删除数据目录所有数据

# 模拟mysql故障,停止mysql
[root@slave ~]# /etc/init.d/mysqld stop
Shutting down MySQL.. SUCCESS! 
# 删除数据目录中的所有数据
[root@slave ~]# rm -rf /data/mysql3306/data/*

将全量备份数据和增量备份数据传送到用于灾备演练的服务器进行恢复

[root@slave ~]# scp -r 2021-07-17_14-22-41 2021-07-17_15-35-03 192.168.0.118:/root/

(2)合并全备数据目录,确保数据的一致性

[root@db-recover ~]# innobackupex --apply-log --redo-only /root/2021-07-17_14-22-41
210717 15:51:57 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

innobackupex version 2.4.23 based on MySQL server 5.7.34 Linux (x86_64) (revision id: 3320f39)
xtrabackup: cd to /root/2021-07-17_14-22-41/
......
......
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 75199625955
InnoDB: Number of pools: 1
210717 15:51:59 completed OK!

(3)将增量备份数据合并到全备数据目录当中

[root@db-recover ~]# innobackupex --apply-log --redo-only /root/2021-07-17_14-22-41 --incremental-dir=/root/2021-07-17_15-35-03/
210717 15:55:20 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".
......
......
210717 15:55:28 [00]        ...done
210717 15:55:28 completed OK!

[root@db-recover ~]# cat /root/2021-07-17_14-22-41/xtrabackup_checkpoints 
backup_type = log-applied  #查看到数据备份类型是增加
from_lsn = 0  #lsn从0开始
to_lsn = 75199632520  #lsn结束号为最新的lsn
last_lsn = 75199632529
compact = 0
recover_binlog_info = 0
flushed_lsn = 75199632433

(4)恢复数据

[root@db-recover ~]# innobackupex --copy-back /root/2021-07-17_14-22-41/
210717 16:59:27 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".
.......
.......
210717 16:04:28 [01]        ...done
210717 16:04:28 completed OK!

[root@db-recover ~]# ll /data/mysql3306/data/
total 1048696
-rw-r----- 1 root root       7419 Jul 17 16:03 ib_buffer_pool
-rw-r----- 1 root root 1073741824 Jul 17 16:00 ibdata1
drwxr-x--- 2 root root       4096 Jul 17 16:03 mysql
drwxr-x--- 2 root root       4096 Jul 17 16:04 performance_schema
drwxr-x--- 2 root root      36864 Jul 17 16:03 new
drwxr-x--- 2 root root      12288 Jul 17 16:03 sys
drwxr-x--- 2 root root       4096 Jul 17 16:03 test1
-rw-r----- 1 root root         26 Jul 17 16:03 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root        563 Jul 17 16:03 xtrabackup_info
-rw-r----- 1 root root          1 Jul 17 16:03 xtrabackup_master_key_id
# 更改数据的属主属组
[root@db-recover ~]# chown -R mysql.mysql /data/mysql3306/
# 启动mysql
[root@db-recover ~]# /etc/init.d/mysqld start  
Starting MySQL.............................................[  OK  ].......
# 查看数据是否恢复
[root@db-recover ~]# mysql -uroot -p -e "show databases;"
Enter password: 
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| new                |
| test1              |
+--------------------+

总结:
(1)增量备份需要使用参数--incremental指定需要备份到哪个目录,使用incremental-dir指定全备目录;
(2)进行数据备份时,需要使用参数--apply-log redo-only先合并全备数据目录数据,确保全备数据目录数据的一致性;
(3)再将增量备份数据使用参数--incremental-dir合并到全备数据当中;
(4)最后通过最后的全备数据进行恢复数据,注意,如果有多个增量备份,需要逐一合并到全备数据当中,再进行恢复。

五、mysql binlog日志恢复

实际情况下xtrabackup恢复了全量备份和增量备份后,可能还有部分数据没有恢复,所以需要用到binlog日志来实现数据的完全恢复。即xtrabackup全备+xtrabackup增备+binlog恢复到某个时间点。
查看开始应用 binlog 的位置

[root@db-recover ~]# cat xtrabackup_binlog_pos_innodb
mybinlog.000001 170823740

解析binlog日志,找到误删除操作的时间或者是位点

[root@db-recover ~]# mysqlbinlog -v --base64-output=decode-rows mybinlog.000017 --stop-datetime="2021-07-16 16:40:58"|more

说明:
--base64-ouput=decode-rows 代表解码
-v 代表换行显示这些语句,如果没有-v 你依然看不到具体的语句
--start-position 代表你要获取日志的开始位置
--stop-position 代表你要获取日志的结束位置
--start-date 代表你要获取日志的开始时间
--stop-date 代表你要获取日志的结束数据

将该误删除操作的时间点前的binlog导出

[root@db-recover ~]# mysqlbinlog mybinlog.000017 --start-position=170823740 --stop-datetime="2021-07-16 16:40:58" > recover.sql

注意:这里不能使用-v --base64-output=decode-rows来导出binlog来恢复数据,否则会恢复不成功。
导入数据库

[root@db-recover ~]# mysql -uroot -p123456 new < recover.sql