XtraBackup使用手册
[TOC] ##XtraBackup安装 yum安装方法:
rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
##XtraBackup备份预备工作
xtrabackup需要连接到数据库和datadir操作权限。 xtrabackup或者innobackupex在使用过程中设计到2类用户权限:
- 系统用户,用来调用innobackupex或者xtrabackup
- 数据库用户,数据库内使用的用户 ###连接到服务 innobackupex或者xtrabackup通过–user和–password连接到数据库服务
innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
###其他连接选项 | Option |Description| |------------|-----------| |--port|The port to use when connecting to the database server with TCP/IP| |--socket|The socket to use when connecting to the local database| |--host|The host to use when connecting to the database server with TCP/IP|
##全备和全备还原 ###使用innobackupex创建全备 ####创建全备
innobackupex --user=DBUSER --password=DBUSERPASS /niub/xtrabackup/base/
会输出一下信息:
innobackupex: Backup created in directory '/niub/xtrabackup/base/2015-11-04_14-24-43'
innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 1946
innobackupex: completed OK!
从信息中会发现备份被创建在/niub/xtrabackup/base/2015-11-04_14-24-43
其他选项:
- --no-timestamp,指定了这个选项备份会直接备份在BACKUP-DIR,不再创建时间戳文件夹。
- --default-file,指定配置文件,用来配置innobackupex的选线。
####预备备份
创建完备份之后数据被没有马上可以被还原,需要回滚未提交事务,前滚提交事务,让数据库文件保持一致性。
innobackupex使用—apply-log来做预备备份
innobackupex --apply-log /path/to/BACKUP-DIR
成功则会输出:
111225 1:01:57 InnoDB: Shutdown completed; log sequence number 1609228
111225 01:01:57 innobackupex: completed OK!
成功后,备份可以被用来还原数据库了。 ###使用innobackupex还原全备 使用innobackupex –copy-back来还原备份
innobackupex --copy-back /path/to/BACKUP-DIR
注:datadir
必须是为空的,innobackupex –copy-back
不会覆盖已存在的文件,还要注意,还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir
还原脚本:
#!/bin/bash
db_data=/niub/mysqldata
base_dir=/niub/xtrabackup/base/2015-11-04_14-24-43
service mysql stop
rm -rf $db_data/*
innobackupex --copy-back $base_dir
chown -R mysql:mysql $db_data/*
service mysql start
##增量备份和还原 增量备份呢是为了减少空间使用和备份的时间。
增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。
增量备份会复制指定LSN之后的所有数据页。
###创建增量备份 ####创建全备 在创建增量备份之前需要一个全备,不然增量备份是没有意义的。
innobackupex --user=DBUSER --password=DBUSERPASS /niub/xtrabackup/base/
这样就会在/niub/xtrabackup/base/
下创建一个时间戳文件夹,如/niub/xtrabackup/base/2015-11-04_14-24-43
,然后文件夹内是备份文件。
检查备份文件夹下的xtrabackup-checkpoints
,会有一下信息:
backup_type = full-backuped
from_lsn =0
to_lsn =1291135
####增量备份
然后使用—incremental
创建增量备份
innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password --incremental $INCREMENTAL_DIR --incremental-basedir=$BASEDIR
$BASEDIR
指向之前的全备目录,如:/niub/xtrabackup/base/2015-11-04_14-24-43
$INCREMENTAL_DIR
为增备目录,如:/niub/xtrabackup/incremental
然后查看增备目录下的 xtrabackup-checkpoints
:
backup_type = incremental
from_lsn =1291135
to_lsn =1352113
确保全备目录下的 xtrabackup-checkpoints
to_lsn
与增备中的from_ls
相等
###还原增量备份 在全备上,使用—redo-only只做已提交事务,不回滚未提交事务
innobackupex --apply-log --redo-only $BASE-DIR
会出现以下结果:
innobackupex: completed OK!
####应用增量备份
innobackupex --apply-log --redo-only $BASE-DIR --incremental-dir= $INCREMENTAL_DIR
####回滚未提交事务 当应用完所有增量备份的时候,就需要回滚所有为完成事务。
innobackupex --apply-log $BASE-DIR
####还原增量备份
还原增量备份其实和还原全备一样
使用innobackupex –copy-back
来还原备份
innobackupex --copy-back /path/to/BACKUP-DIR
注:datadir
必须是为空的,innobackupex –copy-back
不会覆盖已存在的文件,还要注意,还原时需要先关闭服务,如果服务是启动的,那么就不能还原到datadir
还原脚本
#!/bin/bash
db_data=/niub/mysqldata
base_dir=/niub/xtrabackup/base/2015-11-04_14-24-43
service mysql stop
rm -rf $db_data/*
innobackupex --copy-back $base_dir
chown -R mysql:mysql $db_data/*
service mysql start
###全备和增备脚本
#!/bin/bash
user="root"
password=PASSWORD
base_dir='/niub/mysql_xtrabackup'
mysql_date=`date +%Y%m%d`
old_date=`date -d "5 day ago" +%Y%m%d`
if [ -f /root/scripts/mysql_xtrabackup_status ];then
last_base_date=`head -1 /root/scripts/mysql_xtrabackup_status | awk '{print $2}'`
if [ "$last_base_date" == "$old_date" ];then
rm -rf ${base_dir}/base/*
innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password ${base_dir}/base
echo "mysql_xtrabackup_base $mysql_date" > /root/scripts/mysql_xtrabackup_status
echo "`date` -- mysql base create" >> /root/scripts/mysql_xtrabackup.log
else
if [ ! -d ${base_dir}/increment/${mysql_date} ];then
mkdir -p ${base_dir}/increment/${mysql_date}
fi
base_name=`ls ${base_dir}/base`
innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password --incremental-basedir=${base_dir}/base/${base_name} --incremental ${base_dir}/increment/${mysql_date}/
echo "`date` -- mysql increment" >> /root/scripts/mysql_xtrabackup.log
fi
else
echo "mysql_xtrabackup_base $mysql_date" > /root/scripts/mysql_xtrabackup_status
rm -rf ${base_dir}/base/*
innobackupex --defaults-file=/etc/my.cnf --user=$user --password=$password ${base_dir}/base
echo "`date` -- mysql base create" >> /root/scripts/mysql_xtrabackup.log
fi
detlet_time=`date +%H%M`
if [ "$detlet_time" == "0130" ];then
rm -rf ${base_dir}/increment/${old_date}