目录:
1.前言:
Xtrabackup是一个对InnoDB做数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具InnoDB Hotbackup的一个很好的替代品。
XtraBackup优势 :
- 1、无需停止数据库进行InnoDB热备
- 2、增量备份MySQL
- 3、流压缩到传输到其它服务器
- 4、能比较容易地创建主从同步
- 5、备份MySQL时不会增大服务器负载
Xtrabackup有两个主要的工具:xtrabackup、innobackupex
(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
(1)xtrabackup只能备份InnoDB和XtraDB两种数据表,而不能备份MyISAM数据表
(2)innobackupex-1.5.1则封装了xtrabackup,是一个脚本封装,所以能同时备份处理innodb和myisam,但在处理myisam时需要加一个读锁
2.环境:
[root@bogon . (Final)
Kernel \r on an \m
[root@bogon . Distrib .., (x86_64) using EditLine wrapper
[root@bogon .. .. unknown)
Kernel \r on an \m
[root@bogon . Distrib .., (x86_64) using EditLine wrapper
[root@bogon .. .. unknown)
xtrabackup的安装包,可以从http://www.percona.com/下载
3.开始备份
3.1.备份工具采用innobackupex
格式:innobackupex 选项 备份文件的路径(不需要写备份的文件名)
其常用的通用选项如下:
--user= 具备完全权限的账号和密码
--password=
--socket= 指定mysql的socket文件,默认/var/lib/mysql/mysql.sock,一般来说都需要指定这个,因为基本遇到的数据库pid都不在这个位置.
--port= 指定mysql端口,默认3306
--defaults-file= 采用的mysql配置文件
如果不明确定义socket,可能在使用innobackupex进行备份的时候会报:
innobackupex: Error: Failed to connect to MySQL server: DBI connect(';mysql_read_default_group=xtrabackup','root',...) failed: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (2) at /usr/bin/innobackupex line 2945
即innobackupex默认寻找的socket是/var/lib/mysql/mysql.sock
3.2.一次完全备份:
额外的备份可选选项:
--database= 即将备份的数据库(默认是全部数据库)
--stream= 备份文件的存储格式,例如tar格式,# innobackupex --stream=tar /backup | gzip > /backup/`date +%F_%H-%M-%S`.tar.gz 不过如此以来,恢复的时候就需要先解压.
--tmpdir= 指定临时输出目录,因为--stream会使输出文件暂存到临时目录/tmp中,如果mysql并发很大,则/tmp的压力就可能很大,故而采用此选项重新指定一个临时输出目录
[root@localhost mysql]# innobackupex --user=root --password=123456 --socket=/tmp/mysql.sock /data/back_data/
[root@localhost mysql]# ls /data/back_data/2014-04-09_19-35-40/
backup-my.cnf ib_logfile0 mysql test xtrabackup_checkpoints
ibdata1 ib_logfile1 performance_schema xtrabackup_binary xtrabackup_logfile
[root@localhost mysql]# ls /data/back_data/2014-04-09_19-35-40/
backup-my.cnf ib_logfile0 mysql test xtrabackup_checkpoints
ibdata1 ib_logfile1 performance_schema xtrabackup_binary xtrabackup_logfile
3.3.一次完全恢复:
完全恢复必须的恢复选项:
--apply-log 暂时通过备份文件启动mysql服务,将未提交的事务回滚,并将提交但未同步的数据进行同步,保证备份文件在备份时刻的数据一致性.
官方解析>>
After creating a backup, the data is not ready to be restored. There might be uncommitted transactions to be undone or transactions in the logs to be replayed. Doing those pending operations will make the data files consistent and it is the purpose of the prepare stage . Once this has been done, the data is ready to be used.
--copy-back 将备份文件copy到my.cnf中指定的数据库位置
root root Apr ibdata1
root root Apr ib_logfile0
root root Apr ib_logfile1
drwxr root root Apr mysql
drwxr root root Apr performance_schema
drwxr root root Apr test
root root Apr ib_logfile0
root root Apr ib_logfile1
drwxr root root Apr mysql
drwxr root root Apr performance_schema
drwxr root root Apr test
修改数据库权限
[root@localhost mydata]# chown -R mysql.mysql /mydata
启动成功
[root@localhost mydata]# service mysqld start
Starting MySQL...... SUCCESS!
Starting MySQL...... SUCCESS!
[root@localhost mysql]# mysql -uroot -p123456
Warning: Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.6.13 MySQL Community Server (GPL)
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
3.4.增量备份
既然是增量备份,必然需要指定上一次备份的路径.且,第一次增量备份时,指定的上一次备份路径应该是完全备份.
那么增量备份需要额外添加的选项如下:
--incremental 即开启增量备份,后面跟增量备份的路径
--incremental-basedir 即上次备份的存储路径,不管是上次的完全备份,还是上次的增量备份
当前mysql状态
mysql rows . sec)
此时备份目录里只有一次完全备份
[root@localhost
添加一个数据库in1,便于测试第一次增量备份
mysql row affected (. sec)
mysql rows .00 sec)
开始第一次增量备份
[root@localhost ~]# innobackupex --user=root --password=123456 --socket=/tmp/mysql.sock --incremental-basedir=/data/back_data/2014-04-09_19-35-40/ --incremental /data/back_data/
此时备份目录状态
[root@localhost
添加一个数据库in2,便于测试第二次增量备份
mysql row affected (. sec)
mysql rows . sec)
开始第二次增量备份
[root@localhost ~]# innobackupex --user=root --password=123456 --socket=/tmp/mysql.sock --incremental-basedir=/data/back_data/2014-04-10_11-25-56/ --incremental /data/back_data/
此时备份目录状态
[root@localhost
三个目录从左至右依次为完全备份-->增量备份1-->增量备份2
3.5.增量备份的恢复过程
增量备份如果需要恢复的话,需要先将某个完全备份之后的所有增量备份的数据整合到此完全备份中.因此,需要新的额外整合选项
--redo-only 将增量备份的数据重放到完全备份中,但是不要作用于最后一次增量恢复,这个为什么不在最后一个上面执行,具体原因不了解.
官方解析>>
Note:--redo-only should be used when merging all incrementals except the last one. That’s why the previous
line doesn’t contain the --redo-only option. Even if the --redo-only was used on the last step, backup would
still be consistent but in that case server would perform the rollback phase.
line doesn’t contain the --redo-only option. Even if the --redo-only was used on the last step, backup would
still be consistent but in that case server would perform the rollback phase.
--incremental-dir= 指定本次整合中增量备份的存储路径,配合--redo-only选项使用
首先模拟故障,删除所有数据库,(我这里的数据库路径是/mydata)
[root@localhost ~]# service mysqld stop
Shutting down MySQL................ SUCCESS!
[root@localhost mydata]# rm -rf *
[root@localhost mydata]# ls
Shutting down MySQL................ SUCCESS!
[root@localhost mydata]# rm -rf *
[root@localhost mydata]# ls
其次执行增量整合过程,将两个增量备份整合到完全备份中
三次命令依次是:
重放完全备份
整合增量备份1到完全备份
增量备份2到完全备份(不执行--redo-only)
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --redo-only /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --redo-only --incremental-dir=/data/back_data/2014-04-10_11-25-56/ /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --incremental-dir=/data/back_data/2014-04-10_11-48-44/ /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --redo-only --incremental-dir=/data/back_data/2014-04-10_11-25-56/ /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log --incremental-dir=/data/back_data/2014-04-10_11-48-44/ /data/back_data/2014-04-09_19-35-40/
最后,执行还原,即还原整合后的备份.
[root@localhost ~]# innobackupex --user=root --password=123456 --apply-log /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --copy-back /data/back_data/2014-04-09_19-35-40/
[root@localhost ~]# innobackupex --user=root --password=123456 --copy-back /data/back_data/2014-04-09_19-35-40/
查看mydata目录
[root@localhost mydata]# ls
ibdata1 ib_logfile0 ib_logfile1 in1 in2 mysql performance_schema test
ibdata1 ib_logfile0 ib_logfile1 in1 in2 mysql performance_schema test
可以看到in1和in2两个数据库都还原成功.
修改数据库权限
[root@localhost mydata]# chown -R mysql.mysql .
启动mysql数据库,并登陆
[root@localhost
Server version.. MySQL Community Server (GPL)
Server version.. MySQL Community Server (GPL)
Copyright (c) , , Oracle rows . sec)