mysql备份还原方案xtrabackup

摘要:mysql当数据库过大的时候,使用mysqldump的方式进行备份是一种非常慢的操作,500G的数据就够你备份一天一夜,我发现了一种mysql快速备份的方案,它使用文件存储的方式进行备份,支持全量和增量备份,这里所写为全量方式(如果可以接受备份开始到下次恢复之间的数据丢失时使用)。xtrabackup的备份速度很快,不管有多少的数据,备份速度完全是依赖于磁盘的读写速度,还支持压缩、不打断正在执行的事务、自动实现备份检验(用mysqldump会锁表,要加上可重复读–single-transaction才不会影响线上的程序写表,但是写表后的东西在还原的时候就会丢了,这也是全量备份的痛点)

特点

(1)备份过程快速、可靠

(2)备份过程不会打断正在执行的事务

(3)能够基于压缩等功能节约磁盘空间和流量

(4)自动实现备份检验

(5)还原速度快

准备mysql备份组件需要的安装包

检查服务器是centos6版本还是centos7+版本。选择安装包

1
2
centos6/percona-xtrabackup/Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar
centos7/percona-xtrabackup/Percona-XtraBackup-2.4.12-r170eb8c-el7-x86_64-bundle.tar

安装包可以在此下载 : https://www.percona.com/downloads/XtraBackup/LATEST/

安装备份工具

以下所有操作如果是在集群下,要在一个主节点上操作,操作一次即可,启动时设置主节点为被同步节点,集群的管理我们以后再讨论。

1. 上传并解压

假设当前系统是centos6+,使用Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar包,拷贝到系统/tmp/backup_mariadb20181127目录下(没有则创建,日期写当天),使用tar xvf Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar命令解压,你可以得到以下文件。

1
2
3
4
5
6
7
# pwd
/tmp/backup_mariadb20181127
# ls
Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar
percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm
percona-xtrabackup-24-debuginfo-2.4.12-1.el6.x86_64.rpm
percona-xtrabackup-test-24-2.4.12-1.el6.x86_64.rpm

2. 安装rpm包

执行以下命令

1
2
3
rpm -ivh --force --nodeps percona-xtrabackup-24-debuginfo-2.4.12-1.el6.x86_64.rpm  
rpm -ivh --force --nodeps percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm
rpm -ivh --force --nodeps percona-xtrabackup-test-24-2.4.12-1.el6.x86_64.rpm

3. 检查是否安装成功

按以下显示则安装成功

1
2
3
4
# rpm -qa | grep percona
percona-xtrabackup-test-24-2.4.12-1.el6.x86_64
percona-xtrabackup-24-2.4.12-1.el6.x86_64
percona-xtrabackup-24-debuginfo-2.4.12-1.el6.x86_64

开始备份

1. 执行命令开始备份

执行以下命令开始备份,其中/etc/my.cnf为mysql配置文件位置,10.123.2.4为mysql绑定的ip(写当前机器的ip),user1为用户名,123456Abc为密码,/tmp/backup_mariadb20181127为备份文件所在目录,所有按实际环境填写。此处我们只备份cloud库所以--databases库就不用改动了

1
innobackupex --defaults-file=/etc/my.cnf --host=10.123.2.4 --databases="cloud" --use-memory=500M --user=user1 --password=123456Abc /tmp/backup_mariadb20181127

  • 如果只需要备份其中一个或多个数据库,可以加参数--databases="cloud test",其中cloud和test是库名
  • 可以使用–use-memory= (例如: 1MB, 1M, 1GB, 1G)选项加速,在不指定内存大小的情况下,默认会占用100MB的内存。

2. 检查是否备份成功

最后一行显示completed OK! 则备份成功,在所执行的目录下(此处是/tmp/backup_mariadb20181127)会出现备份的文件

1
181127 11:56:48 completed OK!

可以看到文件结构,我们此处自动生成的备份文件夹名为2018-11-27_11-52-48,是一个以时间命名的文件夹

1
2
3
4
5
# ls
2018-11-27_11-52-48
Percona-XtraBackup-2.4.12-r170eb8c-el6-x86_64-bundle.tar percona-xtrabackup-24-2.4.12-1.el6.x86_64.rpm percona-xtrabackup-24-debuginfo-2.4.12-1.el6.x86_64.rpm percona-xtrabackup-test-24-2.4.12-1.el6.x86_64.rpm
# pwd
/tmp/backup_mariadb20181127

还原备份

1. 事务日志应用到备份

备份出的数据并不能直接使用,因为备份出的数据是不一致的,我们还需要将同时备份出的事务日志应用到备份中,才能得到一份完整、一致、可用的数据,xtrabackup称这一步操作为prepare,也就是还原数据前的”准备”工作。

1
innobackupex --apply-log 2018-11-27_11-52-48/

在事务日志容量很大的情况下,可以使用–use-memory= (例如: 1MB, 1M, 1GB, 1G)选项加速,在不指定内存大小的情况下,默认会占用100MB的内存。
输出最后如下就为正确

1
181127 11:56:10 completed OK!

2. 恢复数据

方法一、此处使用该方法,适用于备份部分数据库的方法
数据目录在/data/mariadb/data,我们备份的数据库为cloud库。
进入mysql命令行mysql -A,删除cloud库drop database cloud;(如果无法进入命令行则到数据目录下直接干掉cloud文件夹,集群操作的话必须通过drop或者先停止集群,确定好主从模式)
执行命令

1
2
3
4
5
6
7
cd /data/mariadb/data
rm ib* -f
rm -f cloud
/etc/init.d/mysqld stop #关闭数据库
cd /tmp/backup_mariadb20181127/2018-11-27_11-52-48 #进入备份目录
cp ib* /data/mariadb/data
cp -R cloud /data/mariadb/data

方法二、先停止数据库服务/etc/init.d/mysqld stop,且对应的数据目录(此处是/data/mariadb/data)为空,如果不为空,手动删除,一般此方法针对全量备份的方法。

1
innobackupex  --datadir=/data/mariadb/data --copy-back /tmp/backup_mariadb20181127/2018-11-27_11-52-48

–copy-back:对应的目录就是我们准备好的可用数据的目录。此处为/tmp/backup_mariadb20181127/2018-11-27_11-52-48

–datadir:指定的目录就是还原后数据要存放的目录,如果my.cnf设置了datadir,可以省略–datadir,执行copyback时会读取my.cnf中的配置,datadir目录必须为空目录,如果不为空,手动删除。

3. 设置属主属组为mysql并启动

此时我们还不能启动mysql,因为我们是使用root用户拷贝的数据,所以数据目录中的数据文件的属主属组仍然为root,我们需要将这些文件的属主属组设置为mysql。

1
2
3
4
cd /data/mariadb/data
chown -R mysql.mysql *
chown -R mysql.mysql /data/mariadb/binlog
/etc/inid.d/mysqld start

引用

Xtrabackup 安装使用
xtrabackup 原理

坚持原创技术分享,您的支持将鼓励我继续创作!