xtabakcup
*****************************************************************
安装
*****************************************************************
----1.编译安装percona-xtrabackup
yum -y install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr \
bison libtool zlib-devel libgcrypt-devel libcurl-devel crypt* libgcrypt* \
python-sphinx openssl imake libxml2-devel expat-devel ncurses5-devel ncurses-devle vim-common libgpg-error-devel libidn-devel
NOTE:2.2.16 需要python-sphinx openssl两个依赖包.
---2.安装相关插件
yum -y install perl-DBI
yum -y install perl-DBD-MySQL
yum -y install perl-Time-HiRes
yum -y install perl-IO-Socket-SSL
---3.编译安装组件
http://dist.schmorp.de/libev/
#tar xvzf libev-4.22.tar.gz
# ./configure
# make
# make install
#tar xvzf mysql-boost-5.7.15.tar.gz (编译时候用)
--4.安装xtrabackup
tar xvzf percona-xtrabackup-2.4.4.tar.gz
cd percona-xtrabackup-2.4.4.tar.gz
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql \
-DSYSCONFDIR=/etc \
-DWITH_BOOST=/home/mysql-5.7.15/boost
make
make install
---测试结果
# xtrabackup --version
xtrabackup version 2.4.4 based on MySQL server 5.7.13 Linux (x86_64) (revision id: df58cf2)
---4.备份预备工作
权限和连接
xtrabackup需要连接到数据库和datadir操作权限。
xtrabackup或者innobackupex在使用过程中设计到2类用户权限:
1.系统用户,用来调用innobackupex或者xtrabackup
2.数据库用户,数据库内使用的用户
需要的权限:连接到服务是为了执行备份,需要在datadir上有read,write和execute权限。在数据库中需要以下权限:
RELOAD和LOCK TABLES权限为了执行FLUSH TABLES WITH READ LOCK 。
REPLICATION CLIENT为了获取binary log 位置
CREATE TABLESPACE权限为了导入表,用户表级别的恢复
SUPER权限在slave环境下备份用来启动和关闭slave线程
mysql>CREATEUSER'bkpuser'@'localhost' IDENTIFIED BY's3cret';
mysql>GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON*.*TO'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
---5.全备份和增量备份
全备份
$ innobackupex --user=DBUSER --password=DBUSERPASS /data/backups
从信息中会发现备份被创建在/data/backups/2016-10-25_00-00-09
内部机制:在备份的时候innobackupex会调用xtrabackup来备份innodb表,并复制所有的表定义,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。
增量备份
增量备份呢是为了减少空间使用和备份的时间。
增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。
增量备份会复制指定LSN之后的所有数据页
$ innobackupex --user=DBUSER --password=DBUSERPASS -target-dir=/data/backups/1 --incremental-basedir=/data/backups/2016-10-25_00-00-09/
1目录下回有增量备份新目录
然后再创建一个增量备份
在增量备份1的基础上再创建一个增量备份,记为增量备份2。
$ innobackupex --user=DBUSER --password=DBUSERPASS -target-dir=/data/backups/2 --incremental-basedir=/data/backups/1/2016-10-25_10-10-11/
增量备份替代方法
#可以使用指定—incremental-lsn来代替—incremental-basedir的方法创建增量备份。
#innobackupex --incremental /data/backups --incremental-lsn=1291135
#innobackupex --incremental /data/backups --incremental-lsn=1358967
---6.恢复数据
预备增量备份
1.需要先预备全备,但是只重做已提交事务,不回滚未提交事务,然后应用到全备,也是只重做已提交事务,不回滚未提交事务
2.回滚未提交事务
如果已经回滚了未提交事务,那么就无法再应用增量备份
在全备上,使用—redo-only只做已提交事务,不回滚未提交事务
innobackupex --apply-log --redo-only /data/backups/2016-10-25_00-00-09
应用第一个增量备份
innobackupex --apply-log --redo-only /data/backups/2016-10-25_00-00-09 --incremental-dir=/data/backups/1/2016-10-25_10-10-11/
应用第二个增量备份
innobackupex --apply-log /data/backups/2016-10-25_00-00-09 --incremental-dir=/data/backups/2/2016-10-25_16-30-32/
输出结果,注意LSN的变化:
162026 22:08:43 InnoDB: Shutdown completed; log sequence number 1358967
161026 22:08:43 innobackupex: completed OK!
回滚未提交事务
当应用完所有增量备份的时候,就需要回滚所有为完成事务(如果最后一步加了 –redo-only就需要回滚未提交,不执行的话在服务启动阶段服务会处理未提交事务)。
innobackupex --apply-log /data/backups/2016-10-25_00-00-09
还原操作
service mysqld stop
删除数据库数据目录下的所有数据或者备份数据目录下的所有数据
还原:
innobackupex --copy-back /data/backups/2016-10-25_00-00-09
改变数据库目录权限
chown -R mysql:mysql data/mysqldb
启动数据库
service mysqld start
恢复顺序:
# 全备应用日志
[root@client103 ~]# innobackupex --apply-log /tmp/backup/2014-01-11_15-37-31/
# 第一次的增量备份应用日志,应用完日志后,将合并到全备上,恢复使用全备恢复
[root@client103 ~]# innobackupex --apply-log /tmp/backup/2014-01-11_15-37-31/ --incremental-dir=/tmp/backup/2014-01-11_15-45-06/
# 将第二次增量备份应用日志并合并到全备上
[root@client103 ~]# innobackupex --apply-log /tmp/backup/2014-01-11_15-37-31/ --incremental-dir=/tmp/backup/2014-01-11_15-46-33/
# 此时两次增量备份其实都合并到全备上了,恢复是只需要使用全备进行恢复就可以了
# 模拟数据故障[删除数据库的数据目录,执行如下命令还原]
[root@client103 ~]# innobackupex --copy-back /tmp/backup/2014-01-11_15-37-31/
# 恢复后的数据默认权限是有问题的,所以需要修改数据目录权限,如下
[root@client103 ~]# chown -R mysql:mysql /var/lib/mysql/
# 此时数据恢复完成,重启数据库服务,进行测试就可以了。大家自行测试,有问题留言反馈!