mysql数据库(表)误删恢复
1. 检查mysql服务是否开启binlog
# 查看是否开启binlog日志
show variables like '%log_bin%';
看下图结果.如果这里是OFF那就不用看下去了.本文帮助不了
2.开启binlog日志(已开启略过)
1、编辑打开mysql配置文件 ***/my.cnf在
[mysqld]区块添加
log-bin=mysql-bin(也可指定二进制日志生成的路径,如:log-bin=/opt/Data/mysql-bin)
server-id=1
binlog_format=MIXED(加入此参数才能记录到insert语句)
3.查看binlog日志记录位置
# 查看日志记录位置
show variables like '%datadir%';
直接去结果里面就能
4.常用binlog查询方式
# 查看所有日志文件
show master logs;
# 查看日志状态
show master status;
# 查看指定日志的事件(xxx自行替换到自己的文件名)
show binlog events in 'xxx-bin.0000xx';
5.备份当前数据库
整个库都删了当我没说.直接开始后面操作.如果只是删除了当前表.就先备份当前数据库.其实没啥用.但是咧.就怕手残再有失误,不手残就不会误删表,有备份就TM直接还原了也看不到这…-_-!
反正有备份就在开始下面操作.
6.操作binlog
1.先去上面第三点说的日志文件存放位置找到目录.
2.然后找到xxx-bin.0000xx这类文件
3.不要这么死板找固定名字.理论上这个文件多数人都不一样.然后就是看日期.
4.每次mysql服务重启都会截断日志.重新生成一个新的.找到最后更新日期那个就没错了
# 截断当前日志,后续日志生成一个新的编号binlog文件
flush log
1. 查看binlog日志
binlog文件是二进制的.无法直接打开.什么vim.txt.notepad.啥啥啥都不行.不要浪费功夫找工具尝试打开这种文件.
- 直接去找到mysqlbinlog.exe (一般都在mysql的安装目录.找不到全局搜就行了.)
- 找到之后命令行去到当前目录,mysqlbinlog.exe D:/mysql/WMANG-bin.000020 (window就.exe.linux就不带)
- 这种查看日志少的话还好.多的话直接刷屏.不要等刷完直接ctrl+c了.能看部分.其实看了意义也不大…
- 推荐sql直接查
# a、IN 'log_name':指定要查询的binlog文件名(不指定就是第一个binlog文件)
# b、FROM pos:指定从哪个pos起始点开始查起(不指定就是从整个文件首个pos点开始算)
# c、LIMIT【offset】:偏移量(不指定就是0)
# d、row_count :查询总条数(不指定就是所有行)
show binlog events [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count];
# 查看当前日志的所有事件以及pos
show binlog events in 'xxx-bin.00000xxx';
7 开始恢复数据
可以先把xxx-bin.00000xxx 拷贝到自己的目录去操作.
1. 根据时间恢复(简单粗暴)
估算误操作的事件.实在不记得可以给个大概.数据要求高的就用后面定位的方法
# 运行日志恢复.从2018-11-12 09:00:00开始到2023-12-5 17:00:00 结束事件.开始时间不知道给个比较靠前的就行.反正你当前的文件肯定不会早于这个时间,database指定要操作的数据库.否则会操作所有数据库.mysql后面就是常规登录信息
mysqlbinlog.exe --start-datetime="2018-11-12 09:00:00" --stop-datetime="2023-12-5 17:00:00" D:/mysql/xxx-bin.00000xxx --skip-gtids=true --database=mom_ls_test | mysql -uroot -S D:/mysql/logs/mysql.sock -p123456 -v
2. 根据事件定位恢复(简单粗暴)
估算误操作的事件.实在不记得可以给个大概.数据要求高的就用后面定位的方法
# 运行日志恢复.从当前日志位置号0开始,执行到343299346位号.database指定要操作的数据库.否则会操作所有数据库.mysql后面就是常规登录信息
mysqlbinlog.exe --start-position="0" --stop-position="343299346" D:/mysql/xxx-bin.00000xxx --skip-gtids=true --database=mom_ls_test | mysql -uroot -S D:/mysql/logs/mysql.sock -p123456 -v
需要注意的是.此期间的过程需要包含你插入数据的日志.如果没有.只能往前推.按xxx-bin.00000xxx 后几位是顺序号.找到之前的文件.从起点开始操作,如果你时间跨度很长,那就有的搞了.