1. 程式人生 > >mysql誤刪資料快速恢復

mysql誤刪資料快速恢復

相信後端研發的同學在開發過程經常會遇到產品臨時修改線上資料的需求,如果手法很穩那麼很慶幸可以很快完成任務,很不幸某一天突然手一抖把表裡的資料修改錯誤或者誤刪了,這個時候你會發現各種問題反饋接踵而來。如果身邊有BDA或者有這方面經驗的同事那麼可以很快解決這個問題,如果沒有那麼希望這篇文章可以幫到你。

binglog介紹

首先第一步保證mysql已經開啟binlog,檢視命令:

show variables like '%log_bin%'

mysql binlog分三種格式 :

Statement : 會在binlog中記錄每一條執行修改資料的sql語句的相關資訊,優點是不需要記錄每一行的變化,減少了binlog日誌量,節約了IO
Row : 會在binlog中記錄每一修改語句的詳細資訊,包括資料在修改之前和修改之後的資料的具體資訊,好處是會清晰記錄每一條修改的詳細資訊,不好的地方是會產生大量日誌
Mixed :這種格式實際上就是Statement和Row的結合體,如果遇到表結構變更就會以Statement來記錄,如果涉及語句修改那麼就以Row格式記錄

這裡的binlog格式推薦row,my.cnf 的配置可參考 :

server_id = 1001
log_bin = /var/log/mysql/mysql-bin.log
max_binlog_size = 1G
binlog_format = row
binlog_row_image = full

我們來模擬一些資料:

CREATE TABLE `user` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(125) NOT NULL DEFAULT '' COMMENT '名稱',
  `age` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '年齡',
  `sex` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '性別',
  `deleted` tinyint(4) unsigned DEFAULT '0',
  `created` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='使用者表測試';
INSERT INTO `user` (`id`, `name`, `age`, `sex`, `deleted`, `created`)
VALUES
    (1, '小王', 21, 1),
    (2, '小張', 22, 1),
    (3, '小紅', 22, 0),
    (4, '小楠', 23, 0),
    (5, '小柱', 25, 1);

然後我們把資料全部刪掉

delete from `user`

資料恢復方法一 :

python /binlog2sql/binlog2sql.py --flashback -h127.0.0.1 -P3306 -uroot -p'123456' -dlocal -tuser --start-file='mysql-bin.000038' --sql-type=DELETE --start-datetime='2017-12-17 19:39:33' --stop-datetime='2017-12-17 19:40:01' >/**/data6.sql

解析後的結果大概是這樣

INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小柱', '2017-12-18 13:21:52', 0, 25, 1, 5); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小楠', '2017-12-18 13:21:52', 0, 23, 0, 4); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小紅', '2017-12-18 13:21:52', 0, 22, 0, 3); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小張', '2017-12-18 13:21:52', 0, 28, 1, 2); #start 1890 end 2244 time 2017-12-19 09:20:26
INSERT INTO `local`.`user`(`name`, `created`, `deleted`, `age`, `sex`, `id`) VALUES ('小王', '2017-12-18 13:21:52', 0, 21, 1, 1); #start 1890 end 2244 time 2017-12-19 09:20:26

引數--sql-type建議加上,因為可能會有其他型別語句生成干擾了執行結果
如果是線上阿里雲或者其他產品建議先去管理後臺找到事發時間的binlog日誌下載下來,先在測試環境驗證資料回滾結果.

資料恢復方法二:

當線上資料出現錯誤的時候首先可以詢問具體操作人記錄時間點,這個時候可以藉助mysql自帶的binlog解析工具mysqlbinlog,具體位置在mysql安裝目錄**/mysql/bin/下,示例:

mysqlbinlog --base64-output=decode-rows -v --start-datetime="2017-12-15 17:48:49" --stop-datetime="2017-12-16 23:59:49" /usr/local/mysql/mysql-bin.000038 >/**/data.sql

如果是阿里雲rds或者其他產品可通過遠端方式解析

