大數(shù)據(jù)量備份與還原此衅,始終是個難點。當MYSQL超10G,用mysqldump來導出就比較慢了噪矛。在這里推薦xtrabackup,這個工具比mysqldump要快很多量蕊。
Xtrabackup介紹
Xtrabackup是什么
Xtrabackup是一個對InnoDB做數(shù)據(jù)備份的工具,支持在線熱備份(備份時不影響數(shù)據(jù)讀寫)艇挨,是商業(yè)備份工具InnoDB Hotbackup的一個很好的替代品残炮。
Xtrabackup有兩個主要的工具:xtrabackup、innobackupex
- xtrabackup只能備份InnoDB和XtraDB兩種數(shù)據(jù)表缩滨,而不能備份MyISAM數(shù)據(jù)表
- innobackupex是參考了InnoDB Hotbackup的innoback腳本修改而來的.innobackupex是一個perl腳本封裝势就,封裝了xtrabackup。主要是為了方便的 同時備份InnoDB和MyISAM引擎的表楷怒,但在處理myisam時需要加一個讀鎖蛋勺。并且加入了一些使用的選項。如slave-info可以記錄備份恢 復后鸠删,作為slave需要的一些信息抱完,根據(jù)這些信息,可以很方便的利用備份來重做slave刃泡。
Xtrabackup可以做什么 :
在線(熱)備份整個庫的InnoDB巧娱、 XtraDB表
在xtrabackup的上一次整庫備份基礎上做增量備份(innodb only)
以流的形式產(chǎn)生備份,可以直接保存到遠程機器上(本機硬盤空間不足時很有用)
MySQL數(shù)據(jù)庫本身提供的工具并不支持真正的增量備份烘贴,二進制日志恢復是point-in-time(時間點)的恢復而不是增量備份禁添。
Xtrabackup工具支持對InnoDB存儲引擎的增量備份,工作原理如下:
- 首先完成一個完全備份桨踪,并記錄下此時檢查點的LSN(Log Sequence Number)老翘。
- 在進程增量備份時,比較表空間中每個頁的LSN是否大于上次備份時的LSN锻离,如果是铺峭,則備份該頁,同時記錄當前檢查點的LSN汽纠。
首 先卫键,在logfile中找到并記錄最后一個checkpoint(“l(fā)ast checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile虱朵;接著莉炉,開始拷貝全部的數(shù)據(jù)文 件.ibd;在拷貝全部數(shù)據(jù)文件結(jié)束之后碴犬,才停止拷貝logfile絮宁。
因為logfile里面記錄全部的數(shù)據(jù)修改情況,所以翅敌,即時在備份過程中數(shù)據(jù)文件被修改過了羞福,恢復時仍然能夠通過解析xtrabackup_logfile保持數(shù)據(jù)的一致。
因為innobackupex支持innodb,myisam,所以本文說一下蚯涮,怎么使用innobackupex
全備和全備還原
使用innobackupex創(chuàng)建全備
- 本地創(chuàng)建全備
[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/
[root@localhost var]# innobackupex -H 127.0.0.1 -u root -p newpass -P 3306 -S /var/lib/mysql/mysql.sock /home/xtarback/xtrabackup01/
170223 15:55:36 innobackupex: Starting the backup operation
IMPORTANT: Please check that the backup run completes successfully.
At the end of a successful backup run innobackupex
prints "completed OK!".
Unrecognized character \x01; marked by <-- HERE after <-- HERE near column 1 at - line 1374.
170223 15:55:36 Connecting to MySQL server host: 127.0.0.1, user: root, password: set, port: 3306, socket: /var/lib/mysql/mysql.sock
Using server version 5.6.35
innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 54967d1)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /var/lib/mysql
xtrabackup: open files limit requested 0, set to 1024
xtrabackup: using the following InnoDB configuration:
xtrabackup: innodb_data_home_dir = .
xtrabackup: innodb_data_file_path = ibdata1:12M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 50331648
InnoDB: Number of pools: 1
170223 15:55:36 >> log scanned up to (3692666)
xtrabackup: Generating a list of tablespaces
InnoDB: Allocated tablespace ID 1 for mysql/innodb_table_stats, old maximum was 0
170223 15:55:37 [01] Copying ./ibdata1 to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/ibdata1
170223 15:55:37 [01] ...done
170223 15:55:37 [01] Copying ./mysql/innodb_table_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_table_stats.ibd
170223 15:55:37 [01] ...done
170223 15:55:37 [01] Copying ./mysql/innodb_index_stats.ibd to /home/xtarback/xtrabackup01/2017-02-23_15-55-36/mysql/innodb_index_stats.ibd
170223 15:55:37 [01] ...done
....
....
....
170223 15:55:38 Finished backing up non-InnoDB tables and files
170223 15:55:38 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '3692666'
xtrabackup: Stopping log copying thread.
.170223 15:55:38 >> log scanned up to (3692666)
170223 15:55:38 Executing UNLOCK TABLES
170223 15:55:38 All tables unlocked
170223 15:55:38 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/'
170223 15:55:38 [00] Writing backup-my.cnf
170223 15:55:38 [00] ...done
170223 15:55:38 [00] Writing xtrabackup_info
170223 15:55:38 [00] ...done
xtrabackup: Transaction log of lsn (3692666) to (3692666) was copied.
170223 15:55:39 completed OK! #全備份完成
在備份的同時治专,備份數(shù)據(jù)會在備份目錄下創(chuàng)建一個以當前日期時間為名字的目錄存放備份文件,/home/xtarback/xtrabackup01/2017-02-23_15-55-36/備份到此目錄下面
- 備份目錄下面的各項文件說明
xtrabackup_checkpoints —— 備份類型(如完全或增量)卖陵、備份狀態(tài)(如是否已經(jīng)為prepared狀態(tài))和LSN(日志序列號)范圍信息;
每個InnoDB頁(通常為16k大小)都會包含一個日志序列號张峰,即LSN泪蔫。LSN是整個數(shù)據(jù)庫系統(tǒng)的系統(tǒng)版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發(fā)生改變的喘批。xtrabackup_binlog_info —— mysql服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置撩荣。
xtrabackup_binlog_pos_innodb —— 二進制日志文件及用于InnoDB或XtraDB表的二進制日志文件的當前position。
xtrabackup_binary —— 備份中用到的xtrabackup的可執(zhí)行文件饶深;
backup-my.cnf —— 備份命令用到的配置選項信息餐曹;
在使用innobackupex進行備份時,還可以使用--no-timestamp選項來阻止命令自動創(chuàng)建一個以時間命名的目錄敌厘;如此一來台猴,innobackupex命令將會創(chuàng)建一個BACKUP-DIR目錄來存儲備份數(shù)據(jù)。
內(nèi)部機制:在備份的時候innobackupex會調(diào)用xtrabackup來備份innodb表俱两,并復制所有的表定義饱狂,其他引擎的表(MyISAM,MERGE,CSV,ARCHIVE)。
使用innobackupex預備全備
創(chuàng)建完備份之后數(shù)據(jù)并沒有馬上可以被還原宪彩,需要回滾未提交事務休讳,前滾提交事務,讓數(shù)據(jù)庫文件保持一致性尿孔。
innobackupex使用--apply-log來做預備備份
innobackupex --apply-log /home/xtarback/xtrabackup01/2017-02-23_15-55-36/
輸出:
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 3693619
170223 16:24:26 completed OK!
成功后俊柔,備份可以被用來還原數(shù)據(jù)庫了。
內(nèi)部機制:讀取備份文件夾中的配置文件活合,然后innobackupex重做已提交事務婆咸,回滾未提交事務,之后數(shù)據(jù)就被寫到了備份的數(shù)據(jù)文件(innodb文件)中芜辕,并重建日志文件。這一步隱式調(diào)用了2次xtrabackup –prepare块差。跟多關于xtrabackup可以看之后的章節(jié)侵续。
使用innobackupex還原備份
- 模擬刪除mysql目錄下面的數(shù)據(jù)
[root@localhost mysql]# cd /var/lib/mysql
[root@localhost mysql]# rm -r ./*
[root@localhost mysql]# ll
總用量 0
[root@localhost mysql]#
- 使用innobackupex --copy-back來還原備份
$ innobackupex --coyp-back /home/xtarback/xtrabackup01/2017-02-23_15-55-36/
會根據(jù)my.cnf復制所有備份到datadir下:
170223 16:34:50 Executing UNLOCK TABLES
170223 16:34:50 All tables unlocked
170223 16:34:50 Backup created in directory '/home/xtarback/xtrabackup01/2017-02-23_15-55-36/2017-02-23_16-34-48/'
170223 16:34:50 [00] Writing backup-my.cnf
170223 16:34:50 [00] ...done
170223 16:34:50 [00] Writing xtrabackup_info
170223 16:34:50 [00] ...done
xtrabackup: Transaction log of lsn (1625997) to (1625997) was copied.
170223 16:34:50 completed OK!
注:datadir必須是為空的,innobackupex –copy-back不會覆蓋已存在的文件憨闰。
- 修改還原數(shù)據(jù)目錄的用戶屬組
cd /var/lib/mysql
[root@localhost mysql]# chown -R mysql:mysql ./*
注:datadir必須是為空的状蜗,innobackupex –copy-back不會覆蓋已存在的文件,還要注意鹉动,還原時需要先關閉服務轧坎,如果服務是啟動的,那么就不能還原到datadir泽示。