暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL备份工具XtraBackup安装和使用

叶同学专栏 2022-07-21
403

Xtrabackup版本的选择

MySQL版本Xtrabackup版本
mysql 5.1xtrabackup2.0
mysql5.6xtrabackup 2.2
mysql5.7xtrabackup2.4
mysql8.0xtrabackup8.0

查看xtrabackup最低能支持的mysql版本

xtrabackup -V

下载xtrabackup地址:

最新版:https://www.percona.com/downloads/Percona-XtraBackup-LATEST/

2.4版本:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/

下载和安装

[root@yejf opt]# wget https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.24/binary/tarball/percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12.tar.gz
[root@yejf opt]# tar -zxvf percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12.tar.gz
[root@yejf opt]# cd percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12

备份恢复测试

备份数据库的用户需要具有相应权限,如果要使用一个最小权限的用户进行备份,则可基于如下 命令创建此类用户:

#创建用户
mysql> create user 'bkpuser'@'localhost' identified by '123456';
#回收用户所有权限
mysql> revoke all privileges,grant option from 'bkpuser'@'localhost';
#授权有关备份的相应权限
mysql> grant reload,lock tables,replication client, process on *.* to 'bkpuser'@'localhost';
mysql> flush privileges;

全量备份

Xtrabackup提供了两种命令行工具:

  • xtrabackup:专用于备份InnoDB和XtraDB引擎的 数据;

    export PATH=/opt/percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12/bin:$PATH
    xtrabackup --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=root --password="root" --port=3306 --backup --target-dir=/data/mysqlbackup/full
  • innobackupex:这是一个perl脚本,在执行过程中会调用xtrabackup命令,这样用该命令即可以实现备 份InnoDB,也可以备份MyISAM引擎的对象。

    export PATH=/opt/percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12/bin:$PATH
    innobackupex --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkpuser --password="123456" --port=3306 data/mysqlbackup/full

自动在目录下生成备份的时间时间戳

[root@yejf full]# ll data/mysqlbackup/full
总用量 0
drwxr-x--- 8 root root 267 2月 11 10:36 2022-02-11_10-36-21

执行日志

...
220211 10:36:24 >> log scanned up to (11575686855)
220211 10:36:25 Executing UNLOCK TABLES
220211 10:36:25 All tables unlocked
220211 10:36:25 [00] Copying ib_buffer_pool to data/mysqlbackup/full/2022-02-11_10-36-21/ib_buffer_pool
220211 10:36:25 [00]       ...done
220211 10:36:25 Backup created in directory '/data/mysqlbackup/full/2022-02-11_10-36-21/'
MySQL binlog position: filename 'mysql-bin.000018', position '1719'
220211 10:36:25 [00] Writing data/mysqlbackup/full/2022-02-11_10-36-21/backup-my.cnf
220211 10:36:25 [00]       ...done
220211 10:36:25 [00] Writing data/mysqlbackup/full/2022-02-11_10-36-21/xtrabackup_info
220211 10:36:25 [00]       ...done
xtrabackup: Transaction log of lsn (11575686846) to (11575686855) was copied.
220211 10:36:25 completed OK!

整个备份过程:连接数据库,开始拷贝redo log,拷贝innodb表文件,锁表、拷贝非innodb表文件,停止拷贝redo log,解锁。

备份的文件

[root@yejf 2022-02-11_10-36-21]# ll
总用量 77888
-rw-r----- 1 root root     487 2月 11 10:36 backup-my.cnf
drwxr-x--- 2 root root     4096 2月 11 10:36 blog
-rw-r----- 1 root root     524 2月 11 10:36 ib_buffer_pool
-rw-r----- 1 root root 79691776 2月 11 10:36 ibdata1
drwxr-x--- 2 root root     4096 2月 11 10:36 mysql
drwxr-x--- 2 root root     4096 2月 11 10:36 nacos_config
drwxr-x--- 2 root root     8192 2月 11 10:36 performance_schema
drwxr-x--- 2 root root     8192 2月 11 10:36 sys
drwxr-x--- 2 root root     4096 2月 11 10:36 test
-rw-r----- 1 root root       22 2月 11 10:36 xtrabackup_binlog_info
-rw-r----- 1 root root     147 2月 11 10:36 xtrabackup_checkpoints
-rw-r----- 1 root root     552 2月 11 10:36 xtrabackup_info
-rw-r----- 1 root root     2560 2月 11 10:36 xtrabackup_logfile

