MySQL使用xtrabackup备份和恢复教程

1、xtrabackup说明

xtrabackup是percona开源的mysql物理备份工具。
xtrabackup 8.0支持mysql 8.0版本的备份和恢复。
xtrabackup 2.4支持mysql 5.7及以下版本的备份和恢复。
这里我以xtrabackup 8.0为例讲解备份和恢复的具体操作方法。
xtrabackup 2.4版本的使用上和8.0版本相差并不大。
官网: https://github.com/percona/percona-xtrabackup

1.1、备份过程说明

在 XtraBackup 工具的备份过程中,默认情况下是不会锁定整个数据库的表的。XtraBackup 使用了多版本并发控制(MVCC)来确保备份期间数据库的一致性,并避免对数据库的读取和写入操作造成影响。

在备份过程中,XtraBackup 会先执行 LOCK INSTANCE FOR BACKUP 操作,这个操作会获得全局锁(Global Lock),但它的持有时间非常短暂,只是为了确保备份的一致性而进行的。在获取全局锁期间,XtraBackup 将不会执行任何其他操作。

一旦获得了全局锁,XtraBackup 就会释放该锁,并转而使用多版本并发控制(MVCC)来读取数据库的数据,这意味着备份期间数据库的读取和写入操作不会被阻塞。

这种备份方式称为 “Online Backup”,它允许在备份过程中继续对数据库进行读写操作,因此不会影响数据库的正常运行。由于备份期间不会锁定整个数据库表,所以备份过程对数据库的性能影响相对较小。

2、安装 Percona XtraBackup(XtraBackup)

wget https://downloads.percona.com/downloads/Percona-XtraBackup-8.0/Percona-XtraBackup-8.0.33-28/binary/redhat/7/x86_64/percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
yum -y localinstall percona-xtrabackup-80-8.0.33-28.1.el7.x86_64.rpm
xtrabackup  --version

在这里插入图片描述

3、 Mysql测试环境

3.1、安装部署mysql版本 8.0.21

部署过程忽略
在这里插入图片描述

3.2、写入一些测试数据

进入数据库

/opt/apps/mysql/bin/mysql -uroot -p -S /opt/data/data_16303/mysql.sock

执行SQL语句

create database school character set utf8;
create table school.student(
学号 char(20), 
姓名 char(20), 
性别 char(5), 
手机号 int(11), 
通信地址 char(50));
ALTER TABLE school.student MODIFY COLUMN 手机号 BIGINT;
insert into school.student values('NSD2023002','蛇精','女',1389999999,'上海'),('NSD181003','爷爷','男',1387777777,'长白山');select * from school.student;

在这里插入图片描述
附加Python写入更多的测试数据

