xtrabackup備份(MySQL備份)與恢復

轉自:https://www.cnblogs.com/dianel/mysql


   

1. innobackupex參數選項

--no-timestamp: 不建立一個時間戳
--defaults-file=[MY.CNF]    //指定配置文件:只能從給定的文件中讀取默認選項。 且必須做爲命令行上的第一個選項;必須是一個真實的文件,它不能是一個符號連接。--databases=#    //指定備份的數據庫和表,格式爲:--database="db1[.tb1] db2[.tb2]" 多個庫之間以空格隔開,若是此選項不被指定,將會備份全部的數據庫。--include=REGEXP    //用正則表達式的方式指定要備份的數據庫和表,格式爲 --include=‘^mydb[.]mytb’ ,對每一個庫中的每一個表逐一匹配,所以會建立全部的庫,不過是空的目錄。--include 傳遞給 xtrabackup --tables。--tables-file=FILE    //此選項的參數須要是一個文件名,此文件中每行包含一個要備份的表的完整名稱,格式爲databasename.tablename。該選項傳遞給 xtrabackup --tables-file,與--tables選項不一樣,只有要備份的表的庫纔會被建立。注意:部分備份(--include、--tables-file、--database)須要開啓 innodb_file_per_table 。

--compact    //建立緊湊型備份,忽略全部輔助索引頁,只備份data page;經過--apply-log中重建索引--rebuild-indexs。--compress    //此選項指示xtrabackup壓縮備份的InnoDB數據文件,會生成 *.qp 文件。--apply-log    //應用 BACKUP-DIR 中的 xtrabackup_logfile 事務日誌文件。通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。所以,此時數據文件仍處於不一致狀態。「準備」的主要做用正是經過回滾未提交的事務及同步已經提交的事務至數據文件使得數據文件處於一致性狀態。--use-memory=#    //此選項接受一個字符參數(1M/1MB,1G/1GB,默認100M),僅與--apply-log一塊兒使用,該選項指定prepare時用於崩潰恢復(crash-recovery)的內存。--copy-back    //拷貝先前備份全部文件到它們的原始路徑。但原路徑下不能有任何文件或目錄,除非指定 --force-non-empty-directories 選項。--incremental-basedir=DIRECTORY    //該選項接受一個字符串參數,該參數指定做爲增量備份的基本數據集的完整備份目錄。它與 --incremental 一塊兒使用。--incremental-dir=DIRECTORY    //該選項接受一個字符串參數,該參數指定了增量備份將與完整備份相結合的目錄,以便進行新的完整備份。它與 --incremental 選項一塊兒使用。--redo-only    //在「準備基本完整備份」 和 「合併全部的增量備份(除了最後一個增備)」時使用此選項。它直接傳遞給xtrabackup的 xtrabackup --apply-log-only 選項,使xtrabackup跳過"undo"階段,只作"redo"操做。若是後面還有增量備份應用到這個全備,這是必要的。有關詳細信息,請參閱xtrabackup文檔。--parallel=NUMBER-OF-THREADS    //此選項接受一個整數參數,指定xtrabackup子進程應用於同時備份文件的線程數。請注意,此選項僅適用於文件級別,也就是說,若是您有多個.ibd文件,則它們將被並行複製; 若是您的表一塊兒存儲在一個表空間文件中,它將不起做用。

2.全量備份恢復

建立備份恢復的用戶並賦權

create user pxb@'localhost' identified by '123456';正則表達式

grant reload,process,lock tables,replication client on . to pxb@localhost;sql

建立存放備份文件的目錄數據庫

mkdir -pv /var/data服務器

進行數據庫全量備份:

innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 /var/data/app

[root@aliy ~]# ll /var/data/2018-08-28_09-06-39/ssh

total 18460socket

-rw-r----- 1 root root 417 Aug 28 09:06 backup-my.cnfide

-rw-r----- 1 root root 18874368 Aug 28 09:06 ibdata1工具

drwxr-x--- 2 root root 4096 Aug 28 09:06 mysql

drwxr-x--- 2 root root 4096 Aug 28 09:06 performance_schema

drwxr-x--- 2 root root 4096 Aug 28 09:06 test

-rw-r----- 1 root root 113 Aug 28 09:06 xtrabackup_checkpoints

-rw-r----- 1 root root 454 Aug 28 09:06 xtrabackup_info

-rw-r----- 1 root root 2560 Aug 28 09:06 xtrabackup_logfile

