1. 程式人生 > >MySQL物理備份 xtrabackup

MySQL物理備份 xtrabackup

load edi prim 應用場景 ply 安全 變化 權限 文件系統

MySQL 備份之 xtrabackup | innobackupex

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。 
3、官方文檔:http://www.percona.com/doc/percona-xtrabackup/2.1/ 
A、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保持數據
的一致。 
B、Xtrabackup 可以做什麽? 技術分享圖片
XtraBackup基於InnoDB的crash-recovery功能。它會復制innodb的data file,由於不鎖表,復制出來的數據是不一致的,在恢復的時候使用
crash-recovery,使得數據恢復一致。 
  InnoDB維護了一個redo log,又稱為transaction log,事務日誌,它包含了innodb數據的所有改動情況。當InnoDB啟動的時候,它會先去檢
查data file和transaction log,並且會做二步操作: 
  XtraBackup在備份的時候, 一頁一頁地復制innodb的數據,而且不鎖定表,與此同時,XtraBackup還有另外一個線程監視著transactions log,
一旦log發生變化,就把變化過的log pages復制走。為什麽要急著復制走呢? 因為transactions log文件大小有限,寫滿之後,就會從頭再開始寫,
所以新數據可能會覆蓋到舊的數據。 
在prepare過程中,XtraBackup使用復制到的transactions log對備份出來的innodb data file進行crash recovery。 
官方原理 
在 InnoDB內部會維護一個redo日誌文件,我們也可以叫做事務日誌文件。事務日誌會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動 時,
InnoDB會檢查數據文件和事務日誌,並執行兩個步驟:它應用(前滾)已經提交的事務日誌到數據文件,並將修改過但沒有提交的數據進行回滾操作。
 
Xtrabackup 在啟動時會記住 log sequence number(LSN),並且復制所有的數據文件。復制過程需要一些時間,所以這期間如果數據文件有改動,
那麽將會使數據庫處於一個不同的時間點。這 時,xtrabackup會運行一個後臺進程,用於監視事務日誌,並從事務日誌復制最新的修改。Xtrabackup
必須持續的做這個操作,是因為事務日 誌是會輪轉重復的寫入,並且事務日誌可以被重用。所以 xtrabackup 自啟動開始,就不停的將事務日誌中每個
數據文件的修改都記錄下來。 
上面就是 xtrabackup 的備份過程。接下來是準備(prepare)過程。在這個過程中,xtrabackup 使用之前復制的事務日誌,對各個數據文件執行災難
恢復(就像mysql剛啟動時要做的一樣)。當這個過程結束後,數據庫就可以做恢復還原了。 
以 上的過程在 xtrabackup 的編譯二進制程序中實現。程序 innobackupex 可以允許我們備份 MyISAM 表和 frm 文件從而增加了便捷和功 能。
Innobackupex會啟動xtrabackup,直到xtrabackup復制數據文件後,然後執行FLUSH TABLES WITH READ LOCK來阻止新的寫入進來並把MyISAM
表數據刷到硬盤上,之後復制MyISAM數據文件,最後釋放鎖。 
備 份MyISAM和InnoDB表最終會處於一致,在準備(prepare)過程結束後,InnoDB表數據已經前滾到整個備份結束的點,而不是回滾到 xtrabackup
剛開始時的點。這個時間點與執行FLUSH TABLES WITH READ LOCK的時間點相同,所以myisam表數據與InnoDB表數據是同步的。類似oracle的,
InnoDB的prepare過程可以稱為 recover(恢復), myisam的數據復制過程可以稱為restore(還原)。 
Xtrabackup 和 innobackupex 這兩個工具都提供了許多前文沒有提到的功能特點。手冊上有對各個功能都有詳細的介紹。簡單介紹下,這些工具提供
了如流 (streaming)備份,增量(incremental)備份等,通過復制數據文件,復制日誌文件和提交日誌到數據文件(前滾)實現了各種復合備份方 式。
C、Xtrabackup 備份原理 技術分享圖片
XtraBackup以read-write模式打開innodb的數據文件,然後對其進行復制。其實它不會修改此文件。也就是說,運行XtraBackup的用戶,必須
對 innodb 的數據文件具有讀寫權限。之所以采用 read-write 模式是因為 XtraBackup 采用了其內置的 innodb 庫來打開文件,而 innodb 庫打開文件
的時候就是rw的。 
  XtraBackup要從文件系統中復制大量的數據,所以它盡可能地使用posix_fadvise(),來告訴OS不要緩存讀取到的數據,從而提升性能。因為這些
數據不會重用到了,OS卻沒有這麽聰明。如果要緩存一下的話,幾個G的數據,會對OS的虛擬內存造成很大的壓力,其它進程,比如mysqld很有可
能被swap出去,這樣系統就會受到很大影響了。 
  在備份 innodb page 的過程中,XtraBackup 每次讀寫 1MB 的數據,1MB/16KB=64 個 page。這個不可配置。讀 1MB 數據之後,XtraBackup
