mysql數據庫-備份與還原-Percona XtraBackup 2.4備份工具使用



xtrabackup 數據庫備份工具是由percona提供的mysql數據庫備份工具,目前惟一開源的能夠對innodb和xtradb數據庫進行熱備的工具

Percona XtraBackup 2.4 - Documentation

Percona XtraBackup is an open-source hot backup utility for MySQL - based servers that doesn’t lock your database during the backup.

It can back up data from InnoDB, XtraDB, and MyISAM tables on MySQL 5.1 [1], 5.5, 5.6 and 5.7 servers, as well as Percona Server for MySQL with XtraDB.

For a high-level overview of many of its advanced features, including a feature comparison, please see About Percona XtraBackup.

Whether it is a 24x7 highly loaded server or a low-transaction-volume environment, Percona XtraBackup is designed to make backups a seamless procedure without disrupting the performance of the server in a production environment. Commercial support contracts are available.
  • 由於場景限制,以下內容為Percona XtraBackup 2.4版本的內容

xtrabackup 特點

  1. InnoDB熱備份、增量備份支持
  2. 可直接備份數據到其他數據庫服務器上
  3. 備份MySQL過程不增加服務器負載
  4. 備份還原過程快速、可靠
  5. 備份過程不會打斷正在執行的事務
  6. 能夠基於壓縮等功能節約磁盤空間和流量
  7. 自動實現備份檢驗
  8. 基於時間點恢復

備份生成的相關文件

