1. 程式人生 > >使用innobackupex線上備份及恢復mysql資料庫

使用innobackupex線上備份及恢復mysql資料庫

一、安裝解壓
# 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 是指定需要備份的資料庫

 [[email protected] ~]# innobackupex --user=root  --defaults-file=/etc/my.cnf --database=dotatest  /home/data/backup/  
三、常規恢復資料庫

恢復之前先停止資料庫,並且要刪除資料和日誌檔案
系統環境:

    [root@localhost lib]# cat /etc/redhat-release   
    CentOS release 6.3 (Final)
    [root@localhost lib]# uname -a  
    Linux localhost.localdomain 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux  
    [root@localhost lib]# uname -r  
    2.6.32-279.el6.x86_64
    [root@localhost lib]# 

    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,即把備份檔案拷貝至原資料目錄下,--ibbackup xtrabackup_56作用是指定與本地安裝的mysql版本對應的xtrabackup
      [root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root  --apply-log /home/data/backup/2014-03-11_16-52-44/ --ibbackup xtrabackup_56
                [root@localhost mysql]# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/data/backup/2014-03-11_16-52-44/ --ibbackup xtrabackup_56

    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 
 [[email protected] 2014-03-11_17-33-57]# cat xtrabackup_checkpoints     增量備份檔案  
    backup_type = incremental  
    from_lsn = 657645
    to_lsn = 659090
    last_lsn = 659090     
    [[email protected] 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
    [[email protected] 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> 

注意:

    mkdir /var/lib/mysql
避免如下報錯
 Original data directory '/var/lib/mysql' does not exist! at /usr/bin/innobackupex line 586