一頁一頁地遍歷這 1MB 數據,使用 innodb 的 buf_page_is_corrupted()函數檢查此頁的數據是否正常,如果數據不正常,就重新讀取這一頁,最多重
新讀取10次,如果還是失敗,備份就失敗了,退出。在復制transactions log的時候,每次讀寫512KB的數據。同樣不可以配置。 
D、Xtrabackup 實現細節 技術分享圖片
基於以上原理,xtrabackup 備份恢復工具比較適合數據增長型數據庫。對於數據增長型的庫,由於數據的增長導致數據備份和恢復的空間和時
間上的壓力較大。而xtrabackup有增量備份的功能,在短時間內可以通過進行增量備份來保證數據的安全性。而長期來看,仍然需要間斷性的進行全庫
備份。此外,由於xtrabackup對innodb的數據庫不進行鎖定,因此對要求不影響線上服務的數據備份和恢復較適合。 
       而對於數據量無明顯增長,且更新為主的數據更新型數據庫,xtrabackup顯得過於復雜。xtrabackup操作反而不如mysqldump的性能高。 
E、Xtrabackup 應用場景 技術分享圖片
個人理解: 
    1、無需停止數據庫進行InnoDB熱備,快速、可靠的完成備份 
    2.備份期間不間斷事務處理 
    3.節省磁盤空間和網絡帶寬 
    4.自動對備份文件進行驗證 
    5.快速恢復,保障在線運行時間持久性 
官方說明: 
    1.在不停庫的情況下,對InnoDB數據庫進行熱備 
    2.增量備份MySQL數據庫 
    3.通過流壓縮備份MySQL數據到另外一臺服務器 
4.在線MySQL服務器之間進行表空間遷移
F、Xtrabackup 優勢

Xtrabackup 安裝

官網下載:https://www.percona.com/downloads/XtraBackup/LATEST/

本文示例安裝包下載

下載鏈接:https://pan.baidu.com/s/1C88-Ninf0cTG3ghBWdMPEw 密碼:0kp1

安裝軟件

[root@Admin ~]# yum install libev -y 

[root@Admin ~]# rpm -ivh percona-xtrabackup-24-2.4.7-2.el6.x86_64.rpm 

Xtrabackup 實例

創建測試數據

建庫:mysql> create database ceshi;

建表:mysql> create table users (id int primary key auto_increment,name varchar(20) not null unique,password varchar(100) not null,address 
varchar(200))ENGINE=MyISAM; 

添加數據:mysql> insert into users (id,name,password,address) values (1,zhang,1234,null),(2,wang,4321,湖北武漢), (3,li,5678,北京海澱); 

建庫:mysql> create database test2;

建表:mysql> create table articles (id int primary key auto_increment,content longtext not null);

添加數據:mysql> insert into articles (id,content) values (11,hahahahahaha),(12,xixixixixix),(13,aiaiaiaia),(14,hohoahaoaooo);

全庫備份與恢復操作過程

創建備份目錄:

[root@Admin ~]# mkdir -p /backup/{full_data,dk_data,zl_data}

註:full_data 全庫備份目錄
dk_data 單庫備份目錄
zl_data 增量備份目錄

全庫備份(All DB)

官方備份用法說明:

$ innobackupex --defaults-file=/tmp/other-my.cnf --user=DBUSER --password=DBUSERPASS /path/to/BACKUP-DIR/ 

官方恢復用法說明:

用法一:$ innobackupex --apply-log /path/to/BACKUP-DIR 
用法二:$ innobackupex --apply-log --use-memory=4G /path/to/BACKUP-DIR

註:--use-memory=4G 該參數在 prepare 的時候使用,控制 prepare 時 innodb 實例使用的內存量

全庫備份操作步驟:

第一步:執行備份全庫命令

