一、XtraBackup 简介
Percona XtraBackup
是一个开源的MySQL
和MariaDB
数据库备份工具,它能够创建高性能、一致性的备份,并且对生产环境的影响很小。Percona XtraBackup
通过在不停止MySQL
服务器的情况下,复制InnoDB
存储引擎的数据文件和事务日志,来实现备份和还原操作。
Percona XtraBackup
的主要特点如下:
-
高性能备份:
Percona XtraBackup
能够以并行方式备份数据库,提供快速备份速度,并且对生产系统影响较小。 -
一致性备份:
Percona XtraBackup
使用InnoDB
特定的算法来确保备份的一致性,即备份的数据文件和事务日志是同一时刻的状态。 -
增量备份:
Percona XtraBackup
支持增量备份,可以根据之前的全量备份来创建增量备份,减少备份时间和存储空间的消耗。 -
支持压缩和加密:
Percona XtraBackup
可以在备份过程中使用压缩算法来减小备份文件的大小,还可以对备份文件进行加密,提高数据的安全性。 -
灵活的备份恢复:
Percona XtraBackup
支持将备份文件复制回数据库目录进行恢复,也支持以流的方式输出备份数据进行恢复。 -
兼容性:
Percona XtraBackup
兼容MySQL
和MariaDB
,可以在不同版本的数据库上使用。
总之,Percona XtraBackup
是一个强大而灵活的数据库备份工具,它可以帮助数据库管理员轻松地创建可靠的备份,并在需要时进行高效的还原操作。无论是用于生产环境的数据保护,还是用于开发和测试环境的数据复制,Percona XtraBackup
都是一个可靠的选择。
官网地址:https://docs.percona.com/percona-xtrabackup/8.0/
二、环境及部署
2.1 运行环境介绍
本章节所有演示操作均在Docker
环境下。
docker
版本20.10.6
docker-compose
版本1.28.5
2.2 Mysql及XtraBackup配置
目录结构如下:
Mysql
配置文件my.cnf
:
# For advice on how to change settings please see
# http://dev.mysql.com/doc/refman/8.0/en/server-configuration-defaults.html
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
# Remove leading # to revert to previous value for default_authentication_plugin,
# this will increase compatibility with older clients. For background, see:
# https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_default_authentication_plugin
# default-authentication-plugin=mysql_native_password
default-time_zone='+8:00'
log-bin
log_bin_trust_function_creators=1
lower_case_table_names=1
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql
innodb_undo_tablespaces=2
innodb_read_only=off
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
# !includedir /etc/mysql/conf.d/
docker-compose.yml
:
version: "3.8"
# 通用日志设置
x-logging:
&default-logging
# 日志大小和数量
options:
max-size: "100m"
max-file: "3"
# 文件存储类型
driver: json-file
services:
mysql:
container_name: mysql
image: mysql:8.0.32
user: 999:999
environment:
- MYSQL_ROOT_PASSWORD=1qaz@WSX
volumes:
- data_volume:/var/lib/mysql
- backup_volume:/backup
- /root/apps/mysql/my.cnf:/etc/my.cnf:ro
- /etc/timezone:/etc/timezone:ro
logging: *default-logging
ports:
- "3306:3306"
xtrabackup-command:
container_name: xtrabackup-command-line
image: percona/percona-xtrabackup:8.0.32
user: 999:999
restart: always
depends_on:
- mysql
volumes_from:
- mysql
command: tail -f /dev/null
volumes:
data_volume:
driver: local
backup_volume:
driver: local
注意事项一:
xtrabackup
:请XtraBackup
版本和Mysql
版本保持一致。volumes_from
:表示和docker mysql
容器使用相同的容器卷信息user
:表示容器运行使用指定的用户,mysql
的UID
和GID
为999:999
,xtrabackup
用户与mysql
相同出现避免文件权限问题。command: tail -f /dev/null
:通过此命令将容器xtrabackup-command-line
进行服务常驻,方便后续使用过程演示。
注意事项二:
data_volume
:使用本地数据卷绑定,默认位置:/var/lib/docker/volumes/mysql_data_volume/_data
,因上文中提到容器运行使用指定的用户,需更改此目录权限,容器外部执行:chmod 777 -R /var/lib/docker/volumes/mysql_data_volume/_data
backup_volume
:使用本地数据卷绑定,默认位置:/var/lib/docker/volumes/mysql_backup_volume/_data
,因上文中提到容器运行使用指定的用户,需更改此目录权限,容器外部执行:chmod 777 -R /var/lib/docker/volumes/mysql_backup_volume/_data
2.3 启动服务
cd /root/apps/mysql
docker-compose up -d
2.4 准备测试数据
create DATABASE t1;
use t1;
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` bigint NOT NULL AUTO_INCREMENT,
`name` varchar(20) DEFAULT NULL,
`gender` int NULL DEFAULT 0,
`birthday` varchar(10) DEFAULT NULL,
`address` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES( 1, '张三', 1, '2023-08-06', '黑龙江');
select * from `user`;
三、XtraBackup使用详解
3.1 常用参数介绍
Percona XtraBackup
中一些常用参数的说明及其默认值:
-
--backup
:执行备份操作,默认为启用。 -
--target-dir
=<目录路径>:指定备份文件存储的目录路径。 -
--incremental-basedir
=<目录路径>:指定增量备份的基准目录路径,表示该增量备份是基于哪个全量备份进行的。 -
--prepare
:对备份文件执行准备操作,默认为禁用。 -
--copy-back:
将备份文件复制回数据库目录,用于还原操作,默认为禁用。 -
--apply-log
:在备份文件上应用事务日志,用于还原操作,默认为禁用。 -
--datadir
=<目录路径>:指定数据库的数据目录路径,默认为MySQL配置文件中指定的数据目录。 -
--defaults-file
=<文件路径>:指定用于备份和还原的配置文件路径,默认为MySQL的默认配置文件路径。 -
--user
=<用户名>:指定连接数据库时使用的用户名,默认为当前系统用户。 -
--password
=<密码>:指定连接数据库时使用的密码,默认为空。 -
--host
=<主机名>:指定连接数据库时使用的主机名,默认为localhost。 -
--port
=<端口号>:指定连接数据库时使用的端口号,默认为3306。 -
--compress
:在备份过程中使用压缩算法以减小备份文件的大小,默认为禁用。 -
--compress-threads
=<线程数>:指定用于压缩备份文件的线程数,默认为1。 -
--encrypt
:在备份过程中对备份文件进行加密,默认为禁用。 -
--encrypt-key
=<密钥>:指定用于备份文件加密的密钥。 -
--stream
=<流类型>:将备份数据以流的方式输出到标准输出、文件或网络套接字,默认为禁用。
3.2 完整备份及恢复
3.2.1 进入容器
docker exec -it xtrabackup-command-line /bin/bash
3.2.2 创建完整备份
xtrabackup --backup --datadir=/var/lib/mysql --target-dir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
注意事项:
- 目标目录不存在,
XtraBackup
会创建它。- 目录存在且为空,
XtraBackup
将成功。- 目录存在且为不为空,
XtraBackup
不会覆盖现有文件,它会在运行时失败,显示系统错误17
,file exists
。
3.2.3 查看完整备份
ls -lh /backup/full
注意事项:
- 备份可能需要很长时间,具体取决于数据库的大小。随时取消是安全的,因为
XtraBackup
不会修改数据库。
3.2.4 模拟原数据库损坏
- 关闭容器
docker stop mysql
- 删除数据库文件
cd /var/lib/docker/volumes/mysql_data_volume/_data
rm -rf *
3.2.5 准备完整备份
创建备份后,您需要对其进行准备以进行还原。在准备好数据文件之前,数据文件在时间点上是不一致的,因为它们是在程序运行的不同时间复制的,并且在执行此操作时可能已被更改。
如果你试图用这些数据文件启动InnoDB
,它会检测到损坏并停止工作,以避免在损坏的数据上运行。该步骤使文件在单个时刻完全一致,因此您可以在它们上运行InnoDB
。
您可以在任何机器上运行准备操作;它不需要位于原始服务器或要恢复到的服务器上。您可以将备份复制到实用工具服务器并在那里进行准备。
请注意,
Percona XtraBackup 8.0
只能准备MySQL 8.0
、Percona Server for MySQL 8.0
和Percona XtraDB Cluster 8.0
数据库的备份。不支持8.0
之前的版本。
在准备操作期间,xtrabackup
启动了一种经过修改的嵌入式InnoDB
(extrabackup
链接的库)。这些修改对于禁用InnoDB
标准安全检查是必要的,例如:日志文件大小不合适。此警告不适用于处理备份。这些修改仅适用于extrabackup
二进制文件;您不需要修改后的InnoDB
即可使用xtrabackup
进行备份。
准备步骤使用这个“嵌入式InnoDB
”,使用复制的日志文件对复制的数据文件执行崩溃恢复。该步骤使用起来非常简单:您只需使用选项运行xtrabackup
,并告诉它要准备哪个目录。具体操作如下:
xtrabackup --prepare --target-dir=/backup/full
注意事项:
- 不建议在准备备份时中断
XtraBackup
过程,因为这可能会导致数据文件损坏并且备份将变得不可用。如果准备过程中断,则不保证备份有效性。- 如果希望备份作为进一步增量备份的基础,则应在准备备份时使用
--apply-log-only
选项,否则将无法对其应用增量备份。有关更多详细下文介绍。
完成此操作后,您应该会看到如下所示的消息,其中 LSN
的值将再次取决于您的系统:InnoDB shutdown
:
3.2.6 完整备份还原
为方便起见,xtrabackup
二进制文件可以选择将备份复制到服务器的 datadir
:
xtrabackup --copy-back --target-dir=/backup/full
注意事项:
- 在还原备份之前,数据目录必须为空。此外,请务必注意,在执行还原之前需要关闭
MySQL
服务。您无法还原到正在运行的mysqld
实例的数据目录(导入部分备份时除外)。- 应该检查还原的文件是否具有正确的所有权和权限,需要时可执行:
chown -R mysql:mysql /var/lib/mysql
进行所有权更改。
3.2.7 启动数据库及验证
docker restart mysql
use t1;
select * from `user`;
至此完整备份及恢复介绍完毕。
3.3 增量备份及恢复
3.3.1 创建完整备份
注意事项:
- 需先清空
/var/lib/docker/volumes/mysql_backup_volume/_data/full
目录
详见上文3.2.1、3.2.2、3.2.3章节,操作步骤及命令一致
3.3.2 添加增量数据1️⃣
use t1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES(4, '七七', 1, '2023-08-06', '海南');
select * from `user`;
3.3.3 创建增量备份1️⃣
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
3.3.4 添加增量数据2️⃣
use t1;
INSERT INTO `user` ( id, name, gender, birthday, address ) VALUES(5, '八八', 1, '2023-08-06', '合肥');
select * from `user`;
3.3.5 创建增量备份2️⃣
xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
3.3.6 准备备份
增量备份的步骤与完整备份的步骤不同。在完全备份中,执行两种类型的操作以使数据库保持一致:已提交的事务从日志文件相对于数据文件重播,未提交的事务回滚。
在准备增量备份时,您必须跳过未提交事务的回滚,因为备份时未提交的事务可能正在进行中,而且很可能会在下一次增量备份中提交。您应该使用--prepare --apply-log-only
选项来阻止回滚阶段。
3.3.6.1 准备完整备份
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
注意事项:
--prepare--apply-log-only
:通过配置来阻止回滚阶段。
3.3.6.2 准备增量备份1️⃣
将第一个增量备份应用于完整备份,请运行以下命令:
xtrabackup --prepare --apply-log-only --target-dir=/backup/full --incremental-dir=/backup/inc1 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
注意事项:
- 此备份实际上可以安全地按原样还原,即使已跳过回滚阶段也是如此。如果您还原它并启动
MySQL
,InnoDB
将检测到未执行回滚阶段,并且它将在后台执行此操作,就像通常在启动时进行崩溃恢复一样。它将通知您数据库未正常关闭。- 最终数据在
/backup/full
目录中。
3.3.6.3准备增量备份2️⃣
准备第二个增量备份的过程与第一个类似:
xtrabackup --prepare --target-dir=/backup/full --incremental-dir=/backup/inc2 --user=root --password="1qaz@WSX" --port=3306 --host=192.168.0.50 --no-server-version-check
注意事项:
---apply-log-only
:在合并增量备份(最后一个备份除外)时应使用。这就是上一行不包含该选项的原因。即使在最后一步中使用了 ,备份仍将保持一致,但在这种情况下,服务器将执行回滚阶段。
3.3.7 模拟原数据库损坏
详见上文3.2.4章节,操作步骤及命令一致
3.2.8 完整备份还原
xtrabackup --copy-back --target-dir=/backup/full
3.2.7 启动数据库及验证
docker restart mysql
use t1;
select * from `user`;
至此增量备份及恢复介绍完毕。
3.3 其他
关于
XtraBackup
压缩备份及部分备份稍后整理介绍。
参考:https://blog.51cto.com/u_11750496/6753459