日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

xtrabackup对MySQL数据库的备份及恢复教程

發布時間:2023/12/6 数据库 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xtrabackup对MySQL数据库的备份及恢复教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

xtrabackup

xtrabackup 是 percona 的一個開源項目,可以熱備份innodb ,XtraDB,和MyISAM(會鎖表)。對MyISAM存儲引擎會鎖表,也是很郁悶的因為線上使用的是Innodb和MyISAM兩種存儲引擎,比較 頭疼!!?Xtrabackup是一個對InnoDB做數據備份的工具,支持在線熱備份(備份時不影響數據讀寫),是商業備份工具InnoDB Hotbackup的一個很好的替代品。lamp兄弟連

?

官方原理

?

在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和 innobackupex這兩個工具都提供了許多前文沒有提到的功能特點。手冊上有對各個功能都有詳細的介紹。簡單介紹下,這些工具提供了如流 (streaming)備份,增量(incremental)備份等,通過復制數據文件,復制日志文件和提交日志到數據文件(前滾)實現了各種復合備份方 式。

?

自己的理解

xtrabackup只能備份和恢復InnoDB表,而且只有ibd文件,frm文件它不 管,恢復時就需要DBA提供frm。innobackupex可以備份和恢復MyISAM表以及frm文件,并且對xtrabackup也做了很好的封 裝,所以可以使用innobackupex來備份MySQL數據庫。還有一個問題,就是innobackupex備份MyISAM表之前要對全庫進行加 READ LOCK,阻塞寫操作,若備份是在從庫上進行的話會影響主從同步,造成延遲。對InnoDB表備份不會阻塞讀寫。

?

xtrabackup增量備份的原理是:

1)、首先完成一個完全備份,并記錄下此時檢查點LSN;

2)、然后增量備份時,比較表空間中每個頁的LSN是否大于上次備份的LSN,若是則備份該頁并記錄當前檢查點的LSN。

?

具 體來說,首先在logfile中找到并記錄最后一個checkpoint(“last checkpoint LSN”),然后開始從LSN的位置開始拷貝InnoDB的logfile到xtrabackup_logfile;然后開始拷貝全部的數據文 件.ibd;在拷貝全部數據文件結束之后,才停止拷貝logfile。

?

所以xtrabackup_logfile文件在并 發寫入很大時也會變得很大,占用很多空間,需要注意。另外當我們使用--stream=tar或者遠程備份--remote-host時默認使用 /tmp,但最好顯示用參數--tmpdir指定,以免把/tmp目錄占滿影響備份以及系統其它正常服務。

因為logfile里面記錄全部的數據修改情況,所以即使在備份過程中數據文件被修改過了,恢復時仍然能夠通過解析xtrabackup_logfile保持數據的一致。

xtrabackup的增量備份只能用于InnoDB表,不能用在MyISAM表上。采用增量備份MySQL數據庫時xtrabackup會依據上次全備份或增量備份目錄對InnoDB表進行增量備份,對MyISAM表會進行全表復制。

?

流備份(streaming)可以將備份直接保存到遠程服務器上。

當執行恢復時,由于復制是不鎖表的所以此時數據文件都是不一致的,xtrabackup使用之前保存的redo log對各個數據文件檢查是否與事務日志的checkpoint一致,執行恢復:

1)、根據復制數據文件時以及之后已提交事務產生的事務日志進行前滾;

2)、將未提交的事務進行回滾。

?

這個過程就是MySQL數據庫宕機之后執行的crash recovery。

?

增量備份

在InnoDB中,每個page中都記錄LSN信息,每當相關數據發生改變,page的LSN就會自動增加,xtrabackup的增量備份就是依據這一原理進行的。xtrabackup將上次備份(完全備份集或者也是一個增量備份集)以來LSN改變的page進行備份。

所以,要做增量備份第一次就要做一個完全備份(就是將MySQL實例或者說要備份的數據庫表做一個完全復制,同時記錄LSN),之后可以基于此進行增量備份以及恢復。

?

增量備份優點:

1)、數據庫太大沒有足夠的空間全量備份,增量備份能有效節省空間,并且效率高;

2)、支持熱備份,備份過程不鎖表(針對InnoDB而言),不阻塞數據庫的讀寫;

3)、每日備份只產生少量數據,也可采用遠程備份,節省本地空間;

4)、備份恢復基于文件操作,降低直接對數據庫操作風險;

5)、備份效率更高,恢復效率更高。

?

恢復與還原

backup的恢復過程中包括恢復和還原兩個部分。

