在此之前还是强烈建议大家进行定时备份,不然数据量多的话真的会有点emo的,好啦进入正题
操作背景:服务器windows server2012 数据库MySQL8.0
本人情况很奇葩,之前是备份了目标表的转储sql,但是我不知道是什么时候备份的结构sql,在我执行备份sql的时候选择了结构的sql运行完之后发现,哦豁数据不见了,那没办法只能通过日志恢复,如果没有开启数据库日志那就直接准备跑路吧 好啦进入正题
Mysql Binlog 简介
Mysql Binlog是二进制格式的日志文件
Binlog是用来记录Mysql内部对数据库的改动(只记录对数据的修改操作),主要用于数据库的主从复制以及增量恢复
首先我们得知道我们需要恢复的数据运行记录存在于那个log文件下,每次启动mysql服务,log开启情况下都会生成一个binlog文件,该文件位于mysql安装目录data文件夹下如图:
文件显示的日期为最新更新日期,因为我是后面有启动过mysql所以我定位我的操作是存在于binlog000028中
- show master status; 【查看当前正在写入的binlog文件】
当然这个查询到的binlog不一定就是自己需要恢复的目标log视实际情况而定
- SHOW binlog EVENTS IN "binlog.000028"; 【查看目标log文件】如下:
- Anonymous_Gtid为一个操作的开始标志
- Xid为一个操作的结束标志
- 记录pos值是由小到大 由远及近 也就是说数值越大距离当前时间越近
- 你需要定位到你需要恢复得步数,比如我需要找回我运行结构sql之前那么就是我从创建这个表到我删除这个表数据更新结构之前可以根据关键词进行搜索比如:Update_rows,CREATE TABLE等
- 最终我确定我需要找回的区间为12275---618947062
- 到mysql的bin目录下 键入cmd运行命令:mysqlbinlog --no-defaults --start-position=12275 --stop-position=926420369 D:\soft\mysql\data/binlog.000028 | mysql -ujypxuser -p 其中start position并不是查询的pos值 pos值只是偏移量 实际你需要的是end_log_pos值,D:\soft\mysql\data/binlog.000028根据自己的文件路径进行填写,mysql -ujypxuser -p其中u后面带的是你的数据库用户账号一定是拥有你想进行数据操作的权限的用户,成功后会提示输入密码,密码输入后回车没有报错就表示成功了 刷新表数据就恢复啦
- 其中会有常见问题就是 用户权限不足使用相对应权限用户
- 表已存在 步数中存在建表语句要么分段执行,要么删除表执行