Mysql innobackupex xtrabackup 備份 還原

Mysql innobackupex xtrabackup 備份 還原

 

大數據量備份與還原,始終是個難點。當MySQL10G,用mysqldump來導出就比較慢了。在這裏推薦xtrabackup,這個工具比mysqldump要快很多。

1. Xtrabackup介紹

1.1. Xtrabackup是什麼

Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。

Xtrabackup有兩個主要的工具:xtrabackupinnobackupex

1xtrabackup只能備份InnoDBXtraDB兩種數據表,而不能備份MyISAM數據表

2innobackupex是參考了InnoDB Hotbackupinnoback腳本修改而來的.innobackupex是一個perl腳本封裝,封裝了xtrabackup。主要是爲了方便的 同時備份InnoDBMyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作爲slave需要的一些信息,根據這些信息,可以很方便的利用備份來重做slave

1.2. Xtrabackup可以做什麼

在線()備份整個庫的InnoDBXtraDB

xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)

以流的形式產生備份,可以直接保存到遠程機器上(本機硬盤空間不足時很有用)

MySQL數據庫本身提供的工具並不支持真正的增量備份,二進制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。

Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工作原理如下:

(1)首先完成一個完全備份,並記錄下此時檢查點的LSN(Log Sequence Number)

(2)在進程增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN

首 先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDBlogfilextrabackup_logfile;接着,開始拷貝全部的數據文 件.ibd;在拷貝全部數據文件結束之後,才停止拷貝logfile

因爲logfile裏面記錄全部的數據修改情況,所以,即時在備份過程中數據文件被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持數據的一致。

因爲innobackupex支持innodb,myisam,所以本文說一下,怎麼使用innobackupex

2. 安裝xtrabackup

1,下載地址

http://www.percona.com/downloads/XtraBackup/

2,安裝

根據需求,選擇不同的版本,我選擇的是rpm安裝包,如果報以下錯誤

