msyql truncate 恢复数据

一次意外让我有幸了解了binlog,我无意间将某个库的数据都清空了,当时差点没喘过气来,然后经过一晚上的抢救,把这个经验留下。

  1. 先找的MySQL数据存放目录
    如果是docker启动的,那么可以可以通过docker inspect 找的,或者是docker-compose
    如果不是dockers部署的,可以通过:ps -ef | grep mysql ,找到启动进程

  2. 找到log目录下:
    文件是这种格式的:mysql-bin.0000xx
    ll -t 按时间倒序拍一下,取最上面的一个日志文件,比如:mysql-bin.000020

  3. 找到日志文件后,需要分离要恢复的数据

  4. 1 确定时间,或是数据库,或是表

  5. 2 如果是删除的数据,那么需要把之前的日志也拿下来,把之前的数据都恢复,

  6. 指定数据库恢复成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                      重建为带注释的语句
  1. 将sql导入

这里不建议使用源库,可以重新弄一个数据库,比如替换生成的sql文件里的数据库名称,或是重新弄一个msyql(这里如果是使用–rewrite-db重写了数据库名,可以直接导入源库,但还是细心的查看下)
导入后检查下数据是否恢复,确认数据无误后导出,再导入生产库:
mysql -u root -p < row-data-analysis.sql

注意,主键的问题,自增的话,需要将主键重置以下,我这里是uuid写入的,并不会出现主键的问题

猜你喜欢

转载自blog.csdn.net/qq_28911061/article/details/125696927