记一次博客大锅

事故原因:

  • 修改数据库中不确定的数据之前没对数据库进行备份。
  • 修改后也没有进行备份。
  • 又蜜汁自信升级了Handsome的7.0版本,又是没备份。
  • 升级后发现好像有bug,打算回滚,但是想到我忘记备份配置文件了,于是配置文件丢失。
  • 该数据库的时候登错数据库,锅++

为了恢复数据,开始了一波的学习。

经过一番抢救,终于复活了。

!> 不要忘记,sql命令要加分号!

具体过程如下:

找到出错位置

登入数据库

$ mysql -u root -p databaseA

看一下bin log是否打开

mysql > SHOW VARIABLES LIKE 'log_bin';

显示如下结果,就可以开始操作了。

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_bin | ON |
+---------------+-------+
1 row in set (0.00 sec)

查看日志列表

mysql > show master logs;

显示如下信息,不同的人可能显示的结果不一样,我们找最大的那个mysql-bin.000008

+------------------+-----------+
| Log_name | File_size |
+------------------+-----------+
| mysql-bin.000007 | 7680053 |
| mysql-bin.000008 | 11156528 |
+------------------+-----------+
2 rows in set (0.00 sec)

接下来使用mysqlbinlog

如果可以正常使用mysqlbinlog命令请忽略这部分。

需要确定mysqlbinlog的位置,使用find命令查找

$ find / -name mysqlbinlog -print

找到如下路径

/usr/bin/mysqlbinlog
/yoursql/mysql/bin/mysqlbinlog

根据自己的情况确定你的位置。然后软链接

$ ln -fs /www/server/mysql/bin/mysqlbinlog /usr/bin

接下来就可以使用mysqlbinlog命令了。

由于我们并不清楚出错的时间范围,只能输入一个大致的起始时间,如果确定的话,可以在start-datetime后边跟上相同参数的stop-datetime。跟上result-file导出文件便于我们分析错误位置。

$ mysqlbinlog --start-datetime='2020-07-09 19:00:00' /www/server/data/mysql-bin.000008 --result-file=extra.sql

在一波分析后,发现最后一次(这个根据自身情况,不一定是最后一次)配置正确的position 39876作为stop,然后再向前找比较早的的一个position 2000作为start。

比如我找到我的position分别是start 2000 stop39876

执行下列命令,重新执行这部分sql操作,使数据库恢复。

$ mysqlbinlog --start-position="2000" --stop-position="39876" mysql-bin.000008 > /yourpath/backup.sql

开始恢复

进入数据库databaseA,将这部分sql导入进去

$ mysql -u root -p databaseA

使用source命令(也有其他命令,可以自行搜索)

mysql > source /yourpath/backup.sql;

之后等待执行就可以了。

参考文章

https://learnku.com/articles/20702

https://www.cnblogs.com/fengzhongzhuzu/p/8973822.html