使用innobackupex在線增量備份及恢復mysql數據庫

   這幾天一直在研究mysql備份這一塊,前幾天由於手誤對線上生產數據庫造成誤操作,雖然沒有太大影響,但是爲了把風險度降到最低,因此最近一直在倒騰mysql的在線熱備份,在線熱備份有免費開源的,也收費的產品,在這裏我們值討論免費的產品,支持熱備的的軟件mysqlLVM以及接下來的這款Xtrabackup;Xtrabackup是由percona開發的一個開源軟件,它是innodb熱備工具ibbackup(收費的商業軟件)的一個開源替代品。Xtrabackup由個部分組成:xtrabackup和innobackupex,其中xtrabackup工具用於備份innodb和 xtraDB引擎的表;而innobackupex工具用於備份myisam和innodb引擎的表,本文將介紹如何用innobackupex工具做全量和增量備份。

一、安裝解壓

1.安裝數據庫

官網:http://www.percona.com
下載地址:http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-2.0.8/binary/Linux/x86_64/percona-xtrabackup-2.0.8-587.tar.gz
yum -y install mysql mysql-libs mysql-server MySQL-python

2.創建數據庫

create database dotatest;
mysql -uroot -p dotatest > zhan_data.sql
python mysql_update.py --host localhost --user root --passwd "" --db dotatest
use dotatest;
show tables;
desc item;
insert into item (player, item, count) values (1, 1, 1 );    插入一條數據
insert into item (player, item, count) values (2, 2, 2 );
select * from item;

3.安裝依賴包(如果安裝新版本需要安裝)

yum install cmake gcc gcc-c++ libaio libaio-devel automake autoconf bzr bison libtool ncurses-devel zlib-devel libgcrypt libgcrypt-devel perl-Time-HiRes

4.解壓安裝

[root@localhost home]# tar xf percona-xtrabackup-2.0.8-587.tar.gz
[root@localhost home]# mysql --version
mysql  Ver 14.14 Distrib 5.1.61, for redhat-linux-gnu (x86_64) using readline 5.1
[root@localhost percona-xtrabackup-2.0.8]# pwd
/home/percona-xtrabackup-2.0.8
[root@localhost percona-xtrabackup-2.0.8]# cp bin/
innobackupex        xbstream            xtrabackup_51       xtrabackup_56     
innobackupex-1.5.1  xtrabackup          xtrabackup_55     
[root@localhost percona-xtrabackup-2.0.8]# cp bin/innobackupex /usr/bin/
[root@localhost percona-xtrabackup-2.0.8]# cp bin/xtrabackup* /usr/bin/

二、常規備份文件以及對單個數據庫備份

備份全部數據庫
[root@localhost /]# mkdir /home/data/backup/
[root@localhost /]# innobackupex --defaults-file=/etc/my.cnf --user=root  /home/data/backup/
--defaults-file 指定mysql的配置文件
--user 指定用戶
/home/data/backup/ 備份文件的路徑
需要注意的是 如果不指定--defaults-file 默認會讀取/etc/my.cnf。如果你的配置文件是自定義的,那麼一定要指定目錄,然後會在目錄下創建一個時間戳的目錄(我們本次創建的/home/data/backup/2014-03-11_11-08-23)
查看備份是否成功
[root@localhost /]# cd /home/data/backup/2014-03-11_11-08-23/
[root@localhost 2014-03-11_11-08-23]# pwd
/home/data/backup/2014-03-11_11-08-23
[root@localhost 2014-03-11_11-08-23]# ls
backup-my.cnf  ibdata1  test               xtrabackup_binlog_info  xtrabackup_logfile
dotatest       mysql    xtrabackup_binary  xtrabackup_checkpoints  zabbix
[root@localhost 2014-03-11_11-08-23]#
只針對一個數據庫備份
--database 是指定需要備份的數據庫
[root@localhost ~]# innobackupex --user=root  --defaults-file=/etc/my.cnf --database=dotatest  /home/data/backup/

三、常規恢復數據庫

恢復之前先停止數據庫,並且要刪除數據和日誌文件

