mysql innobackupex xtrabackup 大資料量 備份 還原

zping發表於2016-03-15

大資料量備份與還原,始終是個難點。當MYSQL超10G,用mysqldump來匯出就比較慢了。在這裡推薦xtrabackup,這個工具比mysqldump要快很多。

 

一、Xtrabackup介紹

1,Xtrabackup是什麼

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

Xtrabackup有兩個主要的工具:xtrabackup、innobackupex

1、xtrabackup只能備份InnoDB和XtraDB兩種資料表,而不能備份MyISAM資料表

2、 innobackupex是參考了InnoDB Hotbackup的innoback指令碼修改而來的.innobackupex是一個perl指令碼封裝,封裝了xtrabackup。主要是為了方便的 同時備份InnoDB和MyISAM引擎的表,但在處理myisam時需要加一個讀鎖。並且加入了一些使用的選項。如slave-info可以記錄備份恢 復後,作為slave需要的一些資訊,根據這些資訊,可以很方便的利用備份來重做slave。

2,Xtrabackup可以做什麼 :

線上(熱)備份整個庫的InnoDB、 XtraDB表
在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)
以流的形式產生備份,可以直接儲存到遠端機器上(本機硬碟空間不足時很有用)

MySQL資料庫本身提供的工具並不支援真正的增量備份,二進位制日誌恢復是point-in-time(時間點)的恢復而不是增量備份。
Xtrabackup工具支援對InnoDB儲存引擎的增量備份,工作原理如下:

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

(2)在程式增量備份時,比較表空間中每個頁的LSN是否大於上次備份時的LSN,如果是,則備份該頁,同時記錄當前檢查點的LSN。
首 先,在logfile中找到並記錄最後一個checkpoint(“last checkpoint LSN”),然後開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;接著,開始拷貝全部的資料文 件.ibd;在拷貝全部資料檔案結束之後,才停止拷貝logfile。
因為logfile裡面記錄全部的資料修改情況,所以,即時在備份過程中資料檔案被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持資料的一致。

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

二,安裝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

解決辦法:

  1. [root@localhost xtrabackup]# yum -y install perl perl-devel libaio libaio-devel perl-Time-HiRes perl-DBD-MySQL //安裝依賴包  
  2.   
  3. [root@localhost xtrabackup]# rpm -ivh percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm   //重新安裝  
  4. warning: percona-xtrabackup-2.2.4-5004.el6.x86_64.rpm: Header V4 DSA/SHA1 Signature, key ID cd2efd2a: NOKEY  
  5. Preparing... ########################################### [100%]  
  6. 1:percona-xtrabackup ########################################### [100%]  

注意:

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

innobackupex: Error: Unsupported server version: '5.1.73'

二,修改my.cnf

檢視一下mysqld下面有沒有datadir,如果沒有加上

  1. [mysqld]  
  2. datadir=/var/lib/mysql  

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

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

三,全部資料庫備份與還原

1,全部資料庫備份

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root /home/tank/backup/  

如果報以下錯誤:

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.cnf的mysqld中加入以下內容

  1. [mysqld]  
  2. innodb_log_file_size = 5M  

2,單資料庫備份

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root --database=backup_test /home/tank/backup/  

3,資料庫備份並壓縮

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

4,全資料還原

  1. # /etc/init.d/mysqld stop      //停掉mysql  
  2. # mv /var/lib/mysql /var/lib/mysql_bak   //資料目錄備份  
  3. mkdir -p /var/lib/mysql  //重建資料目錄  
  4.   
  5. //--apply-log選項的命令是準備在一個備份上啟動mysql服務  
  6. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log /home/tank/backup/2014-09-18_16-35-12  
  7.   
  8. //--copy-back 選項的命令從備份目錄拷貝資料,索引,日誌到my.cnf檔案裡規定的初始位置  
  9. # innobackupex --defaults-file=/etc/my.cnf --user=root --copy-back /home/tank/backup/2014-09-18_16-35-12  
  10.   
  11. chown -R mysql.mysql /var/lib/mysql  //改變檔案所屬  
  12. # /etc/init.d/mysqld stop  //啟動mysql  

四,增量備份與還原

