误删MYSQL数据库数据丢失找回方法
简介:
MySQL 的二进制日志 binlog 可以说是 MySQL 最重要的日志,它记录了所有的 DDL 和 DML 语句(除了数据查询语句select、show等),以事件形式记录,还包含语句所执行的消耗的时间,MySQL的二进制日志是事务安全型的。binlog 的主要目的是复制和恢复。当然了,使用binlog日志所恢复的数据只能是部分数据,并不能够使用binlog日志来做数据库的备份,如果想要做数据库备份,依然要使用我们传统的备份方法,而binlog可以作为增量备份。
docker部署的MySQL8.0.19
- 在启动容器之前先要创建好要挂载出来的目录文件
- 容器启动后,连接数据库
查看mysqlbinlog是否开启命令:
不清楚日志文件的名称可以使用
- 在数据库中创建一个数据库、表,插入一些数据,就会在容器中的/var/lib/mysql目录下看到日志文件,或者是看挂载出来对应的目录上
挂载的目录:
通过binlog还原数据库
- ##起始时间点
##结束时间点
##起始位置
##结束位置
// 将binlog日志文件关于tide库的sql转出到文件
mysqlbinlog binlog.000022 -d {database名称} > tide.sql
- 误操作:
- 情景1:删除了表中某一条数据
- 行数:首先找到当天的binlog0000XX 文件,定位到删除操作在日志的行数
- 使用 mysqlbinlog —start-position=XXXXX -- stop-position=XXXXX binlog.0000XX > XXXX.sql
- 将sql中的delete操作改为insert,重新source 到数据中
- 时间: 确定操作所在的时间区间
- 使用mysqlbinlog —start-datetime=‘XXX’ —stop-datetime=‘XXX’ binlog.0000XX > XXXX.sql
- 同上,将sql中的delete操作改为insert,重新source 到数据中
- 情景2:清空数据库或者某一个表
- 首先,找到删除/清除操作在哪个日志中,以及所在的位置
- 不同于单个delete操作,改为insert后可以直接找回
- truncate操作清空的数据比较多,需要从最初的日志文件一个个重新导入到数据库
- 注意:
- 如果mysqlbinlog 开启7天自动清除日志文件的话,数据就只能找回部分了
- 定期备份是最好的办法