xtrabackup的官方下載地址為
http://www.percona.com/software/percona-xtrabackup。
xtrabackup包含兩個主要的工具,即xtrabackup和innobackupex,二者區別如下:
1 xtrabackup只能備份innodb和xtradb兩種引擎的表,而不能備份myisam引擎的表;
2 innobackupex是一個封裝了xtrabackup的Perl腳本,支持同時備份innodb和myisam,但在對myisam備份時需要加一個全局的讀鎖。還有就是myisam不支持增量備份。
innobackupex工具的備份過程原理圖
如圖,備份開始的時候
1 首先會啟動一個xtrabackup_log后台檢測的進程,實時檢測mysql redo的變化,一旦發現redo有新的日志寫入,立刻將日志寫入到日志文件xtrabackup_log中
2 復制innodb的數據文件和系統表空間文件idbdata1到對應的以默認時間戳為備份目錄的地方
3 復制結束后,執行flush table with read lock操作
4 復制.frm .myd .myi文件
5 並且在這一時刻獲得binary log 的位置
6 將表進行解鎖unlock tables
7 停止xtrabackup_log進程
全庫恢復的過程
這一階段會啟動xtrabackup內嵌的innodb實例,將xtrabackup日志xtrabackup_Log進行回放,將提交的事務信息變更應用到innodb數據或表空間,同時回滾未提交的事務
增量備份
增量備份主要是通過拷貝innodb中有變更的頁(指的是LSN大於xtrabackup_checkpoints中的LSN號)。增量備份是基於全備的,第一次增量備份的數據是基於上一次全備,之后的每一次增倍都是基於上一次的增倍,最終達到一致性的增倍,增倍的過程中,和全備很類似,區別在於第二步
增量備份的恢復
和全庫恢復類似,也需要兩步
1 數據文件的恢復 分3部分 全備 增量備份和xtrabackup_log
2 對未提交事務的回滾
=================================================================================
innobackupex的使用案例
rpm -Uhv http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
yum -y install percona-xtrabackup
1 創建備份用戶
mysql> grant reload,lock tables,replication client on *.* to 'dbbak'@'localhost' identified by 'bk2016' ; mysql> flush privileges;
進行數據庫全備
mkdir -pv /data/dbbak cd /data/dbbak
使用以下參數進行全庫備份
[root@MASTER_03 dbbak]# innobackupex --defaults-file=/etc/my.cnf --user=dbbak --password=bk2016 --socket=/data/3306/tmp/mysql.sock /data/dbbak/
xtrabackup: Stopping log copying thread.
.160204 00:36:20 >> log scanned up to (1095197210)
160204 00:36:20 Executing UNLOCK TABLES
160204 00:36:20 All tables unlocked
160204 00:36:20 Backup created in directory '/data/dbbak//2016-02-04_00-35-36'
MySQL binlog position: filename 'mysql-bin.000011', position '1338619'
160204 00:36:20 [00] Writing backup-my.cnf
160204 00:36:20 [00] ...done
160204 00:36:20 [00] Writing xtrabackup_info
160204 00:36:20 [00] ...done
xtrabackup: Transaction log of lsn (1095197210) to (1095197210) was copied.
160204 00:36:20 completed OK!說明備份成功
查看對應生成的文件
[root@MASTER_03 dbbak]# ll 2016-02-04_00-35-36/
total 1048648
-rw-r-----. 1 root root 387 Feb 4 00:36 backup-my.cnf
-rw-r-----. 1 root root 1073741824 Feb 4 00:35 ibdata1
drwx------. 2 root root 4096 Feb 4 00:36 iot
drwx------. 2 root root 12288 Feb 4 00:36 iot2
drwx------. 2 root root 4096 Feb 4 00:36 iot3
drwx------. 2 root root 4096 Feb 4 00:36 lsn
drwx------. 2 root root 4096 Feb 4 00:36 mysql
drwx------. 2 root root 4096 Feb 4 00:36 performance_schema
drwx------. 2 root root 4096 Feb 4 00:36 sakila
drwx------. 2 root root 4096 Feb 4 00:36 sbtest
drwx------. 2 root root 4096 Feb 4 00:36 test
drwx------. 2 root root 4096 Feb 4 00:36 xtrabackup0219
-rw-r-----. 1 root root 25 Feb 4 00:36 xtrabackup_binlog_info
-rw-r-----. 1 root root 119 Feb 4 00:36 xtrabackup_checkpoints
-rw-r-----. 1 root root 539 Feb 4 00:36 xtrabackup_info
-rw-r-----. 1 root root 2560 Feb 4 00:36 xtrabackup_logfile
需要注意的幾個文件
[root@MASTER_03 dbbak]# cat 2016-02-04_00-35-36/xtrabackup_checkpoints
backup_type = full-backuped ###全備
from_lsn = 0
to_lsn = 1095197210
last_lsn = 1095197210 #####LSN號
compact = 0
recover_binlog_info = 0
[root@MASTER_03 dbbak]# cat 2016-02-04_00-35-36/xtrabackup_binlog_info
mysql-bin.000011 1338619
刪掉某個數據庫,進行全庫恢復
mysql> drop database iot2; Query OK, 49 rows affected (7.93 sec)
關閉數據庫
[root@MASTER_03 dbbak]# /etc/init.d/mysqld stop
Shutting down MySQL.......... SUCCESS!
[root@MASTER_03 dbbak]# mv /data/3306/data /data/3306/data_bak
[root@MASTER_03 dbbak]# mkdir /data/3306/data
恢復
[root@MASTER_03 dbbak]# innobackupex --apply-log /data/dbbak/2016-02-04_00-35-36/
160204 00:56:47 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!".
innobackupex version 2.3.3 based on MySQL server 5.6.24 Linux (x86_64) (revision id: 525ca7d)
xtrabackup: cd to /data/dbbak/2016-02-04_00-35-36/
xtrabackup: This target seems to be not prepared yet.
xtrabackup: xtrabackup_logfile detected: size=2097152, start_lsn=(1095197210)
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = ./
xtrabackup: innodb_data_file_path = ibdata1:1G:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 2097152
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = ./
xtrabackup: innodb_data_file_path = ibdata1:1G:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 1
xtrabackup: innodb_log_file_size = 2097152
xtrabackup: Starting InnoDB instance for recovery.
xtrabackup: Using 104857600 bytes for buffer pool (set by --use-memory parameter)
InnoDB: Using atomics to ref count buffer pool pages
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Memory barrier is not used
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, size = 100.0M
InnoDB: Completed initialization of buffer pool
InnoDB: Highest supported file format is Barracuda.
InnoDB: The log sequence numbers 532847032 and 532847032 in ibdata files do not match the log sequence number 1095197210 in the ib_logfiles!
InnoDB: Database was not shutdown normally!
InnoDB: Starting crash recovery.
InnoDB: Reading tablespace information from the .ibd files...
InnoDB: Restoring possible half-written data pages
InnoDB: from the doublewrite buffer...
InnoDB: 128 rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: 5.6.24 started; log sequence number 1095197210
xtrabackup: Last MySQL binlog file position 1337268, file name mysql-bin.000011
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1095198530
xtrabackup: using the following InnoDB configuration for recovery:
xtrabackup: innodb_data_home_dir = ./
xtrabackup: innodb_data_file_path = ibdata1:1G:autoextend
xtrabackup: innodb_log_group_home_dir = ./
xtrabackup: innodb_log_files_in_group = 3
xtrabackup: innodb_log_file_size = 1073741824
InnoDB: Using atomics to ref count buffer pool pages
InnoDB: The InnoDB memory heap is disabled
InnoDB: Mutexes and rw_locks use GCC atomic builtins
InnoDB: Memory barrier is not used
InnoDB: Compressed tables use zlib 1.2.3
InnoDB: Using CPU crc32 instructions
InnoDB: Initializing buffer pool, size = 100.0M
InnoDB: Completed initialization of buffer pool
InnoDB: Setting log file ./ib_logfile101 size to 1024 MB
InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000
InnoDB: Setting log file ./ib_logfile1 size to 1024 MB
InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000
InnoDB: Setting log file ./ib_logfile2 size to 1024 MB
InnoDB: Progress in MB: 100 200 300 400 500 600 700 800 900 1000
InnoDB: Renaming log file ./ib_logfile101 to ./ib_logfile0
InnoDB: New log files created, LSN=1095198530
InnoDB: Highest supported file format is Barracuda.
InnoDB: 128 rollback segment(s) are active.
InnoDB: Waiting for purge to start
InnoDB: 5.6.24 started; log sequence number 1095198732
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: FTS optimize thread exiting.
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1095202631
160204 00:57:31 completed OK!
以上對應的目錄就是innobackupex全備份自己創建的目錄
[root@MASTER_03 dbbak]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/dbbak/2016-02-04_00-35-36/
160204 01:08:39 [01] ...done
160204 01:08:39 [01] Copying ./iot2/t_hash1#P#p3.ibd to /data/3306/data/iot2/t_hash1#P#p3.ibd
160204 01:08:39 [01] ...done
160204 01:08:39 [01] Copying ./iot2/db.opt to /data/3306/data/iot2/db.opt
160204 01:08:39 [01] ...done
160204 01:08:39 [01] Copying ./xtrabackup0219/db.opt to /data/3306/data/xtrabackup0219/db.opt
160204 01:08:39 [01] ...done
160204 01:08:39 completed OK!
更改權限
[root@MASTER_03 tmp]# chown -R mysql.mysql /data/3306/data/
啟動mysqld
[root@MASTER_03 tmp]# /etc/init.d/mysqld start
[root@MASTER_03 tmp]# mysql -uroot -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 1 Server version: 5.6.28-log MySQL Community Server (GPL) Copyright (c) 2000, 2015, Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | iot | | iot2 | ###被刪除的庫 | iot3 | | lsn | | mysql | | performance_schema | | sakila | | sbtest | | test | | xtrabackup0219 | +--------------------+ 11 rows in set (0.00 sec)
發現數據是已經成功恢復
先全備
mysql> use xtrabackup0219;
mysql> create table t1(id int(5) primary key auto_increment,name varchar(20));
innobackupex --defaults-file=/etc/my.cnf --user=dbbak --password=bk2016 --socket=/data/3306/tmp/mysql.sock /data/dbbak/
增量備份
#####往表里插入數據
mysql> insert into t1 select 1,'love sql';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into t1 select 2,'love sql';
Query OK, 1 row affected (0.00 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> insert into t1 select 3,'love sql';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from t1;
+----+----------+
| id | name |
+----+----------+
| 1 | love sql |
| 2 | love sql |
| 3 | love sql |
+----+----------+
3 rows in set (0.00 sec)
[root@MASTER_03 dbbak]# innobackupex --defaults-file=/etc/my.cnf --user=dbbak --password=bk2016 --socket=/data/3306/tmp/mysql.sock --incremental /data/dbbak/ --incremental-basedir=/data/dbbak/2016-02-04_01-44-24/ --parallel=2
[root@MASTER_03 dbbak]# du -sh *
1.5G 2016-02-04_01-44-24
6.0M 2016-02-04_01-46-48
[root@MASTER_03 dbbak]# cat 2016-02-04_01-46-48/xtrabackup_checkpoints
backup_type = incremental ###說明是增量的
from_lsn = 1095215215
to_lsn = 1095217565
last_lsn = 1095217565
compact = 0
recover_binlog_info = 0
此時再插入數據
mysql> insert into t1 select 4,'mysql dba';
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
增量備份2
[root@MASTER_03 dbbak]# innobackupex --defaults-file=/etc/my.cnf --user=dbbak --password=bk2016 --socket=/data/3306/tmp/mysql.sock --incremental /data/dbbak/ --incremental-basedir=/data/dbbak/2016-02-04_01-46-48/ --parallel=2
[root@MASTER_03 dbbak]# du -sh *
1.5G 2016-02-04_01-44-24
6.0M 2016-02-04_01-46-48
5.9M 2016-02-04_01-49-21
增量備份的恢復
增量備份的恢復需要有3個步驟
1 恢復完全備份
2 恢復增量備份到完全備份(開始恢復的增量備份要添加--redo-only參數,到最后一次增量備份要去掉--redo-only)
3 對整體的完全備份進行恢復,回滾未提交的數據
[root@MASTER_03 dbbak]# innobackupex --apply-log --redo-only /data/dbbak/2016-02-04_01-44-24/
xtrabackup: starting shutdown with innodb_fast_shutdown = 1
InnoDB: Starting shutdown...
InnoDB: Shutdown completed; log sequence number 1095209828
160204 01:27:09 completed OK!
將增量1應用到完全備份
[root@MASTER_03 dbbak]# innobackupex --apply-log --redo-only /data/dbbak/2016-02-04_01-44-24/ --incremental-dir=/data/dbbak/2016-02-04_01-46-48/
[root@MASTER_03 dbbak]# innobackupex --apply-log /data/dbbak/2016-02-04_01-44-24/ --incremental-dir=/data/dbbak/2016-02-04_01-49-21/
把所有合在一起的完全備份整體進行一次apply操作,回滾未提交的數據
[root@MASTER_03 dbbak]# innobackupex --apply-log /data/dbbak/2016-02-04_01-44-24/
模擬測試
mysql> drop table t1;
Query OK, 0 rows affected (0.05 sec)
[root@MASTER_03 dbbak]# rm -rf /data/3306/data/
[root@MASTER_03 dbbak]# mkdir /data/3306/data
[root@MASTER_03 dbbak]# innobackupex --defaults-file=/etc/my.cnf --copy-back --rsync /data/dbbak/2016-02-04_01-44-24/
[root@MASTER_03 dbbak]# chown -R mysql.mysql /data/3306/data/
登錄查看
mysql> select * from t1;
+----+-----------+
| id | name |
+----+-----------+
| 1 | love sql |
| 2 | love sql |
| 3 | love sql |
| 4 | mysql dba |
+----+-----------+
4 rows in set (0.05 sec)
發現數據是已經正確
測試完畢,恢復還是比較簡單的。