全量恢复

关闭数据库并删除数据文件
[root@yejf ~]# systemctl stop mysql
[root@yejf ~]# rm -rf data/mysqldata/*
准备工作

由于使用--backup备份数据文件时时间点时不一致的(备份增量redo日志线程会实时监听增量数据),因为程序在不同的时间点复制,并且再复制过程中可能会被更改,如果使用innodb直接尝试启动这些数据文件,innodb将检测损坏并停止运行,所以需要使用--prepare将将备份文件进行崩溃恢复,来使用这些复制文件

innobackupex --apply-log data/mysqlbackup/full/2022-02-11_10-36-21
执行恢复操作
innobackupex  --defaults-file=/etc/my.cnf --copy-back --rsync data/mysqlbackup/full/2022-02-11_10-36-21

执行完后可以看到恢复的文件

[root@yejf ~]# ll data/mysqldata/
总用量 188472
drwxr-x--- 2 root root     4096 2月 11 10:48 blog
-rw-r----- 1 root root     524 2月 11 10:48 ib_buffer_pool
-rw-r----- 1 root root 79691776 2月 11 10:48 ibdata1
-rw-r----- 1 root root 50331648 2月 11 10:48 ib_logfile0
-rw-r----- 1 root root 50331648 2月 11 10:48 ib_logfile1
-rw-r----- 1 root root 12582912 2月 11 10:48 ibtmp1
drwxr-x--- 2 root root     4096 2月 11 10:48 mysql
drwxr-x--- 2 root root     4096 2月 11 10:48 nacos_config
drwxr-x--- 2 root root     8192 2月 11 10:48 performance_schema
drwxr-x--- 2 root root     8192 2月 11 10:48 sys
drwxr-x--- 2 root root     4096 2月 11 10:48 test
-rw-r----- 1 root root       21 2月 11 10:48 xtrabackup_binlog_pos_innodb
-rw-r----- 1 root root     552 2月 11 10:48 xtrabackup_info
-rw-r----- 1 root root       1 2月 11 10:48 xtrabackup_master_key_id

记得修改权限

chown -R mysql:mysql data/mysqldata

启动数据库并验证

[root@yejf ~]# systemctl start mysql
[root@yejf ~]# mysql
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 2
Server version: 5.7.34-log MySQL Community Server (GPL)

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| blog               |
| mysql             |
| nacos_config       |
| performance_schema |
| sys               |
| test               |
+--------------------+
7 rows in set (0.00 sec)

xtrabackup 选项

xtrabackup 工具有许多参数,具体可去官网查询(xtrabackup 参数选项 | innobackupex 参数选项),这里简单介绍 innobackupex 一些常用的参数。

1) innobackupex 参数选项

--defaults-file=[MY.CNF]  

指定配置文件:只能从给定的文件中读取默认选项。且必须作为命令行上的第一个选项;必须是一个真实的文件,它不能是一个符号链接。

--databases=#  

指定备份的数据库和表,格式为:--databases="db1[.tb1] db2[.tb2]" 多个库之间以空格隔开,如果此选项不被指定,将会备份所有的数据库。

--include=REGEXP  

用正则表达式的方式指定要备份的数据库和表,格式为 --include=‘^mydb[.]mytb’ ,对每个库中的每个表逐一匹配,因此会创建所有的库,不过是空的目录。--include 传递给 xtrabackup --tables。

--tables-file=FILE  

此选项的参数需要是一个文件名,此文件中每行包含一个要备份的表的完整名称,格式为databasename.tablename。该选项传递给 xtrabackup --tables-file,与--tables选项不同,只有要备份的表的库才会被创建。

