这里列出来的只是我这个系统环境下遇到的问题,以及解决办法,不一定适用于所有人的情况。
选择4.1.1,是因为B站上的教程全都是这个版本。选择5.0+可能会找不到方向。
CentOS Linux release 7.9.2009 (Core)
mysql-connector-java-5.1.49.jar
Sharding-Proxy使用docker来部署
启动proxy时候报错
Type org.apache.shardingsphere.orchestration.center.yaml.config.YamlCenterRepositoryConfiguration not present
这里参考Sharding-Proxy分库分表。按这位大佬的说法,我的tar包是在Windows下解压的,会有文件名长度的问题=。=
问题是360解压也没报错,无语了。
总之,我在Linux下解压后,问题消失。
我在插入数据的时候,有如下报错
org.apache.shardingsphere.sql.parser.sql.segment.dml.expr.simple.ParameterMarkerExpressionSegment cannot be cast to org.apache.shardingsphere.sql.parser.sql.segment.dml.column.ColumnSegment
这里是我以为自己的4.1.1有BUG的时候,选择了4.1.0版本,遇到的问题。解决方法就是放弃了4.1.0=。=
参考某大佬链接
我在插入数据的时候,发现proxy没有分片操作。我设置的是一个逻辑表分成三个实体表存。
结果在插入一行测试数据后发现,三个实体表里全都有这条数据。
而在查逻辑表的时候会返回三条一样的数据。
我不会Java,没法从源码里找答案,网上也没有查到类似情况。
给我感觉是,程序将我的这张逻辑表视为广播表了。
# 原来的config-sharding.yaml配置
shardingRule:
tables:
ods_exp_pre_in:
actualDataNodes: sharding_db.ods_exp_pre_in_s$->{0..2}
tableStrategy:
inline:
shardingColumn: hs_code
algorithmExpression: ods_exp_pre_in_s$->{hs_code % 3}
keyGenerator:
type: SNOWFLAKE
column: hs_code
我之后去B站看了有关教程,排除这个是官方BUG的可能性。
最后想起来hs_code是字符串,可能在algorithmExpression运算时候出错了。
我把hs_code替换为int类型的id字段后,问题解决。
# 修改后的配置
shardingRule:
tables:
ods_exp_pre_in:
actualDataNodes: sharding_db.ods_exp_pre_in_s$->{0..2}
tableStrategy:
inline:
shardingColumn: id
algorithmExpression: ods_exp_pre_in_s$->{id % 3}
keyGenerator:
type: SNOWFLAKE
column: hs_code
若有如上的配置问题,目前还发现了三种情况会报如下错误
2Unknown exception: [No signature of method: java.lang.String.mod() is applicable for argument types: (java.lang.Integer) values: [3]
Possible solutions: drop(int), any(), find(), use([Ljava.lang.Object;), is(java.lang.Object), take(int)]
1.Kettle的“表输出”插件。
2.Python的pymysql库使用executemany
进一步的,我发现了一个奇怪的地方:
INSERT INTO logic_db.ods_imp_pre_in
VALUES(1, NULL, NULL, "3780017", NULL, "2016-01-01", "394068602", "BG EXPLORATION AND PRODUCTION INDIA LTD", "BG HOUSE,LAKE BOULEVARD,HIRANANDANI BUSINESS PARK,POWAI", "400076", "MUMBAI,MAHARASHTRA", NULL, NULL, NULL, NULL, NULL, "SCHLUMBERGER RESERVOIR PRODUCTS FZE", "P.O.BOX. 18070, JEBEL ALI FREE ZONE, DUBAIUnited Arab Emirates", NULL, "73079990", "CLAMPS FOR SECURING CONTROL LINES OVER 3-1/2 TUBING COUPLING (QTY 200 NOS UNIT PRICE 54 USD) (OILFIELD SUPPLIES)", 1010.000000, "KGS", NULL, 10.800000, NULL, 10908.000000, "USD", 725.760000, 733017.580000, "INR", NULL, 0.000000, 2, 10867.569755, 67.199998, 67.450000, "4A", NULL, "ARYA OFFSHORE SERVICES PVT LTD", NULL, "CN", "China", NULL, "IN", "India", "INNSA1", "Nhava Sheva Sea", NULL, "IN_2016_IMP")
;
INSERT语句中,若使用的双引号标记字符串,就会重复插入数据。
若用单引号,则会发生上述报错。
目前暂时不知道原因是啥。
具体怎么用hs_code(字符串)来分片,我还得研究一下。
2Unknown exception: [no table route info]
目前测试发现,就是配置里有两处没对上。
shardingRule:
tables:
ods_exp_pre_in:
actualDataNodes: sharding_db.ods_exp_pre_in_s$->{0..2}
tableStrategy:
inline:
shardingColumn: id
algorithmExpression: ods_exp_pre_in_s$->{id % 3}
actualDataNodes和algorithmExpression所写的表达上必须要能对上号,错一点就会报这个错误。