Linux 第72天 percona xtrabackup

Linux 第72天 percona xtrabackup

時間: 20181014

個人小站: www.winthcloud.top 歡迎大家來評論留言

目錄

xtrabackup工具備份數據庫原理、特點、提供商、

xtrabackup備份選項

xtrabackup prepare

xtrabackup還原選項

xtrabackup還原注意理項

備份生成的相關文件

示例:舊版Xtrabackup完全備份及還原

示例:新版Xtrabackup完全備份及還原

示例:舊版Xtrabackup完全,增量備份及還原

示例:新版Xtrabackup完全,增量備份及還原

示例: Xtrabackup單表導出和導入

總結


xtrabackup工具備份數據庫

此工具備份原理是基於硬盤塊的備份mysql數據庫啓動或非啓動狀態不影響備份,可以直接熱

備份,此工具的增量備份原理是每次備份所依賴的原備份文件會將每個塊文件做一個數值當

新的增量備份數值如果大於原來的數據塊時,則會將其再次複製備份,如果沒有則不會去備份


提供商

Percona 官網:www.percona.com

percona-server

InnoDB --> XtraDB

percona提供的mysql數據庫備份工具,惟一開源的能夠對innodb和xtradb數據庫

進行熱備的工具

手冊:https://www.percona.com/doc/percona-xtrabackup/LATEST/index.html


特點:

備份還原過程快速、可靠

備份過程不會打斷正在執行的事務

能夠基於壓縮等功能節約磁盤空間和流量

自動實現備份檢驗

開源,免費


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

innobackupex: Perl 腳本

xtrabackup: C/C++ 編譯的二進制

xbcrypt: 加解密

xbstream: 支持併發寫的流文件格式

xtrabackup 是用來備份 InnoDB 表的,不能備份非 InnoDB 表,和 MySQL Server 沒有交互

innobackupex 腳本用來備份非 InnoDB 表,同時會調用 xtrabackup 命令來備份 

InnoDB 表,還會和 MySQL Server 發送命令進行交互,如加全局讀鎖(FTWRL)、

獲取位點(SHOW SLAVE STATUS)等。即innobackupex是在 xtrabackup 

之上做了一層封裝實現的

雖然目前一般不用 MyISAM 表,只是 MySQL 庫下的系統表是 MyISAM 的,

因此備份基本都通過 innobackupex 命令進行



xtrabackup版本升級到2.4後,相比之前的2.1有了比較大的變化:innobackupex

功能全部集成到 xtrabackup 裏面,只有一個 binary程序,另外爲了兼容考慮,

innobackupex作爲 xtrabackup 的軟鏈接,即xtrabackup現在支持非Innodb表備份,

並且Innobackupex在下一版本中移除,建議通過xtrabackup替換innobackupex


xtrabackup安裝:yum install percona-xtrabackup 在EPEL源中

最新版本下載安裝:https://www.percona.com/downloads/XtraBackup/LATEST/


備份:innobackupex [option] BACKUP-ROOT-DIR

選項說明:www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html

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


Prepare:innobackupex --apply-log [option] BACKUP-DIR

選項說明:

--apply-log:一般情況下,在備份完成後,數據尚且不能用於恢復操作,因爲備份

的數據中可能會包含尚未提交的事務或已經提交但尚未同步至數據文件中的事

務。因此,此時數據文件仍處於不一致狀態。此選項作用是通過回滾未提交的事

務及同步已經提交的事務至數據文件使數據文件處於一致性狀態

--use-memory:和--apply-log選項一起使用,當prepare 備份時,做crash 

recovery分配的內存大小,單位字節,也可1MB,1M,1G,1GB等,推薦1G

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

--redo-only:此選項在prepare base full backup,

往其中合併增量備份時候使用,但不包括對最後一個增量備份的合併


還原:innobackupex --copy-back [選項] BACKUP-DIR

