本文为墨天轮数据库管理服务团队技术专家车金陆原创内容,如需转载请联系小墨(VX:modb666)并注明来源。

目录

  • 1、概述
  • 2、xtrabackup 安装

    • 1)安装依赖包
    • 2)安装 xtrabackup
    • 3)查看软件版本信息
  • 3、xtrabackup 参数介绍
  • 4、创建全量备份
  • 5、新增数据及创建增量备份1
  • 6、新增数据及创建增量备份2
  • 7、模拟数据库故障
  • 8、恢复数据库

    • 1)准备恢复全量备份
    • 2)将增量备份1加载至全备中
    • 3)将增量备份2加载至全备中
    • 4)恢复数据库
    • 5)调整数据及日志目录属主属组
    • 6)启动数据库
    • 7)检查数据是否完整
  • 参考文档

1、概述

Xtrabackup 是由 Percona 公司开发的一款 MySQL 物理热备份工具,是 MySQL 数据库较为受欢迎的主流备份工具。

其具有备份和恢复速度快,能够基于压缩功能节约磁盘空间等优点。

需要注意由于MySQL 8.0版本redo日志和数据字典的改变,xtrabackup 8.0版本只支持对mysql 8.0和percona 8.0系列的数据库进行备份恢复。

如需对MySQL 5.7数据库进行备份恢复,可以使用xtrabackup 2.4版本。

2、xtrabackup 安装

操作系统:CentOS Linux release 7.6.1810 (Core)

MySQL 版本:8.0.36

Xtrabackup 版本:xtrabackup-80-8.0.35-31

软件下载地址:https://downloads.percona.com/downloads/Percona-XtraBackup-8....\_64/percona-xtrabackup-80-8.0.35-31.1.el7.x86\_64.rpm

1)安装依赖包

安装过程需要用到libev、zstd等软件包,可从以下地址下载。

http://rpmfind.net/linux/remi/enterprise/7/remi/x86\_64/libev-4.15-0.7.el7.remi.x86\_64.rpm https://mirrors.aliyun.com/epel/7/x86\_64/Packages/z/zstd-1.5.5-1.el7.x86\_64.rpm
yum -y install libev-4.15-0.7.el7.remi.x86_64.rpm
yum -y install zstd-1.5.5-1.el7.x86_64.rpm

2)安装 xtrabackup

yum -y install percona-xtrabackup-80-8.0.35-31.1.el7.x86_64.rpm

3)查看软件版本信息

xtrabackup --version

3、xtrabackup 参数介绍

xtrabackup --help

