1、 問題
首先說下我遇到的問題,我是最近打算了解mycat,遂在自己電腦上安裝了mycat,在經過一番配置之後,無論是命令窗口還是navicat都無法連城成功,總是報沒有數據庫的錯誤,以下是mycat版本
這是我的MySQL版本:
2、鎖定問題
剛開始的時候,我以爲是配置文件有問題,以下是我的配置文件,首先上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也可以正常訪問,歡迎成功之後留下評論。
3、解決問題
下面貼出我修改後的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>
修改之後,成功通過navicat訪問mycat,如下圖: