1. 程式人生 > 實用技巧 >XtraBackup 備份與恢復例項講解

XtraBackup 備份與恢復例項講解

閱讀目錄

前一篇文章我們講到了PXB的原理以及安裝方法,接下來將詳細介紹 XtraBackup 備份和恢復的具體過程。

回到頂部

xtrabackup 選項

xtrabackup 工具有許多引數,具體可去官網查詢(xtrabackup 引數選項|innobackupex 引數選項),這裡簡單介紹 innobackupex 一些常用的引數。

1) innobackupex 引數選項

--defaults-file=[MY.CNF] //指定配置檔案:只能從給定的檔案中讀取預設選項。 且必須作為命令列上的第一個選項;必須是一個真實的檔案,它不能是一個符號連結。

--databases=# //指定備份的資料庫和表,格式為:--databases="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 檔案。

--decompress //解壓縮qp檔案,為了解壓縮,必須安裝 qpress 工具。 Percona XtraBackup不會自動刪除壓縮檔案,為了清理備份目錄,使用者應手動刪除 * .qp檔案:find /data/backup -name "*.qp" | xargs rm。

--no-timestamp //指定了這個選項備份將會直接儲存在 BACKUP-DIR 目錄,不再建立時間戳資料夾。

--apply-log //應用 BACKUP-DIR 中的 xtrabackup_logfile 事務日誌檔案。一般情況下,在備份完成後,資料尚且不能用於恢復操作,因為備份的資料中可能會包含尚未提交的事務或已經提交但尚未同步至資料檔案中的事務。因此,此時資料檔案仍處於不一致狀態。“準備”的主要作用正是通過回滾未提交的事務及同步已經提交的事務至資料檔案使得資料檔案處於一致性狀態。

--use-memory=# //此選項接受一個字元引數(1M/1MB,1G/1GB,預設100M),僅與--apply-log一起使用,該選項指定prepare時用於崩潰恢復(crash-recovery)的記憶體。

--copy-back //拷貝先前備份所有檔案到它們的原始路徑。但原路徑下不能有任何檔案或目錄,除非指定 --force-non-empty-directories 選項。

--force-non-empty-directories //恢復時指定此選項,可使 --copy-back 和 --move-back 複製檔案到非空目錄,即原data目錄下可以有其他檔案,但是不能有與恢復檔案中同名的檔案,否則恢復失敗。

--rsync //此選項可優化本地檔案(非InnoDB)的傳輸。rsync工具一次性拷貝所有非InnoDB檔案,而不是為每個檔案單獨建立cp,在備份恢復很多資料庫和表時非常高效。此選項不能和 --stream 一起使用。

--incremental //這個選項告訴 xtrabackup 建立一個增量備份,而不是完全備份。它傳遞到 xtrabackup 子程序。當指定這個選項,可以設定 --incremental-lsn 或 --incremental-basedir。如果這2個選項都沒有被指定,--incremental-basedir 傳遞給 xtrabackup 預設值,預設值為:基礎備份目錄的第一個時間戳備份目錄。

--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) xtrabackup 引數選項

--apply-log-only //這個選項使在準備備份(prepare)時,只執行重做(redo)階段,這對於增量備份非常重要。

回到頂部

xtrabackup 全量備份恢復

1. 完全備份

建立用於備份恢復的使用者 pxb 並賦予許可權

mysql> create user pxb@'localhost' identified by '123456';
mysql> grant reload,process,lock tables,replication client on *.* to pxb@localhost;

建立存放目錄

[root@centos6 mysql]# mkdir -pv /data/pxb
mkdir: 已建立目錄 "/data"
mkdir: 已建立目錄 "/data/pxb"

進行資料庫全備

[root@centos6 pxb]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock  /data/pxb                                                                                                               

170424 02:46:11 innobackupex: Starting the backup operation

IMPORTANT: Please check that the backup run completes successfully.
           At the end of a successful backup run innobackupex
           prints "completed OK!".
…………

