一、背景
本环境使用的是openstack docker 容器平台,所有服务都是运行在docker 容器中,数据库使用的mariadb(1主2从),由于断电导致数据库无法启动。
二、原因分析
查看数据库日志,发现大量如下报错:
InnoDB: is in the future! Current system log sequence number 8716.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: for more information.
2020-01-06 10:56:46 139986236172480 [Note] InnoDB: 128 rollback segment(s) are active.
2020-01-06 10:56:46 7f5115e168c0 InnoDB: Error: page 0 log sequence number 29661217162
InnoDB: is in the future! Current system log sequence number 8716.
InnoDB: Your database may be corrupt or you may have copied the InnoDB
InnoDB: tablespace but not the InnoDB log files. See
InnoDB: http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html
InnoDB: for more information.
***初步判断由于异常断电,可能导致数据库文件出现了丢失。
三、解决思路
根据日志找到这个http://dev.mysql.com/doc/refman/5.6/en/forcing-innodb-recovery.html,里面是官网给出的强制数据库innodb 恢复的操作。按照这个进行尝试(详细可以看链接)
四、解决过程
1、首先查看哪个节点的数据库文件是最新的,也就是主节点
//在数据库节点上执行如下,找到seqno最大的节点,我的是control3
cat grastate.dat |grep seqno
2、修改数据库文件
[root@control3] vim galera.conf
...
innodb_force_recovery = 1
warep_on=OFF
...
3、删除control3节点ib_logfile文件
rm ib_logfile* -f
4、重启数据库
docker restart mariadb
****如果数据库还是无法启动 ,那么将innodb_force_recovery 的修改成2,然后再依次执行步骤3和步骤4.
****按照官网的建议, innodb_force_recovery 这个值,按照官方文档,要求从1-6依次尝试,直到数据库能起来为止,1-3 数据不会丢失,4-6数据会永久性丢失。
5、当数据库能起来之后,我们可以将整个数据导出,然后重启安装数据库,再建整个数据库回填即可。
这里省略数据库导入导出操作
注意:可能由于文件丢失,导致innoDB 出现问题,也就是现有数据库没法正常使用。只能重新部署,不管什么方法,都是尽量导出数据,保证数据不丢失,然后导入新的集群。我这里只是其中一种,也可以使用数据库文件进行恢复数据,这里可以看下另外的文章 https://medium.com/magebit/recover-innodb-database-from-frm-and-ibd-files-99fdb0deccad .