innobackupex全量備份和增量備份

一、innobackupex備份與恢復簡介

1、innobackupex參數說明


--compress:該選項表示壓縮innodb數據文件的備份。

--compress-threads:該選項表示並行壓縮worker線程的數量。

--compress-chunk-size:該選項表示每個壓縮線程worker buffer的大小,單位是字節,默認是64K。

--encrypt:該選項表示通過ENCRYPTION_ALGORITHM的算法加密innodb數據文件的備份,目前支持的算法有ASE128,AES192,AES256。

--encrypt-threads:該選項表示並行加密的worker線程數量。

--encrypt-chunk-size:該選項表示每個加密線程worker buffer的大小,單位是字節,默認是64K。

--encrypt-key:該選項使用合適長度加密key,因爲會記錄到命令行,所以不推薦使用。

--encryption-key-file:該選項表示文件必須是一個簡單二進制或者文本文件,加密key可通過以下命令行命令生成:openssl rand -base64 24。

--include:該選項表示使用正則表達式匹配表的名字[db.tb],要求爲其指定匹配要備份的表的完整名稱,即databasename.tablename。

--user:該選項表示備份賬號。

--password:該選項表示備份的密碼。

--port:該選項表示備份數據庫的端口。

--host:該選項表示備份數據庫的地址。

--databases:該選項接受的參數爲數據名,如果要指定多個數據庫,彼此間需要以空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也可以只指定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,還是會備份所有innodb表。此外,此選項也可以接受一個文件爲參數,文件中每一行爲一個要備份的對象。

--tables-file:該選項表示指定含有表列表的文件,格式爲database.table,該選項直接傳給--tables-file。

--socket:該選項表示mysql.sock所在位置,以便備份進程登錄mysql。

--no-timestamp:該選項可以表示不要創建一個時間戳目錄來存儲備份,指定到自己想要的備份文件夾。

--ibbackup:該選項指定了使用哪個xtrabackup二進制程序。IBBACKUP-BINARY是運行percona xtrabackup的命令。這個選項適用於xtrbackup二進制不在你是搜索和工作目錄,如果指定了該選項,innoabackupex自動決定用的二進制程序。

--slave-info:該選項表示對slave進行備份的時候使用,打印出master的名字和binlog pos,同樣將這些信息以change master的命令寫入xtrabackup_slave_info文件。可以通過基於這份備份啓動一個從庫。

--safe-slave-backup:該選項表示爲保證一致性複製狀態,這個選項停止SQL線程並且等到show status中的slave_open_temp_tables爲0的時候開始備份,如果沒有打開臨時表,bakcup會立刻開始,否則SQL線程啓動或者關閉知道沒有打開的臨時表。如果slave_open_temp_tables在--safe-slave-backup-timeount(默認300秒)秒之後不爲0,從庫sql線程會在備份完成的時候重啓。

--rsync:該選項表示通過rsync工具優化本地傳輸,當指定這個選項,innobackupex使用rsync拷貝非Innodb文件而替換cp,當有很多DB和表的時候會快很多,不能--stream一起使用。

--kill-long-queries-timeout:該選項表示從開始執行FLUSH TABLES WITH READ LOCK到kill掉阻塞它的這些查詢之間等待的秒數。默認值爲0,不會kill任何查詢,使用這個選項xtrabackup需要有Process和super權限。

--kill-long-query-type:該選項表示kill的類型,默認是all,可選select。

--ftwrl-wait-threshold:該選項表示檢測到長查詢,單位是秒,表示長查詢的閾值。

--ftwrl-wait-query-type:該選項表示獲得全局鎖之前允許那種查詢完成,默認是ALL,可選update。

--galera-info:該選項表示生成了包含創建備份時候本地節點狀態的文件xtrabackup_galera_info文件,該選項只適用於備份PXC。

--stream:該選項表示流式備份的格式,backup完成之後以指定格式到STDOUT,目前只支持tar和xbstream。

--defaults-file:該選項指定了從哪個文件讀取MySQL配置,必須放在命令行第一個選項的位置。

--defaults-extra-file:該選項指定了在標準defaults-file之前從哪個額外的文件讀取MySQL配置,必須在命令行的第一個選項的位置。一般用於存備份用戶的用戶名和密碼的配置文件。

----defaults-group:該選項表示從配置文件讀取的組,innobakcupex多個實例部署時使用。

