xtrabackup 2.4 的介绍与使用

抄袭转载的太多,请认准原文链接:xtrabackup 的介绍与使用

前言

在网上找到教程都是复制粘贴抄袭的,而且还是陈旧资料,不得不说,当前中文互联网环境真是每况愈下。

如果你在网上找 xtrabackup 的教程,大概率会为你介绍 innobackupex。但在最新的 2.4 版本中,innobackupex 已经废弃,只是一个指向 xtrabackup 的软连接 ,官方推荐使用 xtrabackup,原文地址:The innobackupex Program

本文教程使用的是 xtrabackup 2.4.28,是当前(本文发布时)最新的 xtrabackup2.4 版本,可以备份 MySQL 5.1、5.5、5.6 和 5.7 服务器上的 InnoDB、XtraDB 和 MyISAM 表的数据,以及带有 XtraDB 的 Percona Server。

环境安装

教程中使用 MySQL 5.7 版本,其安装方式不多赘述,主要介绍 xtrabackup 的安装,如果你已经准备好了环境可以略过此步,这里介绍三种不同的方式。

Docker

个人推荐使用 docker 安装的方式,这里贴出完整的 docker-compose.yml,仅供参考:

复制代码
version: "3.7"
services:
    xtrabackup:
        image: percona/percona-xtrabackup:2.4.28
        container_name: xtrabackup
        restart: "always"
        command: bash -c "while true; do sleep 1; done"
        volumes:
            - "/home/docker/xtrabackup:/data"
            # 这里需要把 MySQL 的数据目录映射到容器中,原因请查看下文的注意事项
            - "/home/docker/mysql/data/:/var/lib/mysql"

command 命令是一个简单的 while 循环,用来保持容器运行,方便进入其中执行命令。

Debian/Ubuntu

从 Percona web 下载 deb 包

复制代码
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb

安装 dpkg,这一步需要 root 权限

复制代码
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

启用存储库

复制代码
percona-release enable-only tools release

apt 安装 xtrabackup

复制代码
sudo apt install percona-xtrabackup-24

apt 安装 qpress, qpress 用于压缩备份

复制代码
sudo apt install qpress

Red Hat/CentOs

安装 percona-release:

复制代码
yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm

RHEL | Centos5 不支持直接从远程位置安装软件包,因此您需要先下载软件包并使用 rpm 手动安装:

复制代码
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
rpm -ivH percona-release-latest.noarch.rpm

启用存储库:

复制代码
percona-release enable-only tools release

yum 安装 xtrabackup:

复制代码
yum install percona-xtrabackup-24

yum 安装 qpress, qpress 用于压缩备份:

复制代码
yum install qpress

注意事项

xtrabackup 在备份时需要访问 MySQL 的数据目录,且具备操作它的权限 ,所以 MySQL 和 xtrabackup 不在同一主机的情况下,需要把 MySQL 的数据拷贝到 xtrabakcup 所在的主机上。

常用概念和参数

xtrabakcup 有几个常见的概念:

  • 完整备份:顾名思义,就是完整备份 o.O
  • 恢复备份:顾名思义,就是恢复备份 O.o
  • 准备备份:这个不能顾名思义了,它用来把完整备份出来的数据文件进行一些处理,处理后的数据才能用于恢复备份
  • 增量备份:每一次完整备份的数据文件会很大,增量备份会在其基础上做备份,这样可以节省资源
  • 压缩备份:把备份文件进行压缩,以节省空间

这里是几个常用xtrabackup 命令参数,在后续不明白时,可以过来查询

  • --backup 制作一个备份并放在 --target-dir 中,这个是制作完整备份和增量备份的必要参数
  • --prepare 创建准备备份
  • --target-dir 指定备份文件的目录,不存在将自动创建
  • --apply-log-only 这个选项在准备备份时使用,让其只执行 redo 阶段,一般用在增量备份上
  • --host 指定 MySQL 的 host
  • --port 指定 MySQL 的 port
  • --password 指定 MySQL 的密码
  • --defaults-file 指定 my.cnf,不能是 my.cnf 的软链接
  • --datadir 指定 MySQL 的数据目录,一般会从 my.cnf 中读取

预备数据

我们先预备一下 MySQL 的测试数据,创建一个用于测试的数据库:

复制代码
CREATE DATABASE test;

