本文主要参考xtrabackup 详解和马哥linux干货分享使用Xtrabackup进行MySQL备份
一、安装
[root@VMUest tools]# wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.6/binary/tarball/percona-xtrabackup-2.4.6-Linux-i686.tar.gz [root@VMUest tools]# tar xf percona-xtrabackup-2.4.6-Linux-i686.tar.gz -C /usr/local/ [root@VMUest tools]# mv /usr/local/percona-xtrabackup-2.4.6-Linux-i686/ /usr/local/xtrabackup [root@VMUest tools]# echo "export PATH=$PATH:/usr/local/xtrabackup/bin" >> /etc/profile [root@VMUest tools]# source /etc/profile [root@VMUest tools]# echo $PATH
注意下载适合自己机器版本的软件
[root@VMUest tools]# innobackupex --help bash: /usr/local/xtrabackup/bin/innobackupex: cannot execute binary file 出错原因是没有下载适合自己机器版本的软件,之前下载的是percona-xtrabackup-2.4.6-Linux-x86_64.tar.gz [root@VMUest tools]# getconf LONG_BIT
二、备份
2.1、创建备份用户和备份目录
#创建备份用户 mysql> create user 'backup'@'%' identified by 'pwd'; mysql> grant reload,lock tables,replication client,create tablespace,super on *.* to 'backup'@'%'; mysql> flush privileges; #创建备份目录 [root@VMUest tools]# mkdir -p /data/backup/{full,incremental} [root@VMUest tools]# cd /data/backup/
测试备份数据
#测试备份数据 [root@VMUest backup]# innobackupex --host=192.168.85.129 --port=3306 --user=backup --password=pwd /data/backup/full/ 170328 15:17:26 innobackupex: Starting the backup operation IMPORTANT: Please check that the backup run completes successfully. At the end of a successful backup run innobackupex prints "completed OK!". 170328 15:17:26 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;host=192.168.85.129;port=3306' as 'backup' (using password: YES). Failed to connect to MySQL server as DBD::mysql module is not installed at - line 1327. 170328 15:17:26 Connecting to MySQL server host: 192.168.85.129, user: backup, password: set, port: 3306, socket: not set Using server version 5.6.35-log Error: failed to execute query SHOW ENGINE INNODB STATUS: Access denied; you need (at least one of) the PROCESS privilege(s) for this operation
Access denied; you need (at least one of) the PROCESS privilege(s) for this operation,权限不够
#查看、回收、重新赋权备份用户 mysql> show grants for backup@'%'; mysql> revoke create tablespace,super on *.* from backup@'%'; mysql> grant process on *.* to 'backup'@'%'; mysql> flush privileges;
2.2、完全备份
[root@VMUest backup]# innobackupex --host=192.168.85.129 --port=3306 --user=backup --password=pwd /data/backup/full/ ... 170328 17:03:19 Executing UNLOCK TABLES 170328 17:03:19 All tables unlocked 170328 17:03:19 Backup created in directory '/data/backup/full/2017-03-28_17-02-55/' MySQL binlog position: filename 'mysql-bin.000012', position '120' 170328 17:03:19 [00] Writing backup-my.cnf 170328 17:03:19 [00] ...done 170328 17:03:19 [00] Writing xtrabackup_info 170328 17:03:19 [00] ...done xtrabackup: Transaction log of lsn (31966613) to (31966613) was copied. 170328 17:03:19 completed OK!
备份后产生的文件
[root@VMUest backup]# ll -h /data/backup/full/2017-03-28_17-02-55/ total 77M -rw-r-----. 1 root root 418 Mar 28 17:03 backup-my.cnf -rw-r-----. 1 root root 76M Mar 28 17:03 ibdata1 drwxr-x---. 2 root root 4.0K Mar 28 17:03 mysql drwxr-x---. 2 root root 4.0K Mar 28 17:03 performance_schema drwxr-x---. 2 root root 4.0K Mar 28 17:03 sakila drwxr-x---. 2 root root 4.0K Mar 28 17:03 test -rw-r-----. 1 root root 21 Mar 28 17:03 xtrabackup_binlog_info -rw-r-----. 1 root root 115 Mar 28 17:03 xtrabackup_checkpoints -rw-r-----. 1 root root 511 Mar 28 17:03 xtrabackup_info -rw-r-----. 1 root root 2.5K Mar 28 17:03 xtrabackup_logfile [root@VMUest backup]# du -sh /data/backup/full/2017-03-28_17-02-55/ 104M /data/backup/full/2017-03-28_17-02-55/
在备份的同时,innobackupex还会在备份目录中创建如下文件:
(1)xtrabackup_checkpoints --备份类型(如完全或增量)、备份状态(如是否已经为prepared状态)和LSN(日志序列号)范围信息
(2)xtrabackup_binlog_info --mysql服务器当前正在使用的二进制日志文件及至备份这一刻为止二进制日志事件的位置
(3)xtrabackup_info --备份工具名称、版本,数据库版本,备份开始时间、备份结束时间,binlog_pos、innodb_**_lsn
2.3、prepare完全备份
一般情况下,在备份完成后,数据尚且不能用于恢复操作,因为备份的数据中可能会包含尚未提交的事务或已经提交但尚未同步至数据文件中的事务。因此,此时数据文件仍处理不一致状态。prepare的主要作用正是通过回滚未提交的事务及同步已经提交的事务至数据文件也使得数据文件处于一致性状态。
[root@VMUest ~]# innobackupex --apply-log /data/backup/full/2017-03-28_17-02-55/ ... xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: FTS optimize thread exiting. InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 31968650 170328 17:27:56 completed OK!
2.4、还原备份
#模拟误删除 mysql> use test; mysql> drop table employees; #原数据文件目录备份 [root@VMUest backup]# service mysql stop [root@VMUest backup]# mv /usr/local/mysql/data /usr/local/mysql/data_bak [root@VMUest backup]# mkdir /usr/local/mysql/data #还原数据 [root@VMUest backup]# innobackupex --defaults-file=/usr/local/mysql/my.cnf --copy-back --rsync /data/backup/2017-03-28_15-19-26/ #修改数据目录权限 [root@VMUest backup]# chown -R mysql.mysql /usr/local/mysql/data [root@VMUest backup]# service mysql start
三、增量备份
要实现第一次增量备份,可以使用下面的命令进行:
# innobackupex --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全备份所在的目录,此命令执行结束后,innobackupex命令会在/backup目录中创建一个新的以时间命名的目录以存放所有的增量备份数据。另外,在执行过增量备份之后再一次进行增量备份时,其--incremental-basedir应该指向上一次的增量备份所在的目录。
[root@VMUest backup]# innobackupex --host=192.168.85.129 --port=3306 --user=backup --password=pwd --incremental /data/backup/incremental/ --incremental-basedir=/data/backup/2017-03-28_15-19-26/
"准备"(prepare)增量备份与整理完全备份有着一些不同,尤其要注意的是:
(1)需要在每个备份(包括完全和各个增量备份)上,将已经提交的事务进行"重放"。"重放"之后,所有的备份数据将合并到完全备份上
(2)基于所有的备份将未提交的事务进行"回滚"
于是,操作就变成了:
# innobackupex --apply-log --redo-only BASE-DIR
接着执行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二个增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全备份所在的目录,而INCREMENTAL-DIR-1指的是第一次增量备份的目录,INCREMENTAL-DIR-2指的是第二次增量备份的目录,其它依次类推,即如果有多次增量备份,每一次都要执行如上操作;
最后把所有合在一起的完全备份整体进行一次apply操作,回滚未提交的数据
#innobackupex --apply-log BASE-DIR