xtrabackup+binlog 實現完全恢復


一、xtrabackup備份原理

1.1 全備過程

  1. 開啟一個后台檢測進程,檢測 redo 的變化,一旦發現redo中有新日志寫入,將日志記錄到后台日志文件 xtrabackup_log中
  2. 復制 InnoDB 的數據文件和系統表空間 ibdata1文件
  3. 復制結束后,執行 flush tables with read lock。加上--no-lock可以不執行,只對 InnoDB 有效,但是無法獲取准確的 position。flush tables with read lock的作用是防止數據表發生 DDL 操作。
  4. 復制 MyISAM等其他引擎的文件
  5. 獲取binlog的位置
  6. 執行unlock tables,把表設置可讀寫狀態
  7. 停止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》

 


免責聲明!

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



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