1,建立測試資料庫和表

  1. create database backup_test;  //建立庫  
  2.   
  3. CREATE TABLE `backup` (  //建立表  
  4.  `id` int(11) NOT NULL AUTO_INCREMENT ,  
  5.  `name` varchar(20) NOT NULL DEFAULT '' ,  
  6.  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ,  
  7.  `del` tinyint(1) NOT NULL DEFAULT '0',  
  8.  PRIMARY KEY (`id`)  
  9. ) ENGINE=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;  

2,增量備份

  1. mysql> INSERT INTO backup (name) VALUES ('tank'),('tank1');  //插入資料  
  2.   
  3. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/tank/backup/2014-09-18_16-35-12 --incremental /home/tank/backup/  

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

  1. mysql> INSERT INTO backup (name) VALUES ('tank2'),('tank3'),('tank4'),('tank5'),('tank6');  //在插入資料  
  2.   
  3. //2014-09-18_18-05-20這個目錄,上次增量備份產生的目錄  
  4. # innobackupex --defaults-file=/etc/my.cnf --user=root --incremental-basedir=/home/tank/backup/2014-09-18_18-05-20 --incremental /home/tank/backup/  

檢視增量備份記錄檔案:

  1. [root@localhost 2014-09-18_16-35-12]# cat xtrabackup_checkpoints   //全備目錄下的檔案  
  2. backup_type = full-prepared  
  3. from_lsn = 0             //全備起始為0  
  4. to_lsn = 23853959  
  5. last_lsn = 23853959  
  6. compact = 0  
  7.   
  8. [root@localhost 2014-09-18_18-05-20]# cat xtrabackup_checkpoints  //第一次增量備份目錄下的檔案  
  9. backup_type = incremental  
  10. from_lsn = 23853959  
  11. to_lsn = 23854112  
  12. last_lsn = 23854112  
  13. compact = 0  
  14.   
  15. [root@localhost 2014-09-18_18-11-43]# cat xtrabackup_checkpoints  //第二次增量備份目錄下的檔案  
  16. backup_type = incremental  
  17. from_lsn = 23854112  
  18. to_lsn = 23854712  
  19. last_lsn = 23854712  
  20. compact = 0  

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

4,增量還原

  1. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12  
  2.   
  3. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014-09-18_18-05-20  
  4.   
  5. # innobackupex --defaults-file=/etc/my.cnf --user=root --apply-log --redo-only /home/tank/backup/2014-09-18_16-35-12 --incremental-dir=/home/tank/backup/2014-09-18_18-11-43  

在這裡有三個目錄,

1),/home/tank/backup/2014-09-18_16-35-12,全備份目錄

2),/home/tank/backup/2014-09-18_18-05-20,第一次增量備份產生的目錄

3),/home/tank/backup/2014-09-18_18-11-43,第二次增量備份產生的目錄

到這裡增量還原,還沒有結束,還有最重要一步,就是要進行一次全量還原。停止資料庫,刪除/var/lib/mysql,在還原。

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

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

五,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去壓縮, 在XtraBackup的binary包中可獲得該檔案)。
在 使用引數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的時候使用,控制prepare時innodb例項使用的記憶體量

--throttle=IOS
同xtrabackup的--throttle引數

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

--compress[=LEVEL]
對備份資料迚行壓縮,僅支援ibbackup,xtrabackup還沒有實現;

--include=REGEXP
對 xtrabackup引數--tables的封裝,也支援ibbackup。備份包含的庫表,例如:--include="test.*",意思是要備份 test庫中所有的表。如果需要全備份,則省略這個引數;如果需要備份test庫下的2個表:test1和test2,則寫 成:--include="test.test1|test.test2"。也可以使用萬用字元,如:--include="test.test*"。

--databases=LIST
列出需要備份的databases,如果沒有指定該引數,所有包含MyISAM和InnoDB表的database都會被備份;

--uncompress
解壓備份的資料檔案,支援ibbackup,xtrabackup還沒有實現該功能;

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

--socket=SOCKET
指定mysql.sock所在位置,以便備份程式登入mysql.

 

安裝xtrabackup

cp bin/innobackupex /usr/bin/
cp bin/xtrabackup* /usr/bin/
innobackupex --defaults-file=/etc/my.cnf --user=root  --password=cc.123 --parallel=16 --database=ESB /home/backup

innobackupex --defaults-file=/etc/my.cnf --user=root --password=cc.123 --incremental-basedir=/home/backup/2016-03-15_15-08-23 --incremental /home/backup

  

相關文章