MySQL-資料恢復場景實驗
阿新 • • 發佈:2021-07-29
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;