? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Xtrabackup
官方原理
在InnoDB內部會維護一個redo日志文件,我們也可以叫做事務日志文件。事務日志會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查數據文件和事務日志,并執行兩個步驟:它應用(前滾)已經提交的事務日志到數據文件,并將修改過但沒有提交的數據進行回滾操作。
Xtrabackup在啟動時會記住log sequencenumber(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)備份等,通過復制數據文件,復制日志文件和提交日志到數據文件(前滾)實現了各種復合備份方式。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
1、xtrabackup只能備份InnoDB和XtraDB兩種數據表,而不能備份MyISAM數據表
2、innobackupex-1.5.1則封裝了xtrabackup,是一個腳本封裝,所以能同時備份處理innodb和myisam,但在處理myisam時需要加一個讀鎖
安裝
官網下載
#wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/source/tarball/percona-xtrabackup-2.4.4.tar.gz
下載安裝所需依賴包,從MySQL?5.7.5開始Boost庫是必需的
#wget?http://downloads.sourceforge.net/project/boost/boost/1.59.0/boost_1_59_0.tar.gz
#yum install cmake gcc gcc-c++ libaiolibaio-devel automake autoconf bzr bison libtool ncurses-devel libgcrypt-devellibcurl-devel libev-devel python-sphinx perl-Digest-MD5 perl-DBD-MySQL -y
#cp percona-xtrabackup-2.4.4.tar.gz/usr/local/src/
#cp boost_1_59_0.tar.gz /usr/local/src/
#cd /usr/local/src/
#tar zxf boost_1_59_0.tar.gz
安裝xtrabackup
#tar zxf percona-xtrabackup-2.4.4.tar.gz
#cd percona-xtrabackup-2.4.4
#cmake -DBUILD_CONFIG=xtrabackup_release-DDOWNLOAD_BOOST=1 -DWITH_BOOST=../boost_1_59_0
#make -j4
#make install
#ln -s/usr/local/xtrabackup/bin/innobackupex /usr/bin/
#ln -s /usr/local/xtrabackup/bin/xtrabackup/usr/bin/
常用選項:
--defaults-file ? ? ? ?#數據庫的配置文件路徑
--apply-log ? ? ? ? ? #準備在一個備份上啟動mysql服務。
--copy-back ? ? ? ? ? #從備份目錄拷貝數據,索引,日志到my.cnf文件里規定的初始位置。
--no-timestamp ? ? ? ? #創建備份時不自動生成時間目錄,可以自定義備份目錄名例如:/backups/mysql/base
--databases ? ? ? ? ?#用于指定要備份的數據庫,多個庫文件使用方法: “database1 database2″
--incremental ? ? ? ? #在全備份的基礎上進行增量備份,后跟增量備份存貯目錄路徑
--incremental-basedir=DIRECTORY ? ?#增量備份所需要的全備份路徑目錄或上次做增量備份的目錄路徑
--incremental-dir=DIRECTORY ? ? ? #增量備份存貯的目錄路徑
--redo-only ? ? ? ? ? ? ? ? #用于準備增量備份內容把數據合并到全備份目錄,配合incremental-dir增量備份目錄使用。
--force-non-empty-directories ? ? #如果是特定庫備份還原,不需要刪掉整個mysql目錄,只是特定庫的及相關文件就可以,還原時加上此參數就不會報錯。
備份
完全備份
#innobackupex--defaults-file=/data/mysql/data3307/my.cnf --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock?/back/full/
--host:指定備份服務器IP
--defaults-file:指定數據庫配置文件
--user=root:備份用戶
--password=123456:備份用戶密碼
--socket=/data/mysql/data3307/mysql.sock:指定sock文件
/back/full:數據庫完全備份目錄
增量備份
進行第一次增量備份,需要在有一次完整備份的基礎上進行
#innobackupex--defaults-file=/data/mysql/data3307/my.cnf --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --incremental /back/incre/ --incremental-basedir=/back/full/2016-07-28_01-46-28/
--incremental /back/incre:指定這次增量備份存放目錄
--incremental-basedir=/back/full/2016-07-28_01-46-28:指定完整備份存放目錄
進行第二次增量備份
#innobackupex --defaults-file=/data/mysql/data3307/my.cnf--user=root --password=123456 --socket=/data/mysql/data3307/mysql.sock--incremental /back/incre/? --incremental-basedir=/back/incre/2016-07-28_01-50-41/
--incremental /back/incre:指定這次增量備份存放目錄
--incremental-basedir=/back/incre/2016-07-28_01-50-41:指定是第一個增量備份目錄為參考點進行增量備份
以此類推。。。
數據恢復
完全備份恢復
#/etc/init.d/mysql3307 stop
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --apply-log --use-memory=100M /back/full/2016-08-08_00-46-06/
#mv /data/mysql/data3307? /data/mysql/data3307.bak
#mkdir –p /data/mysql/data3307
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --copy-back--datadir=/data/mysql/data3307 /back/full/2016-08-08_00-46-06/
#cp /data/mysql/data3307.bak/my.cnf? /data/mysql/data3307/
#chown –R mysql.mysql /data/mysql/data3307
#/etc/init.d/mysql3307 start
增量備份恢復
停止mysql
#/etc/init.d/mysql3307 stop
應用完全備份
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --apply-log --use-memory=100M --redo-only/back/full/2016-08-08_00-46-06/
將第一次增量備份應用到完全備份上
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --apply-log --use-memory=100M --redo-only/back/full/2016-08-08_00-46-06/ --incremental-dir=/back/incre/2016-07-28_01-46-28/
將第二次增量備份應用到完全備份上
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --apply-log --use-memory=100M --redo-only?/back/full/2016-08-08_00-46-06/ --incremental-dir=/back/incre/2016-07-28_01-50-41/
以此類推。。。最后一個增量庫不加–redo-only選項
創建mysql數據目錄
#mv /data/mysql/data3307/data/mysql/data3307.bak
#mkdir /data/mysql/data3307
將完全備份恢復到數據庫中
#innobackupex --user=root --password=123456--socket=/data/mysql/data3307/mysql.sock --copy-back --datadir=/data/mysql/data3307/back/full/2016-08-08_00-46-06/
啟動mysql
#cp data3307.bak/my.cnf data3307/
#chown -R mysql.mysql data3307
#/etc/init.d/mysql3307 start
查看數據是否恢復
備份的文件說明:
(1)xtrabackup_checkpoints ――備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日志序列號)范圍信息;
每個InnoDB頁(通常為16k大小)都會包含一個日志序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的。
#cat xtrabackup_checkpoints
backup_type = full-backuped??????? #注明這是全備
from_lsn = 0????????????????? #全備的lsn起始號
to_lsn = 2026561686???????????? #全備記錄到的最大序列號
last_lsn = 2026562643?????????? #全備完成后當前的日志序列號
compact = 0????????????????? #注明沒有進行打包
(2)xtrabackup_binlog_info ―― mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置。
#cat xtrabackup_binlog_info
mysql-bin.0000011371180-1-175
(3)backup-my.cnf ――備份命令用到的配置選項信息和備份無關的不會記錄,備份配置文件的話需要單獨備份。
#cat backup-my.cnf
# This MySQL options file was generated byinnobackupex.
# The MySQL server
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=innodb
innodb_data_file_path=ibdata1:12M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=50331648
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=.
innodb_undo_tablespaces=0
server_id=1
redo_log_version=0
(4)xtrabackup_info ――記錄了mariadb的版本信息和一些屬性信息,還原是檢測版本匹配度時用到。
#cat xtrabackup_info
uuid = cda678f9-4dde-11e6-9906-0050562d6ff0
name =
tool_name = innobackupex
tool_command =--defaults-file=/data/mysql/data3307/my.cnf --use-memory=4G --user=root--password=... --port=3307 --socket=/data/mysql/data3307/mysql.sock --incremental/back/dump/incre/2016-07-20_02-28-40 --incremental-basedir/back/dump/incre/2016-07-20_02-28-40/2016-07-20_02-29-12
tool_version = 2.4.4
ibbackup_version = 2.4.4
server_version = 10.1.14-MariaDB
start_time = 2016-07-20 02:29:58
end_time = 2016-07-20 02:30:00
lock_time = 0
binlog_pos = filename 'master-bin.000031',position '1532', GTID of the last change '0-1-4383'
innodb_from_lsn = 1729763
innodb_to_lsn = 1735728
partial = N
incremental = Y
format = file
compact = N
compressed = N
encrypted = N