原文:
相信後端研發的同學在開發過程經常會遇到產品臨時修改線上資料的需求,如果手法很穩那麼很慶幸可以很快完成任務,很不幸某一天突然手一抖把表裡的資料修改錯誤或者誤刪了,這個時候你會發現各種問題反饋接踵而來。如果身邊有bda或者有這方面經驗的同事那麼可以很快解決這個問題,如果沒有那麼希望這篇文章可以幫到你。
binglog介紹
首先第一步保證mysql已經開啟binlog,檢視命令:
show variables like '%log_bin%'
mysql binlog分三種格式 :
statement : 會在binlog中記錄每一條執行修改資料的sql語句的相關資訊,優點是不需要記錄每一行的變化,減少了binlog日誌量,節約了io
row : 會在binlog中記錄每一修改語句的詳細資訊,包括資料在修改之前和修改之後的資料的具體資訊,好處是會清晰記錄每一條修改的詳細資訊,不好的地方是會產生大量日誌
mixed :這種格式實際上就是statement和row的結合體,如果遇到表結構變更就會以statement來記錄,如果涉及語句修改那麼就以row格式記錄
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 '年齡',
`***` 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`, `***`, `deleted`, `created`)
values
(1, '小王', 21, 1),
(2, '小張', 22, 1),
(3, '小紅', 22, 0),
(4, '小楠', 23, 0),
(5, '小柱', 25, 1);
然後我們把資料全部刪掉
delete from `user`
資料恢復方法一 :
使用開源框架binlog2sql :
好處是成熟,穩定,上手難度比較低且可直接生成可執行sql,示例 :
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`, `***`, `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`, `***`, `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`, `***`, `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`, `***`, `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`, `***`, `id`) values ('小王', '2017-12-18 13:21:52', 0, 21, 1, 1); #start 1890 end 2244 time 2017-12-19 09:20:26
資料恢復方法二:
當線上資料出現錯誤的時候首先可以詢問具體操作人記錄時間點,這個時候可以借助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語句。 mysql誤刪資料恢復
資料庫忘記備份,可以使用mysql的日誌二進位制檔案 binlog 進行資料恢復。首先檢視是否開啟了binlog。show variables like log 進入mysql根目錄,會看到有binlog.的日誌檔案。取後面數字最大的日誌檔案,資料恢復。3.檢查某一時間端的binlog start ...
MySQL資料誤刪恢復
一 檢視mysql的binlog是否開啟 二 檢視binlog存放路徑 四 轉換binlog為正常sql mysqlbinlog base64 output decode rows v database dbname start datetime 2020 08 15 13 00 00 stop d...
flashback table快速恢復誤刪除的資料
在oracle資料庫操作中,經常會有不小心誤刪除資料 drop表的情況出現。以前,這種情況發生後,開發人員通常會去求助dba或管理者,使用資料庫備份恢復去找回這些資料。從oracle 9i 10g開始,你可以不必去用備份來恢復了。有一種快速恢復方法,稱之為flashback。你可以flashback...