注意:部分备份(--include、--tables-file、--database)需要开启 innodb_file_per_table 。

--compact  

创建紧凑型备份,忽略所有辅助索引页,只备份data page;通过--apply-log中重建索引--rebuild-indexs。

--compress  

此选项指示xtrabackup压缩备份的InnoDB数据文件,会生成 *.qp 文件。

--decompress  

解压缩qp文件,为了解压缩,必须安装 qpress 工具。Percona XtraBackup不会自动删除压缩文件,为了清理备份目录,用户应手动删除 * .qp文件:find data/backup -name "*.qp" | xargs rm。

--no-timestamp  

指定了这个选项备份将会直接存储在 BACKUP-DIR 目录,不再创建时间戳文件夹。

--apply-log  

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

--use-memory=#  

此选项接受一个字符参数(1M/1MB,1G/1GB,默认100M),仅与--apply-log一起使用,该选项指定prepare时用于崩溃恢复(crash-recovery)的内存。

--copy-back  

拷贝先前备份所有文件到它们的原始路径。但原路径下不能有任何文件或目录,除非指定 --force-non-empty-directories 选项。

--force-non-empty-directories  

恢复时指定此选项,可使 --copy-back 和 --move-back 复制文件到非空目录,即原data目录下可以有其他文件,但是不能有与恢复文件中同名的文件,否则恢复失败。

--rsync  

此选项可优化本地文件(非InnoDB)的传输。rsync工具一次性拷贝所有非InnoDB文件,而不是为每个文件单独创建cp,在备份恢复很多数据库和表时非常高效。此选项不能和 --stream 一起使用。

--incremental  

这个选项告诉 xtrabackup 创建一个增量备份,而不是完全备份。它传递到 xtrabackup 子进程。当指定这个选项,可以设置 --incremental-lsn 或 --incremental-basedir。如果这2个选项都没有被指定,--incremental-basedir 传递给 xtrabackup 默认值,默认值为:基础备份目录的第一个时间戳备份目录。

--incremental-basedir=DIRECTORY  

该选项接受一个字符串参数,该参数指定作为增量备份的基本数据集的完整备份目录。它与 --incremental 一起使用。

--incremental-dir=DIRECTORY  

该选项接受一个字符串参数,该参数指定了增量备份将与完整备份相结合的目录,以便进行新的完整备份。它与 --incremental 选项一起使用。

--redo-only  

在“准备基本完整备份” 和 “合并所有的增量备份(除了最后一个增备)”时使用此选项。它直接传递给xtrabackup的 xtrabackup --apply-log-only 选项,使xtrabackup跳过"undo"阶段,只做"redo"操作。如果后面还有增量备份应用到这个全备,这是必要的。有关详细信息,请参阅xtrabackup文档。

--parallel=NUMBER-OF-THREADS  

此选项接受一个整数参数,指定xtrabackup子进程应用于同时备份文件的线程数。请注意,此选项仅适用于文件级别,也就是说,如果您有多个.ibd文件,则它们将被并行复制;如果您的表一起存储在一个表空间文件中,它将不起作用。

2) xtrabackup 参数选项

--apply-log-only  

这个选项使在准备备份(prepare)时,只执行重做(redo)阶段,这对于增量备份非常重要。

使用qpress加解压缩

下载地址

http://www.quicklz.com/

安装使用

[root@yejf opt]# tar -xvf qpress-11-linux-x64.tar 
[root@yejf opt]# mv qpress usr/bin/

[root@yejf 2022-02-11_14-22-53]# cp backup-my.cnf.qp tmp
[root@yejf tmp]# qpress -d backup-my.cnf.qp .
[root@yejf tmp]# ll -tr backup*
-rw-r----- 1 root root 476 2月 11 14:33 backup-my.cnf.qp
-rw-r--r-- 1 root root 487 2月 11 14:33 backup-my.cnf

对目录的qp压缩文件进行解压

[root@yejf tmp]# innobackupex --decompress data/mysqlbackup/full/2022-02-11_14-22-53/

