# 数据库误操作数据恢复
# 前提
mysql必须有以下配置
代码语言:javascript复制binlog_format = row
binlog_row_image = full # 默认是full
# 实战
假设有一张用户表,结构如下
代码语言:javascript复制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如下:
代码语言:javascript复制insert into tb_user (username, pwd, sex)
values ('张三', '123456', '男'),
('李四', '111111', '女'),
('kk', '1111', '鸡');
小明一天不小心执行了delete全表的操作
代码语言:javascript复制delete from tb_user where id != 0;
把数据全部删除了
# 生成回滚sql
小明都想好跑路的国家了,小董出手相助,祭出今天要介绍的工具ra,github地址:https://github.com/DHBin/raopen in new window
代码语言:javascript复制数据库工具
支持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文件名
代码语言:javascript复制show binary logs;
代码语言:javascript复制 ---------------- --------- ---------
|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分
代码语言:javascript复制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
代码语言:javascript复制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
事情就是这样,小明不用跑路了,请小董喝了一瓶冰红茶。