全量備份恢復

systemctl stop mariadb

rm /var/lib/mysql -rf

mkdir /var/lib/mysql

準備一個徹底備份: --apply-log,執行以後 xtrabackup_checkpoints 文件中的 backup_type = full-prepared

innobackupex --apply-log /var/data/2018-08-28_09-06-39/

執行恢復操做:

innobackupex --defaults-file=/etc/my.cnf --copy-back /var/data/2018-08-28_09-06-39/

更改data目錄權限並啓動mysql:

chown -R mysql:mysql /var/lib/mysql

systemctl start mariadb

3. 增量備份恢復

所謂增量備份恢復就是在全量的基礎上進行增量備份。

增量備份1:以全量爲基準

innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --incremental /var/data/inc --incremental-basedir=/var/data/2018-08-28_10-01-53/ --parallel=2

中途進行了數據添加操做。

增量備份2:以增量備份1爲基準

innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --incremental /var/data/inc/ --incremental-basedir=/var/data/inc/2018-08-28_10-04-22/ --parallel=2

增量備份的恢復:
步驟:

  1. 恢復徹底備份

  2. 恢復增量備份到徹底備份(開始恢復的增量備份要添加--redo-only參數,到最後一次增量備份要去掉--redo-only)

  3. 對總體的徹底備份進行恢復,回滾提交的數據

準備一個全備:

innobackupex --apply-log --redo-only /var/data/2018-08-28_10-01-53/

將增量1應用到徹底備份

innobackupex --apply-log --redo-only /var/data/2018-08-28_10-01-53 --incremental-dir=/var/data/inc/2018-08-28_10-04-22/

將增量2應用到徹底備份,不用加--redo-only參數

innobackupex --apply-log /var/data/2018-08-28_10-01-53 --incremental-dir=/var/data/inc/2018-08-28_10-07-40/

把全部的徹底備份合併到一塊兒進行一次apply操做,回滾提交的數據

innobackupex --apply-log /var/data/2018-08-28_10-01-53/

模擬:將數據庫裏的內容刪除

systemctl stop mariadb

mv /var/lib/mysql /var/lib/mysql.bak

mkdir /var/lib/mysql

恢復:

innobackupex --defaults-file=/etc/my.cnf --copy-back /var/data/2018-08-28_10-01-53/

chown -R mysql:mysql /var/lib/mysql

systemctl start maraidb

流備份以及壓縮備份

Xtrabackup對備份的數據文件支持「流」功能,便可以將備份的數據經過STDOUT傳輸給tar程序進行歸檔,而不是默認的直接保存至某備份目錄中。要使用此功能,僅須要使用--stream選項便可。如:

innobackupex --stream=tar /data/backup/|gzip >/data/backup/`date +%F`.tar.gz

也可使用以下命令將數據備份至其餘服務器

innobackupex --default-file=/etc/my.cnf --stream=tar /backup | ssh user@www.magedu.com " cat -> /backups/date +%F_%H-%M-%S.tar"

同時也可將備份的數據文件存儲到遠程的主機,使用--remote-host來實現

innobackupex --remote-host=root@www.magedu.com /path/IN/REMOTE/HOST/to/backup



Xtrabackup是由percona開發的一個開源軟件,是使用perl語言完成的腳本工具,可以很是快速地備份與恢復mysql數據庫,且支持在線熱備份,備份時不影響數據讀寫

在備份的時候,備份工具主要執行兩個任務來完成備份:

① 在後臺啓動一個日誌拷貝線程。這個線程會監視InnoDB日誌文件,當日志文件發生改變時,這個線程會將發生變化的數據塊拷貝到備份目錄下一個名爲xtrabackup_logfile的文件中。這個操做是必要的,由於備份可能會持續很長時間,在數據庫恢復時,須要全部從備份開始到結束的這些日誌文件。

② 拷貝InnoDB數據文件到指定備份目錄下。這不是一個簡單的拷貝,備份工具打開並讀取文件的方式相似InnoDB,經過讀取文件目錄並以頁(page)爲單位進行拷貝。

當數據文件拷貝結束時,xtrabackup會中止日誌拷貝線程,並在指定備份目錄中建立一個名爲xtrabackup_checkpoints的文件,這個文件包含備份的類型、開始備份的日誌序列號和結束備份的日誌序列號。

 

Xtrabackup 下載地址:https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.13/source/tarball/percona-xtrabackup-2.4.13.tar.gz

解壓安裝過程省略。。。

 