170424 02:46:12 >> log scanned up to (2627779)
170424 02:46:13 Executing FLUSH NO_WRITE_TO_BINLOG TABLES...
170424 02:46:13 Executing FLUSH TABLES WITH READ LOCK...
170424 02:46:13 Starting to backup non-InnoDB tables and files
…………
170424 02:46:15 Executing FLUSH NO_WRITE_TO_BINLOG ENGINE LOGS...
xtrabackup: The latest check point (for incremental): '2627770'
xtrabackup: Stopping log copying thread.
.170424 02:46:15 >> log scanned up to (2627779)

170424 02:46:15 Executing UNLOCK TABLES
170424 02:46:15 All tables unlocked
170424 02:46:15 [00] Copying ib_buffer_pool to /data/pxb/2017-04-24_02-46-11/ib_buffer_pool
170424 02:46:15 [00]        ...done
170424 02:46:15 Backup created in directory '/data/pxb/2017-04-24_02-46-11/'
MySQL binlog position: filename 'mysql-bin.000002', position '2628'
170424 02:46:15 [00] Writing backup-my.cnf
170424 02:46:15 [00]        ...done
170424 02:46:15 [00] Writing xtrabackup_info
170424 02:46:15 [00]        ...done
xtrabackup: Transaction log of lsn (2627770) to (2627779) was copied.
170424 02:46:15 completed OK!

可以看到整個備份過程:連線資料庫,開始拷貝redo log,拷貝innodb表文件,鎖表、拷貝非innodb表文件,停止拷貝redo log,解鎖。

檢視生成的檔案:

[root@centos6 pxb]# ll 2017-04-24_02-46-11/
總用量 12340
-rw-r----- 1 root root      427 4月  24 02:46 backup-my.cnf
-rw-r----- 1 root root      358 4月  24 02:46 ib_buffer_pool
-rw-r----- 1 root root 12582912 4月  24 02:46 ibdata1
drwxr-x--- 2 root root     4096 4月  24 02:46 mysql
drwxr-x--- 2 root root     4096 4月  24 02:46 performance_schema
drwxr-x--- 2 root root    12288 4月  24 02:46 sys
drwxr-x--- 2 root root     4096 4月  24 02:46 test
drwxr-x--- 2 root root     4096 4月  24 02:46 test1
-rw-r----- 1 root root       22 4月  24 02:46 xtrabackup_binlog_info
-rw-r----- 1 root root      113 4月  24 02:46 xtrabackup_checkpoints
-rw-r----- 1 root root      518 4月  24 02:46 xtrabackup_info
-rw-r----- 1 root root     2560 4月  24 02:46 xtrabackup_logfile

其中,mysql/, performance_schema/, sys/ ,test/ ,test1/ 下存放的是資料庫檔案。

backup-my.cnf,備份命令用到的配置選項資訊;

[root@centos6 2017-04-24_02-46-11]# cat backup-my.cnf 
# This MySQL options file was generated by innobackupex.

# The MySQL server
[mysqld]
innodb_checksum_algorithm=innodb
innodb_log_checksum_algorithm=strict_crc32
innodb_data_file_path=ibdata1:12M:autoextend
innodb_log_files_in_group=2
innodb_log_file_size=50331648
innodb_fast_checksum=false
innodb_page_size=16384
innodb_log_block_size=512
innodb_undo_directory=./
innodb_undo_tablespaces=0
server_id=153

redo_log_version=1

ib_buffer_pool, buffer pool 中的熱資料,當設定 innodb_buffer_pool_dump_at_shutdown=1 ,在關閉 MySQL 時,會把記憶體中的熱資料儲存在磁盤裡 ib_buffer_pool 檔案中,位於資料目錄下。

ibdata1,備份的共享表空間檔案;

xtrabackup_binlog_info,mysql伺服器當前正在使用的二進位制日誌檔案及至備份這一刻為止二進位制日誌事件的位置;

