資料庫誤運算元據恢復

DH鑌發表於2023-04-28

前提

mysql必須有以下配置

binlog_format = row
binlog_row_image = full # 預設是full

實戰

假設有一張使用者表,結構如下

create table tb_user
(
    id       bigint primary key not null auto_increment,
    username varchar(100)       not null,
    pwd      varchar(100)       not null,
    sex      varchar(10)        not null
);

資料sql如下:

insert into tb_user (username, pwd, sex)
values ('張三', '123456', '男'),
       ('李四', '111111', '女'),
       ('kk', '1111', '雞');

小明一天不小心執行了delete全表的操作

delete from tb_user where id != 0;

把資料全部刪除了

生成回滾sql

小明都想好跑路的國家了,小董出手相助,祭出今天要介紹的工具ra,github地址:https://github.com/DHBin/ra

下載地址:https://github.com/DHBin/ra/tags

資料庫工具
支援binlog資料閃回、binlog轉sql等等

支援mysql資料庫版本:
5.5.x
5.6.x
5.7.x
8.0.x

Usage:
  ra [command]

Available Commands:
  flashback   資料閃回
  help        Help about any command
  tosql       透過binlog日誌生成sql

Flags:
  -h, --help      help for ra
  -v, --version   version for ra

Use "ra [command] --help" for more information about a command.

步驟一:檢視當前的binlog檔名

show binary logs;
+----------------+---------+---------+
|Log_name        |File_size|Encrypted|
+----------------+---------+---------+
|mysql-bin.000010|7627     |No       |
|mysql-bin.000011|6699     |No       |
+----------------+---------+---------+

刪除的binlog一般在最後的binlog檔案中,mysql-bin.000011。根據小明的描述,當時操作的時間大概是2023-04-26 08:41

步驟二:使用ra生成回滾sql

根據描述得到兩個關鍵的資訊

  • binlog檔名
  • 操作時間

把時間範圍圈在41分

ra flashback --host 127.0.0.1 -u root -p 123456  --start-datetime "2023-04-26 08:41:00" --stop-datetime "2023-04-26 08:42:00"

執行後生成回滾sql

insert into `test`.`tb_user` (id, username, pwd, sex) values(1, '張三', '123456', '男'); # pos 5726 timestamp 1682469713
insert into `test`.`tb_user` (id, username, pwd, sex) values(2, '李四', '111111', '女'); # pos 5726 timestamp 1682469713
insert into `test`.`tb_user` (id, username, pwd, sex) values(3, 'kk', '1111', '雞'); # pos 5726 timestamp 1682469713

事情就是這樣,小明不用跑路了,請小董喝了一瓶冰紅茶。

相關文章