使用innobackupex備份時,其會調用xtrabackup備份所有的InnoDB表,復制所有關於表結構定義的相關文件(.frm)、以及MyISAM、MERGE、CSV和ARCHIVE表的相關文件,同時還會備份觸發器和數據庫配置信息相關的文件。這些文件會被保存至一個以時間命名的目錄中,在備份時,innobackupex還會在備份目錄中創建如下文件:

  • xtrabackup_info:文本文件,innobackupex工具執行時的相關信息,包括版本,備份選項,備份時長,備份LSN(log sequence number日志序列號),BINLOG的位置
  • xtrabackup_checkpoints:文本文件,備份類型(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN范圍信息,每個InnoDB頁(通常為16k大小)都會包含一個日志序列號LSN。LSN是整個數據庫系統的系統版本號,每個頁面相關的LSN能夠表明此頁面最近是如何發生改變的
  • xtrabackup_binlog_info:文本文件,MySQL服務器當前正在使用的二進制日志文件及至備份這一刻為止二進制日志事件的位置,可利用實現基於binlog的恢復
  • backup-my.cnf:文本文件,備份命令用到的配置選項信息
  • xtrabackup_logfile:備份生成的二進制日志文件

xtrabackup 安裝

wget -P /tmp/ https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm

yum -y localinstall /tmp/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm qpress

# rpm -ql percona-xtrabackup-24.x86_64
/usr/bin/innobackupex
/usr/bin/xbcloud
/usr/bin/xbcloud_osenv
/usr/bin/xbcrypt
/usr/bin/xbstream
/usr/bin/xtrabackup
/usr/lib64/xtrabackup/plugin/keyring_file.so
/usr/lib64/xtrabackup/plugin/keyring_vault.so
/usr/share/doc/percona-xtrabackup-24-2.4.22
/usr/share/doc/percona-xtrabackup-24-2.4.22/LICENSE
/usr/share/man/man1/innobackupex.1.gz
/usr/share/man/man1/xbcrypt.1.gz
/usr/share/man/man1/xbstream.1.gz
/usr/share/man/man1/xtrabackup.1.gz

xtrabackup 用法

https://www.percona.com/doc/percona-xtrabackup/LATEST/genindex.html

  1. 備份:對數據庫做完全或增量備份
  2. 預准備: 還原前,先對備份的數據,整理至一個臨時目錄
  3. 還原:將整理好的數據,復制回數據庫目錄中

1 備份

# innobackupex --help
--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

2 預備份

# 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,往其中合並增量備份時候使用,但不包括對最后一個增量備份的合並

3 還原

innobackupex --copy-back [選項] BACKUP-DIR
innobackupex --move-back [選項] [--defaults-group=GROUP-NAME] BACKUP-DIR

--copy-back:#做數據恢復時將備份數據文件拷貝到MySQL服務器的datadir
--move-back:#這個選項與--copy-back相似,唯一的區別是它不拷貝文件,而是移動文件到目的地。這個選項移除backup文件,用時候必須小心。使用場景:沒有足夠的磁盤空間同事保留數據文件和Backup副本
--force-non-empty-directories #指定該參數時候,使得innobackupex --copy-back或--move-back選項轉移文件到非空目錄,已存在的文件不會被覆蓋。如果--copy-back和--move-back文件需要從備份目錄拷貝一個在datadir已經存在的文件,會報錯失敗

4 其他

還原注意事項

  1. datadir 目錄必須為空。除非指定innobackupex --force-non-empty-directorires選項指定,否則--copy-back選項不會覆蓋
  2. 在restore之前,必須shutdown MySQL實例,不能將一個運行中的實例restore到datadir目錄中
  3. 由於文件屬性會被保留,大部分情況下需要在啟動實例之前將文件的屬主改為mysql,這些文件將屬於創建備份的用戶, 執行chown -R mysql:mysql /data/mysql,以上需要在用戶調用innobackupex之前完成

xtrabackup實現完全備份及還原

1 安裝xtrabackup備份工具

wget -P /tmp/ https://downloads.percona.com/downloads/Percona-XtraBackup-2.4/Percona-XtraBackup-2.4.22/binary/redhat/7/x86_64/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm

yum -y localinstall /tmp/percona-xtrabackup-24-2.4.22-1.el7.x86_64.rpm qpress
# install qpress error see PS:1

2 完全備份

mkdir /backup
xtrabackup -uroot -p123456 --backup --target-dir=/backup/base

3 預准備數據

釋義參見PS:4

# scp -r /backup/  目標主機:/    # 拷貝數據到還原主機上
# 預准備:確保數據一致,提交完成的事務,回滾未完成的事務
xtrabackup --prepare --target-dir=/backup/base

4 還原數據

# 1 復制到數據庫目錄
## 數據庫目錄必須為空,MySQL服務不能啟動,必要時可使用 rm  -rf /var/lib/mysql/*
xtrabackup --copy-back --target-dir=/backup/base

# 2 還原文件屬性
chown -R mysql:mysql /var/lib/mysql/

# 3 啟動數據庫服務驗證
service mysqld start

xtrabackup增量備份及還原

備份操作

# 創建備份根目錄
mkdir /backup

# 第一次完全備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/base
# 第一次增量備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/base
# 第二次增量備份
xtrabackup -uroot -p123456 --backup --target-dir=/backup/inc2 --incremental-basedir=/backup/inc1

# 拷貝備份數據到目標機器上准備還原
scp -r /backup/* 目標主機:/bakcup/

還原操作

# 預准備完成備份,此選項--apply-log-only 不回滾未完成的事務
xtrabackup --prepare --apply-log-only --target-dir=/backup/base
# 合並第1次增量備份到完全備份
xtrabackup --prepare --apply-log-only --target-dir=/backup/base --incremental-dir=/backup/inc1
# 合並第2次增量備份到完全備份,最后一次備份的還原不需要加選項--apply-log-only
xtrabackup --prepare --target-dir=/backup/base --incremental-dir=/backup/inc2
# 復制到數據庫目錄
xtrabackup --copy-back --target-dir=/backup/base
# 按需還原文件屬性
chown -R mysql:mysql /var/lib/mysql
# 啟動服務
service mysqld start

xtrabackup單表導出和導入

#導出
# 1 單表備份
innobackupex  -uroot -p123456 --include='hellodb.students' /backup
# 2備份表結構
mysql -e 'show create table hellodb.students' > student.sql
# 3刪除表
mysql -e 'drop table hellodb.students'

# 導出數據
# 4 innobackupex  --apply-log --export /backups/2000-01-01_01-01-01/
# 5 創建表
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/2000-01-01_01-01-01/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;

PS

1. install qpress

To be able to make compressed backups, install the qpress package

wget http://www.quicklz.com/qpress-11-linux-x64.tar
tar xvf qpress-11-linux-x64.tar
cp qpress /usr/bin

2. 查看xtrabackup備份相關文件

cat /backup/inc1/xtrabackup_info
cat /backup/inc1/xtrabackup_checkpoints
cat /backup/inc1/xtrabackup_binlog_info

3.舊版xtrabackup備份指令

# 備份
mkdir /backup/inc{1,2}
innobackupex  --incremental /backup/inc1 --incremental-basedir=/backup/2000-01-01_01-01-01 # (完全備份生成的路徑)
innobackupex  --incremental /backup/inc2 --incremental-basedir=/backup/inc1/2000-01-01_01-02-02 #(上次增量備份生成的路徑)

# 預准備
innobackupex --apply-log --redo-only /data/2000-01-01_01-01-01/
innobackupex --apply-log --redo-only /2000-01-01_01-01-01/ --incremental-dir=/data/inc1/2000-01-01_01-02-02
innobackupex --apply-log /data/2000-01-01_01-01-01/ --incremental-dir=/data/inc2/2000-01-01_01-03-03/

# 還原
innobackupex  --copy-back /data/2000-01-01_01-01-01/

4. 預准備數據回滾理解

基於xtrabackup的備份原理,熱備份基於數據庫的lLSN事件記錄判斷數據記錄是否提交成功落盤,每次備份只要確認哪些事務被成功提交

所以每次的增量備份都把這些記錄還原到總的預准備數據中,不需要把准備的數據中未提交的事務回滾,后續備份中有中斷的事務的記錄可以補全半提交事務

最后一次增量備份添加進入總的預准備的數據中需要回滾未提交的事務,因為后面沒有關於未提交事務的信息,也就需要回滾未提交的,以免產生數據沖突,然后才可以直接應用數據

5.結合binlog文件實現高精度數據恢復

結合PS:4所述,最終還是會有部分未執行完全的事務被丟棄,也就是有部分數據被丟棄,如果需要高精度的數據還原,就需要結合binlog做高精度還原

# 查看備份文件中的binlog文件名(確認預備份文件備份記錄到什么位置)
cat xtrabackup_binlog_info

# 找到對於故障數據庫的對應binlog文件,並導出增量sql
mysqlbinlog /backup/xxx-bin.000088 --start-position=xxxxx > /tmp/inc.sql

# 關閉二進制binlog日志,還原增量數據
show master logs;
set sql_log_bin=off;
source /tmp/inc.sql
set sql_log_bin=on;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM