innobackupex是perl脚本对xtrabackup的封装,和功能扩展。
权限和连接
xtrabackup需要连接到数据库和datadir操作权限。
xtrabackup或者innobackupex在使用过程中设计到2类用户权限:
1.系统用户,用来调用innobackupex或者xtrabackup
2.数据库用户,数据库内使用的用户
连接到服务:innobackupex或者xtrabackup通过—user和—password连接到数据库服务
$ innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
$ innobackupex --user=LUKE --password=US3TH3F0RC3 --stream=tar ./ | bzip2 -
$ xtrabackup --user=DVADER --password=14MY0URF4TH3R --backup --target-dir=/data/bkps/
其他连接选项:
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. |
需要的权限:连接到服务是为了执行备份,需要在datadir上有read,write和execute权限。在数据库中需要以下权限:
Ÿ RELOAD和LOCK TABLES权限为了执行FLUSH TABLES WITH READ LOCK 。
Ÿ REPLICATION CLIENT为了获取binary log 位置
Ÿ CREATE TABLESPACE权限为了导入表,用户表级别的恢复
Ÿ SUPER权限在slave环境下备份用来启动和关闭slave线程
mysql>CREATE USER'bkpuser'@'localhost' IDENTIFIED BY's3cret';
mysql>GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON*.*TO'bkpuser'@'localhost';
mysql> FLUSH PRIVILEGES;
创建全备
$ innobackupex --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/
会输出以下信息
innobackupex: Backup created in directory '/path/to/BACKUP-DIR/2013-03-25_00-00-09'
innobackupex: MySQL binlog position: filename 'mysql-bin.000003', position 1946
111225 00:00:53 innobackupex: completed OK!
从信息中会发现备份被创建在/path/to/BACKUP-DIR/2013-03-25_00-00-09
内部机制:在备份的时候innobackupex会调用xtrabackup来备份innodb表,并复制所有的表定义,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。
其他选项:
--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重做已提交事务,回滚未提交事务,之后数据就被写到了备份的数据文件(innodb文件)中,并重建日志文件。这一步隐式调用了2次xtrabackup –prepare。跟多关于xtrabackup可以看之后的章节。
其他选项:
--user-memory:指定预备阶段可使用的内存,内存多则速度快,默认为10MB
$ innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR
增量备份呢是为了减少空间使用和备份的时间。
增量备份的实现,依赖于innodb页上面的LSN(log sequence number),每次对数据库的修改都会导致LSN自增。
增量备份会复制指定LSN之后的所有数据页。
首先,使用percona-xtrabackup工具对数据库进行全备,然后再每次数据库的数据更新后对数据进行增量备份,每次增量备份均在上一次备份的基础上。恢复时依次把每次增量备份的数据恢复到全备中,最后使用合并的数据进行数据恢复。
创建全备
在创建增量备份之前需要一个全备,不然增量备份是没有意义的。
$ innobackupex /data/backups
这样就会在/data/backups下创建一个时间戳文件夹,如 /data/backups/2013-03-31_23-01-18,然后文件夹内是备份文件。
检查备份文件夹下的xtrabackup-checkpoints,会有一下信息:
backup_type = full-backuped
from_lsn =0
to_lsn =1291135
创建第一个增量备份
然后使用—incremental创建增量备份
$ innobackupex --incremental /data/backups --incremental-basedir=BASEDIR
BASEDIR指向之前的全备, /data/backups/2013-03-31_23-01-18,成功后备份会生成在/data/backups下的时间戳目录中,如:/data/backups/2013-04-01_23-01-18 ,把这个目录叫为记为 INCREMENTAL-DIR-1方面之后使用。
然后查看xtrabackup-checkpoints:
backup_type = incremental
from_lsn =1291135
to_lsn =1352113
可以发现和全备不同的是,backup_type为incremental,from_lsn不为0。
然后再创建一个增量备份
在INCREMENTAL-DIR-1的基础上再创建一个增量备份,记为INCREMENTAL-DIR-2。
$ innobackupex --incremental /data/backups --incremental-basedir=INCREMENTAL-DIR-1
增量备份替代方法
可以使用指定—incremental-lsn来代替—incremental-basedir的方法创建增量备份。
innobackupex --incremental /data/backups --incremental-lsn=1291135
innobackupex --incremental /data/backups --incremental-lsn=1358967
注意:xtrabackup只会影响xtradb或者innodb的表,其他引擎的表在增量备份的时候只会复制整个文件,不会差异。
第一步,全备
[root@serv01 databackup]# innobackupex --user=root --password=123456 /databackup/
第二步,查看数据
mysql> use larrydb; Database changed mysql> select * from class; +------+-------+ | cid | cname | +------+-------+ | 1 | linux | | 2 | dab | | 3 | Devel | +------+-------+ 3 rows in set (0.00 sec) mysql> select * from stu; +------+----------+------+ | sid | sname | cid | +------+----------+------+ | 1 | larry007 | 1 | +------+----------+------+ 1 row in set (0.00 sec)
第三步,更新数据
mysql> insert into stu values(2,'larry02',1); Query OK, 1 row affected (0.00 sec) mysql> select * from stu; +------+----------+------+ | sid | sname | cid | +------+----------+------+ | 1 | larry007 | 1 | | 2 | larry02 | 1 | +------+----------+------+ 2 rows in set (0.00 sec)
第四步,增量备份,进行了全备和第一次增量备份,所以有两个备份文件夹。我们每次增量备份都是针对上一次备份。
#--incremental:增量备份的文件夹 #--incremental-dir:针对哪个做增量备份 [root@serv01 databackup]# innobackupex --user=root --password=123456 --incremental /databackup/ --incremental-dir /databackup/2013-09-10_22-12-50/ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Inc 2009-2012. All Rights Reserved. …… innobackupex: Backup created in directory '/databackup/2013-09-10_22-15-45' innobackupex: MySQL binlog position: filename 'mysql-bin.000004', position 353 130910 22:16:04 innobackupex: completed OK! [root@serv01 databackup]# ll total 8 drwxr-xr-x. 9 root root 4096 Sep 10 22:13 2013-09-10_22-12-50 drwxr-xr-x. 9 root root 4096 Sep 10 22:16 2013-09-10_22-15-45
第五步,再次插入数据
mysql> insert into stu values(3,'larry03',1); Query OK, 1 row affected (0.00 sec) mysql> select * from stu; +------+----------+------+ | sid | sname | cid | +------+----------+------+ | 1 | larry007 | 1 | | 2 | larry02 | 1 | | 3 | larry03 | 1 | +------+----------+------+ 3 rows in set (0.00 sec)
第六步,再次增量备份
[root@serv01 databackup]# ll total 8 drwxr-xr-x. 9 root root 4096 Sep 10 22:13 2013-09-10_22-12-50 drwxr-xr-x. 9 root root 4096 Sep 10 22:16 2013-09-10_22-15-45 [root@serv01 databackup]# innobackupex --user=root --password=123456 --incremental /databackup/ --incremental-dir /databackup/2013-09-10_22-15-45/
第七步,再次插入数据
mysql> insert into stu values(4,'larry04',1); Query OK, 1 row affected (0.00 sec) mysql> select * from stu; +------+----------+------+ | sid | sname | cid | +------+----------+------+ | 1 | larry007 | 1 | | 2 | larry02 | 1 | | 3 | larry03 | 1 | | 4 | larry04 | 1 | +------+----------+------+ 4 rows in set (0.00 sec)
第八步,再次增量备份。一次全备,三次增量备份,所以有四个备份文件夹
[root@serv01 databackup]# innobackupex --user=root --password=123456 --incremental /databackup/ --incremental-dir /databackup/2013-09-10_22-19-21/ [root@serv01 databackup]# ll total 16 drwxr-xr-x. 9 root root 4096 Sep 10 22:13 2013-09-10_22-12-50 drwxr-xr-x. 9 root root 4096 Sep 10 22:16 2013-09-10_22-15-45 drwxr-xr-x. 9 root root 4096 Sep 10 22:19 2013-09-10_22-19-21 drwxr-xr-x. 9 root root 4096 Sep 10 22:22 2013-09-10_22-21-42
第九步,模拟数据丢失
mysql> drop database larrydb; Query OK, 2 rows affected (0.02 sec)
第十步,对全部的数据进行检查。可以看到增量备份和全备的文件占用磁盘大小有很大的差别,显然全备占用磁盘空间多,增量备份占用磁盘空间少
[root@serv01 databackup]# innobackupex --apply-log --redo-only /databackup/2013-09-10_22-12-50/ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Inc 2009-2012. All Rights Reserved. …… xtrabackup: starting shutdown with innodb_fast_shutdown = 1 130910 22:23:35 InnoDB: Starting shutdown... 130910 22:23:36 InnoDB: Shutdown completed; log sequence number 2098700 130910 22:23:36 innobackupex: completed OK! [root@serv01 databackup]# du -sh ./* 22M ./2013-09-10_22-12-50 1.5M ./2013-09-10_22-15-45 1.5M ./2013-09-10_22-19-21 1.5M ./2013-09-10_22-21-42
第十一步,对第一次做的增量备份数据进行合并到全备份中去
[root@serv01 databackup]# innobackupex --apply-log --redo-only --incremental /databackup/2013-09-10_22-12-50/ --incremental-dir=/databackup/2013-09-10_22-15-45/ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Inc 2009-2012. All Rights Reserved. …… innobackupex: Copying '/databackup/2013-09-10_22-15-45/hello/db.opt' to '/databackup/2013-09-10_22-12-50/hello/db.opt' 130910 22:32:26 innobackupex: completed OK!
第十二步,对第二次做的增量备份数据进行合并到全备份中去
[root@serv01 databackup]# innobackupex --apply-log --redo-only --incremental /databackup/2013-09-10_22-12-50/ --incremental-dir=/databackup/2013-09-10_22-19-21/
第十三步,对第三次做的增量备份数据进行合并到全备份中去
[root@serv01 databackup]# innobackupex --apply-log --redo-only --incremental /databackup/2013-09-10_22-12-50/ --incremental-dir=/databackup/2013-09-10_22-21-42/
第十四步,恢复时需要停掉MySQL,所以我们停掉MySQL
[root@serv01 databackup]# /etc/init.d/mysqld stop ERROR! MySQL server PID file could not be found! [root@serv01 databackup]# pkill -9 mysql
第十五步,恢复数据。注意这里指定的文件夹是2013-09-10_22-12-50
[root@serv01 databackup]# innobackupex --copy-back /databackup/2013-09-10_22-12-50/ InnoDB Backup Utility v1.5.1-xtrabackup; Copyright 2003, 2009 Innobase Oy and Percona Inc 2009-2012. All Rights Reserved. This software is published under the GNU GENERAL PUBLIC LICENSE Version 2, June 1991. 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 571. #报以上错需要删除数据目录下的东西 [root@serv01 data]# pwd /usr/local/mysql/data [root@serv01 data]# ls game ib_logfile0 mysql mysql-bin.000003 performance_schema test hello ib_logfile1 mysql-bin.000001 mysql-bin.000004 serv01.host.com.err xtrabackup_binlog_pos_innodb ibdata1 mnt mysql-bin.000002 mysql-bin.index serv01.host.com.pid [root@serv01 data]# rm -rf * #再次恢复数据,并更改数据库数据目录的拥有者和所属组 [root@serv01 databackup]# innobackupex --copy-back /databackup/2013-09-10_22-12-50/ [root@serv01 data]# ll total 18464 drwxr-xr-x. 2 root root 4096 Sep 10 22:37 game drwxr-xr-x. 2 root root 4096 Sep 10 22:37 hello -rw-r-----. 1 root root 18874368 Sep 10 22:33 ibdata1 drwxr-xr-x. 2 root root 4096 Sep 10 22:37 larrydb drwxr-xr-x. 2 root root 4096 Sep 10 22:37 mnt drwxr-xr-x. 2 root root 4096 Sep 10 22:37 mysql drwxr-xr-x. 2 root root 4096 Sep 10 22:37 performance_schema drwxr-xr-x. 2 root root 4096 Sep 10 22:37 test -rw-r--r--. 1 root root 24 Sep 10 22:37 xtrabackup_binlog_pos_innodb [root@serv01 data]# chown mysql.mysql /usr/local/mysql/data/ -R
第十六步,启动服务
[root@serv01 data]# /etc/init.d/mysqld start Starting MySQL.. SUCCESS!
第十七步,登录数据库,然后查看数据
[root@serv01 data]# mysql -uroot -p123456 mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | game | | hello | | larrydb | | mnt | | mysql | | performance_schema | | test | +--------------------+ 8 rows in set (0.00 sec) mysql> select * from larrydb.class; +------+-------+ | cid | cname | +------+-------+ | 1 | linux | | 2 | dab | | 3 | Devel | +------+-------+ 3 rows in set (0.00 sec) mysql> select * from larrydb.stu; +------+----------+------+ | sid | sname | cid | +------+----------+------+ | 1 | larry007 | 1 | | 2 | larry02 | 1 | | 3 | larry03 | 1 | | 4 | larry04 | 1 | +------+----------+------+ 4 rows in set (0.00 sec)