我們前面已經說了xtrabackup只備份InnoDB表的ibd文件,而innobackupex可以備份包括InnoDB表在內的其他存儲引擎的表的所有數據文件。由于不同引擎表備份時的不同,也會讓恢復過程看起來不一樣。

?

先來看看完全備份集的恢復。

在 InnoDB表的備份或者更直接的說ibd數據文件復制的過程中,數據庫處于不一致的狀態,所以要將xtraback_logfile中尚未提交的事務進 行回滾,以及將已經提交的事務進行前滾,使各個數據文件處于一個一致性狀態,這個過程叫做“準備(prepare)”。

?

如果你是在一個從庫上執行的備份,那說明你沒有東西需要回滾,只是簡單的apply redo log就可以了。另外在prepare過程中可以使用參數--use-memory增大使用系統內存量從而提高恢復速度。

?

之 后,我們就可以根據backup-my.cnf中的配置把數據文件復制回對應的目錄了,當然你也可以自己復制回去,但innobackupex都會幫我們 完成。在這里,對于InnoDB表來說是完成“后準備”動作,我們稱之為“恢復(recovery)”,而對于MyISAM表來說由于備份時是采用鎖表方 式復制的,所以此時只是簡單的復制回來,不需要apply log,這個我們稱之為“還原(restore)”。

注:本文檔里之所以使用恢復和還原,也是和其他數據庫比如Oracle看起來一樣。

?

對于增量備份的恢復過程,與完全備份集的恢復類似,只是有少許不同:

1)、恢復過程需要使用完全備份集和各個增量備份集,各個備份集的恢復與前面說的一樣(前滾和回滾),之后各個增量備份集的redo log都會應用到完全備份集中;

2)、對于完全備機集之后產生的新表,要有特殊處理方式,以便恢復后不丟表;

3)、要以完全備份集為基礎,然后按順序應用各個增量備份集。

?

流備份和壓縮

提到流備份(streaming)就要說遠程備份和備份壓縮,先說流備份吧。

流備份是指備份的數據通過標準輸出STDOUT傳輸給tar程序進行歸檔,而不是單純的將數據文件保存到指定的備份目錄中,參數--stream=tar表示開啟流備份功能并打包。同時也可以利用流備份到遠程服務器上。

舉例來說,

$ innobackupex --stream=TAR ${BACKUP_DIR}/base | gzip > ${BACKUP_DIR}/base.tar.gz $ innobackupex --stream=TAR ${BACKUP_DIR}/base|ssh somebackupaddr “cat > ${DIR}/base.tar”

?

當然了,如果你使用了流備份,那么增量備份也就不能用了,因為增量備份需要參考次備份情況,而上次備份卻被打包或者壓縮了。

在我們現實使用中,更多的使用增量備份,至于歸檔壓縮我們可以通過腳本自主完成。

?

部分備份和恢復

xtrabackup可以只備份/恢復部分庫表,可以正則模式匹配或者是你想備份庫表的列表,但InnoDB表必須是獨立表空間,同時不能使用流備份功能。

1)、使用正則模式匹配備份部分庫表,需要使用參數--include,語句類似如下:

$ innobackupex --include=’^qb.*’ ${BACKUP_DIR}/part-base

?

2)、使用數據庫列表備份部分庫,需要使用參數--databases,語句類似如下:

$ innobackupex --databases=qb0 qb1 qb2 qb3 ${BACKUP_DIR}/part-base

?

3) 、使用表列表備份部分表,需要使用參數--tables-file,語句類似如下:

$ innobackupex --tables-list=${CONF_DIR}/tab.conf ${BACKUP_DIR}/part-base

?

注:在我們的現實應用中,很少會只備份集群中部分庫表,所以只是了解此功能即可,若有現實需要可以參考percona官方資料以獲取更多信息。

?

能備份部分庫表,也就能根據完全備份集進行部分庫表的恢復,在現實中很少會用到,但還是說一下吧。

首先在“準備prepare”的過程中,使用參數--export將表導出,這個導出會將每個InnoDB表創建一個以.exp結尾的文件,這些文件為之后的導入過程服務。

$ innobackupex --apply-log --export ${BACKUP_DIR}/base

?

然后將你需要恢復的表的ibd和exp文件復制到目標機器,在目標機器上執行導入:

mysql> create table t()engine=innodb; //此處需要DBA手動創建一個同結構的表或表已存在 mysql> ALTER TABLE t DISCARD TABLESPACE; $ cp t.ibd t.exp ${DATA_DIR}/${DB}/ mysql> ALTER TABLE t IMPORT TABLESPACE;

