mysql备份还原方案xtrabackup
摘要:mysql当数据库过大的时候,使用mysqldump的方式进行备份是一种非常慢的操作,500G的数据就够你备份一天一夜,我发现了一种mysql快速备份的方案,它使用文件存储的方式进行备份,支持全量和增量备份,这里所写为全量方式(如果可以接受备份开始到下次恢复之间的数据丢失时使用)。xtrabackup的备份速度很快,不管有多少的数据,备份速度完全是依赖于磁盘的读写速度,还支持压缩、不打断正在执行的事务、自动实现备份检验(用mysqldump会锁表,要加上可重复读--single-transaction才不会影响线上的程序写表,但是写表后的东西在还原的时候就会丢了,这也是全量备份的痛点)
特点
(1)备份过程快速、可靠
(2)备份过程不会打断正在执行的事务
(3)能够基于压缩等功能节约磁盘空间和流量
(4)自动实现备份检验
(5)还原速度快
准备mysql备份组件需要的安装包
检查服务器是centos6版本还是centos7+版本。选择安装包
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
命令解压,你可以得到以下文件。
### 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包
执行以下命令
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. 检查是否安装成功
按以下显示则安装成功
### 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
库就不用改动了
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)会出现备份的文件
181127 11:56:48 completed OK!
可以看到文件结构,我们此处自动生成的备份文件夹名为2018-11-27_11-52-48
,是一个以时间命名的文件夹
### 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,也就是还原数据前的"准备"工作。
innobackupex --apply-log 2018-11-27_11-52-48/
在事务日志容量很大的情况下,可以使用--use-memory= (例如: 1MB, 1M, 1GB, 1G)选项加速,在不指定内存大小的情况下,默认会占用100MB的内存。
输出最后如下就为正确
181127 11:56:10 completed OK!
2. 恢复数据
方法一、此处使用该方法,适用于备份部分数据库的方法
数据目录在/data/mariadb/data
,我们备份的数据库为cloud库。
进入mysql命令行mysql -A
,删除cloud库drop database cloud;
(如果无法进入命令行则到数据目录下直接干掉cloud文件夹,集群操作的话必须通过drop或者先停止集群,确定好主从模式)
执行命令
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
)为空,如果不为空,手动删除,一般此方法针对全量备份的方法。
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。
cd /data/mariadb/data
chown -R mysql.mysql *
chown -R mysql.mysql /data/mariadb/binlog
/etc/inid.d/mysqld start
评论