分享到: 分享到QQ  分享到Twitter

作者: kideny    访问次数: 948 创建时间: 2023-01-05 23:43:21 更新时间: 2024-03-29 21:04:44

本地Docker开发项目,由于单表数据量太大,在复制数据的时候,经常因为硬件问题导致数据库崩溃,无法启动。ibd文件的表空间id,也就是tablespace id直接变成0,直接无法启动数据库。

这种情况下,我知道的方法就是使用 innodb-force-recovery=1 强制启动数据库。然后把出问题的表删掉,然后再新建表,通过Mysqlbinlog恢复数据。下面分享一下,如何在Docker环境下通过Mysqlbinlog恢复数据。

 

第一点:在对数据库进行大的操作之前,一定要记得备份数据和表结构

 

比如我的项目,会在几个小时内增加上GB的数据,然后我还经常因为单表数据量太大导致MySQL崩溃。在大的操作之前,一定要记得备份数据和表结构。

因为任何对数据和表结构的操作,都会被binlog记录下来,为了不引起恢复数据的时候不必要的麻烦,一定要记得备份数据和表结构。

 

第二点:Oracle官方的MySQL镜像从8.0.24开始不包含Mysqlbinlog工具了

 

需要在env环境中,把MySQL的版本号改成debian的。比如说8.0.31-debian这样的写法。Debian的Docker镜像还包括mysqlbinlog工具。

 

第三点:mysqlbinlog恢复数据的指令

 

首先登录镜像,不要通过mysql进入命令行。而是在root账户下。使用如下指令:

mysqlbinlog --base64-output=auto --require-row-format --start-position=4 --stop-position=1073743090 --database=dev_163_cn --set-charset=UTF8MB4 /var/lib/mysql/binlog.000070 | mysql -uroot -proot -vv

关于这个指令,介绍的文章很多,这里就不赘述了。

建议直接复制这个指令,否则会各种报错的。

 

总结

 

在本地通过mysqlbinlog恢复数据,速度还是挺快的。1GB的二进制文件,一局王者荣耀的时间就完成了。

 

 

月度最有价值文章

帖子投票

名称 是否有价值
kideny

投票统计

是否原创: 100 %

100 % Complete (success)

是否有价值: 100 %

100% Complete

是否有素质: 100 %

100% Complete (warning)

是否合法: 100 %

100% Complete

   群组工具

   外部链接