目录
一、问题描述
这个问题出现的场景是我在Linux中使用MyCat用户远程登录时出现的,搞了很久。错误提示如下图所示:
可以看出,使用show tables找不到表。
二、解决历程
百度反正没有我这种错误的。我参考过如下文章,都没有解决。
https://blog.csdn.net/Chen_leilei/article/details/109566480
https://blog.csdn.net/cnds123321/article/details/117934134
最后定位我的问题是数据库问题。
三、解决方案
首先,我们看一下schema.xml这个文件的配置。
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
<dataNode name="dn1" dataHost="host1" database="testdb"/>
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<!-- can have multi write hosts -->
<writeHost host="hostM1" url="192.168.85.131:3306" user="root" password="123">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.85.132:3306" user="root" password="123"/>
</writeHost>
</dataHost>
</mycat:schema>
我们知道,schema.xml是MyCat三大配置文件之一,其中定义逻辑库,表、分片节点等内容。
而在运行原理上,我们又知道MyCat并不直接指向实际的物理库,而是有一个逻辑库的概念。我们通过<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>定义了逻辑库的数据节点,但是逻辑库dataNode="dn1"最终其实还是要指向实际的物理库,所以我们也要通过<dataNode name="dn1" dataHost="host1" database="testdb" />来指向实际的物理库。而我的问题就出在这个物理库上,我实际的物理库根本就没有表,所以自然报ERROR 1184 (HY000): Invalid DataSource:0这个错误了。 实际我testdb这个真实的物理库也没建,所以也会出现卡顿问题。
问题最终得以解决。其实问题原因很简单,但是定位的过程中由于不知道什么原因很难。仅就本例而言,我认为是我没有搞清楚<scema>和<dataNode>这两个标签分别配置的是什么意思,其实就是分别对应虚拟的逻辑库和真实的物理库,物理库就是数据库中必须真实有这个数据库。经过我在数据库真实创建了destdb这个库,以及库下再放几张表,这个问题就解决了!