【MyCat报错】ERROR 1105 (HY000): backend connect: java.lang.IllegalArgumentException: Invalid DataSource

万恶之源

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

image-20260621011520428

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

image-20260621011633578

意思就是说我当前用户无权限,但我之前就给所有用户授过权了啊。
在这里插入图片描述

之前根据网课,我用了 % 通配符授权

#创建允许访问 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 的映射关系

image-20260621010613588

然后我查资料得知: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 解析结果
3IP 网段通配'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;

初见端倪

结果还是报错(此时已凌晨一点半)

image-20260621013307402

报错原因是 Public Key Retrieval is not allowed

通过网课弹幕大神的指引,我在 JDBC URL 末尾追加&allowPublicKeyRetrieval=true

<writeHost host="hostS1" url="jdbc:mysql://centos7:3306?useSSL=false&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8&amp;allowPublicKeyRetrieval=true" user="root" password="123456" />

没完了吗

在我以为终于大功告成的时候,又双叒叕报错了…

在这里插入图片描述

image-20260621015450911

原因是我失败了太多次,触发了 MySQL 安全防护机制同一个 IP 的连接失败次数超过 max_connect_errors 阈值(默认 10 次)后,MySQL 会自动阻止该 IP 的所有连接,防止暴力破解。

最后执行:

mysqladmin -uroot -p flush-hosts

最后的最后,终于成功了,此时凌晨两点二十二分,室友都睡死过去了。

image-20260621022624363

配置文件改错

额外提醒:修改完配置文件,一定要先停止服务,再重新启动服务,配置文件才生效!
切换到 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&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=utf8&amp;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
在这里插入图片描述

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值