innobackupex --move-back [選項] [--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,

這些文件將屬於創建備份的用戶

chown -R mysql:mysql /data/mysql

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

--force-non-empty-directories:指定該參數時候,使得

innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的

文件不會被覆蓋。如果--copy-back和--move-back文件需要從備份目錄拷貝一個

在datadir已經存在的文件,會報錯失敗



備份生成的相關文件

使用innobakupex備份時,其會調用xtrabackup備份所有的InnoDB表,複製所有關於表結構

定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備

份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,

在備份時,innobackupex還會在備份目錄中創建如下文件:

(1)xtrabackup_info:innobackupex工具執行時的相關信息,包括版本,備份選項,

備份時長,備份LSN(log sequence number日誌序列號),BINLOG的位置

(2)xtrabackup_checkpoints:備份類型(如完全或增量)、備份狀態(如是否已經爲

prepared狀態)和LSN範圍信息,每個InnoDB頁(通常爲16k大小)都會包含一個日誌

序列號,即LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明

此頁面最近是如何發生改變的

(3)xtrabackup_binlog_info:MySQL服務器當前正在使用的二進制日誌文件及至備份

這一刻爲止二進制日誌事件的位置,可利用實現基於binlog的恢復

(4)backup-my.cnf:備份命令用到的配置選項信息

(5)xtrabackup_logfile:備份生成的日誌文件


示例:舊版Xtrabackup完全備份及還原


1 在原主機

innobackupex --user=root /backups

scp -r /backups/2018-02-23_11-55-57/ 目標主機:/data/

2 在目標主機

innobackupex --apply-log /data/2018-02-23_11-55-57/

systemctl stop mariadb

rm -rf /var/lib/mysql/*

innobackupex --copy-back /data/2018-02-23_11-55-57/

chown -R mysql.mysql /var/lib/mysql/

systemctl start mariadb


示例:新版Xtrabackup完全備份及還原

1 在原主機做完全備份到/data/backups

xtrabackup --backup --target-dir=/backups/

scp -r /backups/* 目標主機:/backups

2 在目標主機上

1)預準備:確保數據一致,提交完成的事務,回滾未完成的事務

xtrabackup --prepare --target-dir=/backups/

2)複製到數據庫目錄

注意:數據庫目錄必須爲空,MySQL服務不能啓動

xtrabackup --copy-back --target-dir=/backups/

3)還原屬性

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

4)啓動服務

systemctl start mariadb



示例:舊版Xtrabackup完全,增量備份及還原


1 在原主機

innobackupex /backups

mkdir /backups/inc{1,2}

修改數據庫內容

(下邊爲一條命令)

innobackupex --incremental /backups/inc1

--incremental-basedir=/backups/2018-02-23_14-21-42(完全備份生成的路徑)


再次修改數據庫內容

(下邊爲一條命令)

innobackupex --incremental /backups/inc2 

--incremental-basedir=/backups/inc1/2018-02-23_14-26-17 

(上次增量備份生成的路徑)


複製備份內容至要還原的機器上

scp -r /backups/* 目標主機:/data/


2 在目標主機

不啓動mariadb

刪除原數據庫

rm -rf /var/lib/mysql/*

合併增量備份到完全備份

innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/

innobackupex --apply-log --redo-only /data/2018-02-23_14-21-42/ 

--incremental-dir=/data/inc1/2018-02-23_14-26-17 (與上一行爲一條命令)


innobackupex --apply-log /data/2018-02-23_14-21-42/ 

--incremental-dir=/data/inc2/2018-02-23_14-28-29/ (與上一行爲一條命令)

恢復至備份數據至目標目錄

ls /var/lib/mysql/

innobackupex --copy-back /data/2018-02-23_14-21-42/

chown -R mysql.mysql /var/lib/mysql/

systemctl start mariadb



示例:新版Xtrabackup完全,增量備份及還原

1 備份過程

1)完全備份:xtrabackup --backup --target-dir=/backups/base

2)第一次修改數據

3)第一次增量備份

xtrabackup --backup --target-dir=/backups/inc1 

--incremental-basedir=/backups/base  (與上一行爲一條命令)

4)第二次修改數據


5)第二次增量

xtrabackup --backup --target-dir=/backups/inc2 

--incremental-basedir=/backups/inc1   (與上一行爲一條命令)

6)scp -r /backups/* 目標主機:/backups/

備份過程生成三個備份目錄

/backups/{base,inc1,inc2}



2還原過程

1)預準備完成備份,此選項--apply-log-only阻止回滾未提完成的事務

xtrabackup --prepare --apply-log-only --target-dir=/backups/base

2)合併第1次增量備份到完全備份,

xtrabackup --prepare --apply-log-only --target-dir=/backups/base 

--incremental-dir=/backups/inc1  (與上一行爲一條命令)


3)合併第2次增量備份到完全備份:最後一次還原不需要加選項--apply-log-only

xtrabackup --prepare --target-dir=/backups/base 

--incremental-dir=/backups/inc2  (與上一行爲一條命令)

4)複製到數據庫目錄,注意數據庫目錄必須爲空,MySQL服務不能啓動

xtrabackup --copy-back --target-dir=/data/backups/base


5)還原屬性:chown -R mysql:mysql /var/lib/mysql

6)啓動服務:systemctl start mariadb



示例: Xtrabackup單表導出和導入


1 單表備份

innobackupex --include='hellodb.students' /backups

2備份表結構

mysql -e 'show create table hellodb.students' > student.sql

3刪除表

mysql -e 'drop table hellodb.students‘

4 整理所導出的表格

innobackupex --apply-log --export /backups/2018-02-23_15-03-23/


5 創建表(這步所用的正是剛剛備份的student.sql)

mysql>CREATE TABLE `students` (

`StuID` int(10) unsigned NOT NULL AUTO_INCREMENT,

`Name` varchar(50) NOT NULL,

`Age` tinyint(3) unsigned NOT NULL,

`Gender` enum('F','M') NOT NULL,

`ClassID` tinyint(3) unsigned DEFAULT NULL,

`TeacherID` int(10) unsigned DEFAULT NULL,

PRIMARY KEY (`StuID`)

) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8


6 刪除表空間

alter table students discard tablespace;

cp /backups/2018-02-23_15-03-23/hellodb/students.{cfg,exp,ibd}

/var/lib/mysql/hellodb/   (與上一行爲一條命令)

8 chown -R mysql.mysql /var/lib/mysql/hellodb/

9 mysql>alter table students import tablespace;


總結

使用xtrabackpu還原文件--apply-log-only必須要加不然會將事務日誌裏的內容丟失


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章