一 文章回顧
在上一篇文章,我們講到percona-xtrabackup軟件的使用,這一篇文章我們講解percona-xtrabackup實現增量備份及恢復。
二 增量備份示意圖
三 percona-xtrabackup實現增量備份及恢復原理
首先,使用percona-xtrabackup工具對數據庫進行全備,然後再每次數據庫的數據更新後對數據進行增量備份,每次增量備份均在上一次備份的基礎上。恢復時依次把每次增量備份的數據恢復到全備中,最後使用合併的數據進行數據恢復。
四 percona-xtrabackup實現增量備份及恢復
第一步,全備
[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)