innobackupex經常使用參數

複製代碼

--compress:該選項表示壓縮innodb數據文件的備份。
--compact: 建立一個不包含第二索引(除了主鍵以外的索引)的備份
--defaults-file=[MY.CNF] 配置文件的路徑
--use-memory=#        這個參數用於在準備備份時,xtrabackup執行crash recovery所使用的內存大小。這個參數僅和--apply-log搭配時才生效。
--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。
--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一塊兒使用。
--history:該選項表示percona server 的備份歷史記錄在percona_schema.xtrabackup_history表。
--redo-only 當準備數據庫的全備或合併增量備份時,須要指定這個參數。這個參數實際上執行的是xtrabackup --apply-log-only,會讓xtrabackup跳過回滾節點,只作「redo」步驟。當數據庫須要應用增量備份時,須要指定這個參數。
--no-timestamp        這個參數會讓xtrabackup在備份的時候不建立帶有時間格式的子文件夾。當指定了這個參數,備份會直接建立在指定的備份目錄下。
--stream=STREAMNAME 指定流備份的格式。備份將會以指定格式輸出到STDOUT。目前支持的格式有tar 和 xbstream。若是指定了這個參數,後面須要接tmpdir目錄做爲處理流的一箇中間目錄。
--incremental 建立增量備份,當指定這個參數的時候,應該指定--incremental-lsn或--incremental-basedir參數,不然將會備份到--incremental-basedir路徑
--incremental-basedir 以上一次全量或增量備份的路徑,做爲增量備份的基礎。指定這個參數的同時,應該一樣指定--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操做。若是表空間數量巨大,這是一種能夠關閉再也不訪問的文件句柄的方法。使用該選項有風險,會有產生不一致備份的可能。

複製代碼

全備及本地或者異地恢復過程

備份

innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf /data/backups/ --user=root -H127.0.0.1 -P3307 --password=***
--defaults-file:mysql配置文件。不指定默認爲 /etc/my.cnf
/data/backups/ 備份文件要寫入的目錄,會建立一個以時間格式爲名的目錄2019-02-13_15-19-58

恢復

複製代碼

一、本地恢復的話 要先關閉數據庫,而且刪除數據文件,確保數據目錄爲空
innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=4G --apply-log /data/backups/2019-02-13_15-19-58
--apply-log的做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態

二、innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58
--copy-back,即把備份文件拷貝至原數據目錄下。

三、修改數據目錄權限
chown mysql.mysql /data/mysql_data/3307/data -R

複製代碼

相關備份binlog點都存在下圖中,用做主從同步及記錄,數據庫啓動後根據文件中的點從作主備的相關參數便可


 以上流程也適合異地恢復及作主從同步,把備份目錄scp到遠程服務器目錄,再執行第二三步便可

 增備及本地或者異地恢復過程

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

一、增量備份:增量備份須要基於全備

innobackupex --defaults-file=/data/mysql_data/3307/my_3307.cnf 
--user=root -H127.0.0.1 -P3307 
--password=*** --incremental /data/backups 
--incremental-basedir=/data/backups/2019-02-13_15-19-58
--incremental-basedir     指向全量備份目錄
--incremental             指向增量備份的目錄
上面語句執行成功以後,會在--incremental執行的目錄下建立一個時間戳子目錄
能夠持續作增量備份
只須要把--incremental-basedir 的目錄指向上一次增量備份的目錄便可


二、增量備份恢復
innobackupex --apply-log --redo-only 
--defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G 
 /data/backups/INCREMENTAL-DIR(2019-02-13_15-19-58)
innobackupex --apply-log --redo-only 
--defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G 
/data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-1  
innobackupex --apply-log --redo-only 
--defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G 
/data/backups/2019-02-13_15-19-58 --incremental-dir=INCREMENTAL-DIR-2  
多個備份日後以此類推

INCREMENTAL-DIR:全備目錄

INCREMENTAL-DIR-1:增備目錄1

INCREMENTAL-DIR-2:增備目錄2

。。。

此時兩次增量備份其實都合併到全備上了,恢復是隻須要使用全備進行恢復就能夠了

innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --use-memory=2G --apply-log /data/backups/2019-02-13_15-19-58

innobackupex --defaults-file=/data/mysql_data/3307/mysql_3307.cnf --copy-back /data/backups/2019-02-13_15-19-58

三、修改數據目錄權限啓動便可
相關文章
相關標籤/搜索