MariaDB备份恢复③:Percona XtraBackup

2018-06-02|Categories: Database|

What is XtraBackup

XtraBackup是Percona公司提供的MySQL数据库备份工具,是惟一开源的、能够对InnoDB和XtraDB数据库进行热备的工具。

在开源数据库领域,Percona公司可谓大名鼎鼎,他们的产品都是开源免费的,通过提供技术支持来盈利。

Percona is the champion of unbiased open source database solutions, and provides the best solution for our customers regardless of their database architecture or platform. Our software is 100% free and open source, and is a drop-in replacement for MySQL and MongoDB databases.

https://www.percona.com/about-percona

XtraBackup的特点:

  • 基于磁盘块读写数据库文件,备份还原过程快速、可靠
  • 备份过程不会打断正在执行的事务
  • 能够基于压缩等功能节约磁盘空间和流量
  • 自动实现备份检验
  • 开源,免费

Xtrabackup 2.3版之前包括4个可执行文件:

  • innobackupex: Perl script
    • innobackupex 用来备份非 InnoDB 表,同时会调用 xtrabackup 命令来备份 InnoDB 表
    • 还会和 mysql server 发送命令进行交互,如加读锁(FTWRL)、获取位点(SHOW SLAVE STATUS)等
    • 即 innobackupex 是在 xtrabackup 之上做了一层封装实现的
    • 因此备份基本都通过 innobackupex 命令进行
  • xtrabackup: C/C++ 编译的二进制可执行文件
    • 用来备份 InnoDB 表,不能备份非 InnoDB 表,和 mysql server 没有交互
  • xbcrypt:加解密
  • xbstream:支持并发写的流文件格式

从XtraBackup 2.3.1-beta1版开始,innobackupex变成了一个指向xtrabackup的软链接:

innobackupex script has been rewritten in C and it’s set as the symlink for xtrabackup. innobackupex still supports all features and syntax as 2.2 version did, but it is now deprecated and will be removed in next major release.

https://www.percona.com/doc/percona-xtrabackup/2.4/release-notes/2.3/2.3.1-beta1.html

安装XtraBackup

# 最新版下载页面:https://www.percona.com/downloads/XtraBackup/LATEST/
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.11/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm

yum install ./percona-xtrabackup-24-2.4.11-1.el7.x86_64.rpm
# 依赖`libev`,因此安装时必须启用EPEL仓库或Extras仓库

XtraBackup完全备份

innobackupex --user=root --password=liyang /db_backups

# 会在/db_backups目录下创建一个单独的目录,
# 此次备份创建的目录:2018-06-02_11-15-23/

在另一台主机恢复数据库(同样需要安装XtraBackup):

scp -r /db_backups/2018-06-02_11-15-23/ 172.16.125.73:/db_backups

# 整理数据库文件,回滚未提交的事务
innobackupex --apply-log /db_backups/2018-06-02_11-15-23/

# 停止MariaDB服务
systemctl stop mariadb

# 清空MariaDB的$DATADIR,
# $DATADIR = `show variables like 'datadir';`
/bin/rm -rf /var/lib/mysql/

# 根据`my.cnf`查找$DATADIR作为复制的目标
# XtraBackup 2.2.6: Percona XtraBackup now reads server options 
#       from `SHOW VARIABLES` rather than `my.cnf` configuration file.
# https://www.percona.com/doc/percona-xtrabackup/2.4/release-notes/2.2/2.2.6.html
innobackupex --copy-back 2018-06-02_11-15-23/

chown -R mysql. /var/lib/mysql/

systemctl start mariadb

XtraBackup增量备份

增量备份必须基于之前的完全备份。

示例数据库使用tysql

# update database
MariaDB [tysql]> insert into Orders values (20011, now(), '1000000002');

mkdir /db_backups/incremental

# 第一次增量备份,基于完全备份
innobackupex --user=root --password=liyang \
    --incremental /db_backups/incremental/ \
    --incremental-basedir=/db_backups/2018-06-02_11-15-23/

