不小心把数据删掉了
首先要拿到binlog文件
执行以下命令行
/usr/local/mysql/bin/mysqlbinlog --base64-output=decode-rows --start-datetime=“2023-05-19 09:01:32” --stop-datetime=“2023-05-19 09:01:35” -v /Users/zylong/Downloads/mysql-bin.003178 --result-file=/Users/zylong/desktop/update.txt
/usr/local/mysql/bin/mysqlbinlog是你的mysqlbinlog所在的目录 如果你设置了环境变量可以不加全路径
–base64-output=decode-rows base64输出行
–start-datetime --stop-datetime 起止时间 具体去看binlog里想恢复的时间 如下图的230519 9:01:33 上述两个时间遵循左开右避原则
也可以使用at 具体到行 可以自行百度看看
-v /Users/zylong/Downloads/mysql-bin.003178 -v只想你的目标文件路径
–result-file= 输出到指定文件
输出完成后打开 上述txt文件 显示大概如下
执行以下命令
cat /Users/zylong/desktop/update1.txt | sed -n ‘/### /p;/# at/p’ | sed ‘s/### //g;s/DELETE FROM/INSERT INTO/g;s/WHERE/(ID, departname, description, parentdepartid, org_code, org_type, mobile, fax, address, depart_order, home_dep, is_contrast, total_contrast_number, total_observer_number, total_matched_number, contrast_mirror, current_contrast_number, illness, region_id, is_self_control, main_logo, is_bindable_wx, sms_template, sms_request_template, is_case_center) VALUES(/g;s/@1=//g;s/[0-9]=//g;s/@[0-9]/,/g;s/@/,/g;s/# at/);\n# at/g’ | sed -e ‘/# at/d’ > /Users/zylong/desktop/t6.txt
以上命令是sed 替换文本操作 不会的可以自己去看看 其实就是替换文本没啥难的 随便看看就明白了
以上分五部分依次是源文件 显示行 替换操作 删除操作 目标文件
/Users/zylong/desktop/update1.txt 源文件
其中红色以及黄色标注中的;表示匹配多个 如果你还有额外的需求可以再添加一个匹配或规则
sed -n ‘/### /p;/# at/p’
-n 表示源文件中显示的行 我们只需要sql相关的文件 所以只需要/### 开头的文件 但是我们替换的时候需要在每个sql命令后加上); 所以用到了/# at开头的行
1,s/### //g;
2,s/DELETE FROM/INSERT INTO/g;
3,s/WHERE/(ID, departname, description, parentdepartid, org_code, org_type, mobile, fax, address, depart_order, home_dep, is_contrast, total_contrast_number, total_observer_number, total_matched_number, contrast_mirror, current_contrast_number, illness, region_id, is_self_control, main_logo, is_bindable_wx, sms_template, sms_request_template, is_case_center) VALUES(/g;
4,s/@1=//g;
5,s/[0-9]=//g;
6,s/@[0-9]/,/g;
7,s/@/,/g
8,s/# at/);\n# at/g;
2,3 操作其实就是连成一个 insert into xxx (字段1,字段2…) values(
4 把第一个参数前的数据完全替换
5替换以数字开始=结尾的数据 替换成空字符
6,7 将@以及数字替换成,
8,将/# at 替换成分);# at \n表示换行 /g表示匹配多个 下同 其中/# at后面的/表示分开符号 如果要使用/请先转译
sed -e ‘/# at/d’ 删除包含“# at”的行
上述操作输出后大概就是这样
insert into xxx (字段1,字段2...) values('1','2',...);
insert into xxx (字段1,字段2...) values('1','2',...);
">"符号 表示输出到目标文件
/Users/zylong/desktop/t6.txt 目标文件
复制上述输出文件的内容 运行之后数据就恢复了