Mysql迁移数据导致崩溃

在 Github 上修改

前天收到用户反馈,部分地区打不开我们的应用,一开始检查猜测是机房网络、对全国各地的连通性不通。后来检查服务器,发现机房的网络对三大运营商的连通性不是三线直连,是单线电信的,所以联通和移动网络访问会出现丢包的问题。 接下来我们就开始迁移备用服务,因为是用的docker环境,所以迁移起来比较方便。 mysql的迁移是数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。 数据迁移过来之后但此时服务器一直卡住,过段时间直接timeout,启动失败!看mysql日志,出现大量如下错误

InnoDB: Error: page 47 log sequence number 13576757483
InnoDB: is in the future! Current system log sequence number 8214.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
The manual page at http://dev.mysql.com/doc/mysql/en/crashing.html contains
mysql_1     | information that should help you find out what is causing the crash.
This could be because you hit a bug. It is also possible that this binary
[ERROR] mysqld got signal 6 ;

期间 mysql 启动了一次然后就挂了,根据日志提示设置 innodb_force_recovery

[mysqld]
innodb_force_recovery = 1

innodb_force_recovery可以是设置1-6,数字大的包含数字小的功能

1.innodb_force_recovery=1,即使发现了损坏页面也继续让服务器继续运行,这个选项对于备份或者转存当前数据尤为有用

2.innodb_force_recovery=2,阻止恢复主线程的运行,如果清除操作会导致服务器挂掉

3.innodb_force_recovery=3,恢复后不回滚事务

4.innodb_force_recovery=4,如果插入到缓冲区的合并操作会导致系统崩溃,将不会被执行

5.innodb_force_recovery=5,启动数据库时,忽略撤消日志

6.innodb_force_recovery=6,启动数据库时,忽略与恢复相关的前滚日志

innodb_force_recovery 等于3等时候 mysql 可以打开了,根据文档上描述修复,关闭 innodb_force_recovery 后重启启动成功。

关于数据库迁移有hen在迁移之前有三种方案:

1.数据库直接导出,拷贝文件到新服务器,在新服务器上导入。

2.使用【MySQL GUI Tools】中的 MySQLMigrationTool。

3.数据文件和库表结构文件直接拷贝到新服务器,挂载到同样配置的MySQL服务下。

我选择的是第三种 迁移前关闭 mysql 服务,选择在凌晨进行迁移。因为数据量比较大,所以第三种迁移时间比较快,但是会出现像上面那种异常问题,如果数据量不大的话,可以用第二种或者第一种。

参考: MySQL:MySQL 8参考手册::如果MySQL不断崩溃,该怎么办?

解决迁移mysql数据时,redo log和数据不一直导致mysql崩溃无法重启问题