[root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm

warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY

error: Failed dependencies:

perl(Time::HiRes) is needed by percona-xtrabackup-2.2.4-5004.el6.x86_64

解決辦法:

[root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安裝依賴包  

  

[root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm   //重新安裝  

warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY  

Preparing... ########################################### [100%]  

1:percona-xtrabackup ########################################### [100%]  

注意:

xtrabackup 2.2.4不支持mysql 5.1.73,所以如果要用新的xtrabackup,就要用高版本的mysql數據庫,不然就會報以下錯誤:

innobackupex: Error: Unsupported server version: '5.1.73'

3. 修改my.cnf

查看一下mysqld下面有沒有datadir,如果沒有加上

[mysqld]  

datadir=/usr/local/mysql/data 

不加的話,還原數據的時候,有可能會出現以下問題,

xtrabackup: Error: Please set parameter 'datadir'

innobackupex: fatal error: no 'mysqld' group in MySQL options

innobackupex: fatal error: OR no 'datadir' option in group 'mysqld' in MySQL options

4. 全庫備份與還原

4.1. 全庫備份

# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root  /backup/full  

如果報以下錯誤:

InnoDB: Error: log file ./ib_logfile0 is of different size 5242880 bytes

InnoDB: than specified in the .cnf file 50331648 bytes!

innobackupex: Error: The xtrabackup child process has died at /usr/bin/innobackupex line 2679.

解決辦法:在my.cnfmysqld中加入以下內容

[mysqld]  

innodb_log_file_size = 5M  

4.2. 單數據庫備份

# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --database=test  /backup/full 

4.3. 全庫備份並壓縮

# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --stream=tar  /backup/full | gzip > /backup/full/`date +%F_%H-%M-%S`.tar.gz  

 

4.4. 全庫還原

# /etc/init.d/mysqld stop      //停掉mysql  

# mv /usr/local/mysql/data /usr/local/mysql/data_bak  //數據目錄備份  

# mkdir -p /usr/local/mysql/data  //重建數據目錄  

  

//--apply-log選項的命令是準備在一個備份上啓動mysql服務  

#innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /backup/full/2018-05-23_14-37-34  

  

//--copy-back 選項的命令從備份目錄拷貝數據,索引,日誌到my.cnf文件裏規定的初始位置  

# innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /backup/full/2018-05-23_14-37-34

  

# chown -R mysql.mysql /usr/local/mysql/data //改變文件所屬  

# /etc/init.d/mysqld stop  //啓動mysql  

5. 增量備份與還原

1,創建測試數據庫和表

create database backup_test;  //創建庫  

  

CREATE TABLE `backup` (  //創建表  

 `id` int(11) NOT NULL AUTO_INCREMENT ,  

 `name` varchar(20) NOT NULL DEFAULT '' ,  

 `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,  

 `del` tinyint(1) NOT NULL DEFAULT '0',  

 PRIMARY KEY (`id`)  

) ENGINE=innodb DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  

2、插入數據

mysql> INSERT INTO backup (name) VALUES ('tank');

全量備份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root  /backup/full

3增量備份

mysql> INSERT INTO backup (name) VALUES ('tank1');  //插入數據  

  

#innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --incremental-basedir=/backup/full/2018-05-23_15-22-55 --incremental /backup/incr  

 

3,在增量的基礎上在進行增量備份

mysql> INSERT INTO backup (name) VALUES ('tank2'),('tank3'),('tank4'),('tank5'),('tank6');  //在插入數據  

  

//2018-05-23_15-25-36這個目錄,上次增量備份產生的目錄  

#innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --incremental-basedir=/backup/incr/2018-05-23_15-25-36 --incremental  /backup/incr   

查看增量備份記錄文件:

 

[root@test07 2018-05-23_15-22-55]# cat xtrabackup_checkpoints  //全備目錄

backup_type = full-backuped

from_lsn = 0

to_lsn = 67940611999

last_lsn = 67940611999

compact = 0

recover_binlog_info = 0

  

 

[root@test07 2018-05-23_15-25-36]# cat xtrabackup_checkpoints //第一次增量備後目錄

backup_type = incremental

from_lsn = 67940611999

to_lsn = 67940612311

last_lsn = 67940612311

compact = 0

recover_binlog_info = 0  

 

[root@test07 2018-05-23_15-28-17]# cat xtrabackup_checkpoints  //第二次增量備份目錄下的文件

backup_type = incremental

from_lsn = 67940612311

to_lsn = 67940614349

last_lsn = 67940614349

compact = 0

recover_binlog_info = 0

增量備份做完後,把backup_test這個數據庫刪除掉,drop database backup_test;這樣可以對比還原後

 

4,增量還原

# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --apply-log --redo-only /backup/full/2018-05-23_15-22-55  

  

#innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --apply-log --redo-only /backup/full/2018-05-23_15-22-55 --incremental-dir=/backup/incr/2018-05-23_15-25-36

  

# innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --apply-log /backup/full/2018-05-23_15-22-55 --incremental-dir=/backup/incr/2018-05-23_15-28-17  

在這裏有三個目錄,

1),/backup/full/2018-05-23_15-22-55,全備份目錄

2),/backup/incr/2018-05-23_15-25-36,第一次增量備份產生的目錄

3),/backup/incr/2018-05-23_15-28-17,第二次增量備份產生的目錄

到這裏增量還原,還沒有結束,還有最重要一步,就是要進行一次全量還原。停止數據庫,刪除/usr/local/mysql/data,在還原。

5、還原數據

innobackupex --defaults-file=/etc/my.cnf --user=root --password=root --copy-back /backup/full/2018-05-23_15-22-55

6、驗證數據:

 

MariaDB [backup_test]> select * from backup

    -> ;

+----+-------+---------------------+-----+

| id | name  | create_time         | del |

+----+-------+---------------------+-----+

|  1 | tank  | 2018-05-23 15:22:12 |   0 |

|  2 | tank1 | 2018-05-23 15:23:50 |   0 |

|  3 | tank2 | 2018-05-23 15:25:50 |   0 |

|  4 | tank3 | 2018-05-23 15:25:50 |   0 |

|  5 | tank4 | 2018-05-23 15:25:50 |   0 |

|  6 | tank5 | 2018-05-23 15:25:50 |   0 |

|  7 | tank6 | 2018-05-23 15:25:50 |   0 |

+----+-------+---------------------+-----+

增量備份的原理就是,把增量目錄下的數據,整合到全變量目錄下,然後在進行,全數據量的還原。

總體來說,innobackupex速度快,支持innodb,myisam,用起來是還不是很方便,單庫還原,還是增量備份還原,都要進行全部數據庫還原,這個不合理。

6. innobackup 常用參數說明

--defaults-file

xtrabackup--defaults-file參數

--apply-log

xtrabackup--prepare參數的封裝

--copy-back

做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir

--remote-host=HOSTNAME

通過ssh將備份數據存儲到進程服務器上;

--stream=[tar]

備 份文件輸出格式, tar時使用tar4ibd , 該文件可在XtarBackup binary文件中獲得.如果備份時有指定--stream=tar, tar4ibd文件所處目錄一定要在$PATH(因爲使用的是tar4ibd去壓縮, XtraBackupbinary包中可獲得該文件)

在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。

--tmpdir=DIRECTORY

當有指定--remote-host or --stream, 事務日誌臨時存儲的目錄, 默認採用MySQL配置文件中所指定的臨時目錄tmpdir

--redo-only --apply-log,

強制備份日誌時只redo ,跳過rollback。這在做增量備份時非常必要。

--use-memory=#

該參數在prepare的時候使用,控制prepareinnodb實例使用的內存量

--throttle=IOS

xtrabackup--throttle參數

--sleep=是給ibbackup使用的,指定每備份1M數據,過程停止拷貝多少毫秒,也是爲了在備份時儘量減小對正常業務的影響,具體可以查看ibbackup的手冊 ;

--compress[=LEVEL]

對備份數據迚行壓縮,僅支持ibbackupxtrabackup還沒有實現;

--include=REGEXP

xtrabackup參數--tables的封裝,也支持ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份 test庫中所有的表。如果需要全備份,則省略這個參數;如果需要備份test庫下的2個表:test1test2,則寫 成:--include="test.test1|test.test2"。也可以使用通配符,如:--include="test.test*"

--databases=LIST

列出需要備份的databases,如果沒有指定該參數,所有包含MyISAMInnoDB表的database都會被備份;

--uncompress

解壓備份的數據文件,支持ibbackupxtrabackup還沒有實現該功能;

--slave-info,

備 份從庫, 加上--slave-info備份目錄下會多生成一個xtrabackup_slave_info 文件, 這裏會保存主日誌文件以及偏移, 文件內容類似於:CHANGE MASTER TO MASTER_LOG_FILE='', MASTER_LOG_POS=0

--socket=SOCKET

指定mysql.sock所在位置,以便備份進程登錄mysql.

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