[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_binlog_info
mysql-bin.000002    2628

xtrabackup_checkpoints,備份型別(如完全或增量)、備份狀態(如是否已經為prepared狀態)和LSN(日誌序列號)範圍資訊;

[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_checkpoints
backup_type = full-backuped
from_lsn = 0
to_lsn = 2627770
last_lsn = 2627779
compact = 0
recover_binlog_info = 0

xtrabackup_info,記錄備份的基本資訊,uuid、備份命令、備份時間、binlog、LSN、以及其他加密壓縮等資訊。

[root@centos6 2017-04-24_02-46-11]# cat xtrabackup_info
uuid = 216881a3-2855-11e7-bc84-080027b387ba
name = 
tool_name = innobackupex
tool_command = --defaults-file=/etc/my.cnf --user=pxb --password=... --socket=/tmp/mysql.sock /data/pxb
tool_version = 2.4.6
ibbackup_version = 2.4.6
server_version = 5.7.10-log
start_time = 2017-04-24 02:46:11
end_time = 2017-04-24 02:46:15
lock_time = 0
binlog_pos = filename 'mysql-bin.000002', position '2628'
innodb_from_lsn = 0
innodb_to_lsn = 2627770
partial = N
incremental = N
format = file
compact = N
compressed = N
encrypted = N

xtrabackup_logfile,備份的重做日誌檔案。

2. 全備恢復

關閉資料庫並刪除資料檔案

[root@centos6 data]# /etc/init.d/mysqld stop
Shutting down MySQL..                                      [確定]
[root@centos6 mysql]# cd /home/mysql
[root@centos6 mysql]# mv data/ data_bak/
[root@centos6 mysql]# mkdir data

準備(prepare)一個完全備份: --apply-log ( /data/pxb/2017-04-24_02-46-11/ 為備份目錄,執行之後 xtrabackup_checkpoints 檔案中的backup_type = full-prepared)

[root@centos6 mysql]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/
170424 15:50:20 innobackupex: Starting the apply-log operation

IMPORTANT: Please check that the apply-log run completes successfully.
           At the end of a successful apply-log run innobackupex
           prints "completed OK!".

…………

InnoDB: 5.7.13 started; log sequence number 2628117
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 2628136
170424 15:50:24 completed OK!

執行恢復操作:

[root@centos6 2017-04-24_02-46-11]# innobackupex  --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2017-04-24_02-46-11/
170424 16:02:26 innobackupex: Starting the copy-back operation

IMPORTANT: Please check that the copy-back run completes successfully.
           At the end of a successful copy-back run innobackupex
           prints "completed OK!".

innobackupex version 2.4.6 based on MySQL server 5.7.13 Linux (x86_64) (revision id: 8ec05b7)
170424 16:02:26 [01] Copying ib_logfile0 to /home/mysql/data/ib_logfile0
170424 16:02:26 [01]        ...done
170424 16:02:26 [01] Copying ib_logfile1 to /home/mysql/data/ib_logfile1
170424 16:02:26 [01]        ...done
170424 16:02:26 [01] Copying ibdata1 to /home/mysql/data/ibdata1
170424 16:02:26 [01]        ...done

……

170424 16:02:31 [01] Copying ./xtrabackup_info to /home/mysql/data/xtrabackup_info
170424 16:02:31 [01]        ...done
170424 16:02:31 [01] Copying ./xtrabackup_binlog_pos_innodb to /home/mysql/data/xtrabackup_binlog_pos_innodb
170424 16:02:31 [01]        ...done
170424 16:02:31 completed OK!

更改 data/ 目錄許可權並啟動mysql:

[root@centos6 mysql]# chown -R mysql.mysql data/
[root@centos6 data]# /etc/init.d/mysqld start
Starting MySQL.                                            [確定]

可以看到資料庫和表均已恢復:

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| test1              |
+--------------------+
6 rows in set (0.00 sec)
回到頂部

xtrabackup 增量備份恢復

我們以之前做的全備為基準,在其基礎上做增量備份:

##新建一張表,並插入資料作為增量##
mysql> create table tb2 (id int,name varchar(40)); Query OK, 0 rows affected (0.06 sec) mysql> insert into tb2 values (1,'aaa'),(2,'bbb'),(3,'ccc'),(26,'zzz'); Query OK, 4 rows affected (0.01 sec) Records: 4 Duplicates: 0 Warnings: 0 mysql> select * from tb2; +------+------+ | id | name | +------+------+ | 1 | aaa | | 2 | bbb | | 3 | ccc | | 26 | zzz | +------+------+ 4 rows in set (0.00 sec)

增量備份1:( 以全備為基準:/data/pxb/2017-04-24_02-46-11/)

[root@centos6 pxb]# innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock --incremental /data/pxb/inc --incremental-basedir=/data/pxb/2017-04-24_02-46-11/ --parallel=2

[root@centos6 2017-04-28_01-09-40]# cat xtrabackup_checkpoints 
backup_type = incremental    ##說明是增量備份
from_lsn = 2627770
to_lsn = 2636739
last_lsn = 2636748
compact = 0
recover_binlog_info = 0

再往 tb2 裡插入資料:

mysql> insert into tb2 values (201,'aaa'),(202,'bbb'),(203,'ccc'),(326,'zzz');
Query OK, 4 rows affected (0.12 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> 
mysql> select * from tb2; 
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|   26 | zzz  |
|  201 | aaa  |
|  202 | bbb  |
|  203 | ccc  |
|  326 | zzz  |
+------+------+
8 rows in set (0.00 sec)

增量備份2:( 以增量1為基準:/data/pxb/inc/2017-04-28_01-09-40/)

innobackupex --defaults-file=/etc/my.cnf --user=pxb --password=123456 --socket=/tmp/mysql.sock --incremental /data/pxb/inc --incremental-basedir=/data/pxb/inc/2017-04-28_01-09-40/ --parallel=2

[root@centos6 2017-04-28_01-27-46]# cat xtrabackup_checkpoints 
backup_type = incremental
from_lsn = 2636739
to_lsn = 2643563
last_lsn = 2643572
compact = 0
recover_binlog_info = 0

增量備份的恢復

增量備份的恢復需要有3個步驟

  1. 恢復完全備份
  2. 恢復增量備份到完全備份(開始恢復的增量備份要新增--redo-only引數,到最後一次增量備份要去掉--redo-only)
  3. 對整體的完全備份進行恢復,回滾未提交的資料
 ##準備一個全備##
[root@centos6 pxb]# innobackupex --apply-log --redo-only /data/pxb/2017-04-24_02-46-11/ xtrabackup: starting shutdown with innodb_fast_shutdown = 1 InnoDB: Starting shutdown... InnoDB: Shutdown completed; log sequence number 2628145 InnoDB: Number of pools: 1 170428 01:33:52 completed OK! ##將增量1應用到完全備份## [root@centos6 pxb]# innobackupex --apply-log --redo-only /data/pxb/2017-04-24_02-46-11/ --incremental-dir=/data/pxb/inc/2017-04-28_01-09-40/ ##將增量2應用到完全備份,注意不加 --redo-only 引數了## [root@centos6 pxb]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/ --incremental-dir=/data/pxb/inc/2017-04-28_01-27-46/ ##把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的資料## [root@centos6 pxb]# innobackupex --apply-log /data/pxb/2017-04-24_02-46-11/ xtrabackup: Log applied to lsn 2628145 xtrabackup: The intended lsn is 2643563

模擬測試:

mysql> drop table tb2;
Query OK, 0 rows affected (0.05 sec)

[root@centos6 mysql]# /etc/init.d/mysqld stop
[root@centos6 mysql]# mv data data_bak2
[root@centos6 mysql]# mkdir data
innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/pxb/2017-04-24_02-46-11/
[root@centos6 mysql]# chown -R mysql:mysql data/
[root@centos6 mysql]# /etc/init.d/mysqld start

##資料已經恢復##
mysql> select * from tb2;
+------+------+
| id   | name |
+------+------+
|    1 | aaa  |
|    2 | bbb  |
|    3 | ccc  |
|   26 | zzz  |
|  201 | aaa  |
|  202 | bbb  |
|  203 | ccc  |
|  326 | zzz  |
+------+------+
8 rows in set (0.01 sec)

轉自https://www.cnblogs.com/waynechou/p/xtrabackup_backup.html#_label1