1. 程式人生 > 其它 >MySQL-資料恢復場景實驗

MySQL-資料恢復場景實驗

MySQL-資料恢復場景實驗

情景1:誤刪資料

背景描述

  • 9點的時候,刪除一個庫或一張表資料
  • 後來發現數據丟了,需緊急恢復

資料恢復思路

存在全量備份和binlog的情景

  • 利用全量備份進行資料恢復

    • 物理備份

      • 庫級別:使用xtrabackup進行庫級別的恢復到一個新庫即可
      • 表級別:拷貝idb檔案(innodb還需要執行alter table t discard/import tablespace命令)
    • 邏輯備份

      • 庫級別:匯入整庫備份的SQL檔案

      • 表級別:恢復單個的sql檔案

        sed -e'/./{H;$!d;}' -e 'x;/CREATE TABLE `order`/!d;q' /backup/order.sql   
        grep 'INSERT INTO `order`' /backup/dbname.sql > order_data.sql
        
  • 利用增量的binlog檔案恢復資料

沒有全備和binlog的情景

1、恢復delete的資料
可以考慮percona-data-recovery-tool-for-innodb工具
2、恢復drop 表的資料
可以考慮使用undrop-for-innodb工具
3、有從庫的話,考慮使用主從切換
四、對於rm類刪除
在沒有備份的情況下,如果伺服器沒有重啟,可以複製/proc/$pid/fd檔案來進行恢復

準備測試資料

create database devdb;
use devdb;
create table customers(
id int not null auto_increment,
name char(20) not null,
age int not null,
primary key(id)
)engine=InnoDB;

insert into customers values(1,"biu1","24");
insert into customers values(2,"biu2","22");
insert into customers values(3,"biu3","27");
commit;

全量備份

mysqldump -uroot -p -B -F -R -x --master-data=2 devdb|gzip >/tmp/devdb_$(date +%F).sql.gz

引數說明:
-B:指定資料庫
-F:重新整理日誌
-R:備份儲存過程等
-x:鎖表
--master-data:在備份語句裡新增CHANGE MASTER語句以及binlog檔案及位置點資訊

再次變更資料

insert into customers values(4,"biu4","21");
insert into customers values(5,"biu5","25");
insert into customers values(6,"biu6","29");
update customers set age=28 where id=4;
insert into customers values(7,"biu7","18");
delete from customers ;
commit;

drop database devdb;

恢復資料

當發現重要表資料刪除時,立即鎖表(可選)

flush tables with read lock; -- 給表加上讀鎖

在另一臺機器或例項上恢復資料

解壓備份檔案(可選)
gzip -d /tmp/devdb_$(date +%F).sql.gz
確定上次全備的binlog檔名稱及其位置
grep 'CHANGE' /tmp/devdb_$(date +%F).sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000002', MASTER_LOG_POS=106;

全備時刻的binlog檔案位置:mysql-bin.000002的106行,因此在該檔案之前的binlog檔案中的資料都已經包含在全備中,該檔案之後的資料是全備之後的增量資料

將全量備份檔案及binlog檔案拷貝到新機器

全量備份還原
mysql -uroot -proot < /tmp/devdb_$(date +%F).sql
還原增量資料
# 1. 將binlog日誌轉換成sql
mysqlbinlog --start-position=106 mysql-bin.000002 > incr002.sql
mysqlbinlog mysql-bin.000003 > incr003.sql
......

# 2. 定位到刪除資料的行並將其註釋


# 2.2 也可以通過時間和位置點恢復


# 3. 匯入binlog中的增量資料
mysql -uroot -proot < incr002.sql

注意:

恢復全備資料之前必須將該binlog檔案移出,否則恢復過程中,會繼續寫入語句到binlog

檢查資料完整性
show databases;
select * from devdb.customers;