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;
7
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必須要加不然會將事務日誌裡的內容丟失