使用ShardingSphere做数据库分片,当使用查询条件不包含分片字段时,就会报错:Not allow DML operation without sharding conditions。如果我要查询时不带分片字段条件,该如何处理呢?

Not allow DML operation without sharding conditions报错

步骤一:

server.yaml设置proxy-hint-enabled为true

1
2
3
props:
#是否允许在 ShardingSphere-Proxy 中使用 Hint。使用 Hint 会将 Proxy 的线程处理模型由 IO 多路复用变更为每个请求一个独立的线程,会降低 Proxy 的吞吐量。
  proxy-hint-enabled: true

步骤二:

config-sharding.yaml设置为allow-range-query-with-inline-sharding: true

1
2
3
4
5
6
  shardingAlgorithms:
    database_inline:
      type: INLINE
      props:
        algorithm-expression: ds_${user_id % 2}
        allow-range-query-with-inline-sharding: true

说明:关于allow-range-query-with-inline-sharding字段,用到的有行表达式分片算法和复合行表达式分片算法。

以下是算法属性说明:

参考自官方文档:https://shardingsphere.apache.org/document/5.0.0/cn/features/sharding/concept/inline-expression/

行表达式分片算法

类型:INLINE

属性名称 数据类型 说明 默认值
algorithm-expression String 分片算法的行表达式 -
allow-range-query-with-inline-sharding (?) boolean 是否允许范围查询。注意:范围查询会无视分片策略,进行全路由 false

复合行表达式分片算法

类型:COMPLEX_INLINE

属性名称 数据类型 说明 默认值
sharding-columns (?) String 分片列名称,多个列用逗号分隔。如不配置无法则不能校验 -
algorithm-expression String 分片算法的行表达式 -
allow-range-query-with-inline-sharding (?) boolean 是否允许范围查询。注意:范围查询会无视分片策略,进行全路由 false

步骤三:

MySQL 客户端连接,默认是–skip-comments 过滤注释,要使用SQL Hint 功能,需要添加-c 选项保留注释,或–comments,例如:

1
mysql -h10.10.0.101 -P3307 -uroot -p --comments

步骤四:

查询时带上注释hint

1
2
/* ShardingSphere hint: disableAuditNames=sharding_key_required_auditor */
select * from t_order;

或者

1
2
/* SHARDINGSPHERE_HINT: disableAuditNames=sharding_key_required_auditor */ 
select * from t_order;

效果如下:

不带分片字段查询结果