這樣的導出導入就可以保住恢復的表可以與數據庫其他表保持一致性了。

?

并行備份

xtrbackup 還支持并行備份,默認情況下xtrabackup備份時只會開啟一個進程進行數據文件的備份,若配置參數--parallel=N可以讓 xtrabackup開啟N個子進程對多個數據文件進行并發備份,這樣可以加快備份的速度。當然服務器的IO處理能力以及對服務器的影響也是要考慮的,所 以另一個參數--throttle=IOS會與它同時使用,這個參數用來限制備份過程中每秒讀寫的IO次數,對服務器的IO是一個保護。

?

這兩個參數xtrabackup和innobackupex都支持,舉例如下:

$ innobackupex --parallel=4 --throttle=400 ${BACKUP_DIR}/part-base

注意:對同一個數據文件只會有一個進程在備份。

?

其他

xtrabackup 在備份時主要的工作是做數據文件復制,它每次只會讀寫1MB的數據(即64個page,不能修改),xtrabackup逐頁訪問1MB數據,使用 innodb的buf_page_is_corrupted()函數檢查此頁的數據是否正常,如果數據不正常,就重新讀取這一頁,最多重新讀取10次,如 果還是失敗,備份就失敗了,退出。

在復制事務日志的時候,每次讀寫512KB的數據,同樣不可以配置。

之前我在維護 mysql數據庫的時候,使用mysqldump來進行備份與恢復,在備份的時候鎖住表,然后全部備份,在數據少的時候沒問題,但如果數據很多,不允許鎖 表,同時需要恢復數據塊的情況,mysqldump就不適合了,我在恢復一個4G數據文件的數據庫的時候,恢復的數據是使用mysqldump的數據,恢 復了3個小時還沒有反應,造成的影響很嚴重,所以我開始尋找其他的別發軟件來滿足以上的需求,幸好找到了,就是使用xtrabackup來進行備份與恢 復,恢復4G數據文件的數據庫,僅需要14秒,同時在備份的時候不會鎖表,而且支持增量備份,所以把我的比較分享給大家,希望對大家有益!

?

?

?

安裝:

yum install perl-Time-HiRes -y

yum -y install perl-DBD-MySQL.x86_64

tar xvf percona-xtrabackup-2.1.5-680-Linux-x86_64.tar.gz

cd percona-xtrabackup-2.1.5-Linux-x86_64/

