innobackupex备份工具使用

Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。

Xtrabackup有两个主要的工具:xtrabackup、innobackupex
  (1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
  (2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁

innobackupex:这个是其实是下面三个工具的一个perl脚本封装,可以备份MyISAM, InnoDB, XtraDB表。但在处理Myisam时需要加一个读锁。

xtrabackup:一个由C编译而来的二进制文件,只能备份InnoDB和XtraDB数据。

xbcrypt:用来加密或解密备份的数据。

xbstream:用来解压或压缩xbstream格式的压缩文件。

xtrabackup命令只备份数据文件,并不备份数据表结构(.frm),所以使用xtrabackup恢复的时候必须有对应表结构文件(.frm)。
innobackupex命令相当于冷备份,复制数据目录的索引,数据,结构文件,但会有短暂的锁表(时间依赖于MyISAM大小)。

这里主要介绍innobackupex的使用:

innobackupex在线备份及恢复(全量和增量)

innobackupex的安装
#获得安装包下载地址
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.3.3/binary/redhat/6/x86_64/percona-xtrabackup-2.3.3-1.el6.x86_64.rpm

安装:
rpm -ivh --force --nodeps percona-xtrabackup-2.3.3-1.el6.x86_64.rpm

查看版本信息:
[root@localhost data]# innobackupex -version
innobackupex version 2.3.3 Linux (x86_64) (revision id: 525ca7d)
(注):该版本只适用于5.6以下的,5.7要装2.4的percona-xtrabackup.

全备及其恢复

全备:

my.cnf文件添加如下内容并重启mysql
[mysqld]
basedir = /usr/local/mysql/
datadir = /usr/local/mysql/data
pid-file=/usr/local/mysql/data/localhost.localdomain.pid

service mysqld restart

执行如下语句进行全备:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/mysql/data
该语句将拷贝数据文件(由my.cnf里的变量datadir指定)至备份目录下(/backup/mysql/data),注意:如果不指定–defaults-file,默认值为/etc/my.cnf。
可以看到备份成功:

00316 12:47:00 Executing UNLOCK TABLES
200316 12:47:00 All tables unlocked
200316 12:47:00 Backup created in directory ‘/backup/mysql/data/2020-03-16_12-46-57’
200316 12:47:00 [00] Writing backup-my.cnf
200316 12:47:00 [00] …done
200316 12:47:00 [00] Writing xtrabackup_info
200316 12:47:00 [00] …done
xtrabackup: Transaction log of lsn (1635941) to (1635941) was copied.
200316 12:47:00 completed OK!

另外可以看到备份成功:

[root@localhost mysql]# cd /backup/mysql/data/
[root@localhost data]# ls
2020-03-16_12-46-57
[root@localhost data]# cd 2020-03-16_12-46-57/
[root@localhost 2020-03-16_12-46-57]# ls
backup-my.cnf ibdata1 mysql performance_schema test xtrabackup_checkpoints xtrabackup_info xtrabackup_logfile

恢复:

service mysqld stop
cd /usr/local/mysql/data
rm -rf *

如果不执行上面这步会提示data不为空。

开始执行数据恢复:
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --use-memory=1G --apply-log /backup/mysql/data/2020-03-16_12-46-57/
innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --copy-back /backup/mysql/data/2020-03-16_12-46-57/

可以看出,恢复分为两个步骤,
第1步是apply-log,为了加快速度,一般建议设置–use-memory,这个步骤完成之后,目录/backup/mysql/data/2020-03-16_12-46-57/下的备份文件已经准备就绪。
第2步是copy-back,即把备份文件拷贝至原数据目录下。
恢复完成之后,一定要记得检查数据目录的所有者和权限是否正确。

chown -R mysql.mysql *
service mysqld start
连接数据库会发现数据已经全部恢复。

增量备份及其恢复

注意:innobackupex 增量备份仅针对InnoDB这类支持事务的引擎,对于MyISAM等引擎,则仍然是全备。

增量备份:

增量备份需要基于全备,这里基于上面的全备。
select * from t1;
±—±---------+
| id | name |
±—±---------+
| 1 | zhanmusi |
| 2 | kebi |
±—±---------+
2 rows in set (0.00 sec)
mysql> insert into t1 select 3,‘Ali’;
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0

mysql> select * from t1;
±—±---------+
| id | name |
±—±---------+
| 1 | zhanmusi |
| 2 | kebi |
| 3 | Ali |
±—±---------+
3 rows in set (0.00 sec)
现在已经插入新的数据插入了一条新的数据。

innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --incremental-basedir=/backup/mysql/data/2020-03-16_12-46-57/ --incremental /backup/mysql/data
其中–incremental-basedir指向全备目录,–incremental指向增量备份的目录。
上面语句执行成功之后,会在–incremental执行的目录下创建一个时间戳子目录/2020-03-16_13-06-05/

在备份目录下,有一个文件xtrabackup_checkpoints记录着备份信息,全备的信息如下:
cat xtrabackup_checkpoints
backup_type = full-prepared
from_lsn = 0
to_lsn = 1635941
last_lsn = 1635941
compact = 0
recover_binlog_info = 0

基于该全备的增量备份的信息如下:
cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 1635941
to_lsn = 1636487
last_lsn = 1636487
compact = 0
recover_binlog_info = 0

从上面可以看出,增量备份的from_lsn正好等于全备的to_lsn。
那么,我们是否可以在增量备份的基础上再做增量备份呢?答案是肯定的,只要把–incremental-basedir执行上一次增量备份的目录即可.

增量恢复:

增量备份的恢复比全备要复杂很多,第一步是在所有备份目录下重做已提交的日志,如:
service mysqld stop
[root@localhost mysql]# pwd
/usr/local/mysql
[root@localhost mysql]# rm -rf *

innobackupex --apply-log --redo-only BASE-DIR

innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR是指全备目录,INCREMENTAL-DIR-1是指第一次的增量备份,INCREMENTAL-DIR-2是指第二次的增量备份,以此类推。
以上语句执行成功之后,最终数据在BASE-DIR(即全备目录)下。

具体命令如下:
innobackupex --apply-log --redo-only --user=root --password=123 /backup/mysql/data/2020-03-16_12-46-57/
innobackupex --apply-log --redo-only --user=root --password=123 /backup/mysql/data/2020-03-16_12-46-57/ --increment-dir=/backup/mysql/data/2020-03-16_13-06-05/

第一步完成之后,我们开始第二步:回滚未完成的日志:
innobackupex --apply-log BASE-DIR
上面执行完之后,BASE-DIR里的备份文件已完全准备就绪,最后一步是拷贝:
[plain]
innobackupex --copy-back BASE-DIR
同样地,拷贝结束之后,记得检查下数据目录的权限是否正确。
具体命令如下:
innobackupex --apply-log --user=root --password=123 /backup/mysql/data/2020-03-16_12-46-57/
innobackupex --copy-back --user=root --password=123 /backup/mysql/data/2020-03-16_12-46-57/

修改属主属组并启动:
chown -R mysql.mysql *
service mysqld start

查看数据已经恢复:
mysql> select * from t1;
±—±---------+
| id | name |
±—±---------+
| 1 | zhanmusi |
| 2 | kebi |
| 3 | Ali |
±—±---------+
3 rows in set (0.00 sec)

Percona XtraBackup的部分备份与恢复/单库备份/单表备份/指定库备份/指定表备份
创建部分备份(Creating Partial Backups)
部分备份共有三种方式,分别是:
1.用正则表达式表示要备份的库名及表名(参数为–include);
2. 将要备份的表名或库名都写在一个文本文件中(参数为–tables-file),3. 将要备份表名或库名完整的写在命令行中(参数为:–databases)。(译者注:不管你备份哪个库或是哪张表,强烈推荐把mysql库也一起备份,恢复的时候要用。)
3,使用–databases参数
使用这种方式,用户既可以将所有要备份的数据库名和完整表名都写在一起,以空格分隔,也可以将数据库名、完整表名写在一个文件中,每行一个,如果数据库有用户名密码请使用–user和–password指定相关信息。下面是一个例子。

以下展示我在MS银行期间写的一个备份脚本,该脚本适用于3个ETC项目的备份。

#!/bin/bash
#date:2017/12/04 17:58
#author: zhangsz
#describe: full_backup recover_full_backup incremental_backup recover_incremental_backup

#以下变量参数根据需要,自行设定
ip=192.168.136.136
mysql_conf=/etc/my.cnf
full_backup_dir=/opt/full
incremental_backup_dir=/opt/incremental
bak_dir=/opt/bak
data_dir=/usr/local/mysql/data
user=root
password=123

#全备函数
full_backup () {
ssh $ip mkdir -p $dir &>/dev/null
ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password    $full_backup_dir
}
#恢复全备函数
recover_full_backup () {
	ssh $ip mkdir -p $bak_dir
	ssh $ip service mysqld stop
	ssh $ip cp -rf $data_dir/* $bak_dir
	ssh $ip rm -rf $data_dir/* 
	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password  --apply-log $full_backup_dir/$1
        ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password  --copy-back $full_backup_dir/$1
  	ssh $ip chown -R mysql.mysql $data_dir
	ssh $ip service mysqld start
}
#增备函数
incremental_backup () {
	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password --incremental-basedir=$full_backup_dir/$1 --incremental $incremental_backup_dir
}
#恢复增备函数
recover_incremental_backup () {
	ssh $ip service mysqld stop
	ssh $ip cp -rf $data_dir/* $bak_dir
	ssh $ip rm -rf $data_dir/*

	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password --apply-log --redo-only $full_backup_dir/$1

	for incdir in $2
	do
	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password --apply-log --redo-only $full_backup_dir/$1  --incremental-dir=$incremental_backup_dir/$incdir
	done

	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password --apply-log $full_backup_dir/$1
	ssh $ip innobackupex --defaults-file=$mysql_conf --user=$user --password=$password --copy-back $full_backup_dir/$1
	ssh $ip  chown -R mysql.mysql $data_dir
	ssh $ip service mysqld start
}

echo "当前全备文件目录------>"
ssh $ip ls  $full_backup_dir
echo "当前增备文件目录------>"
ssh $ip ls  $incremental_backup_dir
read -p "请输入当前操作:(1,全备  2,恢复全备 3,增备 4,恢复增备)"  input
if [ $input -eq 1 ];then
	full_backup
elif [ $input -eq 2 ];then
	echo "当前全备文件目录------>"
        ssh $ip ls  $full_backup_dir
	read -p "请输入需要恢复的全备目录:" input2
	recover_full_backup $input2
elif [ $input -eq 3 ];then
	echo "当前全备文件目录------>"
        ssh $ip ls  $full_backup_dir
	read -p "请选择当前增备基于的全备:" input3
	incremental_backup $input3
elif [ $input -eq 4 ];then
	echo "当前全备文件目录------>"
	ssh $ip ls  $full_backup_dir
	read -p "请选择还原增备基于的全备:" input4
	
	echo "当前增备文件目录------>"
	ssh $ip ls  $incremental_backup_dir
	read -p "请选择需要还原的增备:" input5
	recover_incremental_backup $input4 $input5
fi

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值