--no-lock:該選項表示關閉FTWRL的表鎖,只有在所有表都是Innodb表並且不關心backup的binlog pos點,如果有任何DDL語句正在執行或者非InnoDB正在更新時(包括mysql庫下的表),都不應該使用這個選項,後果是導致備份數據不一致,如果考慮備份因爲獲得鎖失敗,可以考慮--safe-slave-backup立刻停止複製線程。

--tmpdir:該選項表示指定--stream的時候,指定臨時文件存在哪裏,在streaming和拷貝到遠程server之前,事務日誌首先存在臨時文件裏。在 使用參數stream=tar備份的時候,你的xtrabackup_logfile可能會臨時放在/tmp目錄下,如果你備份的時候併發寫入較大的話 xtrabackup_logfile可能會很大(5G+),很可能會撐滿你的/tmp目錄,可以通過參數--tmpdir指定目錄來解決這個問題。

--history:該選項表示percona server 的備份歷史記錄在percona_schema.xtrabackup_history表。

--incremental:該選項表示創建一個增量備份,需要指定--incremental-basedir。

--incremental-basedir:該選項表示接受了一個字符串參數指定含有full backup的目錄爲增量備份的base目錄,與--incremental同時使用。

--incremental-dir:該選項表示增量備份的目錄。

--incremental-force-scan:該選項表示創建一份增量備份時,強制掃描所有增量備份中的數據頁。

--incremental-lsn:該選項表示指定增量備份的LSN,與--incremental選項一起使用。

--incremental-history-name:該選項表示存儲在PERCONA_SCHEMA.xtrabackup_history基於增量備份的歷史記錄的名字。Percona Xtrabackup搜索歷史表查找最近(innodb_to_lsn)成功備份並且將to_lsn值作爲增量備份啓動出事lsn.與innobackupex--incremental-history-uuid互斥。如果沒有檢測到有效的lsn,xtrabackup會返回error。

--incremental-history-uuid:該選項表示存儲在percona_schema.xtrabackup_history基於增量備份的特定歷史記錄的UUID。

--close-files:該選項表示關閉不再訪問的文件句柄,當xtrabackup打開表空間通常並不關閉文件句柄目的是正確的處理DDL操作。如果表空間數量巨大,這是一種可以關閉不再訪問的文件句柄的方法。使用該選項有風險,會有產生不一致備份的可能。

--compact:該選項表示創建一份沒有輔助索引的緊湊的備份。

--throttle:該選項表示每秒IO操作的次數,只作用於bakcup階段有效。apply-log和--copy-back不生效不要一起用。

 


 

2、prepare:

定義:


innobackupex --apply-log [--use-memory=B]

[--defaults-file=MY.CNF]

[--export] [--redo-only] [--ibbackup=IBBACKUP-BINARY]

BACKUP-DIR


 

參數說明:

--apply-log:該選項表示同xtrabackup的--prepare參數,一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事務。因此,此時數據 文件仍處理不一致狀態。--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態。

--use-memory:該選項表示和--apply-log選項一起使用,prepare 備份的時候,xtrabackup做crash recovery分配的內存大小,單位字節。也可(1MB,1M,1G,1GB),推薦1G。

--defaults-file:該選項指定了從哪個文件讀取MySQL配置,必須放在命令行第一個選項的位置。

--export:這個選項表示開啓可導出單獨的表之後再導入其他Mysql中。

--redo-only:這個選項在prepare base full backup,往其中merge增量備份(但不包括最後一個)時候使用。

 

3、解壓解密:

定義:


innobackupex [--decompress] [--decrypt=ENCRYPTION-ALGORITHM]

[--encrypt-key=LITERAL-ENCRYPTION-KEY] | [--encryption-key-file=MY.KEY]

[--parallel=NUMBER-OF-FORKS] BACKUP-DIR


參數說明:

--decompress:該選項表示解壓--compress選項壓縮的文件。

--parallel:該選項表示允許多個文件同時解壓。爲了解壓,qpress工具必須有安裝並且訪問這個文件的權限。這個進程將在同一個位置移除原來的壓縮/加密文件。

--decrypt:該選項表示解密通過--encrypt選項加密的.xbcrypt文件。

 

4、還原:

定義:


innobackupex --copy-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR

innobackupex --move-back [--defaults-file=MY.CNF] [--defaults-group=GROUP-NAME] BACKUP-DIR


參數說明:

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

--move-back:這個選項與--copy-back相似,唯一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本