# update database again
MariaDB [tysql]> insert into Orders values (20012, now(), '1000000003');

# 第二次增量备份,基于第一次增量备份
innobackupex --user=root --password=liyang \
    --incremental /db_backups/incremental/ \
    --incremental-basedir=/db_backups/incremental/2018-06-02_16-28-09/

scp -r /db_backups/incremental/ 172.16.125.73:/db_backups

# 整理 完全备份 的数据库文件
# `--redo-only` forces xtrabackup to skip the "rollback" phase and do a "redo" only. 
# This is necessary if the backup will have incremental changes applied to it later.
innobackupex --apply-log --redo-only /db_backups/2018-06-02_11-15-23/

# 把第一个增量备份合并到完全备份
innobackupex --apply-log --redo-only /db_backups/2018-06-02_11-15-23/ \
    --incremental-dir=/db_backups/incremental/2018-06-02_16-28-09

# 把第二个增量备份合并到完全备份
innobackupex --apply-log --redo-only /db_backups/2018-06-02_11-15-23/ \
    --incremental-dir=/db_backups/incremental/2018-06-02_16-32-07

systemctl stop mariadb

/bin/rm -rf /var/lib/mysql/

innobackupex --copy-back /db_backups/2018-06-02_11-15-23/

chown -R mysql. /var/lib/mysql/

systemctl start mariadb

备份并恢复单表(单表导出)

前面演示的备份恢复操作都是针对数据库服务器管理的所有数据库,XtraBackup也支持单表导出,但有一些注意事项:

MySQL 5.6之前,即使启用了innodb_file_per_table,也无法通过复制文件的方式在数据库服务器之间复制表。

但是,借助Percona XtraBackup,可以从任意的InnoDB数据库导出单独的表,然后导入到Percona Server with XtraDB或者MySQL 5.6。(源数据库服务器可以不是Percona Server with XtraDB或者MySQL 5.6,但目标数据库服务器必须是。)

单表导出只能针对单独的.ibd文件,也就是说,必须启用innodb_file_per_table

https://www.percona.com/doc/percona-xtrabackup/LATEST/innobackupex/restoring_individual_tables_ibk.html

mkdir /db_backups/individual_tables && cd $_

# 备份表空间和表结构文件:`*.ibd`、`*.frm`
innobackupex --user=root --password=liyang \
    --include='tysql.Orders' /db_backups/individual_tables

# 把 表结构 单独导出为SQL语句文件
# -d, --no-data
mysqldump -uroot -pliyang -d tysql Orders > orders.sql

# 删除表
# 因为被删除的表包含了外键,删除时必须通过`SET foreign_key_checks = 0;`禁用外键检查,
# 否则无法删除,并报错如下:
# ERROR 1451 (23000) at line 1: Cannot delete or update a parent row: a foreign key constraint fails
mysql -uroot -pliyang -e 'SET foreign_key_checks = 0; drop table tysql.Orders; SET foreign_key_checks = 1;'

# 整理导出的表
# 会在导出表的目录生成两个文件:`*.cfg`、`*.exp`
innobackupex --apply-log --export /db_backups/individual_tables/2018-06-02_18-59-51/

# 恢复表结构
mysql -uroot -pliyang tysql < /db_backups/individual_tables/orders.sql

# 删除自动生成的表空间文件`*.ibd`
mysql -uroot -pliyang -e 'SET foreign_key_checks = 0; alter table Orders discard tablespace; SET foreign_key_checks = 1;'

# 把最早备份的表空间文件复制到对应的数据库目录
cp individual_tables/2018-06-02_18-59-51/tysql/Orders.{cfg,exp,ibd} /data/mariadb/tysql/ -v

chown -R mysql. /data/mariadb/tysql/

# 恢复最早备份的表空间文件
mysql -uroot -pliyang -e 'alter table tysql.Orders import tablespace;'

以上就是Percona XtraBackup备份恢复的常用操作。

Leave A Comment