共計 8380 個字符,預(yù)計需要花費 21 分鐘才能閱讀完成。
今天就跟大家聊聊有關(guān)如何進行 MySQL 5.6 xtrabackup 全量和增量的備份及恢復(fù),可能很多人都不太了解,為了讓大家更加了解,丸趣 TV 小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
xtrabackup 備份和恢復(fù)
較之于 MySQL 自身的備份 mysqldump,類似于 Oracle 的 export。小數(shù)據(jù)量時效率還行,當(dāng)數(shù)據(jù)量達到一定規(guī)模時,使用 mysqldump 執(zhí)行備份的時間也許還可接受,但恢復(fù)時間基本就不能忍受了。
這時就需要一種好用又高效的工具,xtrabackup 就是其中一款,號稱免費版的 InnoDB HotBackup。
Xtrabackup 提供了兩種命令行工具:
xtrabackup:專用于備份 InnoDB 引擎的數(shù)據(jù);
innobackupex:這是一個 perl 腳本,在執(zhí)行過程中會調(diào)用 xtrabackup 命令,這樣用該命令即可以實現(xiàn)備份 InnoDB,也可以備份 MyISAM 引擎的對象。
一、Xtrabackup 備份原理
XtraBackup 基于 InnoDB 的 crash-recovery 功能。它會復(fù)制 innodb 的 data file,由于不鎖表,復(fù)制出來的數(shù)據(jù)是不一致的,在恢復(fù)的時候使用 crash-recovery,使得數(shù)據(jù)恢復(fù)一致。
InnoDB 維護了一個 redo log,又稱為 transaction log,事務(wù)日志,它包含了 innodb 數(shù)據(jù)的所有改動情況。當(dāng) InnoDB 啟動的時候,它會先去檢查 data file 和 transaction log,并且會做二步操作:
XtraBackup 在備份的時候,一頁一頁地復(fù)制 innodb 的數(shù)據(jù),而且不鎖定表,與此同時,XtraBackup 還有另外一個線程監(jiān)視著 transactions log,一旦 log 發(fā)生變化,就把變化過的 log pages 復(fù)制走。為什么要急著復(fù)制走呢?因為 transactions log 文件大小有限,寫滿之后,就會從頭再開始寫,所以新數(shù)據(jù)可能會覆蓋到舊的數(shù)據(jù)。在 prepare 過程中,XtraBackup 使用復(fù)制到的 transactions log 對備份出來的 innodb data file 進行 crash recovery。
注意:xtrabackup 只備份數(shù)據(jù)文件,并不備份數(shù)據(jù)表結(jié)構(gòu) (.frm),所以使用 xtrabackup 恢復(fù)的時候,你必須有對應(yīng)表結(jié)構(gòu)文件(.frm)。
所以要手動備份一下,以便 xtrabackup 恢復(fù)的時候使用。
二、備份操作:
1 . 全量備份操作:
點擊 (此處) 折疊或打開
[root@zhanglin bin]./xtrabackup –backup –log-stream –target-dir=/mysqlbak/xtrabackup/20141022 –datadir=/usr/local/mysql/data
./xtrabackup version 2.2.3 based on MySQL server 5.6.17 Linux (x86_64) (revision id:)
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /usr/local/mysql/data
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:10M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 50331648
——- 略
[01] Copying ./mdm_pro/org_organ_business_group.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_business_group.ibd
[01] …done
[01] Copying ./mdm_pro/coding_rule.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/coding_rule.ibd
[01] …done
[01] Copying ./mdm_pro/org_store_channel.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_store_channel.ibd
[01] …done
[01] Copying ./mdm_pro/dim_org_store.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/dim_org_store.ibd
[01] …done
[01] Copying ./mdm_pro/org_organ_region.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_region.ibd
[01] …done
[01] Copying ./mdm_pro/org_organ_managing_city.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_organ_managing_city.ibd
[01] …done
[01] Copying ./mdm_pro/pro_barcode.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/pro_barcode.ibd
[01] …done
[01] Copying ./mdm_pro/type_duibi_back.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/type_duibi_back.ibd
[01] …done
log scanned up to (18573586827)
[01] Copying ./mdm_pro/org_store.ibd to /mysqlbak/xtrabackup/20141022/mdm_pro/org_store.ibd
[01] …done
log scanned up to (18573586827)
xtrabackup: The latest check point (for incremental): \ 18573586827\
xtrabackup: Stopping log copying thread.
. log scanned up to (18573586827)
xtrabackup: Transaction log of lsn (18573586258) to (18573586827) was copied.
[root@zhanglin bin]
2. 增量備份概念:
MySQL 數(shù)據(jù)庫本身提供的工具并不支持真正的增量備份,二進制日志恢復(fù)是 point-in-time(時間點)的恢復(fù)而不是增量備份。Xtrabackup 工具支持對 InnoDB 存儲引擎的增量備份,工作原理如下:
(1)首先完成一個完全備份,并記錄下此時檢查點的 LSN(Log Sequence Number)。
(2)在進程增量備份時,比較表空間中每個頁的 LSN 是否大于上次備份時的 LSN,如果是,則備份該頁,同時記錄當(dāng)前檢查點的 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ù)文件被修改過了,恢復(fù)時仍然能夠通過解析 xtrabackup_logfile 保持?jǐn)?shù)據(jù)的一致。
在增量備份的目錄下,數(shù)據(jù)文件都是以.delta 結(jié)尾的。增量備份只備份上一次全量備份后被修改過的 page,所以增量備份只暫用較少的空間。增量備份可以在增量備份的基礎(chǔ)上增量。
增量備份優(yōu)點:
1、數(shù)據(jù)庫太大沒有足夠的空間全量備份,作增量備份有效節(jié)省空間,且效率高。
2、支持熱備份。備份過程不鎖表,不受時間限制,不影響用戶使用。
3、每日備份只產(chǎn)生少量數(shù)據(jù),遠程備份傳輸更方便。同時節(jié)省空間。
4、備份恢復(fù)基于文件操作,降低直接對數(shù)據(jù)庫操作風(fēng)險。
5、備份效率更高,恢復(fù)效率更高。
提醒一下可能出現(xiàn)的錯誤:
(a)、在做增量備份的時候,如果 –target-dir 跟全量的一樣,就會出現(xiàn)下面的報錯
[root@zhanglin bin]# ./xtrabackup –backup –log-stream –target-dir=/mysqlbak/xtrabackup/20141022 –datadir=/usr/local/mysql/data –incremental-
basedir=/mysqlbak/xtrabackup/20141022_full_in
xtrabackup: Error: cannot open /mysqlbak/xtrabackup/20141022_full_in/xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from /mysqlbak/xtrabackup/20141022_full_in/xtrabackup_checkpoints
(b)、同時如果 –incremental-basedir= 參數(shù)的最后目錄不是 base 也會出錯。
[root@zhanglin bin]# ./xtrabackup –backup –log-stream –target-dir=/mysqlbak/xtrabackup/20141022_full_in –datadir=/usr/local/mysql/data –incremental-
basedir=/mysqlbak/xtrabackup/20141022-test
xtrabackup: Error: cannot open /mysqlbak/xtrabackup/20141022-test/xtrabackup_checkpoints
xtrabackup: error: failed to read metadata from /mysqlbak/xtrabackup/20141022-test/xtrabackup_checkpoints
增量備份操作:
點擊 (此處) 折疊或打開
[root@zhanglin bin]# ./xtrabackup –backup –log-stream –target-dir=/mysqlbak/xtrabackup/20141022_full_in –datadir=/usr/local/mysql/data –incremental-basedir=/mysqlbak/xtrabackup/base
./xtrabackup version 2.2.3 based on MySQL server 5.6.17 Linux (x86_64) (revision id:)
incremental backup from 16888466657 is enabled.
xtrabackup: uses posix_fadvise().
xtrabackup: cd to /usr/local/mysql/data
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:10M:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 2
xtrabackup: innodb_log_file_size = 50331648
log scanned up to (18580258871)
log scanned up to (18580258871)
xtrabackup: using the full scan for incremental backup
[01] Copying ./ibdata1 to /mysqlbak/xtrabackup/20141022_full_in/ibdata1.delta
—- 略
[01] Copying ./mdm_pro/mid_org_area.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/mid_org_area.ibd.delta
[01] …done
[01] Copying ./mdm_pro/org_organ_business_group.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_business_group.ibd.delta
[01] …done
[01] Copying ./mdm_pro/coding_rule.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/coding_rule.ibd.delta
[01] …done
[01] Copying ./mdm_pro/org_store_channel.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_store_channel.ibd.delta
[01] …done
[01] Copying ./mdm_pro/dim_org_store.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/dim_org_store.ibd.delta
[01] …done
[01] Copying ./mdm_pro/org_organ_region.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_region.ibd.delta
[01] …done
[01] Copying ./mdm_pro/org_organ_managing_city.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_organ_managing_city.ibd.delta
[01] …done
[01] Copying ./mdm_pro/pro_barcode.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/pro_barcode.ibd.delta
[01] …done
[01] Copying ./mdm_pro/type_duibi_back.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/type_duibi_back.ibd.delta
log scanned up to (18580258871)
[01] …done
[01] Copying ./mdm_pro/org_store.ibd to /mysqlbak/xtrabackup/20141022_full_in/mdm_pro/org_store.ibd.delta
[01] …done
xtrabackup: The latest check point (for incremental): \ 18580258871\
xtrabackup: Stopping log copying thread.
. log scanned up to (18580258871)
xtrabackup: Transaction log of lsn (18580258871) to (18580258871) was copied.
[root@zhanglin bin]#
3、xtrabackup 參數(shù)介紹:
–defaults-file=#
默認配置文件的路徑,如果不該參數(shù),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_size
6 個參數(shù)即可讓 xtrabackup 正常工作。
–defaults-extra-file=# 如果使用了該參數(shù),在讀取了全局配置文件之后,會再讀取這里指定的配置文件
–target-dir=name 備份文件的存放目錄路徑
–backup 實施備份到 target-dir
–prepare 實施對備份文件進行恢復(fù)前的準(zhǔn)備(生成 InnoDB log file)
–print-param 打印備份或恢復(fù)時需要的參數(shù)
–use-memory=# 該參數(shù)在 prepare 的時候使用,控制 prepare 時 innodb 實例使用的內(nèi)存量
–suspend-at-end 在 target-dir 目錄下產(chǎn)生一個 xtrabackup_suspended 文件,將 xtrabackup 進程掛起,不停地將數(shù)據(jù)文件的變化同步到備份文件,直到用戶手工刪除
xtrabackup_suspended 文件
–throttle=# 每秒 IO 次數(shù), 限制 backup 時使用的 I / O 操作量,使備份對數(shù)據(jù)庫正常業(yè)務(wù)的影響最小化
–log-stream 該參數(shù)在 backup 的時候使用,將 xtrabackup_logfile 的內(nèi)容標(biāo)準(zhǔn)輸出,使用該參數(shù)時會自動使用 suspend-at-end 參數(shù),innobackupex 腳本的 stream 模式會使用該參數(shù)。
–incremental-lsn=name 增量備份時只拷貝 LSN 比該參數(shù)指定值新的 ibd pages,前次備份到了哪個 LSN 可以看前次備份集的 xtrabackup_checkpoints 文件
–incremental-basedir=name 該參數(shù)在 backup 的時候使用,備份比該參數(shù)指定位置的備份集新的 idb pages
–incremental-dir=name 該參數(shù)在 prepare 的時候使用,指定 prepare 時產(chǎn)生的.delta 文件和日志文件的存放路徑
–tables=name 在備份 file-per-table 類型的數(shù)據(jù)文件時使用,使用正則表達式指定需要備份的 innodb 表
–datadir=name MySQL 數(shù)據(jù)庫的數(shù)據(jù)文件目錄。
三、全量和增量恢復(fù):
我們需要分別對全量、增量備份各做一次 prepare 操作。如果只是做全量恢復(fù),就只需要執(zhí)行一次你之前的全量就可以了,這里給出命令。
./xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/mysqlbak/xtrabackup/20141022
./xtrabackup –defaults-file=/etc/my.cnf –prepare –target-dir=/mysqlbak/xtrabackup/20141022_full_in –incremental-basedir=/mysqlbak/xtrabackup/base
提醒:xtrabackup 只備份 InnoDB 數(shù)據(jù)文件,表結(jié)構(gòu)是不備份的,所以恢復(fù)的時候,你必須有對應(yīng)表結(jié)構(gòu)文件(.frm)。
看完上述內(nèi)容,你們對如何進行 MySQL 5.6 xtrabackup 全量和增量的備份及恢復(fù)有進一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注丸趣 TV 行業(yè)資訊頻道,感謝大家的支持。