各位大佬,mycat2搭建好,创建分片表后delete 删除分片表报错:no database selected,查询、修改、新增都正常,就删除报错,是什么原因?
建表语句如下:
CREATE TABLE db1.orders(
id BIGINT NOT NULL AUTO_INCREMENT,
order_type INT,
customer_id INT,
amount DECIMAL(10,2),
PRIMARY KEY(id),
KEY id
(id
)
)ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 4;
删除语句如下:
delete from db1.orders where id=1;
后台日志报错如下:
INFO | jvm 1 | 2024/04/10 11:51:09 | 2024-04-10 11:51:09,333[ERROR]io.vertx.core.impl.future.FutureImpl.?:?tryFail
INFO | jvm 1 | 2024/04/10 11:51:09 | java.sql.SQLException: No database selected
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:129)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1092)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdateInternal(ClientPreparedStatement.java:1040)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.ClientPreparedStatement.executeLargeUpdate(ClientPreparedStatement.java:1347)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.mysql.cj.jdbc.ClientPreparedStatement.executeUpdate(ClientPreparedStatement.java:1025)
INFO | jvm 1 | 2024/04/10 11:51:09 | at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:255)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.mycat.newquery.NewMycatConnectionImpl.lambda$update$5(NewMycatConnectionImpl.java:374)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.vertx.core.impl.future.Transformation.onSuccess(Transformation.java:39)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.vertx.core.impl.future.FutureBase.emitSuccess(FutureBase.java:60)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.vertx.core.impl.future.FutureImpl.addListener(FutureImpl.java:168)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.vertx.core.impl.future.FutureBase.transform(FutureBase.java:92)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.mycat.newquery.NewMycatConnectionImpl.update(NewMycatConnectionImpl.java:353)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.mycat.monitor.ThreadMycatConnectionImplWrapper.lambda$update$5(ThreadMycatConnectionImplWrapper.java:119)
INFO | jvm 1 | 2024/04/10 11:51:09 | at io.mycat.IOExecutor$1.lambda$executeBlocking$0(IOExecutor.java:33)
INFO | jvm 1 | 2024/04/10 11:51:09 | at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
INFO | jvm 1 | 2024/04/10 11:51:09 | at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
INFO | jvm 1 | 2024/04/10 11:51:09 | at java.lang.Thread.run(Thread.java:748)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据您提供的信息,mycat2
搭建完成后,创建了分片表并尝试执行DELETE
操作时,报错No database selected
。然而,查询、修改和新增操作均正常运行。以下是问题的详细分析与解决方案。
错误信息解读
报错信息No database selected
表明在执行DELETE
语句时,数据库上下文未正确设置。这通常是因为SQL语句中未明确指定数据库名称,且当前会话未选择默认数据库。
分片表特性
您的建表语句中使用了分片功能:
CREATE TABLE db1.orders (...) ENGINE=INNODB DEFAULT CHARSET=utf8
dbpartition BY mod_hash(customer_id) tbpartition BY mod_hash(customer_id)
tbpartitions 1 dbpartitions 4;
dbpartition
和 tbpartition
定义了分片规则。Mycat2 的行为
Mycat2 是一个分布式数据库中间件,负责将 SQL 请求路由到不同的分片节点。如果 SQL 语句中未明确指定数据库名称,Mycat2 可能无法正确解析目标分片节点,从而导致No database selected
错误。
在执行DELETE
语句时,确保明确指定数据库名称。例如:
DELETE FROM db1.orders WHERE id = 1;
在执行DELETE
语句前,先通过USE
语句设置默认数据库。例如:
USE db1;
DELETE FROM orders WHERE id = 1;
USE
语句会为当前会话设置默认数据库,后续 SQL 语句无需重复指定数据库名称。如果上述方法仍无法解决问题,请检查 Mycat2 的配置文件,确保以下内容正确: 1. 逻辑库配置
确保schema.xml
中定义了db1
逻辑库,并正确映射到物理分片节点。例如:
<schema name="db1" checkSQLschema="true">
<table name="orders" dataNode="dn1,dn2,dn3,dn4" rule="mod_hash(customer_id)" />
</schema>
注意:checkSQLschema
属性应设置为true
,以确保 Mycat2 自动解析 SQL 中的数据库名称。
分片规则配置
确保rule.xml
中定义了mod_hash(customer_id)
分片规则,并正确映射到物理分片节点。
日志排查
查看 Mycat2 的后台日志,确认是否因分片规则或路由配置错误导致DELETE
操作失败。
分片表的限制
分片表的操作(如DELETE
)可能受到 Mycat2 的路由规则限制。建议在执行复杂操作前,先验证分片规则是否正确。
SQL 语法兼容性
Mycat2 对 SQL 语法的支持可能存在差异。建议参考官方文档,确保 SQL 语句符合 Mycat2 的语法要求。
异常处理
如果问题仍未解决,建议启用 Mycat2 的调试日志,进一步排查路由和执行过程中的异常。
通过明确指定数据库名称或设置默认数据库,可以有效解决No database selected
错误。同时,建议检查 Mycat2 的配置文件,确保分片规则和路由配置正确无误。如果问题持续存在,请结合日志信息进一步排查。
希望以上解答能够帮助您解决问题!您可以复制页面截图提供更多信息,我可以进一步帮您分析问题原因。