基於xtrabackup實現mysql備份還原

簡介

Xtrabackup2.2版以前包括4個可執行文件:

innobackupex: Perl 腳本 xtrabackup: C/C++ 編譯的二進制 xbstream: 支持併發寫的流文件格式 xbcrypt: 加解密 xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQLServer 沒有交互;innobackupex 腳本用來備份非 InnoDB 表,同時會調用xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上作了一層封裝實現的;mysqldump默認是不支持增量備份的(mysqldump實現增量備份靠的是二進制日誌),xtrabackup支持增量備份 innobackupex: Perl 腳本 xtrabackup: C/C++ 編譯的二進制 xbstream: 支持併發寫的流文件格式 xbcrypt: 加解密 xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQLServer 沒有交互;innobackupex 腳本用來備份非 InnoDB 表,同時會調用xtrabackup 命令來備份 InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在xtrabackup 之上作了一層封裝實現的;mysqldump默認是不支持增量備份的(mysqldump實現增量備份靠的是二進制日誌),xtrabackup支持增量備份

xtrabackup下載地址

https://www.percona.com/downloads/Percona-XtraBackup-2.4/
https://www.percona.com/downloads/Percona-XtraBackup-LATEST/          #最新版本下載mysql

xtrabackup備份過程

棕色線條是備份MyISAM存儲引擎的表,綠色線條是備份InnoDB存儲引擎的表; innobackupex啓動後先調用xtrabackup,xtrabackup啓動兩個線程,一個線程先備份redo(事務日誌); 拷貝上事務日誌以後,開啓另外一個線程備份ibd文件(ibd是存放數據庫以及索引的文件),備份完ibd文件以後通知innobackupex; 備份完ibd文件後,innobackupex腳本會加全局讀鎖備份MyISAM相關的表; MyISAM表備份完以後通知備份redo的線程,中止備份事務日誌,線程收到通知後會中止備份而且告知innobackupex; innobackupex進行解鎖,通知xtrabackup中止備份,xtrabackup回覆完以後備份結束; 新版本的xtrabackup中xtrabackup和innobackupex已經合二爲一,innobackupex做爲xtrabackup的軟連接 棕色線條是備份MyISAM存儲引擎的表,綠色線條是備份InnoDB存儲引擎的表; innobackupex啓動後先調用xtrabackup,xtrabackup啓動兩個線程,一個線程先備份redo(事務日誌); 拷貝上事務日誌以後,開啓另外一個線程備份ibd文件(ibd是存放數據庫以及索引的文件),備份完ibd文件以後通知innobackupex; 備份完ibd文件後,innobackupex腳本會加全局讀鎖備份MyISAM相關的表; MyISAM表備份完以後通知備份redo的線程,中止備份事務日誌,線程收到通知後會中止備份而且告知innobackupex; innobackupex進行解鎖,通知xtrabackup中止備份,xtrabackup回覆完以後備份結束; 新版本的xtrabackup中xtrabackup和innobackupex已經合二爲一,innobackupex做爲xtrabackup的軟連接

xtrabackup選項用法

--user:該選項表示備份帳號 --password:該選項表示備份的密碼 --host:該選項表示備份數據庫的地址 --databases:該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也能夠只指 定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,仍是會備份全部innodb表 --defaults-file:該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置 --incremental:該選項表示建立一個增量備份,須要指定--incremental-basedir --incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用 --incremental-dir:該選項表示還原時增量備份的目錄 --include=name:指定表名,格式:databasename.tablename --backup:備份 --prepare:預處理 --apply-log-only:阻止回滾未完成的事務 --target-dir:指定目標位置 --apply-log:通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。因 此,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 --use-memory:和--apply-log選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G(快速還原) --export:表示開啓可導出單獨的表以後再導入其餘Mysql中 --redo-only:此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併 --copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir --move-back:這個選項與--copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有 足夠的磁盤空間同時保留數據文件和Backup副本 --force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是 --copy-back和--move-back文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗 --user:該選項表示備份帳號 --password:該選項表示備份的密碼 --host:該選項表示備份數據庫的地址 --databases:該選項接受的參數爲數據庫名,若是要指定多個數據庫,彼此間須要空格隔開;如:"xtra_test dba_test",同時,在指定某數據庫時,也能夠只指 定其中的某張表。如:"mydatabase.mytable"。該選項對innodb引擎表無效,仍是會備份全部innodb表 --defaults-file:該選項指定從哪一個文件讀取MySQL配置,必須放在命令行第一個選項位置 --incremental:該選項表示建立一個增量備份,須要指定--incremental-basedir --incremental-basedir:該選項指定爲前一次全備份或增量備份的目錄,與--incremental同時使用 --incremental-dir:該選項表示還原時增量備份的目錄 --include=name:指定表名,格式:databasename.tablename --backup:備份 --prepare:預處理 --apply-log-only:阻止回滾未完成的事務 --target-dir:指定目標位置 --apply-log:通常狀況下,在備份完成後,數據尚且不能用於恢復操做,由於備份的數據中可能會包含還沒有提交的事務或已經提交但還沒有同步至數據文件中的事務。因 此,此時數據文件仍處理不一致狀態。此選項做用是經過回滾未提交的事務及同步已經提交的事務至數據文件使數據文件處於一致性狀態 --use-memory:和--apply-log選項一塊兒使用,當prepare 備份時,作crash recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G(快速還原) --export:表示開啓可導出單獨的表以後再導入其餘Mysql中 --redo-only:此選項在prepare base full backup,往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併 --copy-back:作數據恢復時將備份數據文件拷貝到MySQL服務器的datadir --move-back:這個選項與--copy-back類似,惟一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須當心。使用場景:沒有 足夠的磁盤空間同時保留數據文件和Backup副本 --force-non-empty-directories:指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。若是 --copy-back和--move-back文件須要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

