之前不小心删除了mysql的数据,搞了半天才恢复过来,现在记录一下之前的操作,以备日后用到。
1.检查mysql是否开启了binlog功能,使用数据库连接工具或者使用命令窗口登陆后数据库后,执行
show variables like '%log_bin%';
+---------------------------------+-----------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------+
| log_bin | ON | //开关
| log_bin_basename | /var/lib/mysql/binlog | // 存放路径
| log_bin_index | /var/lib/mysql/binlog.index |
| log_bin_trust_function_creators | ON |// 函数创建
| log_bin_use_v1_row_events | OFF |
| sql_log_bin | ON |//变更sql记录下来
+---------------------------------+-----------------------------+
log_bin:是否打开binlog功能,ON为打开,OFF为关闭,若是关闭了,那就无法通过binlog日志恢复数据了
log_bin_basename:
是binlog日志的基本文件名,后面会追加标识来表示每一个文件log_bin_index:
是binlog文件的素引文件,这个文件管理了所有的binlog文件的目录log_bin_trust_function_creators:
限制存储过程,前面我们已经讲过了,这是因为二进制日志的一个重要功能是用于主从复制,而存储函数有可能导致主从的数据不一致。所以当开启二进制日志后,需要限制存储函数的创建、修改、调用log_bin_use_v1_row_events此只读系统变量已弃用
。ON表示使用版本1二进制日志行,OFF表示使用版本2二进制日志行(MySQL5.6的默认值为2)。
2. 查看当前数据库生成了哪些二进制日志文件。也是通过登陆数据库后操作
show binary logs;
一般删除的命令是在编号靠后面的文件中。
3.show binlog events 该语句用于查看日志中进行了哪些操作。
show binlog events in 'mysql-bin.000001';
从上面可以看出在6277的位置开始删除了数据,然后到6362结束。所以可以执行以下语句将删除语句删除的数据。打开命令窗口执行:
mysqlbinlog --no-defaults -v --start-position=6277 --stop-position=6362 /soft/mysql/logs/mysql-bin.000001 > /soft/mysql/logs/recovery.sql;
上面语句可以将删除的数据导出到指定的文件中。也可以按照时间段导出,可以执行mysqlbinlog --no-defaults -v --start-datetime="2023-12-19 18:10:00" --stop-datetime="2023-12-19 18:40:00" | grep delete /soft/mysql/logs/mysql-bin.000001 > recovery.sql。grep 后面可以接一些关键字查找。导出的数据格式是这样的
这是row模式下的数据,其他模式的话不知道怎么恢复。这些数据可以通过一些手段,将多余的字符去掉,然后改成insert语句执行就可以恢复了。往上说可以通过什么语句直接恢复之类的,反正没成功。我是通过insert语句重新插入恢复的。