mysqlbinlog --no-defaults -u賬號 -p密碼 -h ***.rds.aliyuncs.com --read-from-remote-server mysql-bin.000180 --base64-output=decode-rows -v > /data.sql

這裡因為binlog檔案預設是通過base64編碼過的,所以需要加上--base64-output=decode-rows -v
解析後的格式大概是這樣的 :

### DELETE FROM `local`.`user`
### WHERE
###   @1=1
###   @2='小王'
###   @3=21
###   @4=1
###   @5=0
###   @6='2017-12-18 13:21:52'
### DELETE FROM `local`.`user`
### WHERE
###   @1=2
###   @2='小張'
###   @3=28
###   @4=1
###   @5=0
###   @6='2017-12-18 13:21:52'
....

仔細檢視這種格式檔案,發現這種格式檔案並不能直接執行,但是在where條件後面記錄了被刪除之前的原始資料,需要藉助sed、awk把SQL文字轉換成真正的SQL。或者當你在遇到開源框架解決不了的情況下,可以根據具體場景嘗試手動把這種格式的檔案解析成可執行的sql語句。



作者:qtshe
連結:https://www.jianshu.com/p/c9a2fe3f4534
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。

相關推薦

mysql資料快速恢復

相信後端研發的同學在開發過程經常會遇到產品臨時修改線上資料的需求,如果手法很穩那麼很慶幸可以很快完成任務,很不幸某一天突然手一抖把表裡的資料修改錯誤或者誤刪了,這個時候你會發現各種問題反饋接踵而來。如果身邊有BDA或者有這方面經驗的同事那麼可以很快解決這個問題,如果沒有那

mysql資料快速回滾

binlog2sql快速回滾 首先,確認你的MySQL server開啟了binlog,設定了以下引數: [mysqld] server-id = 1 log_bin = /var/log/mysql/mysql-bin.log max_binlog_size = 1000M binlog-

MySQL資料救命指南:開發人員必收藏

  首先看下mysql誤刪資料排名最前的幾種是: 1.誤刪檔案 2.誤刪庫、表 3.錯誤全表刪除 / 更新 4.升級操作失誤 都來看看你命中過幾個,hoho。 簡單說下我親手造的一個大事故吧。 那大概是一個春暖花開的季節,我的內心是激動澎湃的,因為已經

MySQL資料救命指南:必收藏

首先看下mysql誤刪資料排名最前的幾種是: 1.誤刪檔案 2.誤刪庫、表 3.錯誤全表刪除 / 更新 4.升級操作失誤 都來看看你命中過幾個,hoho。 簡單說下我親手造的一個大事故吧。 那大概是一個春暖花開的季節,我的內心是激動澎湃的,因為已經安排了休假計劃。在這前幾天,已經把一個新

Oracle資料庫中對資料恢復