[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 /backup/full_data
 註:--defaults-file:默認配置文件的路徑,如果不該參數,xtrabackup 將從依次從以下位置查找配置文件/etc/my.cnf、/etc/mysql/my.cnf、/usr/local/etc/my.cnf、 ~/.my.cnf,並讀取配置文件中的[mysqld]和[xtrabackup]配置段。[mysqld]中只需要指定datadir、innodb_data_home_dir、innodb_data_file_path、innodb_log_group_home_dir、innodb_log_files_in_group、innodb_log_file_size6個參數即可讓xtrabackup正常工作。
     --user:授權的數據庫用戶
     --password:數據庫用戶的密碼
     --target-dir=name備份文件的存放目錄路徑(即:/backup/full_data )

第二步:恢復準備:

[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --apply-log /backup/full_data/2018-10-18_20-58-04

第三步:停庫:

[root@Admin ~]# /etc/init.d/mysqld stop

第四步:把備份文件拷貝至原數據目錄下並授權:

[root@Admin ~]# rm -rf /data/DB/*        # 把數據目錄刪除測試

[root@Admin ~]# cp /backup/full_data/2018-10-18_20-58-04/* /data/DB/

[root@Admin ~]# chown -R mysql. /data/DB/

第五步:重啟數據庫:

[root@Admin ~]# /etc/init.d/mysqld start

第六步:查看數據:

mysql> show databases;

mysql> use ceshi;

mysql> show tables;

mysql> select * from users;

單庫備份與恢復操作過程

單庫備份跟全庫用法是一樣的,只不過單庫在備份裏,要指定要備份的數據庫名,即: --databases=LIST

單庫備份操作步驟:

全量備份:

[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --database=ceshi /backup/dk_data
註:如果是備份從庫的話,需要添加參數:--slave-info,即:
[root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --slave-info --database=ceshi /tmp

刪除ceshi庫,方便後面測試是否恢復成功:

mysql> drop database ceshi;

恢復單庫操作步驟:

  • 1) 關閉數據庫
    [root@Admin ~]# /etc/init.d/mysqld stop
  • 2) 恢復日誌文件 apply-log
    [root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --apply-log /backup/dk_data/2018-10-18_21-10-51
  • 3) 把備份文件拷貝至原數據目錄下
    [root@Admin ~]# cp -ap /backup/dk_data/2018-10-18_21-10-51/ceshi/ /data/DB/
  • 4) 檢查數據目錄的所有者和權限是否正確
    [root@Admin ~]# chown -R mysql. /data/DB/ 
  • 5) 重啟 mysql
    [root@Admin ~]# /etc/init.d/mysqld start
  • 6) 檢查數據
    mysql> show databases;
    
    mysql> use ceshi;
    
    mysql> show tables;
    
    mysql> select * from users;
    
    mysql> show create table users\G

單庫增量備份與恢復操作過程

單庫增量備份操作步驟:

增量的備份:

  • 1)首先對單庫執行一次全備
    [root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123 --database=ceshi /backup/dk_data/
  • 2)插入數據
    mysql> select * from users;
    mysql> insert into users (id,name,password,address) values (4,liu,1122,null),(5,zou,4311,湖南長沙), (6,zhou,6789,北京八 寶山), (7,ding,7891,深圳西麗);
  • 3) 對單庫進行增量備份
    [root@Admin ~]# innobackupex --defaults-file=/etc/my.cnf --user=root --password=123  --database=ceshi --incremental --incremental-basedir=/backup/dk_data/2018-10-18_21-33-20 /backup/zl_data
    註: --incremental 指備份類型為增量備份,做增量備份之前首先要做一次全量備份,所以 
         --incremental-basedir=/backup/dk_data/2014-05-30_23-26-22  的目錄 就是--incremental-basedir=BASEDIR  
         /backup/zl_data就是 --incremental-basedir=INCREMENTAL-DIR-1 
         INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。

增量的恢復:

  • 1) 關閉數據庫
    [root@Admin ~]# /etc/init.d/mysqld stop
  • 2) 恢復全備份日誌文件(回滾未完成的日誌)
    [root@Admin ~]# innobackupex --defaluts-file=/etc/my.cnf --user=root --password=123 --apply-log --redo-only /backup/dk_data/2018-10-18_21-33-20
    加選項:--apply-log-only作用是:只應用redo log,不對數據的rollback,起到先合並事務日誌# 
  • 3) 恢復增量備份日誌文件
    [root@Admin ~]# innobackupex --defaluts-file=/etc/my.cnf --user=root --password=123 --apply-log --red-only /backup/dk_data/2018-10-18_21-33-20 --incremental-dir=/backup/zl_data/2018-10-18_22-17-33
    註:其中BASE-DIR是指全備目錄,INCREMENTAL-DIR-1是指第一次的增量備份,INCREMENTAL-DIR-2是指第二次的增量備份,以此類推。 
     BASE-DIR:/backup/dk_data/2014-05-30_11-56-51 
     INCREMENTAL-DIR-1:/backup/zl_data/2014-05-31_03-01-33 
     以上語句執行成功之後,最終數據在BASE-DIR(即全備目錄)下 
  • 4) 恢復增量備份數據文件(拷貝數據)
    [root@Admin ~]# \cp -afp /backup/dk_data/2018-10-18_21-33-20/* /data/DB/
  • 5) 授權
    [root@Admin ~]# chown -R mysql. /data/DB/
  • 6) 啟動數據庫
    [root@Admin ~]# /etc/init.d/mysqld start
  • 7) 檢查數據
    mysql> show databases;
    
    mysql> select * from ceshi.users;

MySQL物理備份 xtrabackup