admin管理员组文章数量:1538736
MySQL数据被误删?
在开发和在生产中总会出现各种各样的失误和意味,当MySQL的数据或表被删除后不要慌,执行以下命令,查看mysql是否开启binlog,binlog会记录下数据库表结构的变更,因此强烈建议在部署MySQL的时候开启binlog.
-- 查看是否开启binlog ON 为开启, OFF则为未开启
show variables like '%log_bin%';
如果忘记自己binlog文件存放在哪里可以使用以下命令去查看,也可以到自己mysqld中去查看 。
show variables like '%datadir%';
我们进入存储binlog的目录可能会看到多个文件,可以使用下面一行命令查看最新的binlog文件,我们最近的操作日志就存在里面。
show master status;
在找到binlog文件就需要确定我们要恢复的范围,因为每个mysql-bin可能内容很多,我们需要根据时间区间,截取出需要数据恢复的那一部分。
## mysqlbinlog 在mysql/bin路径下的工具
./mysqlbinlog --no-defaults --database=www --start-datetime='2022-08-26 00:00:00' --stop-datetime='2022-08-26 16:00:00' /www/server/data/mysql-bin.000006
## 第一条指令会有base64可用下面一条转码
./mysqlbinlog --no-defaults --database=www --base64-output=decode-rows -v --start-datetime='2022-08-27 00:36:00' --stop-datetime='2022-08-27 01:25:00' /www/server/data/mysql-bin.000008 > day.txt
使用mysqlbinlog工具截取出binlog文件由字节文件转到day.txt文件中,转成我们可以读懂的日志,打开day.txt文件可以看到截取时间段内mysql执行过的指令。
上图我们只需要关注箭头所指的时间和end_log_pos 根据这两个参数进行数据恢复,使用以下指令,在服务器中执行。
## stop-ponsition对用我们end_log_pos,该指令会恢复到2679日志片段的数据,前面删去的数据都会恢复
./mysqlbinlog --no-defaults -v --stop-position=2679 -v /www/server/data/mysql-bin.000008 |./mysql -u root -p
## 以下指令则恢复2744 到 2949 区间的数据
./mysqlbinlog --no-defaults --start-position=2744 --stop-position=2949 /www/server/data/mysql-bin.000008 |./mysql -u root -p
还有一种方式查看end_log_pos的区间,在mysql中执行以下指令
show binlog EVENTS in 'mysql-bin.000008' ;
mysqlbinlog恢复数据存在的问题
使用mysqlbinlog尝试了几次恢复数据,对于删除的数据是可以恢复的,然后使用对于修改过的数据测试后并没有恢复,而在服务器会报错 Can't find record in table,不能直观展示需要回退的内容,很不友好。
binlog还原小工具
GitHub - danfengcao/binlog2sql: Parse MySQL binlog to SQL you wantParse MySQL binlog to SQL you want. Contribute to danfengcao/binlog2sql development by creating an account on GitHub.https://github/danfengcao/binlog2sql
binlog2sql是一个比较好用的mysql闪回工具,建议去上面的github查看,有例子,基本不踩坑,步骤也很简单,使用binlog2sql有前提,必须在myf进行指定配置,如果是突发删除问题,自己数据库又没有配置,那就只能回去使用mysqlbinlog。
// 可能会用到的命令,自己记录一下
find / -name myf
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p -dwww -ttbl --start-file='mysql-bin.000008' --start-datetime='2022-08-27 00:25:00' --stop-datetime='2022-08-27 13:30:00'
python binlog2sql.py -h127.0.0.1 -P3306 -uroot -p -dwww -ttbl --start-file='mysql-bin.000008' --start-position=22577 --stop-position=23372 -B > rollback.sql | cat
mysql -h127.0.0.1 -P3306 -uroot -p < rollback.sql
如果表被删除的话binlog2sql也是没办法恢复得,所以删除表之前一定要谨慎再谨慎,同时做好备份。
可能踩坑问题整理
- 使用的恢复数据的mysql用户权限要给大一些,不然会遇到权限问题,很多指令无法执行。
- 在恢复数据的时候尽可能确定需要恢复的时间段。
相关博文链接
【MySQL】MySQL-binlog日志格式 binlog_format三种模式_mcom270的博客-CSDN博客_binlog_format
MySQL Binlog--binlog_format参数 - TeyGao - 博客园
mysql binlogrowimage_安全考虑,binlog_row_image建议尽量使用FULL_晴朗的树的博客-CSDN博客
版权声明:本文标题:MySQL表和表数据被删除后,紧急复原 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://m.elefans.com/dianzi/1726035294a1052856.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论