您好,登錄后才能下訂單哦!
原理:
在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的安裝:
官網下載rpm包或者tar.gz包解壓就能用,此外需要通過epel的yum安裝依賴包libev
# yum install libev -y
# rpm -ivh percona-xtrabackup-24-2.4.3-1.el6.x86_64.rpm
rpm包釋放的可執行文件如下:
/usr/bin/innobackupex # 封裝過的perl腳本
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup # 主程序
xtrabackup的使用:
1、完全備份
# innobackupex --user=DBUSER --password=SECRET /path/to/backup/dir/
生成的是一個以當前日期命名的文件夾。
如果要使用一個最小權限的用戶進行備份,則可基于如下命令創建此類用戶:
> GRANT PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'bkpuser'@'localhost' IDENTIFIED BY '123456';
> FLUSH PRIVILEGES;
使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關于表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中。
在備份的同時,innobackupex還會在備份目錄中創建如下文件:
(1)xtrabackup_checkpoints —— 備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
(2)xtrabackup_binlog_info:mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。
(3)xtrabackup_binlog_pos_innodb:二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。
(4)xtrabackup_binary:備份中用到的xtrabackup的可執行文件;
(5)backup-my.cnf:備份命令用到的配置選項信息;
在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創建一個以時間命名的目錄;如此一來,innobackupex命令將會創建一個BACKUP-DIR目錄來存儲備份數據。
完全備份\恢復示例:
備份:
在node1上執行:
# /etc/init.d/mysqld stop
# innobackupex --user=root --password=xxxx --no-timestamp /backups/
# scp -rp /backups/ root@node2:/tmp
恢復:
在node2上執行恢復:
1、node2上停止mysql服務(如果啟動的話),并刪除mysql的數據目錄下所有文件:
# /etc/init.d/mysqld stop
# rm -fr /data/mysql/*
2、在node2上執行整理操作:
# innobackupex --apply-log /tmp/backups/
3、在node2上執行恢復操作,并修改文件屬主屬組:
# innobackupex --copy-back /tmp/backups/
# chown -R mysql.mysql /data/mysql/*
4、在node2上啟動mariadb服務:
# /etc/init.d/mysqld start
2、增量備份
每個InnoDB的頁面都會包含一個LSN信息,每當相關的數據發生改變,相關的頁面的LSN就會自動增長。這正是InnoDB表可以進行增量備份的基礎,即innobackupex通過備份上次完全備份之后發生改變的頁面來實現。
要實現第一次增量備份,可以使用下面的命令進行:
# innobackupex --user=root --password=xxxx --incremental /backup --incremental-basedir=BASEDIR
其中,BASEDIR指的是完全備份所在的目錄,此命令執行結束后,innobackupex命令會在/backup目錄中創建一個新的以時間命名的目錄以存放所有的增量備份數據。另外,在執行過增量備份之后再一次進行增量備份時,其--incremental-basedir應該指向上一次的增量備份所在的目錄。
注意: 增量備份僅能應用于InnoDB或XtraDB表,對于MyISAM表而言,執行增量備份時其實進行的是完全備份。
“準備”(prepare)增量備份與整理完全備份有著一些不同,尤其要注意的是:
(1)需要在每個備份(包括完全和各個增量備份)上,將已經提交的事務進行“重放”。“重放”之后,所有的備份數據將合并到完全備份上。
(2)基于所有的備份將未提交的事務進行“回滾”。
于是,操作就變成了:
# innobackupex --apply-log --redo-only BASE-DIR
接著執行:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-1
而后是第二個增量:
# innobackupex --apply-log --redo-only BASE-DIR --incremental-dir=INCREMENTAL-DIR-2
其中BASE-DIR指的是完全備份所在的目錄,而INCREMENTAL-DIR-1指的是第一次增量備份的目錄,INCREMENTAL-DIR-2指的是第二次增量備份的目錄,其它依次類推,即如果有多次增量備份,每一次都要執行如上的操作;
增量備份、恢復示例:
1、先做一個完全備份
# innobackupex --user=root /backups/ 會在/backups/下生成一個以當前時間命名的文件夾。如下圖:
2、對數據表執行些修改等操作
【數據表的修改操作略過】
3、執行增量備份
# innobackupex --incremental /backups/ --incremental-basedir=/backups/2015-11-08_19-24-05
說明:
有時候查看增量備份的文件中的xtrabackup_checkpoints發現其數值沒變化,可能是LSN變化太小了。執行大量的數據表修改等操作后,會發現其LSN是會變化的,有時候不變也是正常的。
補充個腳本的方式執行全備份、增量備份: 全備份: innobackupex --user=root --password=123456 /backups/ 增量備份: innobackupex --user=root --password=123456 --incremental /backups/ --incremental-basedir=/backups/$(ls -l /backups| awk '{print $NF}'|tail -1) # 將上面的2個添加到cron計劃任務即可,備份的路徑是/backups/目錄下。
4、合并備份文件
# innobackupex --user=root --password=123456 --apply-log-only --redo-only /backups/2015-11-08_19-57-53/
# innobackupex --user=root --password=123456 --apply-log-only --redo-only /backups/2015-11-08_19-57-53/ --incremental-dir=/backups/2015-11-08_19-59-31/
# cat /backups/2015-11-08_19-57-53/xtrabackup_checkpoints # 檢驗是否合并成功
5、執行恢復數據到數據庫的操作
# innobackupex --user=root --password=123456 --copy-back /backups/2015-11-08_19-57-53/ 【注意這里填的應該是basedir的路徑】
# ls -lh /data/mysql/ 查看文件是否恢復
# chown -R mysql.mysql /data/mysql/ 修改文件權限
6、啟動MySQL查看是否數據已恢復
# /etc/init.d/mysqld start
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。