注意:重要  *

1.datadir目錄必須爲空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-backup選項不會覆蓋

2.在restore之前,必須shutdown MySQL實例,你不能將一個運行中的實例restore到datadir目錄中

3.由於文件屬性會被保留,大部分情況下你需要在啓動mysql服務器之前將文件的屬主改爲mysql,這些文件將屬於創建備份的用戶

chown -R mysql:mysql /var/lib/mysql    #mysql的數據路徑

以上需要在用戶調用Innobackupex之前完成

 

--force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。如果--copy-back和--move-back文件需要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗。

 

二、具體實例

1、普通全量備份、還原:

如果是對所有數據庫備份的話,可以使用--copy-back恢復。但如果是部分備份,不能直接用--copy-back,只能手動來複制需要的庫,也要複製ibdata(數據字典)

備份所有數據庫:備份目錄裏生成日期命名的文件夾


innobackupex  --defaults-file=/etc/my.cnf --user=root [email protected]  /home/backup/xtrabackup/


還原

利用--apply-log的作用是通過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態


innobackupex --apply-log /home/backup/xtrabackup/2018-07-28_09-35-25/


恢復數據:需要數據目錄爲空,關掉mysql服務器


innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/xtrabackup/2018-07-28_09-35-25/


修改權限


sudo chown mysql:mysql /var/lib/mysql -R    #/var/lib/mysql是我mysql的數據路徑


重新啓動服務器,數據恢復完成


service mysqld start


 --no-timestamp 增加選項,備份文件直接在指定目錄下產生,不會生成日期命名的文件夾

++++++++++++++++++++++++++++++++++++++++++++++++++++

2、普通增量備份、還原

如果是對所有數據庫備份的話,可以使用--copy-back恢復。但如果是部分備份,不能直接用--copy-back,只能手動來複制需要的庫,也要複製ibdata(數據字典)

#全量備份


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] /home/backup/xtrabackup/


#增量備份1


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --incremental --incremental-basedir=/home/backup/xtrabackup/2018-07-28_22-37-26/ /home/backup/increment_data/


#增量備份2


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --incremental --incremental-basedir=/home/backup/increment_data/2018-07-28_22-39-28/  /home/backup/increment_data/


 

注:    1.通過上面三個目錄裏的xtrabackup_checkpoints文件,可以看出是哪種備份類型,全量(full-backuped)還是增量 並且全量到增量的from_lsn和last_lsn是一一對應的。

          2.在第2次做增量備份的時候 --incremental-basedir 指向全量備份,則第一次增量備份中的數據會被第2次包含,只需要還原一次就可以恢復,現在則需要還原2次增量備份。  

          3.其中,--incremental指明是增量備份,--incremental-basedir指定上次完整備份或者增量備份文件的位置。這裏的增量備份其實只針對的是InnoDB,對於MyISAM來說,還是完整備份。

 

#還原

1.先prepare全備


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26


2.再prepare第一個增量


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26 --incremental-dir=/home/backup/increment_data/2018-07-28_22-39-28


3.然後prepare最後一個增量


innobackupex --incremental --apply-log --redo-only /home/backup/xtrabackup/2018-07-28_22-37-26 --incremental-dir=/home/backup/increment_data/2018-07-28_22-41-21


此時兩次增量備份其實都合併到全備上了,恢復是只需要使用全備進行恢復就可以了

4.最後再prepare全量備份


innobackupex --apply-log /home/backup/xtrabackup/2018-07-28_22-37-26/


 

數據恢復,需要mysql數據目錄爲空,如果非空,恢復命令將報錯


innobackupex --defaults-file=/etc/my.cnf --copy-back /home/backup/xtrabackup/2018-07-28_22-37-26/


 

修改權限,因爲--copy-back恢復產生的文件的用戶爲root,需要把mysql數據庫目錄下的文件用戶都修改爲mysql,mysql的服務器才能正常啓動


sudo chown mysql:mysql /var/lib/mysql -R    #/var/lib/mysql是我mysql的數據路徑


重新啓動服務器,數據恢復完成。

 

以上是對所有數據庫的一個增量備份過程,如果想要指定備份的數據庫,只需要在每條的備份命令裏增加:

--databases=DataBaseName(指定的數據庫個>1時,用空格隔開)

如果只想備份指定數據庫下的某個表,只需要在每條的備份命令裏增加:

--databases=DataBaseName.tableName