還原注意事項:

一、datadir 目錄必須爲空。除非指定innobackupex --force-non-emptydirectorires選項指定,不然--copy-back選項不會覆蓋 二、在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中 三、.因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶chown -R mysql:mysql /data/mysql 以上須要在用戶調用innobackupex以前完成 一、datadir 目錄必須爲空。除非指定innobackupex --force-non-emptydirectorires選項指定,不然--copy-back選項不會覆蓋 二、在restore以前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中 三、.因爲文件屬性會被保留,大部分狀況下須要在啓動實例以前將文件的屬主改成mysql,這些文件將屬於建立備份的用戶chown -R mysql:mysql /data/mysql 以上須要在用戶調用innobackupex以前完成

xtrabackup還原過程

t0點作徹底備份,t一、t2點都作增量備份(第一次增量備份前都須要一個徹底備份);上圖中,有可能會出現t1點作增量備份以前有一個事務正在執行,t1點作完增量備份以後事務還沒完成,這樣會形成事務跨備份點了,至關於t1點增量備份中有一半事務的備份,另外一半的事務沒有作備份;同理,t2點也會出現這種狀況; xtrabackup還原的兩個步驟: 一、預處理:當須要還原數據庫到t2點時,須要t0的徹底備份和t一、2的增量備份;xtrabackup把備份複製到一個第三方目錄中,用徹底備份加上t1點的增量備份,再 加上t2點的增量備份,但t2點的增量備份中有可能出現一半的事務備份,因此會把t2點的備份進行事務回滾(撤銷不完整的事務);備份還原時,前面的 備份都不作事務回滾,只有須要還原的最後一次增量備份才作事務滾動 二、還原:把預處理完的備份文件複製到數據庫所在目錄 徹底備份也會出現備份一半事務的狀況,當數據庫啓動會發現不完整事務,系統會自動回滾 t0點作徹底備份,t一、t2點都作增量備份(第一次增量備份前都須要一個徹底備份);上圖中,有可能會出現t1點作增量備份以前有一個事務正在執行,t1點作完增量備份以後事務還沒完成,這樣會形成事務跨備份點了,至關於t1點增量備份中有一半事務的備份,另外一半的事務沒有作備份;同理,t2點也會出現這種狀況; xtrabackup還原的兩個步驟: 一、預處理:當須要還原數據庫到t2點時,須要t0的徹底備份和t一、2的增量備份;xtrabackup把備份複製到一個第三方目錄中,用徹底備份加上t1點的增量備份,再 加上t2點的增量備份,但t2點的增量備份中有可能出現一半的事務備份,因此會把t2點的備份進行事務回滾(撤銷不完整的事務);備份還原時,前面的 備份都不作事務回滾,只有須要還原的最後一次增量備份才作事務滾動 二、還原:把預處理完的備份文件複製到數據庫所在目錄 徹底備份也會出現備份一半事務的狀況,當數據庫啓動會發現不完整事務,系統會自動回滾

備份生成的相關文件