解压后压缩文件还在

[root@yejf 2022-02-11_14-22-53]# ll
总用量 90460
-rw-r--r-- 1 root root     487 2月 11 14:37 backup-my.cnf
-rw-r----- 1 root root     476 2月 11 14:22 backup-my.cnf.qp
-rw-r--r-- 1 root root     524 2月 11 14:37 ib_buffer_pool
-rw-r----- 1 root root     410 2月 11 14:22 ib_buffer_pool.qp
-rw-r--r-- 1 root root 79691776 2月 11 14:37 ibdata1
-rw-r----- 1 root root 12850886 2月 11 14:22 ibdata1.qp
drwxr-x--- 2 root root     8192 2月 11 14:37 mysql
drwxr-x--- 2 root root   12288 2月 11 14:37 performance_schema
drwxr-x--- 2 root root     8192 2月 11 14:37 test
-rw-r--r-- 1 root root       21 2月 11 14:37 xtrabackup_binlog_info
-rw-r----- 1 root root     108 2月 11 14:22 xtrabackup_binlog_info.qp
-rw-r----- 1 root root     147 2月 11 14:22 xtrabackup_checkpoints
-rw-r--r-- 1 root root     571 2月 11 14:37 xtrabackup_info
-rw-r----- 1 root root     545 2月 11 14:22 xtrabackup_info.qp
-rw-r--r-- 1 root root     2560 2月 11 14:37 xtrabackup_logfile
-rw-r----- 1 root root     287 2月 11 14:22 xtrabackup_logfile.qp

然后可以进行恢复

innobackupex --apply-log data/mysqlbackup/full/2022-02-11_14-22-53/
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync data/mysqlbackup/full/2022-02-11_14-22-53/

XtraBackup不会自动删除压缩文件,为了清理备份目录,需要手动删除 * .qp文件

find data/backup -name "*.qp" | xargs rm

流备份方式

xbstream

export PATH=/opt/percona-xtrabackup-2.4.24-Linux-x86_64.glibc2.12/bin:$PATH
--备份
innobackupex --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkpuser --password="123456" --port=3306 --stream=xbstream /tmp > /data/mysqlbackup/full/backup.xbstream
--恢复出来
mkdir bak
xbstream -x -C ./bak < backup.xbstream

[root@yejf full]# du -sh *
158M   backup.xbstream
158M   bak

xbstream功能只是作为流的一种方式,大小没变,备份中可使用压缩

innobackupex --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkpuser --password="123456" --port=3306  --stream=xbstream --parallel=8  --compress --compress-threads=8 /tmp > /data/mysqlbackup/full/backup.xbstream

tar

innobackupex --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkpuser --password="123456" --port=3306  --stream=tar --tmpdir=/tmp /data/mysqlbackup/full |gzip > /data/mysqlbackup/full/backup.tar.gz

tar -zxvf backup.tar.gz -C ./bak
[root@yejf full]# du -sh *
20M     backup.tar.gz
158M   bak

--tmpdir是压缩过程中临时数据的目录,如果不指定,会用mysql中的变量tmpdir

实现远程备份

innobackupex命令只能在数据库服务器上执行,如果需要实现远程备份,首先mysql服务器能够免密登陆到备份机,然后使用流方式通过管道备份过去

[root@yejf ~]# innobackupex --default-file=/etc/my.cnf --socket=/tmp/mysql.sock --user=bkpuser --password="123456" --port=3306  --stream=tar --tmpdir=/tmp /tmp | ssh tmpuser@192.168.16.140 "cat - >/tmp/mysql-16.7.tar"

cat - 输出标准输入的内容

查看备份机

[tmpuser@streamset-bussiness-1 tmp]$ du -sh *16.7*
158M   16.7
158M   mysql-16.7.tar

参考文档

https://mp.weixin.qq.com/s/fL8Mp0hM-rzyPXjDUFZP-Q
https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html
https://www.cnblogs.com/paul8339/p/14108792.html
文章转载自叶同学专栏,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论