部分備份,不能直接用--copy-back,只能手動來複制需要的庫,也要複製ibdata(數據字典)

++++++++++++++++++++++++++++++++++++++++++++++++++++

3、部分備份

1、部分備份多個數據庫時,多個數據庫用空格分開

注意的是:如果備份單個的表,備份的表必須是在獨立的表空間中,即該表在創建以前,你的MySQL開啓了innodb_file_per_table設置。

還一點要注意的是:不要將prepared backup備份的東西拷貝回去。部分備份使用的是導入表(importing the tables),而不是全庫備份的--copy-back參數。儘管有時簡單的拷貝備份文件可以成功,但是這種方法很容易導致數據庫的不一致,因此不推薦大家這麼做

部分備份共有三種方式,分別是:1. 用正則表達式表示要備份的庫名及表名(參數爲--include);2. 將要備份的表名或庫名都寫在一個文本文件中(參數爲--tables-file)以及 3. 將要備份表名或庫名完整的寫在命令行中(參數爲:--databases)。(注:不管你備份哪個庫或是哪張表,強烈推薦把mysql庫也一起備份,恢復的時候要用。)

 

2、#備份指定表

        保證:InnoDB_File_Per_Table = ON   --此參數修改InnoDB爲獨立表空間模式,每個數據庫的每個表都會生成一個數據空間.

          以數據庫xtra_test下表 I 爲例實驗,這個涉及到兩個mysql的服務器,在一個服務器上備份,在另一臺服務器上恢復。

第一步:備份數據庫xtra_test下的 I 表,備份前保證表裏有一定的數據


innobackupex --defaults-file=/etc/my.cnf --user=root [email protected] --databases="xtra_test.I mysql" /home/backup/xtrabackup


第二步:準備部分備份(Preparing Partial Backups)


innobackupex --apply-log --export /home/backup/xtrabackup


第三步:查看備份表的結構


mysql> show create table I;

 


 

第四步:把創建表的命令複製下來,在另一臺服務器上,創建一模一樣的表


