记一次mysql数据库误删除,利用二进制日志恢复的过程
2020-12-21 admin linux mysql 2448
因用户误点了一键清空,导致数据表全部没了数据。为找回数据,首先查看有没计划备份,查看后台发现没有;再进入阿里云后台看看有无快照,也是没有启用。最后,只能看看有没有开启二进制日志:
第一步:保证mysql已经开启binlog,查看命令:
查看binklog是否开启
show variables like '%log_bin%';
查看binlog存放日志文件目录
show variables like '%datadir%';
值为OFF,需开启,值为ON,已开启。
如果没有开启binlog,也没有预先生成回滚SQL,那可能真的无法快速回滚了。对存放重要业务数据的MySQL,强烈建议开启binlog。
第二步:进入binlog文件目录,找出日志文件
第三步:切换到mysqlbinlog目录,通过mysqlbinlog工具命令查看数据库增删改查记录(必须切换到mysqlbinlog目录才有效)
/www/server/mysql/bin/mysqlbinlog --no-defaults --database=cx_xiangxinedu_c --start-datetime="2020-12-21 15:05:00" --stop-datetime="2020-12-21 15:06:00" /www/server/data/mysql-bin.000004 > templog.txt
上面的命令,需要绝对路径,并指定数据库和开始时间,结果时间,日志文件。执行完毕后,打开/www/server/mysql/bin/mysqlbinlog目录下的templog.txt文件,复制,粘贴到Phpmyadmin中的sql语句中执行,数据库恢复了。
如果数据有误,需要核对上面文本中的sql语句。
例子3:查询2018-11-12 09:00:00到2018-11-13 20:00:00 数据库为 youxi 的操作日志,并且过滤出 只包括 template_coupon_tb_product_category 表数据的操作记录 ,输入如下命令将数据写入到一个备用的txt文件中
mysqlbinlog --no-defaults --database=youxi --start-datetime="2018-11-12 09:00:00" --stop-datetime="2018-11-13 20:00:00" /data/mysql/mysql-bin.000015 | grep template_coupon_tb_product_category > templog.txt
附:在恢复过程中,发现直接导入会导致很多update的数据没有更新,原因是日志的sql语句,许多id=1变成了id=1_fg这种。因此,最好将updata和insert语句分开为两个文件,再分开导入,先插入再更新。
数据恢复是非常繁琐的,因此管理员在做删除操作时,一定要慎重。
要通过 MySQL 二进制日志文件来恢复数据库数据,你需要执行以下步骤:
停止 MySQL 服务: 在进行数据恢复之前,首先停止 MySQL 服务,以防止在恢复过程中出现数据写入冲突。
备份当前数据: 在执行恢复操作之前,建议先对当前数据库进行备份,以防意外情况发生。
找到正确的二进制日志文件: 确保你选择了正确的二进制日志文件进行恢复。在你提供的情况下,你提到的日志文件是
/www/server/data/mysql-bin.000007
。执行恢复命令: 使用
mysqlbinlog
命令解析二进制日志文件,并将其应用到 MySQL 服务器上。命令可能类似于以下内容:
/www/server/mysql/bin/mysqlbinlog --no-defaults /www/server/data/mysql-bin.000007 | mysql -u username -p
这将会应用二进制日志文件中的操作到 MySQL 服务器上。请替换 username
为你的 MySQL 用户名,然后输入密码以确认。
- 启动 MySQL 服务: 当恢复完成后,重新启动 MySQL 服务。
请注意,这种方法只能用于恢复在二进制日志中记录的更改,而不能用于恢复完整的数据库备份。此外,恢复过程可能会影响当前数据库中的数据,因此在执行此操作之前,请确保已经做好了充分的备份并谨慎操作。