赞
踩
一次意外让我有幸了解了binlog,我无意间将某个库的数据都清空了,当时差点没喘过气来,然后经过一晚上的抢救,把这个经验留下。
先找的MySQL数据存放目录
如果是docker启动的,那么可以可以通过docker inspect 找的,或者是docker-compose
如果不是dockers部署的,可以通过:ps -ef | grep mysql ,找到启动进程
找到log目录下:
文件是这种格式的:mysql-bin.0000xx
ll -t 按时间倒序拍一下,取最上面的一个日志文件,比如:mysql-bin.000020
找到日志文件后,需要分离要恢复的数据
1 确定时间,或是数据库,或是表
2 如果是删除的数据,那么需要把之前的日志也拿下来,把之前的数据都恢复,
指定数据库恢复成sql
比如数据库:data-analysis
那么命令:
# 方法一:指定数据库从日志导出sql
mysqlbinlog -u pico -p --database=data-analysis -vv /data/mysql/log/mysql-bin.000020 >/row-data-analysis.sql
# 方法二:指定数据库,和结束时间,从日志导出sql,如果不记得时间,可以先全部导出,再把出错的sql删除
mysqlbinlog -u pico -p --database=data-analysis --stop-datetime "2022-06-06 17:16:03" -vv /data/mysql/log/mysql-bin.000020 >/row-data-analysis.sql
# 方法三:指定数据库,和结束位置,从日志导出sql;这个位置,在日志里可以找到,position可以再日志文件里找到,日志已经一般比较大,所有用方法一最好
mysqlbinlog -u pico -p --database=data-analysis --stop-position 67840048 -vv /data/mysql/log/mysql-bin.000020 >/row-data-analysis.sql
# 在mysql 5.7 后增加了--rewrite-db 的参数,可以替换数据库名,
mysqlbinlog -u pico -p --database=data-analysis-2 --rewirite-db "data-analysis->data-analysis-2" -vv /data/mysql/log/mysql-bin.000020 >/row-data-analysis.sql
参数及命令说明:
详细的看这位博主的,很详细:https://blog.csdn.net/line_on_database/article/details/115487650
-d, --database=name 仅显示指定数据库的转储内容。
-o, --offset=# 跳过前N行的日志条目。
-r, --result-file=name 将输入的文本格式的文件转储到指定的文件。
-s, --short-form 使用简单格式。
--set-charset=name 在转储文件的开头增加'SET NAMES character_set'语句。
--start-datetime=name 转储日志的起始时间。
--stop-datetime=name 转储日志的截止时间。
-j, --start-position=# 转储日志的起始位置。
--stop-position=# 转储日志的截止位置。
--vv 重建为带注释的语句
这里不建议使用源库,可以重新弄一个数据库,比如替换生成的sql文件里的数据库名称,或是重新弄一个msyql(这里如果是使用–rewrite-db重写了数据库名,可以直接导入源库,但还是细心的查看下)
导入后检查下数据是否恢复,确认数据无误后导出,再导入生产库:
mysql -u root -p < row-data-analysis.sql
注意,主键的问题,自增的话,需要将主键重置以下,我这里是uuid写入的,并不会出现主键的问题
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。