Xtrabackup 增量备份
Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工作原理如下
1、在InnoDB內部會維護一個redo/undo日志文件,也可以叫做事務日志文件。事務日志會存儲每一個InnoDB表數據的記錄修改。當InnoDB啟動時,InnoDB會檢查數據文件和事務日志,并執行兩個步驟:它應用(前滾)已經提交的事務日志到數據文件,并將修改過但沒有提交的數據進行回滾操作。
2、Xtrabackup在啟動時會記住log sequence number(LSN),并且復制所有的數據文件。復制過程需要一些時間,所以這期間如果數據文件有改動,那么將會使數據庫處于一個不同的時間點。這時,xtrabackup會運行一個后臺進程,用于監視事務日志,并從事務日志復制最新的修改。Xtrabackup必須持續的做這個操作,是因為事務日志是會輪轉重復的寫入,并且事務日志可以被重用。所以xtrabackup自啟動開始,就不停的將事務日志中每個數據文件的修改都記錄下來。
3、上面就是xtrabackup的備份過程。接下來是準備(prepare)過程,在這個過程中,xtrabackup使用之前復制的事務日志,對各個數據文件執行災難恢復(就像mysql剛啟動時要做的一樣)。當這個過程結束后,數據庫就可以做恢復還原了,這個過程在xtrabackup的編譯二進制程序中實現。程序innobackupex可以允許我們備份MyISAM表和frm文件從而增加了便捷和功能。Innobackupex會啟動xtrabackup,直到xtrabackup復制數據文件后,然后執行FLUSH TABLES WITH READ LOCK來阻止新的寫入進來并把MyISAM表數據刷到硬盤上,之后復制MyISAM數據文件,最后釋放鎖。
4、備份MyISAM和InnoDB表最終會處于一致,在準備(prepare)過程結束后,InnoDB表數據已經前滾到整個備份結束的點,而不是回滾到xtrabackup剛開始時的點。這個時間點與執行FLUSH TABLES WITH READ LOCK的時間點相同,所以myisam表數據與InnoDB表數據是同步的。類似oracle的,InnoDB的prepare過程可以稱為recover(恢復),myisam的數據復制過程可以稱為restore(還原)。
5、Xtrabackup 和 innobackupex這兩個工具都提供了許多前文沒有提到的功能特點。手冊上有對各個功能都有詳細的介紹。簡單介紹下,這些工具提供了如流(streaming)備份,增量(incremental)備份等,通過復制數據文件,復制日志文件和提交日志到數據文件(前滾)實現了各種復合備份方式。
1、安裝
rpm -ivh? ?libev-4.04-2.el6.x86_64.rpm?
rpm -ivh? ?perl-DBD-MySQL-4.023-6.el7.x86_64.rpm
rpm -ivh? ?percona-xtrabackup-24-2.4.12-1.el7.x86_64.rpm
2、查看my.cnf
#egrep -v "^#|^$" /etc/my.cnf
!includedir /etc/my.cnf.d/
!includedir /etc/percona-server.conf.d/
[client]
default-character-set = utf8
[mysql]
default-character-set = utf8
[mysqld]
character-set-server = utf8
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
?
做增量備份是在全量的基礎上,所以,需要先做一個全量備份,放在/data/mysqlbackup/下,且不壓縮,方便后面同步數據,生成當前日期的一個目錄,語句如下:
innobackupex --user=root? --password=Passw0rd! /data/mysqlbackup/
3、創建測試數據庫和表
Mysql> 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=myisam DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
4、增量備份
#--incremental:增量備份的文件夾
#--incremental-dir:針對哪個做增量備份
?
//第一次加入數據,然后備份
mysql> INSERT INTO backup (name) VALUES ('haha'),('six');?//插入數據
innobackupex? --user=root? --password=Passw0rd! ?--incremental-basedir=/data/mysqlbackup/2018-08-20_14-58-42 --incremental /data/mysqlbackup/?????????????? ?????????//增量備份語句
?
//再次加入數據,然后備份
mysql> INSERT INTO backup (name) VALUES ('test'),('testd');?//在插入數據
innobackupex --user=root? --password=Passw0rd! ?--incremental-basedir=/data/mysqlbackup/2018-08-20_15-05-11 --incremental /data/mysqlbackup/??????????????? ??????????????????????//增量備份語句
?
這個時候在 /data/mysqlbackup/ 下面應該有當前時間的三個目錄,時間有一點差別而已
?
?
#/data/mysqlbackup/2018-08-20_14-58-42 全備份目錄
#/data/mysqlbackup/2018-08-20_15-05-11 第一次增量備份產生的目錄
#/data/mysqlbackup/2018-08-20_15-10-27 第二次增量備份產生的目錄
?
5、查看增量備份記錄文件
[root@ma02]# cat 2018-08-20_14-58-42/xtrabackup_checkpoints?//全備目錄下的文件
backup_type = full-backuped
from_lsn = 0 //全備起始為0
to_lsn = 44966412
last_lsn = 44966421
compact = 0
recover_binlog_info = 0
?
[root@ma02]# cat 2018-08-20_15-05-11/xtrabackup_checkpoints?//第一次增量備份目錄下的文件
backup_type = incremental
from_lsn = 44966412
to_lsn = 44969224
last_lsn = 44969233
compact = 0
recover_binlog_info = 0
?
[root@ma02]# cat 2018-08-20_15-10-27/xtrabackup_checkpoints?//第二次增量備份目錄下的文件
backup_type = incremental
from_lsn = 44969224
to_lsn = 44971200
last_lsn = 44971209
compact = 0
recover_binlog_info = 0
5.1 模擬數據丟失
增量備份做完后,把backup_test這個數據庫刪除掉,
Mysql> drop database backup_test;
這樣可以對比還原后
6、增量還原,同步開始合并
回滾未提交的事務及同步已經提交的事務至數據文件使得數據文件處于一致性狀態
?
①innobackupex? --apply-log? --redo-only 2018-08-20_14-58-42/
②innobackupex? --apply-log? --redo-only? --incremental 2018-08-20_14-58-42/? ? --incremental-dir 2018-08-20_15-05-11/
③innobackupex? --apply-log? --redo-only? --incremental 2018-08-20_14-58-42/? ? --incremental-dir 2018-08-20_15-10-27/
?
提示:
#/data/mysqlbackup/2018-08-20_14-58-42 全備份目錄
#/data/mysqlbackup/2018-08-20_15-05-11 第一次增量備份產生的目錄
#/data/mysqlbackup/2018-08-20_15-10-27 第二次增量備份產生的目錄
從my.cnf讀取datadir/innodb_data_home_dir/innodb_data_file_path等變量
先復制MyISAM表,然后是innodb表,最后為logfile
7、恢復數據
拷貝先前備份所有文件到它們的原始路徑
?
| 1 2 3 4 | Systemctl? stop? mysqld.service innobackupex --copy-back /data/backup/2018-08-20_14-58-42 chown –R mysql.mysql? /var/lib/mysql/* Systemctl? start? mysqld.service |
?
注意:
①??? --data-dir目錄必須為空(可在恢復前移動到其他目錄下)
② 恢復完數據之后記得更改所有者和所屬組,防止mysql 啟動失敗
?
8、 登錄驗證數據是否存在
?
發現數據都在,未丟失,實驗結束。
9、其他
//全部數據庫備份
innobackupex --user=ftpuser? --password=Passw0rd!? ?/data/backup/
?
//單數據庫備份
innobackupex --user=ftpuser? --password=Passw0rd!? ? --database=backup_test /data/backup/
?
//多庫
innobackupex--user=ftpuser? --password=Passw0rd!? ?--include='dba.*|dbb.*'?/data/backup/
?
//多表
innobackupex --user=ftpuser? --password=Passw0rd! --include='dba.tablea|dbb.tableb'?/data/backup/
?
//數據庫備份并壓縮
log=zztx01_`date +%F_%H-%M-%S`.log
db=zztx01_`date +%F_%H-%M-%S`.tar.gz
innobackupex --user=ftpuser? --password=Passw0rd! ?--stream=tar /data/backup? 2>/data/backup/$log | gzip 1> /data/backup/$db
//不過注意解壓需要手動進行,并加入 -i 的參數,否則無法解壓出所有文件,疑惑了好長時間
?
//如果有錯誤可以加上? --defaults-file=/etc/my.cnf
?
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 增量备份的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: webpack 报错Cannot fin
- 下一篇: 时间戳转换函数