创建一个表,并填充数据:

复制代码
CREATE TABLE `user`  (
  `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

INSERT INTO `user` (name) VALUES ("oldme");
INSERT INTO `user` (name) VALUES ("newton");
INSERT INTO `user` (name) VALUES ("watt");

完整备份

创建备份

复制代码
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/base/

完成后的效果:

查看备份出来的文件:ls -l /data/backups/base

然后我们删掉一条数据,以做恢复数据展示:

复制代码
DELETE FROM `user` WHERE id=3

准备备份

必须先要准备备份后才能恢复数据:

复制代码
xtrabackup --prepare --target-dir=/data/backups/base/

完成后的效果:

恢复备份

在恢复备份前需要关闭 MySQL 服务。

复制代码
// base后面一定要带/
rsync -avrP /data/backups/base/ /var/lib/mysql/

恢复数据后更改文件所有权,如果是 docker 部署则略过:

复制代码
chown -R mysql:mysql /var/lib/mysql

重启 MySQL 服务,查看恢复完成的数据:

复制代码
SELECT* FROM `user`

id	name
--------------
1	oldme
2	newton
3	watt

增量备份

创建备份

在创建增量备份前,我们需要有一个完整备份:

复制代码
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/base/

给数据库新增一条数据:

复制代码
INSERT INTO `user` (name) VALUES ("Einstein");

然后以此为基础进行增量:

复制代码
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/inc1 --incremental-basedir=/data/backups/base

/data/backups/inc1/ 目录现在应该包含增量文件,例如 ibdata1.delta 和 test/user.ibd.delta。

还可以以 inc1 为基础继续增量:

复制代码
xtrabackup --backup --host=mysql --password=12345678 --target-dir=/data/backups/inc2 --incremental-basedir=/data/backups/inc1

删除数据,准备恢复:

复制代码
DELETE FROM `user` WHERE id in (3,4)

准备备份与恢复

准备备份与完整备份不同,需要使用 --apply-log-only 选项来保持数据库一致。

先准备基础备份:

复制代码
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base/

将增量备份应用到基础备份中:

复制代码
xtrabackup --prepare --apply-log-only --target-dir=/data/backups/base --incremental-dir=/data/backups/inc1

然后执行同样的恢复备份命令,这点与完整备份的步骤一样,停止 MySQL 服务,执行命令,重启 MySQL:

复制代码
// base后面一定要带/
rsync -avrP /data/backups/base/ /var/lib/mysql/

最后即可看到恢复的数据:

复制代码
id	name
--------------
1	oldme
2	newton
3	watt
4	Einstein

压缩备份

创建压缩备份

复制代码
xtrabackup --backup --compress --host=mysql --password=12345678 --target-dir=/data/backups/compressed/

可以使用 --compress-threads 配置多线程压缩,例如启用四个线程压缩:

复制代码
xtrabackup --backup --compress --host=mysql --password=12345678 --compress-threads=4 --target-dir=/data/backups/compressed/

准备备份

在准备备份之前需要解压备份:

复制代码
xtrabackup --decompress --target-dir=/data/backups/compressed/

解压完成后使用和完整备份一样的方式就可以恢复备份数据了。

相关推荐
Fleshy数模1 小时前
CentOS7 安装配置 MySQL5.7 完整教程(本地虚拟机学习版)
linux·mysql·centos
az44yao2 小时前
mysql 创建事件 每天17点执行一个存储过程
mysql
秦老师Q3 小时前
php入门教程(超详细,一篇就够了!!!)
开发语言·mysql·php·db
橘子134 小时前
MySQL用户管理(十三)
数据库·mysql
Dxy12393102164 小时前
MySQL如何加唯一索引
android·数据库·mysql
我真的是大笨蛋4 小时前
深度解析InnoDB如何保障Buffer与磁盘数据一致性
java·数据库·sql·mysql·性能优化
怣504 小时前
MySQL数据检索入门:从零开始学SELECT查询
数据库·mysql
人道领域5 小时前
javaWeb从入门到进阶(SpringBoot事务管理及AOP)
java·数据库·mysql
千寻技术帮6 小时前
10404_基于Web的校园网络安全防御系统
网络·mysql·安全·web安全·springboot
spencer_tseng6 小时前
MySQL table backup
mysql