一、xtrabackup備份原理
1.1 全備過程
- 開啟一個后台檢測進程,檢測 redo 的變化,一旦發現redo中有新日志寫入,將日志記錄到后台日志文件 xtrabackup_log中
- 復制 InnoDB 的數據文件和系統表空間 ibdata1文件
- 復制結束后,執行 flush tables with read lock。加上--no-lock可以不執行,只對 InnoDB 有效,但是無法獲取准確的 position。flush tables with read lock的作用是防止數據表發生 DDL 操作。
- 復制 MyISAM等其他引擎的文件
- 獲取binlog的位置
- 執行unlock tables,把表設置可讀寫狀態
- 停止xtrabackup_log
1.2 全備恢復
恢復的過程會應用xtrabackup_log,將提交的事務變更到 InooDB表空間,同時回滾未提交的事務。

二、xtrabackup全備+binlog恢復到某個時間點
2.1. 構造測試數據
create database vcyber; use vcyber; create table t(id int primary key,name varchar(10)); insert into t select 1,'a'; insert into t select 2,'b'; select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | +----+------+
2.2. 執行全量備份
innobackupex --defaults-file=/etc/my.cnf --slave-info --no-timestamp /data/backup/data/dbfull_3306_`date '+%Y%m%d_%H%M'`
2.3. 新增加2行數據
insert into t select 3,'c'; insert into t select 4,'d'; select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +----+------+
2.4. 模擬誤刪除數據庫
drop database vcyber;
2.5. 恢復數據庫
# 關閉數據庫
mysqladmin shutdown
# 把原來的數據目錄改名,清空 data目錄下面的數據,要不然后面還原數據的時候會報目錄非空
mv /data/mysql/mysql_3306/data /data/mysql/mysql_3306/data_bak
# 應用日志
innobackupex --defaults-file=/etc/my.cnf --apply-log /data/backup/data/dbfull_3306_20180907_0319
# 把一致性的備份還原到原來數據目錄
innobackupex --defaults-file=/etc/my.cnf --move-back /data/backup/data/dbfull_3306_20180907_0319
# 修改權限
chown -R mysql:mysql /data/mysql/mysql_3306/data
2.6. 查看恢復情況
# 啟動數據庫
service mysqld start
# 查看恢復狀況
select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | +----+------+
有 2 條數據沒有恢復過來
2.7. 應用 binlog
# 查看開始應用 binlog 的位置
cat xtrabackup_binlog_pos_innodb bin.000001 944
# 解析binlog
mysqlbinlog -vv --start-position=944 /data/mysql/mysql_3306/logs/bin.00000 > recover.sql
# 清空GTID,最好先備份 binlog
reset master
# 應用 binlog
mysql < recover.sql
# 查看恢復情況
select * from t; +----+------+ | id | name | +----+------+ | 1 | a | | 2 | b | | 3 | c | | 4 | d | +----+------+
看來已經是把數據恢復回來了
參考書籍:《塗抹MySQL》