CREATE TABLE `I` (

  `id` int(11) DEFAULT NULL,

  `name` varchar(10) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=utf8;


第五步:discard its tablespace


ALTER TABLE test.I DISCARD TABLESPACE;


第六步:將備份文件中的I.exp  和  I.ibd 文件拷貝到你創建的表空間,即mysqldatadir/databaseName/tableName/下


scp [email protected]:/home/backup/xtrabackup/2018-07-30_23-40-13/xtra_test/I.exp .


scp遠程拷貝命令,注意最後有個點表示拷貝到當前目錄,可以換成絕對路徑:/var/lib/mysql/test/I/

第七步:修改拷貝文件的權限


sudo chown mysql:mysql /var/lib/mysql/test/I -R


或者在當前目錄執行:


sudo chown mysql:mysql I.exp -R

sudo chown mysql:mysql  I.ibd -R


第八步:IMPORT TABLESPACE


ALTER TABLE test.I IMPORT TABLESPACE;


最後查看錶中的數據,恢復完成。

++++++++++++++++++++++++++++++++++++++++++++++++++++

三、其他備份形式(沒有親自操作,留着以後用到再做研究)

③.打包壓縮備份,注意:--compress不能和--stream=tar一起使用

#壓縮備份


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --no-timestamp --databases="xtra_test.I" /home/zhoujy/xtrabackup/


#在perpare之前需要decompress,需要安裝qpress


innobackupex --decompress /home/zhoujy/xtrabackup/


#prepare


innobackupex --apply-log /home/zhoujy/xtrabackup/


最後還原方法和上面一致

 

#打包備份


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ 1>/home/zhoujy/xtrabackup/xtra_test.tar


#解包


tar ixvf xtra_test.tar


最後還原方法和上面一致

#第三方壓縮備份:


innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=8 --parallel=4 --stream=tar --no-timestamp --databases="xtra_test" /home/zhoujy/xtrabackup/ | gzip >/home/zhoujy/xtrabackup/xtra_test.tar.gz


 

#prepare之前先解壓


tar izxvf xtra_test.tar.gz

 

#prepare

innobackupex --apply-log /home/zhoujy/xtrabackup/


 

④.加密備份

說明:在參數說明裏看到加密備份的幾個參數:--encrypt、--encrypt-threads、--encrypt-key、--encryption-key-file。其中encrypt-key和encryption-key-file不能一起使用,encryption-key需要把加密的密碼寫到命令行,不推薦。

#加密備份:

先生成key:

openssl rand -base64 24

把Key寫到文件:

echo -n "Ue2Wp6dIDWszpI76HQ1u57exyjAdHpRO" > keyfile

最後備份:

innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --compress --compress-threads=3 --no-timestamp --encrypt=AES256 --encrypt-key-file=/home/zhoujy/keyfile ----encrypt-threads=3 --parallel=5 /home/zhoujy/xtrabackup2/

#解密:

for i in `find . -iname "*\.xbcrypt"`; do xbcrypt -d --encrypt-key-file=/home/zhoujy/keyfile --encrypt-algo=AES256 < $i > $(dirname $i)/$(basename $i .xbcrypt) && rm $i; done

#解壓:

innobackupex --decompress /home/zhoujy/xtrabackup2/

#prepare:

innobackupex --apply-log /home/zhoujy/xtrabackup2/

#還原copy

innobackupex --defaults-file=/etc/mysql/my.cnf --move-back /home/zhoujy/xtrabackup2/

 

⑤.複製環境中的備份:一般生產環境大部分都是主從模式,主提供服務,從提供備份。

#備份 5個線程備份2個數據庫,並且文件xtrabackup_slave_info記錄GTID和change的信息

innobackupex --defaults-file=/etc/mysql/my.cnf --user=root --password=123 --no-timestamp --slave-info --safe-slave-backup --parallel=5 --databases='xtra_test dba_test' /home/zhoujy/xtrabackup/

#還原

還原方法同上

總結:關於更多的innobackupex的備份可以看官方文檔和xtrabackup 安裝使用。強烈推薦研究研究幫助文檔

 

 

四、個人感覺一些比較重要的文檔,大多博客沒有提到的放在了下邊

Once the pages have been put together in their respective order, applying the logs will recreate the process that affected

the database, yielding the data at the moment of the most recently created backup.

Creating an Incremental Backups with innobackupex First, you need to make a full backup as the BASE for

subsequent incremental backups:

$ innobackupex /data/backups

This will create a timestamped directory in /data/backups. Assuming that the backup is done last day of the

month, BASEDIR would be /data/backups/2013-03-31_23-01-18, for example.

Note: You can use the innobackupex --no-timestamp option to override this behavior and the backup will

be created in the given directory.

If you check at the xtrabackup-checkpoints file in BASE-DIR, you should see something like:

backup_type = full-backuped

from_lsn = 0

to_lsn = 1291135

To create an incremental backup the next day, use the --incremental option and provide the BASEDIR:

$ innobackupex --incremental /data/backups --incremental-basedir=BASEDIR

and another timestamped directory will be created in /data/backups, in this example,

/data/backups/2013-04-01_23-01-18 containing the incremental backup. We will call this

INCREMENTAL-DIR-1.

If you check at the xtrabackup-checkpoints file in INCREMENTAL-DIR-1, you should see something like:

backup_type = incremental

from_lsn = 1291135

to_lsn = 1352113

Creating another incremental backup the next day will be analogous, but this time the previous incremental one will

be base:

$ innobackupex --incremental /data/backups --incremental-basedir=INCREMENTAL-DIR-1

yielding (in this example) /data/backups/2013-04-02_23-01-18. We will use INCREMENTAL-DIR-2

instead for simplicity.

At this point, the xtrabackup-checkpoints file in INCREMENTAL-DIR-2 should contain something like:

backup_type = incremental

from_lsn = 1352113

to_lsn = 1358967

As it was said before, an incremental backup only copy pages with a LSN greater than a specific value. Providing the

LSN would have produced directories with the same data inside:

innobackupex --incremental /data/backups --incremental-lsn=1291135

innobackupex --incremental /data/backups --incremental-lsn=1358967

This is a very useful way of doing an incremental backup, since not always the base or the last incremental will be

available in the system.

 

Warning: This procedure only affects XtraDB or InnoDB-based tables. Other tables with a different storage

engine, e.g. MyISAM, will be copied entirely each time an incremental backup is performed.

 

Note: Currently in Percona XtraBackup the –databases option has no effect for InnoDB files for both local and

streaming backups, i.e. all InnoDB files are always backed up. Currently, only .frm and non-InnoDB tables are limited

by that option.
 

發佈了188 篇原創文章 · 獲贊 163 · 訪問量 66萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章