首先说下我遇到的问题,我是最近打算了解mycat,遂在自己电脑上安装了mycat,在经过一番配置之后,无论是命令窗口还是navicat都无法连城成功,总是报没有数据库的错误,以下是mycat版本
这是我的MySQL版本:
刚开始的时候,我以为是配置文件有问题,以下是我的配置文件,首先上server.xml的配置,这个没啥好说的,用户名和密码,以及逻辑库名,这里用的是默认的TESTDB,也可以改成自己需要的,
<user name="root" defaultAccount="true">
<property name="password">root</property>
<property name="schemas">TESTDB</property>
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
接下来贴出schema.xml,这是核心配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="10">
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
</schema>
<dataNode name="dn1" dataHost="localhost" database="db1" />
<dataNode name="dn2" dataHost="localhost" database="db2" />
<dataNode name="dn3" dataHost="localhost" database="db3" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="root"></writeHost>
</dataHost>
</mycat:schema>
经多次检查,没有发现问题,于是去查看mycat 的日志文件,发现有以下信息:
WARN [$_NIOREACTOR-0-RW] (io.mycat.backend.mysql.nio.MySQLConnectionAuthenticator.handle(MySQLConnectionAuthenticator.java:91)) - can't connect to mysql server ,errmsg:Client does not support authentication protocol requested by server; consider upgrading MySQL client MySQLConnection [id=12, lastTime=1565574804387, user=root, schema=db3, old shema=db3, borrowed=false, fromSlaveDB=false, threadId=6185, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
这是没有连接mysql,于是猜测是不是版本问题,检查mycat的jar包,发现mysql-connector-java-5.1.35.jar,这个版本的jar包连接mysql8肯定会失败,换成mysql-connector-java-8.0.16.jar,本以为就可以连接成功,但是还是报错,继续排查…
终于在网上找到mycat尚未完全支持mysql8,如果要使用修改一些配置文件,这里我用的是另一种方式,修改mycat的连接方式,之前使用的是native,现在改为jdbc,这种方式不用修改太多文件,相对而言比较简单,有兴趣的小伙伴可以去修改mysql的配置文件,让native也可以正常访问,欢迎成功之后留下评论。
下面贴出我修改后的schema.xml文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="10">
<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
<table name="employee" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-intfile" />
</schema>
<dataNode name="dn1" dataHost="localhost" database="db1" />
<dataNode name="dn2" dataHost="localhost" database="db2" />
<dataNode name="dn3" dataHost="localhost" database="db3" />
<dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" />
<dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" />
<dataNode name="jdbc_dn3" dataHost="jdbchost" database="db3" /> -->
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="jdbc:mysql://localhost:3306?useSSL=false&serverTimezone=UTC&characterEncoding=utf8" user="root" password="root">
<!-- can have multi read hosts -->
<!--<readHost host="hostS2" url="127.0.0.1:3306" user="root" password="xxx" />-->
</writeHost>
</dataHost>
</mycat:schema>