如果一不小心對Oracle資料庫中的資料進行了誤刪除操作,那麼如何進行資料恢復呢(不考慮全庫備份和利用歸檔日誌)?如果使用的是9i以及之後的版本,那麼我們可以採用閃回技術對誤刪除的資料進行恢復。方式有兩種。 原理: 利用oracle提供的閃回方法,如果在刪除資料後還沒做大量的操作(只

MySQL資料

首先看下mysql誤刪資料排名最前的幾種是: 1.誤刪檔案 2.誤刪庫、表 3.錯誤全表刪除 / 更新 4.升級操作失誤 都來看看你命中過幾個,hoho。 簡單說下我親手造的一個大事故吧。 那大概是一個春暖花開的季節,我的內心是激動澎湃的,因為已經安排了休假計劃。在這前幾天,已經把一個新專案的資

oracle delete from table 資料恢復

oracle delete from table 誤刪資料的恢復: select log_mode,open_mode,flashback_on from v$database;        --檢視閃回功能是否開啟(NO 表示未開啟;Y

SQL Server 2008無備份資料恢復

系統已上線,給客戶修改bug的時候,使用delete語句刪表資料,沒想到庫沒切換成測試庫。誤刪了SQL Server正式庫的資料,而且一次備份都沒有做過,玩大了。 不扯了,進入主題 網上很多方法,都是針對至少有一次備份的情況下進行資料恢復的,沒有備份就基本上只能找資料恢復公司了。本章將通過日誌來恢復誤刪的

linux下資料檔案恢復

linux下檔案被刪除可以用很多工具進行恢復,例如undelete(適合ext2,ext3)、giis(不能恢復安裝giis之前的檔案)、ext3grep(僅限ext3)、R-linux(支援ext3,但是需要作業系統是32位的)。還有testdisk等等就不一一介紹了。需

mysql 恢復資料

mysql通過bin_log恢復資料 轉載 2016年09月26日 15:55:39 2897 一、開啟binlog日誌: 編輯開啟mysql

mysqlroot後如何恢復root賬戶

mysql誤刪除root後恢復roo賬戶系統:CentOS release 6.5 (Final)內核:2.6.32-431.el6.x86_64MySQL版本:5.5.28-log Source distribution操作步驟:1.停止mysql服務#service mysqld stop2.以安全模式進

利用plsql工具恢復表和恢復資料

一、恢復誤刪表     1.執行以下sql語句,找到被自己誤刪的資料表對應的object_name;         select * from user_recyclebin t;--檢視被刪掉

SqlServer無備份下資料恢復

系統已上線,給客戶修改bug的時候,使用delete語句刪表資料,沒想到庫沒切換成測試庫。誤刪了正式庫的資料,而且一次備份都沒有做過,玩大了 不扯了,進入主題 網上很多方法,都是針對至少有一次備份的情況下進行資料恢復的,沒有備份就基本上只能找資料恢復公司了。本章將通過日誌來恢復誤刪的資料,若是日誌檔案都沒

linux資料檔案後恢復

--------------建立測試表 [[email protected] ~]$ sqlplus / as sysdba SQL>create user test identified by test default tablespace users;

mysql恢復操作

前提:對mysql庫進行全備和增量備份(全備就是對hive庫進行完全備份,增量備份就是將mysql的binlog日誌進行備份) 情景說明:由於誤操作,將包含有多張表的資料庫給誤刪了 要求:恢復誤刪的資料庫   具體模擬故障過程與恢復操作步驟如下: (1)首先建立hive

恢復資料

問題點: 比如,不小心使用 diskpark clean 刪除了整個硬碟。   1.下載DiskGenius破解版。 DiskGenius4.9.6專業版註冊版 https://download.csdn.net/download/qq_27278957/1069767

CentOS 恢復 rm -rf * 資料--extundelete

一、 將磁碟分割槽掛載為只讀 這一步很重要,並且在誤刪除檔案後應儘快將磁碟掛載為只讀。越早進行,恢復的成功機率就越大。 1.  檢視被刪除檔案位於哪個分割槽 [root@localhost  ~]# mount/dev/mapper/VolGroup-lv_roo

SQLSERVER2012資料恢復過程

由於長時間從事企業應用系統開發,前往使用者現場升級、除錯系統是比較常做的事情,但是就在週一,由於同事的失誤在毫無知覺的情況下誤刪了生產資料庫幾乎所有的資料。當我發現的那一刻,感覺頭髮都立起來了,心想這他孃的是要領盒飯了。   為了迅速恢復系統的使用,在當時的情況下立即關閉

mysql刪除資料恢復處理

1.事故 後臺操作許可權較高人員執行錯誤的刪除語句:mysql> delete from order where order_id=1; 2.事故影響 使用者看不到這個定單,且這個定單是活躍的定單 3.是故時間 4.恢復處理流程 保留現場。 mysql> del

linux資料恢復教程(ext4檔案型別)

必要工具安裝1.extundelete安裝安裝依賴包:yum install e2fsprogs e2fsprogs-libs e2fsprogs-devel -y解壓安裝:cd /usr/local/srctar -jxvf extundelete-0.2.4.tar.bz