cp bin/* /usr/bin/

?

?

?

innobackupex 使用參數介紹由于innobackupex能同時備份InnoDB和MyISAM引擎的表,這里重點介紹innobackupex的備份與恢復使用通常一 般都直接使用innobackupex,因為它能同時備份InnoDB和MyISAM引擎的表。要注意的是my.cnf里datadir這個參數是必須要 指定的,xtrabackup_55是根據它去定位innodb數據文件的位置。

?

innobackupex 語法及參數說明innobackup [--sleep=MS] [--compress[=LEVEL]] [--include=REGEXP] [--user=NAME] [--password=WORD] [--port=PORT] [--socket=SOCKET] [--no-timest a mp] [--ibbackup=IBBACKUP-BINARY] [--slave-info] [--stream=tar] [--defaults-file=MY.CNF] [--databases=LIST] [--remote-host=HOSTNAME] BACKUP-ROOT-DIR

?

innobackup --apply-log [--use-memory=MB] [--uncompress] [--defaults-file=MY.CNF] [--ibbackup=IBBACKUP-BINARY] BACKUP-DIR

?

innobackup --copy-back [--defaults-file=MY.CNF] BACKUP-DIR

各參數說明:

--defaults- file指定mysql的配置文件my.cnf的位置,如--defaults-file=/etc/my.cnf如果不該參數,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_size6個參數即可讓xtrabackup正常工作 --apply-log對xtrabackup的--prepare參數的封裝

--copy-back做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir ;

--remote-host=HOSTNAME通過ssh將備份數據存儲到進程服務器上,HOSTNAME是遠程IP地址;

--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.

?

注意:innobackupex?增量備份僅針對InnoDB這類支持事務的引擎,對于MyISAM等引擎,則仍然是全備。

?

操作:

對數據庫全庫備份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 /tmp/

解釋:

--defaults-file=/etc/my.cnf? #指定my.cnf位置

--user=root? #指定mysql帳號

--password=111111?? #指定mysql密碼

--port=3306?? #指定mysql端口

/tmp/?? #指定備份好的文件存放目錄,我這放在/tmp/下面,

執行完成后,如下多了個時間為名了的目錄,里面就是備份文件了:

[root@drfdai-17 tmp]# ls

2013-10-29_16-06-41

[root@drfdai-17 tmp]# ls 2013-10-29_16-06-41/

aa???????????? ibdata1???????????? test??????????????????? xtrabackup_checkpoints

backup-my.cnf? mysql?????????????? xtrabackup_binary?????? xtrabackup_logfile

drfdai???????? performance_schema? xtrabackup_binlog_info

?

?

?

備份drfdai庫:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 --database=drfdai /tmp/

解釋:

--database=drfdai #指定需要備份的數據庫名

[root@drfdai-17 2013-10-29_16-23-53]# ls

backup-my.cnf? ibdata1??????????? xtrabackup_binlog_info? xtrabackup_logfile

drfdai???????? xtrabackup_binary? xtrabackup_checkpoints

?

?

備份多個庫:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 --database='drfdai mysql' /tmp/

解釋:

--database='drfdai mysql'? #指定你需要備份的那幾個庫名,用單引號把這些庫名引起來,每個庫中間用空格隔開。

[root@drfdai-17 2013-10-29_16-33-09]# ls

backup-my.cnf? ibdata1? xtrabackup_binary?????? xtrabackup_checkpoints

drfdai???????? mysql??? xtrabackup_binlog_info? xtrabackup_logfile

?

?

備份多個表:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 --database='drfdai.aa1 drfdai.aa2' /tmp/

解釋:

--database='drfdai.aa1 drfdai.aa2' #指定備份drfdai庫下面的aa1表和aa2表

?

?

還原操作:

停止mysql數據庫并刪除欲恢復的數據庫文件夾

如我的mysql數據庫文件夾是在/data/mysql/data中,所以我刪掉這個文件夾

然后重建一個/data/mysql/data/

rm -rf /data/mysql/data

mkdir /data/mysql/data

?

還原完整備份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 --apply-log /tmp/2013-10-29_17-17-47/

這里的--apply-log指明是將日志應用到數據文件上,完成之后將備份文件中的數據恢復到數據庫中

?

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306 --copy-back /tmp/2013-10-29_17-17-47/

這里的—copy-back指明是進行數據恢復。數據恢復完成之后,需要修改相關文件的權限mysql數據庫才能正常啟動。

?

chown -R mysql:mysql /data/mysql/data

?

?

?

增量備份:

次先進行完備:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306? /tmp/

備份完后,會生成最新的目錄,名為:2013-10-29_17-17-47

?

進行第一次增量備份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306? --incremental --incremental-basedir=/tmp/2013-10-29_17-17-47 /tmp

備份完成后,會生成最新增量備份,名為:2013-10-29_17-57-21

?

解釋:

--incremental #指定為此次為增量備份

--incremental-basedir=/tmp/2013-10-29_17-17-47? #指定是從哪個備份目錄為參考點進行增量備份

?

進行第二次增量備份:

innobackupex --defaults-file=/etc/my.cnf --user=root --password=111111 --port=3306? --incremental --incremental-basedir=/tmp/2013-10-29_17-57-21/ /tmp

?

以此類推,第三,第四 ……

?

?

增量備份恢復:

增量備份恢復的步驟和完整備份恢復的步驟基本一致,只是應用日志的過程稍有不同。增量備份恢復時,是先將所有的增量備份挨個應用到完整備份的數據文件中,然后再將完整備份中的數據恢復到數據庫中。命令如下:

?

應用第一個增量備份

innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--apply-log?/mysqlbackup/full/2011-08-09_14-50-20/?--incremental-dir=/mysqlbackup/trn/2011-08-09_15-12-43/

?

應用第二個增量備份

innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--apply-log?/mysqlbackup/full/2011-08-09_14-50-20/?--incremental-dir=/mysqlbackup/trn/2011-08-05_15-15-47/

?

將完整備份中的數據恢復到數據庫中。

innobackupex?--user=root?--password=MySQLPASSWORD?--defaults-file=/etc/my.cnf?--copy-back?/mysqlbackup/full/2011-08-05_14-50-20/

其中,--incremental-dir指定要恢復的增量備份的位置。


本文轉自 Tenderrain 51CTO博客,原文鏈接:http://blog.51cto.com/tenderrain/1612103


總結

以上是生活随笔為你收集整理的xtrabackup对MySQL数据库的备份及恢复教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。