用法:
Usage: [xtrabackup [–defaults-file=#] --backup | xtrabackup [–defaults-file=#] --prepare] [OPTIONS]

–print-defaults 打印程序的参数列表并退出
–no-defaults 不从任何配置文件中读取参数信息,除了登录文件
–defaults-file=# 仅从给定文件读取默认选项,必须是个真实文件,必须在命令行第一个选项位置指定。
–defaults-extra-file=# 在读取全局文件后读取此文件
–defaults-group-suffix=# 还可以阅读带有concat(group,suffix)的组
–login-path=# 读取登录文件的路径
-v, --version 打印 xtrabackup版本信息
–target-dir=name 指定备份的目标目录,如果目录不存在,xtrabackup 将创建它。如果目录确实存在且为空,则xtrabackup 将成功,xtrabackup 不会覆盖现有的文件,会在操作系统层面报错,文件存在。
–backup 备份到target-dir指定的目录
–stats 计算 datadir 中的统计信息(建议使用离线mysqld)
–prepare 启动mysql服务器备份的prepare(准备)阶段
–export 在prepare阶段创建要导入到另一个数据库的文件–apply-log-only 在准备阶段应用日志时,停止恢复进程,不向前推进LSN。
注意:此选项较为重要。主要应用于增量备份,在常规备份中,执行两种操作以使数据库保持一致:从日志文件对数据文件重播已提交的事务,以及回滚未提交的事务。
在准备备份时,必须跳过未提交事务的回滚,因为在备份时未提交的事务可能正在进行中,它们很可能在下一次增量备份中提交。您应该使用–apply-log-only 选项来防止回滚阶段。
如果您不使用–apply-log-only 选项来防止回滚阶段,那么您的增量备份将是无用的。
事务回滚后,无法应用进一步的增量备份。
–print-param 输出mysqld copyback所需的参数
–use-memory=# 备份的时候指定的内存,该选项表示和–apply-log选项一起使用,prepare备份的时候,xtrabackup做crash recovery分配的内存大小,单位字节。也可(1MB,1M,1G,1GB),使用该值代替 buffer_pool_size。
–throttle=# 和—backup一起使用,限制每秒IO操作(读写对)的IOS数值。
–log[=name] 忽略MySQL选项兼容性的选项
–log-copy-interval=# 日志复制线程执行检查之间的时间间隔(毫秒)(默认值为1秒)
–extra-lsndir=name 和–backup一起使用,在此目录中保存一份额外的xtrabackup_checkpoints文件。
–to-archived-lsn=# 指定prepare备份时apply事务日志LSN,只能和xtrabackup --prepare选项一起使用。
–tables=name 通过正则表达式过滤表名
–tables-file=name 按文件中的精确的database.table名称列表进行筛选。
–databases=name 按照数据库列表进行过滤
–databases-file=name 按照文件中的数据库列表进行过滤
–tables-exclude=name 按正则表达式过滤表名。操作方式和–tables一样,但是匹配的表名将不备份,此参数的优先级高于—tables。
–databases-exclude=name 不包括基于名称的数据库,操作方式和–databases一样,但是匹配的库名将不被备份,优先级高于—databases。
–create-ib-logfile 暂时不起作用 也在“–prepare”之后创建ib_logfile。###如果要创建ib_logfile,只需在相同的选项中重新执行此命令###。
–stream[=name] 使用xbstream格式流式传输所有备份文件。根据–FIFO-streams选项,文件被流式传输到STDOUT或FIFO文件。唯一支持的流格式是“xbstream”。
–compress[=name] 压缩所有输出数据,包括事务日志文件和元数据文件。使用指定的压缩算法压缩单个备份文件。支持的算法是“lz4”和“zstd”。默认算法为“zstd”。
–decompress 解压缩使用–compress选项生成的所有压缩文件。
–compress-threads=# 备份压缩的并行线程,默认为1.并行压缩(‘compress-threads’)可以和并行文件拷贝(‘parallel’)一起使用。例如:'–parallel=4 --compress --compress-threads=2’会创建4个IO线程读取数据并通过管道传送给2个压缩线程。
–compress-chunk-size=# 压缩线程的工作缓冲区大小(字节)。默认值为64K。
–encrypt=name 该选项表示通过ENCRYPTION_ALGORITHM的算法加密innodb数据文件的备份,目前支持的算法有AES128,AES192,AES256。
–encrypt-key=name 要使用的加密密钥,因为会记录到命令行,所以不推荐使用。
–encrypt-key-file=name 包含要使用的加密密钥的文件,加密key可通过以下命令行命令生成:openssl rand -base64 24。
–encrypt-threads=# 该选项表示并行加密的worker线程数量,默认为1。
–encrypt-chunk-size=# 该选项表示每个加密线程worker 缓冲区的大小,单位是字节,默认是64K。
–decrypt=name 解密使用–encrypt选项创建的备份中扩展名为.xbcrypt的所有文件。
–remove-original 解密和解压缩后删除.qp、.zst、.lz4和.xbcrypt文件。
–rebuild-threads=# 在紧凑备份中重建索引的线程数,只有和–prepare和–rebuild-indexes一起才生效。
–rebuild-indexes 在apply事务日志之后重建索引,只有和–prepare一起才生效。
–close-files 该选项表示关闭不再访问的文件句柄,当xtrabackup打开表空间通常并不关闭文件句柄,目的是正确的处理DDL操作。如果表空间数量巨大,这是一种可以关闭不再访问的文件句柄的方法。使用该选项有风险,会有产生不一致备份的可能。
–core-file 写核心致命信号
–copy-back 做数据恢复时将备份的所有数据文件拷贝到MySQL服务器的datadir目录。
–move-back 这个选项与–copy-back相似,将以前备份中的所有文件从备份目录移动到实际的datadir位置。请谨慎使用,因为它会删除备份文件。使用场景:没有足够的磁盘空间同时保留数据文件和Backup副本。

注意
1.datadir目录必须为空。除非指定innobackupex --force-non-empty-directories选项指定,否则–copy-backup选项不会覆盖。
2.在restore之前,必须shutdown MySQL实例,你不能在实例运行中restore到datadir目录中。
3.由于文件属性会被保留,大部分情况下你需要在启动实例之前将文件的属主改为mysql,这些文件将属于创建备份的用户。

–galera-info 此选项创建xtrabackup_galera_info文件,其中包含备份时的本地节点状态。执行Percona XtraDB Cluster备份时应使用选项。使用备份锁创建备份时无效。
–slave-info 此选项在备份slave从属服务器时非常有用。它打印主服务器的二进制日志位置和名称。它还将此信息作为“CHANGE MASTER”命令写入“xtrabackup_slave_info”文件。通过在此备份上启动slave从属服务器并发出“CHANGE master”命令,并将二进制日志位置保存在“xtrabackup_slave_info”文件中,可以为主服务器设置新的从属服务器。
–no-lock 该选项表示关闭FTWRL的表锁,只有在所有表都是Innodb表并且不关心backup的binlog pos点,如果有任何DDL语句正在执行或者非InnoDB正在更新时(包括mysql库下的表),都不应该使用这个选项,后果是导致备份数据不一致,如果考虑备份因为获得锁失败,可以考虑–safe-slave-backup立刻停止复制线程。
–lock-ddl 如果服务器在备份开始时支持,则在备份时发出LOCK TABLES/LOCK INSTANCE以阻止所有DDL操作。(默认为on;使用–skip-lock-ddl禁用。)
–lock-ddl-timeout=# 如果LOCK TABLES FOR BACKUP未在给定超时内返回,请中止备份。
–lock-ddl-per-table 在xtrabackup开始复制阶段之前锁定每个表的DDL直到备份完成。
–safe-slave-backup 该选项表示为保证一致性复制状态,这个选项停止SQL线程并且等到show status中的slave_open_temp_tables为0的时候开始备份,如果没有打开临时表,backup会立刻开始,否则SQL线程启动或者关闭直到没有打开的临时表。
–safe-slave-backup-timeout=# 如果slave_open_temp_tables在该选项指定的值(默认300秒)之后不为0,从库sql线程会在备份完成的时候重启。
–rsync 该选项表示通过rsync工具优化本地传输,当指定这个选项,innobackupex使用rsync拷贝非Innodb文件而替换cp,当有很多DB和表的时候会快很多,不能和–stream一起使用。
–force-non-empty-directories 指定该参数时候,使得 --copy-back或–move-back选项转移文件到非空目录,已存在的文件不会被覆盖。如果–copy-back和–move-back文件需要从备份目录拷贝一个在datadir已经存在的文件,会报错失败。
–no-version-check 该选项关闭版本检查,当–version-check选项开启的时候。
–tables-compatibility-check 选项开启表存储引擎兼容性告警,默认开启。可使用–skip-tables-compatibility-check关闭。
–no-backup-locks 该选项在backup阶段控制锁,替换FLUSH TABLES WITH READ LOCK命令。关闭需使用参数–no-backup-locks。当mysql服务器不支持backup locks时候此参数无效。
-u, --user=name 连接的用户名
-H, --host=name 连接的IP地址
-P, --port=# 数据库的端口
-p, --password[=name] 连接用户的密码
-S, --socket=name 备份时连接的unix操作系统的socket文件
-h, --datadir=name 数据恢复时候的数据目录。从my.cnf中读取,或者命令行指定。
-t, --tmpdir=name 当使用–print-param指定的时候打印出正确的tmpdir参数。用于存储临时文件的路径,在轮循模式下可以指定多个路径,使用英文的:分隔
–parallel=# 指定备份时拷贝多个数据文件并发的进程数,默认值为1。
–log-bin[=name] binlog的日志序列
–incremental-lsn=name 和–backup一起使用。仅复制比指定LSN’high:low’新的.ibd页##注意##:如果指定了错误的LSN值,则无法对此进行诊断,从而导致备份不可用。小心!
–incremental-basedir=name 和–backup一起使用,仅拷贝.ibd中新增的数据到指定路径,创建增量备份。
–incremental-dir=name 和–prepare一起使用,将.delta文件和logfile保存在指定的路径。
–incremental-force-scan 该选项表示创建一份增量备份时,强制扫描所有增量备份中的数据页。
–incremental-history-name 该选项表示存储在PERCONA_SCHEMA.xtrabackup_history基于增量备份的历史记录的名字。Percona Xtrabackup搜索历史表查找最近(innodb_to_lsn)成功备份并且将to_lsn值作为增量备份启动初始lsn.与innobackupex–incremental-history-uuid、–incremental-basedir、–incremental-lsn互斥。如果没有检测到有效的lsn,xtrabackup会返回error。和选项–incremental一起使用。
–incremental-history-uuid 该选项表示存储在percona_schema.xtrabackup_history基于增量备份的特定历史记录的UUID。和选项–incremental一起使用。

4、创建全量备份

进行备份的数据库用户,需要具有BACKUP\_ADMIN 权限

grant BACKUP_ADMIN on *.* to root@'%';
flush privileges;

创建全量备份存放目录

mkdir -p /data/backup/0922/full_db

创建全量备份

xtrabackup --user=root --password=Root#123 --backup --target-dir=/data/backup/0922/full_db

–backup: 表示该操作为备份操作

–target-dir: 指定备份文件的存放路径

–user: 备份使用的数据库用户

–password: 该用户的密码

5、新增数据及创建增量备份1

新增数据

create database testdb;
use testdb;
create table t1 (id int primary key);
insert into t1 values(1),(2),(3),(4),(5);

创建增量备份1存放目录

mkdir -p /data/backup/0922/incr1

创建增量备份1

xtrabackup --user=root --password=Root#123 --backup --target-dir=/data/backup/0922/incr1 --incremental-basedir=/data/backup/0922/full_db

–incremental-basedir: 表示在某个备份的基础上进行增量备份

查看备份文件大小

6、新增数据及创建增量备份2

新增数据

insert into testdb.t1 values(6),(7),(8),(9),(10);

创建增量备份2存放目录

mkdir -p /data/backup/0922/incr2

创建增量备份2

xtrabackup --user=root --password=Root#123 --backup --target-dir=/data/backup/0922/incr2 --incremental-basedir=/data/backup/0922/incr1

查看备份文件大小

7、模拟数据库故障

关闭mysql数据库

service mysql stop

删除datadir下的所有文件

cd /data/mysql/data
rm -rf *

删除所有binlog日志

cd /data/mysql/binlogs
rm -rf * 

8、恢复数据库

1)准备恢复全量备份

xtrabackup --prepare --apply-log-only --target-dir=/data/backup/0922/full_db

–prepare:表示为准备阶段

2)将增量备份1加载至全备中