使用innobackupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件: (1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置;數 據庫的數據存放在一個個16K的數據塊中,每當修改一個數據塊的數據,則這個數據塊的事務id號就會更改;當作備份時,假如備份完成後最 大的事務id爲1000,則1000id以前的都作過備份,1000以後的id則都未作備份,LSN即事務id (2)xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個 日誌序列號LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的 (3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復 (4)backup-my.cnf:備份命令用到的配置選項信息 (5)xtrabackup_logfile:備份生成的日誌文件 使用innobackupex備份時,其會調用xtrabackup備份全部的InnoDB表,複製全部關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中建立以下文件: (1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置;數 據庫的數據存放在一個個16K的數據塊中,每當修改一個數據塊的數據,則這個數據塊的事務id號就會更改;當作備份時,假如備份完成後最 大的事務id爲1000,則1000id以前的都作過備份,1000以後的id則都未作備份,LSN即事務id (2)xtrabackup_checkpoints:備份類型(如徹底或增量)、備份狀態(如是否已經爲prepared狀態)和LSN範圍信息,每一個InnoDB頁(一般爲16k大小)都會包含一個 日誌序列號LSN。LSN是整個數據庫系統的系統版本號,每一個頁面相關的LSN可以代表此頁面最近是如何發生改變的 (3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復 (4)backup-my.cnf:備份命令用到的配置選項信息 (5)xtrabackup_logfile:備份生成的日誌文件

xtrabackup徹底備份還原

備份

準備兩臺機器

[root@centos7 ~]# yum install percona-*.rpm #安裝xtrabackup [root@centos7 ~]# rpm -ql percona-xtrabackup-24 #查看包都包含了哪些文件 [root@centos7 ~]# mkdir /backup #建立備份目錄 [root@centos7 ~]# mysql -e 'show databases;' #提早準備好數據庫 +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/ #作徹底備份到指定目錄 [root@centos7 ~]# scr -r /backup/ 192.168.38.37:/ #把備份目錄拷貝到遠程主機的根下;備份儘可能不要放在本機上 [root@centos7 ~]# yum install percona-*.rpm #安裝xtrabackup [root@centos7 ~]# rpm -ql percona-xtrabackup-24 #查看包都包含了哪些文件 [root@centos7 ~]# mkdir /backup #建立備份目錄 [root@centos7 ~]# mysql -e 'show databases;' #提早準備好數據庫 +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/ #作徹底備份到指定目錄 [root@centos7 ~]# scr -r /backup/ 192.168.38.37:/ #把備份目錄拷貝到遠程主機的根下;備份儘可能不要放在本機上

還原

[root@localhost ~]# yum install percona*.rpm [root@localhost ~]# systemctl stop mariadb #還原數據庫期間須要中止用戶訪問 [root@localhost ~]# rm -rf /var/lib/mysql/* #還原時要清除數據庫目錄下的全部文件 [root@localhost ~]# mkdir /restore #準備一個預處理用的第三方目錄 [root@localhost ~]# cp -ra /backup/* /restore/ #把備份的數據拷貝到預處理用的目錄下 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/ #指定目錄進行預處理;徹底備份還原,不須要阻止日誌回滾,系統會自動回滾日誌 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/ #把處理過的備份還原(拷貝)到數據庫目錄;xtrabackup會自動檢查mysql的配置文件,從而找到數據庫的目錄 [root@localhost ~]# ll /var/lib/mysql/ #會發現文件的全部者和所屬組都是當前系統默認用戶 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #更改數據庫目錄的全部文件的全部者和所屬組爲Mysql [root@localhost ~]# systemctl start mariadb #恢復服務 [root@localhost ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+ [root@localhost ~]# yum install percona*.rpm [root@localhost ~]# systemctl stop mariadb #還原數據庫期間須要中止用戶訪問 [root@localhost ~]# rm -rf /var/lib/mysql/* #還原時要清除數據庫目錄下的全部文件 [root@localhost ~]# mkdir /restore #準備一個預處理用的第三方目錄 [root@localhost ~]# cp -ra /backup/* /restore/ #把備份的數據拷貝到預處理用的目錄下 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/ #指定目錄進行預處理;徹底備份還原,不須要阻止日誌回滾,系統會自動回滾日誌 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/ #把處理過的備份還原(拷貝)到數據庫目錄;xtrabackup會自動檢查mysql的配置文件,從而找到數據庫的目錄 [root@localhost ~]# ll /var/lib/mysql/ #會發現文件的全部者和所屬組都是當前系統默認用戶 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #更改數據庫目錄的全部文件的全部者和所屬組爲Mysql [root@localhost ~]# systemctl start mariadb #恢復服務 [root@localhost ~]# mysql -e 'show databases;' +--------------------+ | Database | +--------------------+ | information_schema | | db1 | | db2 | | db3 | | mysql | | performance_schema | +--------------------+

xtrabackup增量備份還原

備份

[root@centos7 ~]# yum install mariadb-server percon*.rpm #須要開啓epel源,有的包依賴於epel源 [root@centos7 ~]# systemctl start mariadb [root@centos7 ~]# mkdir /backup #建立備份目錄 [root@centos7 ~]# mysql MariaDB [(none)]> create database db1; MariaDB [(none)]> use db1; MariaDB [(none)]> create table t1(id int); #建立個空表 MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/base #建立徹底備份,base目錄自動生成 [root@centos7 ~]# mysql db1 MariaDB [db1]> insert t1 value(1),(2); MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base #建立基於base徹底備份的增量備份inc1 [root@centos7 ~]# mysql db1; MariaDB [db1]> insert t1 value(3),(4); MariaDB [db1]> select * from t1; >+------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 #建立基於inc1備份的增量備份inc2 [root@centos7 ~]# scp -r /backup/ 192.168.38.37:/ #把全部備份拷貝到遠程主機 [root@centos7 ~]# yum install mariadb-server percon*.rpm #須要開啓epel源,有的包依賴於epel源 [root@centos7 ~]# systemctl start mariadb [root@centos7 ~]# mkdir /backup #建立備份目錄 [root@centos7 ~]# mysql MariaDB [(none)]> create database db1; MariaDB [(none)]> use db1; MariaDB [(none)]> create table t1(id int); #建立個空表 MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/base #建立徹底備份,base目錄自動生成 [root@centos7 ~]# mysql db1 MariaDB [db1]> insert t1 value(1),(2); MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base #建立基於base徹底備份的增量備份inc1 [root@centos7 ~]# mysql db1; MariaDB [db1]> insert t1 value(3),(4); MariaDB [db1]> select * from t1; >+------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+ MariaDB [db1]> quit [root@centos7 ~]# xtrabackup --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1 #建立基於inc1備份的增量備份inc2 [root@centos7 ~]# scp -r /backup/ 192.168.38.37:/ #把全部備份拷貝到遠程主機

還原

[root@localhost ~]# yum install percona*.rpm -y [root@localhost ~]# systemctl stop mariadb #還原過程須要先暫停服務,中止用戶訪問 [root@localhost ~]# mkdir /restore #建立預處理備份的第三方目錄 [root@localhost ~]# cp -r /backup/* /restore/ #把備份拷貝到預處理目錄 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base #預處理徹底備份,禁止事務回滾 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base --incremental-dir=/restore/inc1 #把增量備份inc1預處理,而且和徹底備份合併 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/base --incremental-dir=/restore/inc2 #預處理增量備份inc2,inc2是最後一個增量備份,因此須要進行事務回滾,而且與徹底備份合併 [root@localhost ~]# rm -rf /var/lib/mysql/* #還原前,刪除數據庫目錄下的全部文件目錄 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/base #把預處理的備份還原(拷貝)到數據庫的目錄下 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #修改數據庫的全部文件的全部者所屬組爲Mysql;若是不修改,默認數據庫文件的全部者所屬組是備份時的當前用戶,啓動mysql服務時會形成數據庫服務沒法啓動 [root@localhost ~]# systemctl start mariadb [root@localhost ~]# mysql db1 MariaDB [db1]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+[root@localhost ~]# yum install percona*.rpm -y [root@localhost ~]# systemctl stop mariadb #還原過程須要先暫停服務,中止用戶訪問 [root@localhost ~]# mkdir /restore #建立預處理備份的第三方目錄 [root@localhost ~]# cp -r /backup/* /restore/ #把備份拷貝到預處理目錄 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base #預處理徹底備份,禁止事務回滾 [root@localhost ~]# xtrabackup --prepare --apply-log-only --target-dir=/restore/base --incremental-dir=/restore/inc1 #把增量備份inc1預處理,而且和徹底備份合併 [root@localhost ~]# xtrabackup --prepare --target-dir=/restore/base --incremental-dir=/restore/inc2 #預處理增量備份inc2,inc2是最後一個增量備份,因此須要進行事務回滾,而且與徹底備份合併 [root@localhost ~]# rm -rf /var/lib/mysql/* #還原前,刪除數據庫目錄下的全部文件目錄 [root@localhost ~]# xtrabackup --copy-back --target-dir=/restore/base #把預處理的備份還原(拷貝)到數據庫的目錄下 [root@localhost ~]# chown -R mysql:mysql /var/lib/mysql/ #修改數據庫的全部文件的全部者所屬組爲Mysql;若是不修改,默認數據庫文件的全部者所屬組是備份時的當前用戶,啓動mysql服務時會形成數據庫服務沒法啓動 [root@localhost ~]# systemctl start mariadb [root@localhost ~]# mysql db1 MariaDB [db1]> select * from t1; +------+ | id | +------+ | 1 | | 2 | | 3 | | 4 | +------+
相關文章
相關標籤/搜索