MySQL innobackupex全量备份恢复

摘要

本文内容取自网络

先简单介绍一下这个工具:

innobackupex

innobackupex比xtrabackup有更强的功能,它整合了xtrabackup和其他的一些功能,他不但可以全量备份/恢复,还可以基于时间的增量备份与恢复。

innobackupex备份原理

innobackupex首先调用xtrabackup来备份innodb数据文件,当xtrabackup完成后,innobackupex就查看文件 xtrabackup_suspended ;然后执行“FLUSH TABLES WITH READ LOCK”来备份其他的文件

innobackupex恢复原理

innobackupex首先读取my.cnf,查看变量

  • datadir
  • innodb_data_home_dir
  • innodb_data_file_path
  • innodb_log_group_home_dir

对应的目录是否存在,确定相关目录存在后,然后先copy myisam表和索引,然后在copy innodb的表、索引和日志。

全量备份

全备命令

1
./innobackupex --user=root --password=root --host=172.17.210.112 --parallel=4 --throttle=400 --stream=tar /mysqlbak/innobackupex 2>/mysqlbak/innobackupex/bak.log 1>/mysqlbak/innobackupex/fullbak.tar

参数解释

1
2
3
4
5
6
7
8
--user=root 备份操作用户名,一般都是root用户
--password=root123 密码
--host=172.17.210.112 主机ip,本地可以不加
--parallel=4 --throttle=400 并行个数,根据主机配置选择合适的,默认是1个,多个可以加快备份速度。
--stream=tar 压缩类型,这里选择tar格式,可以加,可不加。加上文件就小一点,在备份的时候就已经打包好了。
/mysqlbak/innobackupex 备份存放的目录
2>/mysqlbak/innobackupex/bak.log 备份日志,将备份过程中的输出信息重定向到bak.log
1>/mysqlbak/innobackupex/fullbak.tar 备份文件压缩后的名字

不压缩的全备

1
./innobackupex --user=root --password=root --host=172.17.210.112 --parallel=4 --throttle=400 /mysqlbak/innobackupex 2>/mysqlbak/innobackupex/bak.log 1>/mysqlbak/innobackupex/

查看日志信息,会出现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
141011 09:44:02 innobackupex: Executing FLUSH ENGINE LOGS...
141011 09:44:02 innobackupex: Waiting for log copying to finish
xtrabackup: The latest check point (for incremental): '14275993522'
xtrabackup: Stopping log copying thread.
.>> log scanned up to (14275993522)
xtrabackup: Creating suspend file '/tmp/xtrabackup_log_copied' with pid '19659'
141011 09:44:03 innobackupex: All tables unlocked
141011 09:44:03 innobackupex: Waiting for ibbackup (pid=19659) to finish
xtrabackup: Transaction log of lsn (14275990028) to (14275993522) was copied.
innobackupex: Backup created in directory '/mysqlbak/innobackupex'
141011 09:44:04 innobackupex: Connection to database server closed
innobackupex: You must use -i (--ignore-zeros) option for extraction of the tar stream.
141011 09:44:04 innobackupex: completed OK!

表示备份成功。

innobackupex的全量备份脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#!/bin/bash
#set -x
#set -u
export PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/mysql/bin:/usr/local/percona-xtrabackup/bin
export HOME=/var/empty
DATE=$(date +%Y%m%d)
RM_DATE=$(date --date '10 days ago' +'%Y%m%d')
BACKUP_DIR=${XTRABACKUP_BACKUP_DIR}
[ ! -d "${BACKUP_DIR}" ] && mkdir -p ${BACKUP_DIR}
# Full database backup
/usr/local/percona-xtrabackup/bin/innobackupex --defaults-file=/etc/my.cnf --user=root --password=xxxx --no-timestamp ${BACKUP_DIR}/${DATE}
# Compress
# cd ${BACKUP_DIR} && tar czf mysql-${DATE}.tar.gz ${DATE} && rm -rf ${DATE}
# Delete backup over 10 days
rm -rf ${BACKUP_DIR}/${RM_DATE}

全量恢复

恢复备份文件要保证datadir文件为空,否则会报如下的错误

1
2
3
4
5
6
7
innobackupex --user=root /data/backup/
IMPORTANT: Please check that the copy-back run completes successfully.
At the end of a successful copy-back run innobackupex
prints "completed OK!".
Original data directory is not empty! at /usr/bin/innobackupex line 568.

恢复第一步:应用日志

1
./innobackupex --user=root --password=root1 --defaults-file=/etc/my.cnf --apply-log /u02/backup/

恢复第二步:拷贝文件

1
./innobackupex --user=root --password=root1 --defaults-file=/etc/my.cnf --copy-back /u02/backup/

参数解释

1
2
3
--defaults-file=/etc/my.cnf 恢复会使用my.cnf文件把需要恢复的文件,恢复到my.cnf指定的位置。
--apply-log 这是备份时产生的日志,
--copy-back 这是备份源,解压后的备份文件。

恢复需要一点点的时间,出现下面信息表示恢复成功。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
innobackupex: Starting to copy InnoDB system tablespace
innobackupex: in '/u02/backup'
innobackupex: back to original InnoDB data directory '/u01/mysql/data'
innobackupex: Copying '/u02/backup/ibdata1' to '/u01/mysql/data/ibdata1'
innobackupex: Starting to copy InnoDB undo tablespaces
innobackupex: in '/u02/backup'
innobackupex: back to '/u01/mysql/data'
innobackupex: Starting to copy InnoDB log files
innobackupex: in '/u02/backup'
innobackupex: back to original InnoDB log directory '/u01/mysql/data'
innobackupex: Copying '/u02/backup/ib_logfile1' to '/u01/mysql/data/ib_logfile1'
innobackupex: Copying '/u02/backup/ib_logfile0' to '/u01/mysql/data/ib_logfile0'
innobackupex: Finished copying back files.

恢复第三步:修改文件权限

1
2
cd /data
chown -R mysql.mysql data/

可能出现的报错:

出现下面错误,先初始化一下mysql

1
2
3
./mysql.server start
Starting MySQL...The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]
[root@newbidb script]# ./mysql_install_db --basedir=/u01/mysql --no-defaults --skip-name-resolve --user=mysql --datadir=/u01/mysql/data

权限:应该恢复使用的是root用户,但是MySQL需要MySQL用户去访问。

1
2
3
./mysql.server restart
MySQL server PID file could not be found![FAILED]
Starting MySQL.The server quit without updating PID file (/u01/mysql/data/newbidb.pid).[FAILED]

连接MySQL的时候

1
2
3
4
./mysql -uroot -p
Enter password:
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
没有这个文件,touch mysql.sock 并修改文件权限。