xtrabackup --prepare --apply-log-only --target-dir=/data/backup/0922/full_db  --incremental-dir=/data/backup/0922/incr1

3)将增量备份2加载至全备中

xtrabackup --prepare --target-dir=/data/backup/0922/full_db --incremental-dir=/data/backup/0922/incr2

准备阶段:可以将全备理解成一个集合,所有的增备都需要汇合到这个集合(全备)里,才能进行完整的恢复操作。

4)恢复数据库

xtrabackup --copy-back --target-dir=/data/backup/0922/full_db

–copy-back:将备份的数据copy至数据目录下(my.cnf参数文件中datadir配置)

5)调整数据及日志目录属主属组

chown mysql:mysql -R /data/mysql/data
chown mysql:mysql -R /data/mysql/binlogs/

6)启动数据库

service mysql start

7)检查数据是否完整

select count(*) from testdb.t1;

参考文档:

MySQL 8.0 物理备份xtrabackup简介

MySQL\_备份还原之xtrabackup8.0


墨天轮从乐知乐享的数据库技术社区蓄势出发,全面升级,提供多类型数据库管理服务。墨天轮数据库管理服务旨在为用户构建信赖可托付的数据库环境,并为数据库厂商提供中立的生态支持。

服务官网:https://www.modb.pro/service 关注墨天轮公众号可获取更多服务团队技术干货。


墨天轮
30 声望18 粉丝