import random
import string
import pymysql
import time# MySQL数据库配置
db_config = {"host": "172.16.11.1","port": 16303,"user": "mync","password": "bR5!eA7~bA","database": "school",
}# 生成随机字符串
def generate_random_string(length):letters = string.ascii_lettersreturn ''.join(random.choice(letters) for i in range(length))# 生成随机数据
def generate_random_data():students = [{"学号": f"NSD{random.randint(100000, 999999)}","姓名": generate_random_string(5),"性别": random.choice(["男", "女"]),"手机号": "1" + ''.join(random.choice(string.digits) for _ in range(10)),  # 生成11位数字字符串"通信地址": generate_random_string(10),}for _ in range(5)  # 更改要插入的随机记录数]return students# 将随机数据插入MySQL数据库
def insert_random_data(data):try:# 连接到MySQL数据库conn = pymysql.connect(**db_config)cursor = conn.cursor()# 插入数据到表中insert_query = "INSERT INTO school.student (学号, 姓名, 性别, 手机号, 通信地址) VALUES (%s, %s, %s, %s, %s)"for student in data:values = (student["学号"],student["姓名"],student["性别"],student["手机号"],student["通信地址"],)cursor.execute(insert_query, values)# 提交更改并关闭连接conn.commit()cursor.close()conn.close()print("数据插入成功。")except pymysql.Error as error:print(f"错误:{error}")if conn and conn.open:cursor.close()conn.close()if __name__ == "__main__":try:while True:# 生成随机数据random_data = generate_random_data()# 将随机数据插入表中insert_random_data(random_data)# 等待一段时间,例如5秒time.sleep(5)except KeyboardInterrupt:print("手动停止数据插入。")

4、全量各种备份操作

4.1、本地全量备份

4.1.1、将整个数据库备份到本地的指定目录。

mkdir  -p /data/backup/
/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --target-dir=/data/backup/ --port=16303 2> /tmp/xtrabackup.log

参数说明:

/usr/bin/xtrabackup: 这是执行 XtraBackup 工具的路径。
backup:发起全量备份
--slave-info:记录slave复制位点信息。
-uroot: 这是连接 MySQL 数据库时使用的用户名。
-p: 这是连接 MySQL 数据库时使用的密码选项,在命令中没有指定具体的密码值,所以执行命令时会提示您输入密码。
-S /opt/data/data_16303/mysql.sock: 这指定了 MySQL 服务器的 Unix 套接字路径。这个选项用于指定连接到 MySQL 服务器的套接字。
--datadir=/opt/data/data_16303: 这是 MySQL 数据目录的路径,XtraBackup 将从该路径读取数据库文件进行备份。
--target-dir=/data/backup/: 这是备份数据输出目录的路径。XtraBackup 将备份的数据输出到指定的目录中。
--port=16303:指定数据库端口
2> /tmp/xtrabackup.log: 这部分将标准错误输出 (stderr) 重定向到 /tmp/xtrabackup.log 文件。

4.1.2、执行命令之后,查看日志信息

在这里插入图片描述
在这里插入图片描述
可以观察到xtrabackup备份过程中的重要操作。比如何时锁表、何时解锁、何时开始备份、何时完成备份、备份是否成功等。

图中可以看到 completed OK!: 说明备份过程已成功完成。

4.1.3、查看备份出来的文件

在这里插入图片描述
每个文件的解释:

backup-my.cnf: 备份期间使用的 MySQL 配置文件。
ibdata1: InnoDB 存储引擎的系统表空间文件。它包含了表结构、数据和索引等信息。
mysql-bin.000005: 二进制日志文件,用于记录数据库的更改操作,以支持数据复制和恢复。
performance_schema: MySQL 的性能架构表,用于存储性能监控数据。
slave-bin.index: 从服务器的二进制日志索引文件,记录了从服务器的复制日志文件名。
undo_001: InnoDB 存储引擎的回滚段文件,用于支持事务的回滚操作。
xtrabackup_binlog_info: 备份期间的二进制日志信息,包括文件名和位置等。
xtrabackup_info: 备份的元数据信息,包括备份开始和结束时间、备份类型等。
xtrabackup_slave_info: 备份期间的主从复制信息,记录了主服务器的位置等信息。
ib_buffer_pool: InnoDB 存储引擎的缓冲池文件,用于缓存数据页。
mysql: MySQL 数据库的目录,其中可能包含其他表和数据文件。
mysql.ibd: MySQL 系统表的表空间文件。
school: 数据库中名为 "school" 的数据库的目录,其中可能包含其他表和数据文件。
sys: MySQL 的系统库,包含了系统视图和存储过程等。
undo_002: InnoDB 存储引擎的回滚段文件,用于支持事务的回滚操作。
xtrabackup_checkpoints: 备份期间生成的检查点信息,用于增量备份。
xtrabackup_logfile: 备份期间生成的日志文件。
xtrabackup_tablespaces: 备份期间生成的表空间信息,用于支持 InnoDB 表的恢复。

4.2、备份到远程主机

xtrabackup支持流式备份,备份文件本地不落盘,直接备份到远程主机,避免单个主机故障导致数据库和备份文件同时丢失。
本地主机跟远程主机提前做好SSH免密

/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock  --datadir=/opt/data/data_16303 --stream=xbstream --target-dir=/data/backup/ --port=16303 2> /tmp/xtrabackup.log  | ssh root@1.1.1.1 "cat -  > /data/backup/backup.s1"

命令执行后,由于做了SSH免密,只需输入MySQL的root密码。
在这里插入图片描述
命令解释:

这个命令执行了一个数据库备份操作,并将备份数据通过SSH传输到另一台远程主机。
/usr/bin/xtrabackup: 这是执行备份操作的命令。
--backup: 这是xtrabackup的选项之一,表示执行备份操作。
--slave-info: 这是xtrabackup的选项之一,表示在备份数据时包含复制相关的信息,以便在进行复制恢复时使用。
-uroot: 这是连接MySQL数据库的用户名,这里使用root用户进行连接。
-p: 这是连接MySQL数据库时的密码选项,命令中没有指定密码,因此在运行命令后,需要手动输入MySQL的密码。
-S /opt/data/data_16303/mysql.sock: 这是连接MySQL数据库时指定的UNIX套接字文件路径,用于指定数据库的连接方式。
--datadir=/opt/data/data_16303: 这是MySQL数据库的数据目录路径,指定要备份的数据库的数据目录。
--stream=xbstream: 这是xtrabackup的选项之一,表示将备份数据流式传输给stdout,以便在管道中传递到远程主机。
--target-dir=/data/backup/: 这是备份数据输出的目标目录路径。
--port=16303: 这是连接MySQL数据库时使用的端口号。
2> /tmp/xtrabackup.log: 这部分将标准错误输出重定向到/tmp/xtrabackup.log文件中,以便记录备份过程中可能出现的错误和警告。
|: 这是管道符号,它将前面命令的输出作为后面命令的输入。
ssh root@1.1.1.1: 这是SSH命令,用于远程登录到IP地址为1.1.1.1的主机,并使用root用户进行连接。
"cat - > /data/backup/backup.s1": 这部分是在远程主机上执行的命令,cat用于将标准输入(即前面备份命令传输的数据流)输出到/data/backup/backup.s1文件中。

4.3、压缩备份文件

可以在备份服务器上进行压缩,也可以在远程服务器上进行压缩。
压缩软件可以使用gzip,也可以使用pigz。pigz支持并行压缩和并行解压缩,可以加快压缩和解压的速度。

4.3.1、备份服务器上进行压缩

大概需求:
使用 Percona XtraBackup 工具备份 MySQL 数据库,连接到位于 /opt/data/data_16303 目录下的 MySQL 实例(使用用户名 “root”),备份的同时获取复制信息,备份数据输出到 /data/backup/ 目录下,并将备份数据进行压缩,压缩后的文件名为 backup1.gz。

/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --target-dir=/data/backup/ --port=16303 2> /tmp/xtrabackup.log  | gzip - > /data/backup/backup1.gz

命令解释:

/usr/bin/xtrabackup: 这是实际执行的备份工具的路径。
--backup: 这是 Percona XtraBackup 工具的选项之一,表示进行备份操作。
--slave-info: 这是 Percona XtraBackup 工具的选项之一,表示在备份的时候,也要获取复制信息。通常在配置了 MySQL 主从复制时使用,以确保备份数据的一致性。
-uroot: 这是连接 MySQL 数据库的用户名,这里使用了 "root" 用户。
-p: 这是一个选项,表示在连接数据库时需要输入密码。由于没有指定密码,系统会提示输入密码后才能继续执行。
-S /opt/data/data_16303/mysql.sock: 这是指定 MySQL 连接使用的套接字文件路径,用于连接到特定的 MySQL 实例。这里是连接到位于 /opt/data/data_16303 目录下的 MySQL 实例。
--datadir=/opt/data/data_16303: 这是指定 MySQL 数据目录的路径,即数据库文件所在的位置。
--target-dir=/data/backup/: 这是指定备份文件输出的目录路径。在这里,备份文件将会输出到 /data/backup/ 目录下。
--port=16303: 这是指定要连接的 MySQL 实例的端口号,这里指定为 16303。
2> /tmp/xtrabackup.log: 这是将标准错误输出(stderr)重定向到 /tmp/xtrabackup.log 文件中,用于记录备份过程中的错误信息。
| gzip - > /data/backup/backup1.gz: 这是将备份数据通过管道传送到 gzip 命令中,并将压缩后的数据输出到 /data/backup/backup1.gz 文件中。

4.3.2、发送到远程服务器压缩

大概需求
使用 Percona XtraBackup 工具备份 MySQL 数据库,连接到位于 /opt/data/data_16303 目录下的 MySQL 实例(使用用户名 “root”),备份的同时获取复制信息,备份数据通过 SSH 传输到位于 IP 地址为 “1.1.1.1” 的远程服务器,并在远程服务器上进行压缩保存,压缩后的文件名为 backup1.gz。

/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --target-dir=/data/backup/ --port=16303 2> /tmp/xtrabackup.log  | ssh root@1.1.1.1 "gzip - > /data/backup/backup1.gz"

命令解释:

/usr/bin/xtrabackup: 这是实际执行的备份工具的路径。
--backup: 这是 Percona XtraBackup 工具的选项之一,表示进行备份操作。
--slave-info: 这是 Percona XtraBackup 工具的选项之一,表示在备份的时候,也要获取复制信息。通常在配置了 MySQL 主从复制时使用,以确保备份数据的一致性。
-uroot: 这是连接 MySQL 数据库的用户名,这里使用了 "root" 用户。
-p: 这是一个选项,表示在连接数据库时需要输入密码。由于没有指定密码,系统会提示输入密码后才能继续执行。
-S /opt/data/data_16303/mysql.sock: 这是指定 MySQL 连接使用的套接字文件路径,用于连接到特定的 MySQL 实例。这里是连接到位于 /opt/data/data_16303 目录下的 MySQL 实例。
--datadir=/opt/data/data_16303: 这是指定 MySQL 数据目录的路径,即数据库文件所在的位置。
--target-dir=/data/backup/: 这是指定备份文件输出的目录路径。在这里,备份文件将会输出到 /data/backup/ 目录下。
--port=16303: 这是指定要连接的 MySQL 实例的端口号,这里指定为 16303。
2> /tmp/xtrabackup.log: 这是将标准错误输出(stderr)重定向到 /tmp/xtrabackup.log 文件中,用于记录备份过程中的错误信息。
|: 这是管道符号,用于将前面命令的输出传递给后面的命令。
ssh root@1.1.1.1: 这是通过 SSH 登录到远程服务器,其中 "root" 是远程服务器的用户名,"1.1.1.1" 是远程服务器的 IP 地址。
"gzip - > /data/backup/backup1.gz": 这是在远程服务器上执行的命令,通过管道接收来自前面命令的备份数据,并将其压缩后保存到远程服务器的 /data/backup/backup1.gz 文件中。

4.4、备份到云端(OSS)

xtrabackup工具中有一个xbcloud程序,可以将数据库直接备份到S3对象存储中,本地不落盘。
本次演示备份到阿里云OSS

4.4.1、部署ossutil工具

参考文章:阿里云ossutil使用

验证命令是否安装成功

./ossutil64  ls

在这里插入图片描述

4.4.2、创建一个命名管道

mkfifo /data/backup/backup0625.xbstream
ls -l /data/backup/backup0625.xbstream

在这里插入图片描述

4.4.3、执行备份命令

将备份的输出重定向到步骤 4.4.2 创建的命名管道。

/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --stream=xbstream --target-dir=/data/backup/ --port=16303 2>/data/backup/xtrabackup.log   > /data/backup/backup0625.xbstream

命令解释:
其余参数参考以上步骤

> /data/backup/backup0625.xbstream: 以 xbstream 格式流式输出备份数据重定向到 /data/backup/backup0625.xbstream 文件中,用于保存备份数据的 xbstream 文件。

4.4.4、使用ossutil工具将备份文件上传到OSS

ossutil64 cp /data/backup/backup0625.xbstream  oss://ycdbbackup

解释命令:

ossutil64: 这是实际执行的 OSS 命令行工具
cp: 这是 ossutil64 工具的一个子命令,用于复制文件或目录。
/data/backup/backup0625.xbstream: 这是本地的文件路径,指定了要上传的备份文件 backup0625.xbstream 所在的位置。
oss://ycdbbackup: 这是 OSS 存储桶的路径,指定了上传文件的目标位置。在这里,ycdbbackup 是 OSS 存储桶的名称,文件将会上传到该存储桶中。

5、增量备份操作

xtrabackup支持增量备份,在做增量备份之前,需要先做一个全量备份,xtrabackup会基于innodb page的lsn号来判断是否需要备份一个page,如果page lsn大于上次备份的lsn号,就需要备份该page。

5.1、进行一次全量备份。

使用 Percona XtraBackup 工具备份 MySQL 数据库,并将备份数据以流式 xbstream 格式进行压缩,然后保存到 /data/backup/full/backup_full.gz 文件中。

/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock  --datadir=/opt/data/data_16303 --stream=xbstream --target-dir /data/backup/full --port=16303 --extra-lsndir=/data/backup/full 2>/data/backup/full/backup_full.log | gzip -  > /data/backup/full/backup_full.gz

在这里插入图片描述
各参数命令解释:

/usr/bin/xtrabackup: 这是实际执行的备份工具的路径。
--backup: 这是 Percona XtraBackup 工具的选项之一,表示进行备份操作。
--slave-info: 这是 Percona XtraBackup 工具的选项之一,表示在备份的时候,也要获取复制信息。通常在配置了 MySQL 主从复制时使用,以确保备份数据的一致性。
-uroot: 这是连接 MySQL 数据库的用户名,这里使用了 "root" 用户。
-p: 这是一个选项,表示在连接数据库时需要输入密码。由于没有指定密码,系统会提示输入密码后才能继续执行。
-S /opt/data/data_16303/mysql.sock: 这是指定 MySQL 连接使用的套接字文件路径,用于连接到特定的 MySQL 实例。这里是连接到位于 /opt/data/data_16303 目录下的 MySQL 实例。
--datadir=/opt/data/data_16303: 这是指定 MySQL 数据目录的路径,即数据库文件所在的位置。
--stream=xbstream: 这是一个选项,指定备份数据以 xbstream 格式进行流式输出。xbstream 格式支持并行处理和压缩,适用于备份大型数据库。
--target-dir /data/backup/full: 这是指定备份文件输出的目录路径。在这里,备份文件将会输出到 /data/backup/full 目录下。
--port=16303: 这是指定要连接的 MySQL 实例的端口号,这里指定为 16303。
--extra-lsndir=/data/backup/full: 这是指定备份过程中产生的日志文件(LSN文件)的存放目录。LSN文件包含备份信息和复制信息。
2>/data/backup/full/backup_full.log: 这是将标准错误输出(stderr)重定向到 /data/backup/full/backup_full.log 文件中,用于记录备份过程中的错误信息。
|: 这是管道符号,用于将前面命令的输出传递给后面的命令。
gzip - > /data/backup/full/backup_full.gz: 这是将备份数据通过管道传送到 gzip 命令中,并将压缩后的数据输出到 /data/backup/full/backup_full.gz 文件中。

综合命令解释:
这个命令的含义是:使用 Percona XtraBackup 工具备份 MySQL 数据库,连接到位于 /opt/data/data_16303 目录下的 MySQL 实例(使用用户名 “root”),备份的同时获取复制信息,并以 xbstream 格式流式输出备份数据,备份数据输出到 /data/backup/full 目录中,并将备份数据进行压缩,压缩后的文件名为 backup_full.gz。同时,将错误信息输出到 /data/backup/full/backup_full.log 文件中。

5.1.1、测试写入新的数据

全量备份完之后,测试写入新的数据,使用Python 脚本模拟写入。

在这里插入图片描述

5.2、发起增量备份

使用 Percona XtraBackup 工具进行增量备份,将增量备份数据以流式 xbstream 格式进行压缩,并保存到 /data/backup/inc1/backup_inc1.gz 文件中。

5.2.1、在全量备份的基础上做增量备份

mkdir /data/backup/inc1
/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --stream=xbstream --target-dir /data/backup/inc1 --port=16303 --extra-lsndir=/data/backup/inc1 --incremental-basedir=/data/backup/full 2>/data/backup/inc1/backup_inc1.log | gzip -  > /data/backup/inc1/backup_inc1.gz

参数解释:

/usr/bin/xtrabackup: 这是实际执行的备份工具的路径。
--backup: 这是 Percona XtraBackup 工具的选项之一,表示进行备份操作。
--slave-info: 这是 Percona XtraBackup 工具的选项之一,表示在备份的时候,也要获取复制信息。通常在配置了 MySQL 主从复制时使用,以确保备份数据的一致性。
-uroot: 这是连接 MySQL 数据库的用户名,这里使用了 "root" 用户。
-p: 这是一个选项,表示在连接数据库时需要输入密码。由于没有指定密码,系统会提示输入密码后才能继续执行。
-S /opt/data/data_16303/mysql.sock: 这是指定 MySQL 连接使用的套接字文件路径,用于连接到特定的 MySQL 实例。这里是连接到位于 /opt/data/data_16303 目录下的 MySQL 实例。
--datadir=/opt/data/data_16303: 这是指定 MySQL 数据目录的路径,即数据库文件所在的位置。
--stream=xbstream: 这是一个选项,指定备份数据以 xbstream 格式进行流式输出。xbstream 格式支持并行处理和压缩,适用于备份大型数据库。
--target-dir /data/backup/inc1: 这是指定备份文件输出的目录路径。在这里,增量备份文件将会输出到 /data/backup/inc1 目录下。
--port=16303: 这是指定要连接的 MySQL 实例的端口号,这里指定为 16303。
--extra-lsndir=/data/backup/inc1: 这是指定备份过程中产生的日志文件(LSN 文件)的存放目录。LSN 文件包含备份信息和复制信息。
--incremental-basedir=/data/backup/full: 这是指定增量备份的基准目录,即之前已经完成的完整备份(full backup)的目录路径。这里是指定增量备份基于 /data/backup/full 目录下的完整备份。
2>/data/backup/inc1/backup_inc1.log: 这是将标准错误输出(stderr)重定向到 /data/backup/inc1/backup_inc1.log 文件中,用于记录备份过程中的错误信息。
|: 这是管道符号,用于将前面命令的输出传递给后面的命令。
gzip - > /data/backup/inc1/backup_inc1.gz: 这是将增量备份数据通过管道传送到 gzip 命令中,并将压缩后的数据输出到 /data/backup/inc1/backup_inc1.gz 文件中。

5.2.2、在上一次增量备份的基础上进行增量备份

使用 Percona XtraBackup 工具进行第二次增量备份,将增量备份数据以流式 xbstream 格式进行压缩,并保存到 /data/backup/inc2/backup_inc2.gz 文件中。
需要注意的是,恢复增量备份时,需要增量备份前的全量备份,以及该增量备份和全量备份之间的所有增量备份。

我这边的上一次增量备份目录是 /data/backup/inc1

mkdir /data/backup/inc2
/usr/bin/xtrabackup --backup --slave-info -uroot -p -S /opt/data/data_16303/mysql.sock --datadir=/opt/data/data_16303 --stream=xbstream --target-dir /data/backup/inc2 --port=16303 --extra-lsndir=/data/backup/inc2 --incremental-basedir=/data/backup/inc1 2>/data/backup/inc2/backup_inc2.log | gzip -  > /data/backup/inc2/backup_inc2.gz

命令参数解释:

/usr/bin/xtrabackup: 这是实际执行的备份工具的路径。
--backup: 这是 Percona XtraBackup 工具的选项之一,表示进行备份操作。
--slave-info: 这是 Percona XtraBackup 工具的选项之一,表示在备份的时候,也要获取复制信息。通常在配置了 MySQL 主从复制时使用,以确保备份数据的一致性。
-uroot: 这是连接 MySQL 数据库的用户名,这里使用了 "root" 用户。
-p: 这是一个选项,表示在连接数据库时需要输入密码。由于没有指定密码,系统会提示输入密码后才能继续执行。
-S /opt/data/data_16303/mysql.sock: 这是指定 MySQL 连接使用的套接字文件路径,用于连接到特定的 MySQL 实例。这里是连接到位于 /opt/data/data_16303 目录下的 MySQL 实例。
--datadir=/opt/data/data_16303: 这是指定 MySQL 数据目录的路径,即数据库文件所在的位置。
--stream=xbstream: 这是一个选项,指定备份数据以 xbstream 格式进行流式输出。xbstream 格式支持并行处理和压缩,适用于备份大型数据库。
--target-dir /data/backup/inc2: 这是指定备份文件输出的目录路径。在这里,第二次增量备份文件将会输出到 /data/backup/inc2 目录下。
--port=16303: 这是指定要连接的 MySQL 实例的端口号,这里指定为 16303。
--extra-lsndir=/data/backup/inc2: 这是指定备份过程中产生的日志文件(LSN 文件)的存放目录。LSN 文件包含备份信息和复制信息。
--incremental-basedir=/data/backup/inc1: 这是指定增量备份的基准目录,即上一次已经完成的增量备份(inc1 backup)的目录路径。这里是指定第二次增量备份基于 /data/backup/inc1 目录下的增量备份,如果上次备份的目录是其他,就需要更改。
2>/data/backup/inc2/backup_inc2.log: 这是将标准错误输出(stderr)重定向到 /data/backup/inc2/backup_inc2.log 文件中,用于记录备份过程中的错误信息。
|: 这是管道符号,用于将前面命令的输出传递给后面的命令。
gzip - > /data/backup/inc2/backup_inc2.gz: 这是将增量备份数据通过管道传送到 gzip 命令中,并将压缩后的数据输出到 /data/backup/inc2/backup_inc2.gz 文件中。

6、恢复全量备份

恢复全量备份大致可以分成以下几步:解压备份文件、prepare备份文件、将数据copy到目标实例相关目录、启动数据库实例。

6.1、删除测试机器上的数据库

由于之前的实验做了全量备份,所以我本次可以直接删除库,方便后续验证恢复。

在这里插入图片描述
删除之后停掉mysql服务

6.2、解压文件

如果备份时使用了xbstream,需要先解压备份文件。
我们备份时使用了–stream=xbstream和gzip压缩,先使用gunzip接解压缩,再使用xbstream将文件提取出来。

gunzip backup_full.gz
xbstream -x -v < backup_full

在这里插入图片描述
这两个命令的含义如下:

gunzip backup_full.gz: 这是一个解压缩命令,用于解压名为 backup_full.gz 的备份文件。gunzip 命令用于解压以 .gz 结尾的压缩文件,将其还原为原始格式的文件。gunzip: 这是用于解压缩文件的命令。
backup_full.gz: 这是要解压缩的文件名。在这里,backup_full.gz 是待解压缩的备份文件。
xbstream -x -v < backup_full: 这是使用 xbstream 工具从备份文件中还原数据的命令。xbstream: 这是 Percona XtraBackup 工具提供的命令,用于从 xbstream 格式的流数据中恢复备份文件。
-x: 这是 xbstream 命令的选项,表示要从流数据中还原(解压)备份文件。
-v: 这也是 xbstream 命令的选项,表示在解压备份数据时输出详细信息(verbose mode)。
< backup_full: 这是输入重定向符号 <,将备份文件 backup_full 的内容作为输入传递给 xbstream 命令。这样,xbstream 命令就可以从 backup_full 文件中获取数据并进行解压缩。

6.3、应用redo日志

解压完成后,需要使用xtrabackup --prepare命令,将xtrabackup_logfile应用到备份的数据文件中,将数据库恢复到备份结束时的状态。
xtrabackup --prepare命令会根据xtrabackup_checkpoints文件中记录的last_lsn来确定需要应用哪些日志。

cat   xtrabackup_checkpoints

在这里插入图片描述
xtrabackup_checkpoints 文件是 Percona XtraBackup 工具在备份过程中生成的检查点文件,其中包含了备份过程的一些状态信息。这些信息的含义:

backup_type = full-backuped: 这是备份类型,指示该备份是全量备份。
from_lsn = 0: 这是备份的起始日志序列号(LSN),表示备份过程从哪个LSN开始。
to_lsn = 18025014: 这是备份的结束日志序列号(LSN),表示备份过程到哪个LSN结束。
last_lsn = 18025014: 这是备份过程完成时数据库的最后一个日志序列号(LSN),表示备份过程结束时数据库中最后一个已经完成的日志序列号。
flushed_lsn = 18025014: 这是备份过程完成时数据库的刷新日志序列号(LSN),表示备份完成时刷新到磁盘上的最后一个日志序列号。
redo_memory = 0: 这是备份过程中使用的重做日志内存大小。
redo_frames = 0: 这是备份过程中使用的重做日志帧数。
这些信息对于备份的恢复非常重要。备份过程中记录的 LSN 信息用于确定备份的范围和备份点。在恢复时,这些信息可以帮助确定从哪个备份点开始恢复数据。通过这些信息,Percona XtraBackup 工具可以在恢复时识别已经备份的数据和未备份的数据,确保数据的一致性。
在正常情况下,xtrabackup_checkpoints 文件应该被 Percona XtraBackup 工具自动创建和管理,无需手动修改或操作。它只是备份过程的一个辅助文件,供工具在需要时参考。

6.3.1执行prepare命令

命令要在刚才解压的路径下执行

xtrabackup --prepare --target-dir . > prepare.log 2>&1

在这里插入图片描述

6.3.2命令执行完成后,查看日志信息

在这里插入图片描述
从输出可以看出,备份恢复过程已经成功完成,并且数据库已经恢复到了备份的状态。
如果最后一行日志不是“completed OK”,说明prepare执行过程中有问题,需要根据输出的日志分析具体原因。

日志信息解释:

2023-07-28T17:55:20.884397+08:00 0 [Note] [MY-012976] [InnoDB] 8.0.33 started; log sequence number 18025494: MySQL InnoDB 引擎已经启动,并显示了当前的日志序列号。2023-07-28T17:55:20.885939+08:00 0 [Warning] [MY-012091] [InnoDB] Allocated tablespace ID 1 for sys/sys_config, old maximum was 0: 在 InnoDB 启动过程中,分配了一个表空间 ID 给了 sys/sys_config 表。这里的警告表示这个表空间之前的最大 ID 为 0,现在被分配的 ID 是 1。2023-07-28T17:55:20.887374+08:00 0 [Note] [MY-011825] [Xtrabackup] Completed loading of 3 tablespaces into cache in 0.00289571 seconds: Xtrabackup 成功加载了 3 个表空间到缓存中,加载时间为 0.00289571 秒。2023-07-28T17:55:20.914958+08:00 0 [Note] [MY-011825] [Xtrabackup] Time taken to build dictionary: 0.0275147 seconds: 构建数据字典所花费的时间为 0.0275147 秒。2023-07-28T17:55:20.916163+08:00 0 [Note] [MY-011825] [Xtrabackup] starting shutdown with innodb_fast_shutdown = 1: Xtrabackup 开始执行 MySQL 的关闭过程,并且使用了 innodb_fast_shutdown = 1。2023-07-28T17:55:20.916277+08:00 0 [Note] [MY-012330] [InnoDB] FTS optimize thread exiting.: 全文搜索 (FTS) 优化线程正在退出。2023-07-28T17:55:21.915623+08:00 0 [Note] [MY-013072] [InnoDB] Starting shutdown...: MySQL InnoDB 引擎开始关闭。2023-07-28T17:55:21.922401+08:00 0 [Note] [MY-013084] [InnoDB] Log background threads are being closed...: 后台日志线程正在关闭。2023-07-28T17:55:21.938262+08:00 0 [Note] [MY-012980] [InnoDB] Shutdown completed; log sequence number 18025494: MySQL InnoDB 引擎已经成功关闭,并显示了关闭时的日志序列号。2023-07-28T17:55:21.940303+08:00 0 [Note] [MY-011825] [Xtrabackup] completed OK!: Xtrabackup 完成了恢复操作,并成功恢复数据库到备份的状态。

6.4、增加内存

xtrabackup启动的mysql临时实例buffer pool默认为100M,可以通过参数–use-memory适当增加内存,加快恢复的速度。官方文档建议将内存设置为1-2G。

xtrabackup --prepare --use-memory=2G --target-dir . > prepare.log 2>&1

在这里插入图片描述

6.5、将数据文件复制到数据目录

xtrabackup prepare完成后的数据库,可以用来直接启动。启动实例之前,需要将文件复制(或移动)到目标实例的数据目录中。目录需要依据目标实例的参数来确定。

6.5.1、先查看一下恢复出来的文件

在这里插入图片描述

6.5.2、查看本机的my_16303.cnf文件

在这里插入图片描述

6.5.3复制文件

cd  /data/backup/full/
\cp  -r   *   /opt/data/data_16303/

6.6、启动实例

/opt/apps/mysql/bin/mysqld --defaults-file=/opt/conf/my_16303.cnf --user=swadmin & 

进库验证数据

/opt/apps/mysql/bin/mysql -uroot -p -S /opt/data/data_16303/mysql.sock

在这里插入图片描述
可以看到之前删除的库已经恢复回来了

7、恢复增量备份

恢复增量备份时,需要先对基础全量备份进行恢复,然后再依次按增量备份的时间进行恢复。

7.1、先再次恢复全量备份

cd /data/backup/full
xbstream -x -v < backup_full
xtrabackup --prepare --apply-log-only --target-dir=. > prepare_full.log 2>&1

命令解释:

xbstream -x -v < backup_full: xbstream是用于处理InnoDB备份数据的工具,这里使用了输入重定向符<,将名为backup_full的输入数据传递给xbstream命令。-x参数表示解压缩备份数据,-v参数表示启用详细输出(verbose mode)。xbstream将解压缩后的备份数据输出到当前目录下。xtrabackup --prepare --apply-log-only --target-dir=. > prepare_full.log 2>&1: xtrabackup是用于处理InnoDB备份的工具,这里使用了输出重定向符>将输出结果写入名为prepare_full.log的文件中。2>&1将标准错误输出重定向到标准输出,也就是一并写入到prepare_full.log文件。--prepare: 这个选项用于准备InnoDB备份数据。在准备阶段,备份数据会被还原,但不会被恢复到MySQL服务器上。这是为了确保数据的一致性,以便在后续恢复过程中使用。--apply-log-only: 这个选项告诉xtrabackup只执行事务日志的应用,而不进行真正的数据恢复。这也是准备阶段的一部分。--target-dir=.: 这个选项指定备份数据的目录,这里使用.表示当前目录,即之前通过xbstream解压缩的备份数据所在的目录。

7.2、查看日志

查看日志,确认这一步骤执行成功(最后一行日志显示“completed OK!”):
在这里插入图片描述

7.3、恢复第一个增量备份

cd /data/backup/inc1
gunzip backup_inc1.gz
rm -rf  xtrabackup_checkpoints xtrabackup_info    ## 需要先删除这两个文件,否则xbstream提取文件时有冲突
xbstream -x -v < backup_inc1       ## 提取文件

在这里插入图片描述
以上命令执行完后
恢复增量备份时,切换到全量备份的目录执行

cd /data/backup/full
xtrabackup --prepare --apply-log-only --incremental-dir=/data/backup/inc1 --target-dir=. > prepare_inc1.log 2>&1

恢复增量备份时,加上apply-log-only参数,参数–incremental-dir设置为增量备份文件所做目录。

7.4、检查执行日志

在这里插入图片描述
确认增量备份恢复执行成功(日志最后一行显示“completed OK!”)

7.5、复制文件

到这一步之后,操作和恢复全量备份的操作基本是一样的。

cd /data/backup/full
\cp -r *    /opt/data/data_16303
chown -R swadmin:swadmin   /opt/data/data_16303/*

7.6、启动数据库

/opt/apps/mysql/bin/mysqld --defaults-file=/opt/conf/my_16303.cnf --user=swadmin & 

至此,增量备份恢复完成。

8、将数据库恢复到指定时间点

使用全量备份和增量备份文件,都只能将数据库恢复到备份结束的时间。通过binlog,可以将数据库恢复到任意时间点(前提是备份和该时间点之间的binlog都存在)。

8.1、找到时间点对应的binlog

恢复到时间点,首先需要定位该时间点对应的binlog位点(binlog文件和文件内的偏移量)。每个binlog头部都记录了该binlog产生的时间,我们可以使用mysqlbinlog工具解析binlog,查看binlog的第一个event的时间:

/opt/apps/mysql/bin/mysqlbinlog  -v  mysql-bin.000011  |   head

在这里插入图片描述
如果我们需要恢复到某个时间点T,那么我们需要找的binlog开始时间不大于T,并且该binlog的下一个binlog的开始时间大于T。

8.2、批量查看binlog时间

这里提供一个python的脚本,可以批量查看binlog时间

import sys
import structif len(sys.argv) >= 2:pattern = sys.argv[1]
else:pattern = 'mysql-bin.0000*'print ('binlog pattern: %s' % pattern)def parse_binlog_header(filename):with open(filename, 'rb') as f:data = f.read(8)return struct.unpack('i', data[4:])[0]def main():import globfrom datetime import datetimefor f in sorted(glob.glob(pattern), key=lambda x: int(x.split('.')[-1])):ts = parse_binlog_header(f)print f, ts, datetime.fromtimestamp(ts)if __name__ == '__main__':main()

其中这个参数 pattern = ‘mysql-bin.0000*’ 根据自己本机的名字修改
脚本定义在跟binlog同一个目录
在这里插入图片描述
执行脚本,显示binlog时间:

在这里插入图片描述

8.3使用mysqlbinlog解析binlog并执行

我的全量备份binlog位点是mysql-bin.000008

cat xtrabackup_binlog_info

在这里插入图片描述
假设需求希望将数据库恢复到2023-07-28 16:45:00

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

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

相关文章

【HDFS】Block、BlockInfo、BlockInfoContiguous、BlockInfoStriped的分析记录

本文主要介绍如下内容: 关于几个Block类之间的继承、实现关系;针对文章标题中的每个类,细化到每个成员去注释分析列出、并详细分析BlockInfo抽象类提供的抽象方法、非抽象方法的功能针对几个跟块组织结构的方法再进行分析。moveBlockToHead、listInsert、listRemove等。一、…

【计算机网络】应用层协议 -- HTTP协议

文章目录 1. 认识HTTP协议2. 认识URL3. HTTP协议格式3.1 HTTP请求协议格式3.2 HTTP响应协议格式 4. HTTP的方法5. HTTP的状态码6. HTTP的Header7. Cookie和Session 1. 认识HTTP协议 协议。网络协议的简称&#xff0c;网络协议是通信计算机双方必须共同遵守的一组约定&#xff0…

C# 全局响应Ctrl+Alt+鼠标右键

一、简述 某些应用&#xff0c;我们希望全局自定义热键。按键少了会和别的应用程序冲突&#xff0c;按键多了可定用户操作不变。因此我计划左手用CtrlAlt&#xff0c;右手用鼠标右键呼出我自定义的菜单。 我使用键盘和鼠标事件进行简单测试&#xff08;Ctrl鼠标右键&#xff…

【Ajax】笔记-jsonp实现原理

JSONP JSONP是什么 JSONP(JSON With Padding),是一个非官方的跨域解决方案&#xff0c;纯粹凭借程序员的聪明才智开发出来的&#xff0c;只支持get请求。JSONP 怎么工作的&#xff1f; 在网页有一些标签天生具有跨域能力&#xff0c;比如&#xff1a;img link iframe script. …

【Python数据分析】Python常用内置函数(一)

&#x1f389;欢迎来到Python专栏~Python常用内置函数&#xff08;一&#xff09; ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;Python学习专栏 文章作者技术和水平有限&#xff0c;如果文…

Redis实战(3)——缓存模型与缓存更新策略

1 什么是缓存? 缓存就是数据交换的缓冲区&#xff0c; 是存贮数据的临时区&#xff0c;一般读写性能较高 \textcolor{red}{是存贮数据的临时区&#xff0c;一般读写性能较高} 是存贮数据的临时区&#xff0c;一般读写性能较高。缓存可在多个场景下使用 以一次 w e b 请求为例…

计算机网络——学习笔记

付费版&#xff1a;直接在上面的CSDN资源下载 免费版&#xff1a;https://wwsk.lanzouk.com/ijkcj13tqmyb 示例图&#xff1a;

基于MOT数据集的高精度行人检测系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于MOT数据集的高精度行人检测系统可用于日常生活中检测与定位行人目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的行人目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训练数据集&…

数据可视化(3)

1.饼状图 #饼状图 #pie&#xff08;x,labels,colors,labeldistance,autopct,startangle,radius,center,textprops&#xff09; #x,每一块饼状图的比例 #labels:每一块饼形图外侧显示的文字说明 #labeldistance&#xff1a;标记的绘制位置&#xff0c;相对于半径的比例&#xf…

[论文笔记] CLRerNet: Improving Confidence of Lane Detection with LaneIoU

Honda, Hiroto, and Yusuke Uchida. “CLRerNet: Improving Confidence of Lane Detection with LaneIoU.” arXiv preprint arXiv:2305.08366 (2023). 2023.05 出的一篇车道线检测的文章, 效果在CULane, CurveLanes SOTA 文章目录 简介LaneIoULineIoU存在问题为什么使用LaneIo…

阿里Java开发手册~集合处理

1. 【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 1 &#xff09; 只要重写 equals &#xff0c;就必须重写 hashCode 。 2 &#xff09; 因为 Set 存储的是不重复的对象&#xff0c;依据 hashCode 和 equals 进行判断&#xff…

【雕爷学编程】MicroPython动手做(02)——尝试搭建K210开发板的IDE环境3

4、下载MaixPy IDE&#xff0c;MaixPy 使用Micropython 脚本语法&#xff0c;所以不像 C语言 一样需要编译&#xff0c;要使用MaixPy IDE , 开发板固件必须是V0.3.1 版本以上&#xff08;这里使用V0.5.0&#xff09;, 否则MaixPy IDE上会连接不上&#xff0c; 使用前尽量检查固…

基于fpga_EP4CE6F17C8实现的呼吸灯

文章目录 前言实验手册&#xff08;EP4CE6F17C8&#xff09;一、实验目的二、实验原理理论原理 三、系统架构设计四、模块说明1&#xff0e;模块端口信号列表2&#xff0e;状态转移图3&#xff0e;时序图 五、仿真波形图六、引脚分配七、代码实现八、仿真代码九、板级验证效果 …

深入浅出索引(上)

场景引入 某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。但到底什么是索引&#xff0c;索引又是如何工作的呢&#xff1f; 一句话简单来说&#xff0c;索引的出现其实就是为了提高数据查询的效率&#xff…

Golang Devops项目开发(1)

1.1 GO语言基础 1 初识Go语言 1.1.1 开发环境搭建 参考文档&#xff1a;《Windows Go语言环境搭建》 1.2.1 Go语言特性-垃圾回收 a. 内存自动回收&#xff0c;再也不需要开发人员管理内存 b. 开发人员专注业务实现&#xff0c;降低了心智负担 c. 只需要new分配内存&#xff0c;…

Mysql定时删除表数据

由于用户环境有张日志表每天程序都在狂插数据&#xff0c;导致不到一个月时间&#xff0c;这张日志表就高达200多万条记录&#xff0c;但是日志刷新较快&#xff0c;里面很多日志没什么作用&#xff0c;就写了个定时器&#xff0c;定期删除这张表的数据。 首先查看mysql是否开启…

L---泰拉瑞亚---2023河南萌新联赛第(三)场:郑州大学

链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 来源&#xff1a;牛客网 示例1 输入 1 10 3 5 输出 3 说明 只有一把回旋镖&#xff0c;你可以先打两次伤害为3的&#xff0c;再打一次倾尽全力的&#xff0c;造成的伤害为5。总伤害为33511&#xff0c;即可获得胜…

FPGA设计时序分析三、恢复/去除时间

目录 一、背景说明 二、工程设计 2.1 工程代码 2.2 综合结果 一、背景说明 ​恢复时间recovery和去除时间removal和setup、holdup类型&#xff0c;不同点是数据信号为控制信号&#xff0c;如复位&#xff0c;清零&#xff0c;使能信号&#xff0c;更多的是异步的复位信号&a…

Spring Cloud Eureka 服务注册和服务发现超详细(附加--源码实现案例--及实现逻辑图)

文章目录 EurekaEureka组件可以实现哪些功能什么是CAP原则&#xff1f;服务注册代码实战搭建注册中心服务A搭建服务B搭建启动服务启动注册中心启动服务A启动服务B 结束语 Eureka 这篇文章先讲述一下Eureka的应用场景、代码实现案例&#xff0c;多个服务模块注册到Euraka中&…

使用MyBatis(2)

目录 一、定义接口、实体类、创建XML文件实现接口&#xff09; 二、MyBatis的增删改查 &#x1f345;1、MyBatis传递参数查询 &#x1f388;写法一 &#x1f388;写法二 &#x1f388;两种方式的区别 &#x1f345;2、删除操作 &#x1f345;3、根据id修改用户名 &#x…