数据库连接报错:ERROR 1047 (08S01): WSREP has not yet prepared node for application use

背景:昨天突然接到客户电话说系统登录不上了,之前都好好很稳定,我想着不会有太大问题,由于是周日,我立即登录看了日志是怎么回事,发现数据库连接异常,如题异常;

数据库环境:CentOS + MariaDB10.1.22 + galera cluster 

说明:可能一部分童鞋没用过MariaDB,MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

而galera cluster是mysql多主集群,包含在MariaDB中,同时支持Percona xtradb、MySQL,是一个易于使用的高可用解决方案,在数据完整性、可扩展性及高性能方面都有可接受的表现。

问题分析:当数据库集群正常运行的时候,可高性能正常运行,当其他节点正常关闭,只剩下一个节点的时候,也是可以正常读写的,但是当其他节点异常关闭时,就不能提供正常的读写了,因为此时数据库集群中没有了裁判节点,也就是此时会出现脑裂,数据库不知道读写出现混乱,不能正常读写。就会导致如题异常。

解决方案:

背景:昨天突然接到客户电话说系统登录不上了,之前都好好很稳定,我想着不会有太大问题,由于是周日,我立即登录看了日志是怎么回事,发现数据库连接异常,如题异常;

数据库环境:CentOS6.4 + MariaDB10.1.22 + galera cluster 

说明:可能一部分童鞋没用过MariaDB,MariaDB数据库管理系统是MySQL的一个分支,主要由开源社区在维护,采用GPL授权许可。开发这个分支的原因之一是:甲骨文公司收购了MySQL后,有将MySQL闭源的潜在风险,因此社区采用分支的方式来避开这个风险。

MariaDB的目的是完全兼容MySQL,包括API和命令行,使之能轻松成为MySQL的代替品。

而galera cluster是mysql多主集群,包含在MariaDB中,同时支持Percona xtradb、MySQL,是一个易于使用的高可用解决方案,在数据完整性、可扩展性及高性能方面都有可接受的表现。

问题分析:当数据库集群正常运行的时候,可高性能正常运行,当其他节点正常关闭,只剩下一个节点的时候,也是可以正常读写的,但是当其他节点异常关闭时,就不能提供正常的读写了,因为此时数据库集群中没有了裁判节点,也就是此时会出现脑裂,数据库不知道读写出现混乱,不能正常读写。就会导致如题异常。

解决方案:收集了很多资料,一步一步的走,最后花了一天的时间才解决这个问题;

第一步:查看完日志后,发现数据库异常后,查看数据库状态:service mysql status  发现只有一台DB服务是正常启动状态

第二步:查看galera cluster 节点数:进入数据库 查看集群的节点  MariaDB [(none)]> SHOW STATUS WHERE Variable_name IN; 和预想的一样就剩一个节点了,此时查看集群配置文件/etc/my.cnf.d/server.cnf  集群配置wsrep_cluster_address="gcomm://"里配置了3个节点服务ip,也就是说目前已经挂了两个了,经过咨询同事之前有一个节点是正常关闭(为了节省资源);然后就把问题缩小到目前正在使用的两个节点上了,很明显一个节点正常,那肯定是另一个节点异常关闭了,从而导致了现在的异常

第三步:知道是节点异常关闭的问题,那就先恢复数据库,那么现在问题来了在重启数据库的时候一直Failed

经过查阅mysql日志发现有一个节点,正常关闭的节点一直处于连接超时状态,我就修改了galera cluster 配置文件/etc/my.cnf.d/server.cnf 不用的这个集群几点删除,重启还是Failed , 查看日志报错就变了:WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out),此时针对此错误:

删除所有节点的两个缓存文件及/var/lock/subsys 目录下的mysql 文件,然后重新启动:

rm -rf /var/lock/subsys/mysql

cd /var/lib/mysql

rm -rf galera.cache

rm -rf grastate.dat

第一个节点这样启动:

service mysql start --wsrep-new-cluster

其他节点正常启动:

service mysql start

到此处主节点已经正常启动了,也就是说数据库已经可以正常用了,但是集群还没起来,此时就要查看异常节点的日志了,查看的时候发现一直重复出现一条错误日志:19:25:02 [ERROR] Invalid (old?) table or database name ‘lost+found‘

这个日志的大致意思是什么呢?就是这个“lost+found”空间是无效的,这就很明了的,我火速查看磁盘空间,结果发现此节点所占的磁盘已经100%了

到此,异常原因和解决方案已经有了。

特别感谢:https://blog.csdn.net/yabingshi_tech/article/details/105489707  、 https://blog.csdn.net/qq_41133227/article/details/94392512https://www.cnblogs.com/xiangyuqi/p/10221129.html

如有错误,欢迎指正!

 

数据库连接报错:ERROR 1047 (08S01): WSREP has not yet prepared node for application use

上一篇:Scrapy 实现抓取玉米资源网 按分类抓取全站资源 ,X站慎入! 手机电脑 可以直接看


下一篇:移动端WEB开发之响应式布局