最近在深入学习mysql的底层原理和应用,今天在学习分库分表操作的时候,由于一些配置问题,导致无法正常启动MyCat。最终通过GPT和其他博客将问题解决了,以下是一篇关于MyCat启动异常的解决方案。
1.思路:
配置问题其实一直都是比较头痛的,尤其当时是对于刚刚起步的新手,按着视频或者教程一步一步走,最后却没有办法正常运行,明明配置的一摸一样,却不知道问题出现在哪里?这时候,我们不妨跳出视频或者教程的节奏,通过各种各样的搜索来正确解决问题。由于配置问题多种多样,很难直接找到和自己的错误相同的。这里提供一般性的解决思路:查看日志文件,拿着日志文件的中的error信息去提问GPT,让GPT提供思路。在确定好大致问题之后,再去网络上搜索文档去解决问题或者让GPT提供解决方案。
2. 查找日志文件
我们可以通过以下linux命令来查找mycat的安装目录
1.使用 whereis
命令
格式:whereis 文件名
这个命令会返回指定文件的可执行文件、源代码文件以及帮助文档所在的目录。
2. 使用find命令
格式:find / -name "文件名"
这个命令会在整个系统中搜索文件名并返回匹配的路径。
我们通过以上命令快速定位本机上的mycat的安装目录,logs文件夹中的wrapper.log里面有我们想要看的mycat启动的日志信息,可按照以下命令进入:
3. 解读错误信息
Error1:
STATUS | wrapper | 2024/03/26 10:34:31 | Launching a JVM...
ERROR | wrapper | 2024/03/26 10:34:31 | JVM exited while loading the application.
INFO | jvm 5 | 2024/03/26 10:34:31 | Unrecognized VM option 'MaxPermSize=64M'
INFO | jvm 5 | 2024/03/26 10:34:31 | Error: Could not create the Java Virtual Machine.
INFO | jvm 5 | 2024/03/26 10:34:31 | Error: A fatal exception has occurred. Program will exit.
FATAL | wrapper | 2024/03/26 10:34:31 | There were 5 failed launches in a row, each lasting less than 300 seconds. Giving up.
FATAL | wrapper | 2024/03/26 10:34:31 | There may be a configuration problem: please check the logs.
STATUS | wrapper | 2024/03/26 10:34:31 | <-- Wrapper Stopped
这里我们可以看出,有一个VM option的参数没有办法去识别,导致jvm启动失败,错误看的一头雾水,完全没有思路,在网上搜索也没有解决方法,报错信息不一致。于是就询问GPT,GPT的解答如下:
GPT给出的思路是JDK版本不匹配,之后在官网里面核实信息,看看是否真的是因为版本号的问题,找到了这样的一句话:only mycat2 is supported on java8
查看本地JDK版本号,发现是JDK17的,于是下载JDK8,更改系统变量,解决了这一个版本错误的信息;
Error2:
解决完版本问题,又遇到一个bug,一大串的初始化异常,同时也印证了我们上一个问题解决了,JVM现在能够正常启动了。
问题看的不是很懂,于是再次询问GPT,对话如下:
这是我的schema.xml内容如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="TB_ORDER" dataNode="dn1,dn2" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="dhost1" database="db01" />
<dataNode name="dn2" dataHost="dhost2" database="db01" />
<dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="linux01" url="jdbc:mysql://192.168.49.111:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="123456">
</writeHost>
</dataHost>
<dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="linux03" url="jdbc:mysql://192.168.49.113:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
这时候想起来,默认配置文件里面的分表操作是3个数据库,而我直接删除了一个,配置了两个数据的信息。让GPT给出的解决方案是:
按照GPT给出的方案去解决问题,仍然报错,于是就想着能不能把规则函数的rang-long的分区大小进行更改呢?
在rule.xml配置文件中向下查找算法的最终实现,发现算法实现时,需要读取一个名为autopartition-long.txt的配置文件信息。
找到该文件,打开,发现问题所在
文件中配置了3个数据库的分区,而我只配置了两个数据库,导致配置文件之间发生冲突。
解决方法:直接注掉最后一行即可。
4.总结:
这篇博客解决了两个问题:
- mycat需要JDK8作为支持,不能够使用JDK17
- 我们在配置schema.xml文件的时候,一定要注意自己所使用的算法是如何实现的,可以在rule.xml中找到算法实现的配置文件进行更改。
这篇博客到这里就结束了,学习中遇到问题很简单,想办法去解决就可以了。
一起加油吧!!!