01.首先停止數據庫
[root@localhost 2014-03-11_16-52-44]# /etc/rc.d/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@localhost 2014-03-11_16-52-44]#
02.備份刪除mysql文件
[root@localhost lib]# cp -a mysql/ mysql.bak
[root@localhost lib]# ls
alternatives  dav   dhclient  games             misc     mysql      nfs  plymouth  postfix  random-seed  rpm      stateles
authconfig    dbus  fprint    logrotate.status  mlocate  mysql.bak  ntp  polkit-1  prelink  readahead    rsyslog  udev
[root@localhost lib]# cd mysql
[root@localhost mysql]# ls
dotatest  ibdata1  ib_logfile0  ib_logfile1  mysql  test  zabbix
[root@localhost mysql]# rm -rf *

03.來恢復文件

恢復文件分兩步,

第1步是apply-log,爲了加快速度,一般建議設置--use-memory,這個步驟完成之後,目錄/backup/mysql/data/2013-10-29_09-05-25下的備份文件已經準備就緒。

因爲我們的文件比較少,因此我們不需要設置--user-memory產數文件

第2步是copy-back,即把備份文件拷貝至原數據目錄下。

[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root  --apply-log /home/data/backup/2014-03-11_16-52-44/
[root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/data/backup/2014-03-11_16-52-44/

04.修改權限 啓動服務

[root@localhost lib]# chown mysql:mysql /var/lib/mysql/ -R

[root@localhost lib]# /etc/rc.d/init.d/mysqld start

Starting mysqld:                                           [  OK  ]

[root@localhost lib]#


四、配置增量備份

增量備份及其恢復

注意:innobackupex 增量備份僅針對InnoDB這類支持事務的引擎,對於MyISAM等引擎,則仍然是全備。

01.首先在數據庫插入一條數據

mysql> use dotatest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|  1 |      1 |    1 |     1 |
|  2 |      2 |    2 |     2 |
+----+--------+------+-------+
2 rows in set (0.00 sec)
mysql> insert into item (player, item, count) values (3, 3, 3 );
Query OK, 1 row affected (0.00 sec)
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|  1 |      1 |    1 |     1 |
|  2 |      2 |    2 |     2 |
|  3 |      3 |    3 |     3 |
+----+--------+------+-------+
3 rows in set (0.00 sec)
mysql>

02.增量備份是基於一個數據庫的全部備份文件的,在剛纔我們備份了一個全備份,我們現在的增量備份就基於剛纔的全部備份來做(2014-03-11_16-52-44)

需要注意如下兩個參數:

--incremental-basedir指向全備目錄;

--incremental指向增量備份的目錄;

[root@localhost backup]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/2014-03-11_16-52-44/ --incremental /home/data/backup/
……略……
innobackupex: Backup created in directory '/home/data/backup/2014-03-11_17-33-57'
innobackupex: MySQL binlog position: filename '', position
140311 17:34:16  innobackupex: completed OK!

03.查看是否有備份文件,最新的配置文件就是我們剛纔的增量備份文件

[root@localhost backup]# pwd
/home/data/backup
[root@localhost backup]# ls
2014-03-11_16-52-44  2014-03-11_17-33-57
[root@localhost backup]#
在如下的文件中我們可以發現增量備份的文件from_lsn剛好等於全部備份的to_lsn
[root@localhost 2014-03-11_17-33-57]# cat xtrabackup_checkpoints    增量備份文件
backup_type = incremental
from_lsn = 657645
to_lsn = 659090
last_lsn = 659090   
[root@localhost 2014-03-11_17-33-57]# cat ../2014-03-11_16-52-44/xtrabackup_checkpoints     全局備份
backup_type = full-prepared
from_lsn = 0
to_lsn = 657645
last_lsn = 657645
[root@localhost 2014-03-11_17-33-57]#

五、在增量備份的基礎上再做增量備份

在備份之前我們在item表中再插入數據
mysql> insert into item (player, item, count) values (4, 4, 4 );
Query OK, 1 row affected (0.03 sec)
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|  1 |      1 |    1 |     1 |
|  2 |      2 |    2 |     2 |
|  3 |      3 |    3 |     3 |
|  4 |      4 |    4 |     4 |
+----+--------+------+-------+
4 rows in set (0.00 sec)
mysql>

在增量備份的基礎上再做增量備份,我們需要添加如下參數

--incremental-basedir執行上一次增量備份的目錄

如下備份:
[root@localhost 2014-03-11_17-33-57]# innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/data/backup/2014-03-11_17-33-57/ --incremental /home/data/backup/
………中間部分略………
innobackupex: Backup created in directory '/home/data/backup/2014-03-11_18-03-54'
innobackupex: MySQL binlog position: filename '', position
140311 18:04:13  innobackupex: completed OK!
innobackupex: Backup created in directory '/home/data/backup/2014-03-11_18-10-13'
innobackupex: MySQL binlog position: filename '', position
140311 18:10:31  innobackupex: completed OK!

然後來查看lsn號來:

[root@localhost 2014-03-11_18-10-13]# cat xtrabackup_checkpoints
backup_type = incremental
from_lsn = 659090
to_lsn = 659214
last_lsn = 659090
[root@localhost 2014-03-11_18-10-13]# cat ../2014-03-11_17-33-57/
backup-my.cnf           ibdata1.meta            xtrabackup_binary       xtrabackup_logfile    
dotatest/               mysql/                  xtrabackup_binlog_info  zabbix/               
ibdata1.delta           test/                   xtrabackup_checkpoints
[root@localhost 2014-03-11_18-10-13]# cat ../2014-03-11_17-33-57/xtrabackup_checkpoints
backup_type = incremental
from_lsn = 657645
to_lsn = 659090
last_lsn = 659090
[root@localhost 2014-03-11_18-10-13]#

六、恢復增量數據庫

停止數據庫
[root@localhost backup]# /etc/rc.d/init.d/mysqld stop
Stopping mysqld:                                           [  OK  ]
[root@localhost backup]#
備份數據庫
[root@localhost lib]# mv mysql mysql.bak.2
[root@localhost lib]# pwd
/var/lib
[root@localhost lib]#

這個恢復比恢復全部備份稍微複雜點,接下來我們來恢復,如果有多個增量備份,需要疊加就可以

innobackupex --apply-log --redo-only BASE-DIR   BASE-DIR指完整的全部備份目錄
innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1           INCREMENTAL-DIR-1指第一次增量備份的目錄
innobackupex --apply-log BASE-DIR --incremental-dir=INCREMENTAL-DIR-2                       BASE-DIR指完整的全部備份目錄 INCREMENTAL-DIR-2第二次增量備份的目錄

01.在我們的環境中我們來執行如下操作,因爲我們只有兩次的增量備份如下即可:

innobackupex --apply-log --redo-only /home/data/backup/2014-03-11_16-52-44/
innobackupex --apply-log --redo-only /home/data/backup/2014-03-11_16-52-44 --incremental-dir=/home/data/backup/2014-03-11_17-33-57/
innobackupex --apply-log /home/data/backup/2014-03-11_16-52-44/ --incremental-dir=/home/data/backup/2014-03-11_18-10-13/

02.回滾未完成的日誌(需要注意的是恢復的時候,我們只恢復全備份文件就可以了)

innobackupex --apply-log /home/data/backup/2014-03-11_16-52-44/
innobackupex --copy-back /home/data/backup/2014-03-11_16-52-44/

03.授權啓動

[root@localhost lib]# chown mysql:mysql /var/lib/mysql -R
[root@localhost lib]# /etc/rc.d/init.d/mysqld start
Starting mysqld:                                           [  OK  ]
[root@localhost lib]#

04.檢查備份是否回來

mysql> use dotatest;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select * from item;
+----+--------+------+-------+
| id | player | item | count |
+----+--------+------+-------+
|  1 |      1 |    1 |     1 |
|  2 |      2 |    2 |     2 |
|  3 |      3 |    3 |     3 |
|  4 |      4 |    4 |     4 |
+----+--------+------+-------+
4 rows in set (0.00 sec)
mysql>


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章