问题
今天跟着某马学习分库分表时用到了MyCat,但是使用他们提供的Mycat 1.6.7.3压缩包解压完成后,mycat启动时,mycat的wrapper.log一直报错,查询Mycat也没有运行起来,其中Ubuntu 20系统报错如下:
NFO | jvm 1 | 2024/04/28 16:25:44 | WrapperSimpleApp: Encountered an error running main: java.lang.NoSuchMethodError: org.apache.logging.log4j.spi.ExtendedLogger.logIfEnabled(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Object;)V
INFO | jvm 1 | 2024/04/28 16:25:44 | java.lang.NoSuchMethodError: org.apache.logging.log4j.spi.ExtendedLogger.logIfEnabled(Ljava/lang/String;Lorg/apache/logging/log4j/Level;Lorg/apache/logging/log4j/Marker;Ljava/lang/String;Ljava/lang/Object;)V
问题分析
1.因为mycat分库分表涉及到server.xml和schema.xml的配置修改,因为很久没有写java,无法确定上面报错一定就是软件问题,所以多次确认好两个配置文件无误后进行下一步。
2.AI提示对于这个回答很笼统,分别让确认依赖版本,查看pom.xml,或者时编译环境等,但是我可能除了系统用的是Ubuntu外,其他基本无差别,jdk和mycat都使用的是教程相同版本。
3.使用Google搜索依然无解,只能自己慢慢尝试。为了排查系统因素,使用虚拟机开启安装好的Centos7系统,进入mycat目录,启动后,查看mycat目录下的logs文件夹中的wrapper.log报了新的错:
INFO | jvm 1 | 2024/04/28 16:45:32 | WrapperSimpleApp: Unable to locate the class io.mycat.MycatStartup: java.lang.NoSuchMethodError: org.apache.logging.log4j.status.StatusLogger.debug(Ljava/lang/String;Ljava/lang/Object;)V
4.查询网上资料说可能jdk版本低了,可能是我之前练习linux的时候遗留的jdk版本低了,重新上传视频同版本jdk到Centos虚拟机下并配置profile环境变量,配置好后使用source /etc/profile指令重载环境变量并启动mycat,报错依旧,看来和系统关系不大,继续切换回Ubuntu系统进行修复。
5.根据网上资料访问Mycat官网,结果Mycat 1已经访问不到资源了,页面已经提示Nginx 404了
6.因为log4j依赖库实在不知道怎么修改,网上该报错也较少,可能是Mycat 1版本已经很久没人维护的原因。尝试更换网上找到的Mycat版本为1.6到Ubuntu,结果发现项目目录结构还相对较新的1.6.7.3版本不一样,启动后报了新错,直接放弃。
7.CSDN中不少该软件不同的版本要付费,也只好放弃
解决办法
搞了一整天,最后还是版本问题,Google到藏在GitHub下原官方不起眼的Mycat 1.6.7.5的包,最终成功解决,先上网盘连接给大伙
重新安装MyCat前,先使用cp指令备份自己已经确认修改好的mycat的conf目录下的server.xml和schema.xml文件,避免重复无用功。
之后一定要删除原来的mycat文件夹,然后解压缩并且在新的mycat目录下创建一个名为logs的文件夹!
因为我第一次成功是在Ubuntu下,重新安装到CentOS系统测试时,没有删除原来的mycat文件夹导致CentOS报错依然和此前该系统的报错一致。
步骤:
1.通过xftp或者其他软件,将mycat 1.6.7.5.tar.gz包和mysql-connector-java-8.0.22.jar上传到自己要使用mycat的主服务器上,我这里上传到系统根目录下的/opt路径下
2.切换到自己的linux系统,解压mycat压缩包到/usr/local文件夹下
cd /opt
tar -zxvf Mycat-server-1.6.7.5-release-20200422133810-linux.tar.gz -C /usr/local
3.配置好可以通过该指令看到jdk版本回显信息
java -version
4.在mycat目录下,先删除lib目录下的过时5.x版本的mysql-connection的jar包,之后将jar包拷贝到lib目录下,并修改该包的权限为可读写执行
cd /usr/local/mycat/lib
rm -rf mysql-connector-java-5.1.35.jar
cp /opt/mysql-connector-java-8.0.22.jar /usr/local/mycat/lib
chmod 777 /usr/local/mycat/lib/mysql-connector-java-8.0.22.jar
5.切换到mycat的conf目录下,删除默认的server.xml和schema.xml,并拷贝备份修改好的这两个文件到conf目录下,同上一步一样使用chmod指令为两个配置文件添加可读可写可执行权限。
cd /usr/local/mycat/conf
rm server.xml
rm schema.xml
cp 你的备份server.xml或shcema.xml /usr/local/mycat/conf
6.重点,重点,重点,这个Mycat包缺少了一个logs文件夹,需要创建一个logs文件夹,用于存放wrapper.log文件
cd /usr/local/mycat
mkdir logs
如果不创建缺少文件夹,直接启动mycat,就有可能会报下面这个错误:
Could not write pid:No such file or directory
这个问题解决方法参考自:启动MyCat报错:Could not write pid:No such file or directory 解决办法
7.切换到mycat目录下,执行如下指令,并查看log信息可以看到success已经成功写到了日志里
/usr/local/mycat/bin/mycat start
less /usr/local/mycat/logs/wrapper.log
成功启动可以看到如下信息
并且使用端口指令也可以查看到8066端口已经在运行了
netstat -lnap | grep 8066
总结
这个问题虽然解决后感觉不难,可是当时找了一天,AI和Google和百度都没有找到这个和Mycat相关联的报错信息,确实比较崩溃,而且官网也不再维护这个版本了,换不同版本的包都不太好找,中途一度怀疑自我,还好这次运气比较好,如果有帮到你的话,希望可以点个赞,谢谢!