万恶之源
报错信息:ERROR 1105 (HY000): backend connect: java.lang.IllegalArgumentException: Invalid DataSource:0

为了找出具体报错原因,我根据 tail -f /usr/local/mycat/logs/mycat.log 命令,发现报错信息为:Access denied for user ‘root’@‘centos7’。

意思就是说我当前用户无权限,但我之前就给所有用户授过权了啊。

之前根据网课,我用了 % 通配符授权:
#创建允许访问 MyCat 服务器的用户
CREATE USER 'root'@'%' IDENTIFIED BY '123456';
#授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
#刷新权限
FLUSH PRIVILEGES;
而我之前给虚拟机配置了固定IP(192.168.88.130),配置主机名(centos7)和 IP 的映射关系

然后我查资料得知:MySQL 会自动查 /etc/hosts 或 DNS,把 192.168.88.130 反向解析成 centos7,优先用 ‘root’@‘centos7’ 匹配权限,而不是 ‘root’@‘%’,所以导致 ‘root’@‘centos7’ 没有权限。
| 优先级 | 匹配类型 | 示例 | 说明 |
|---|---|---|---|
| 1(最高) | 精确 IP 地址 | 'root'@'192.168.88.130' | 完全匹配客户端 IP |
| 2 | 精确主机名 / 域名 | 'root'@'centos7' | 完全匹配反向 DNS 解析结果 |
| 3 | IP 网段通配 | 'root'@'192.168.88.%' | 匹配整个网段 |
| 4 | 域名通配 | 'root'@'%.example.com' | 匹配所有子域名 |
| 5(最低) | 全通配 | 'root'@'%' | 匹配所有来源 |
所以我又在 MySQL 中给 'root'@'centos7' 用户授了一遍权。
#创建允许访问 MyCat 服务器的用户
CREATE USER 'root'@'centos7' IDENTIFIED BY '123456'; #注意这里的密码要与Mycat的server.xml文件配置一致
#授予所有权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'centos7' WITH GRANT OPTION;
#刷新权限
FLUSH PRIVILEGES;
初见端倪
结果还是报错(此时已凌晨一点半)

报错原因是 Public Key Retrieval is not allowed。
通过网课弹幕大神的指引,我在 JDBC URL 末尾追加&allowPublicKeyRetrieval=true :
<writeHost host="hostS1" url="jdbc:mysql://centos7:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true" user="root" password="123456" />
没完了吗
在我以为终于大功告成的时候,又双叒叕报错了…


原因是我失败了太多次,触发了 MySQL 安全防护机制:同一个 IP 的连接失败次数超过 max_connect_errors 阈值(默认 10 次)后,MySQL 会自动阻止该 IP 的所有连接,防止暴力破解。
最后执行:
mysqladmin -uroot -p flush-hosts
最后的最后,终于成功了,此时凌晨两点二十二分,室友都睡死过去了。

配置文件改错
额外提醒:修改完配置文件,一定要先停止服务,再重新启动服务,配置文件才生效!
切换到 Mycat 的安装目录,执行如下指令:
#停止
bin/mycat stop
#启动
bin/mycat start
如果你能开三台虚拟机,只要跟老师配置一样即可。如果你和我一样,只开了一台或两台虚拟机,也可以参考一下我的改错过程。
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">
<table name="user_order" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
</schema>
<dataNode name="dn1" dataHost="localhost1" database="test" />
<dataNode name="dn2" dataHost="localhost1" database="test" />
<dataNode name="dn3" dataHost="localhost1" database="test" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS1" url="jdbc:mysql://centos7:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8&allowPublicKeyRetrieval=true" user="root" password="123456" />
</dataHost>
</mycat:schema>
-
注意这里的 database 只能填 MySQL 已存在的数据库;
还有 dataHost 也是只能填已存在的,如果没有多台主机就全填同一个也行,只留一个分片节点也行。

-
比如这里的 test 数据库,我已经在 MySQL 创建好了,如果填的是未创建的数据库名会报错。

-
如果 url 填的是 jdbc,注意 dbDriver 也要填 jdbc,因为默认是 native,怕有些人会忘。

-
如果不涉及到分表,就把这里的 rule 删了。

-
如果涉及到分表,且你填的 rule = “auto-sharding-long”,如果你是三台虚拟机就没事,不是三台就在 autopartition-long.txt 文件修改一下。路径是:mycat/conf/autopartition-long.txt

-
假设你只开了两台主机,就把第三个注释掉。

-
url的账号密码要与 server.xml 配置文件一致
dataHost 标签的 url

server.xml

改报错真是痛苦又畅快的经历。(写完这篇博客已凌晨三点二十七分,不知道为啥一点都不困)
如果文章对你有一丝帮助的话,就点个小小的赞吧。


372

被折叠的 条评论
为什么被折叠?



