使用Sharding-Proxy为什么keyGenerateStrategy,指定的column没有值

方便更快捷的说明问题,可以按需填写(可删除)

使用环境:

5.0.1.SNAPSHOT 1206版本

场景、问题:

已进行操作:

config-sharding:

rules:
- !SHARDING
 tables:
   user:
     actualDataNodes: ds_0.user
     tableStrategy:
       standard:
         shardingColumn: id
         shardingAlgorithmName: user_inline
     keyGenerateStrategy:
       column: p_id
       keyGeneratorName: snowflake

 shardingAlgorithms:
   database_inline:
     type: INLINE
     props:
       algorithm-expression: ds_4
   user_inline:
     type: INLINE
     props:
       algorithm-expression: user_${id % 16}
 
 keyGenerators:
   snowflake:
     type: SNOWFLAKE
     props:
       worker-id: 123

proxy内执行:

ADD RESOURCE ds_4 (
    URL="jdbc:mysql://127.0.0.1:3306/account_shard?serverTimezone=UTC&useSSL=false",
    USER=root,
    PASSWORD=rootroot,
    PROPERTIES("maximumPoolSize"=1000,"idleTimeout"="30000")
);

ALTER SHARDING TABLE RULE user (
RESOURCES(ds_4),
SHARDING_COLUMN=id,
TYPE(NAME=hash_mod,PROPERTIES("sharding-count"=16)),
GENERATED_KEY(COLUMN=p_id,TYPE(NAME=snowflake,PROPERTIES("worker-id"=123)))
);

现状:

image

p_id bigint unsigned NOT NULL
这个是我的表字段定义

@imchao9
Hi,请问你的 INSERT 语句是怎样的?
最好可以提日志中的 Logic SQL 和 Actual SQL。

我是通过scaling执行的,貌似没有打印日志

好的,我们请 @sandynz 看一下呢

可以开启 Proxy 的 sql-show 配置,能够打印所有 SQL。

你好,scaling迁移的是现有数据,p_id在源端是什么取值,目标端就是什么取值,不会重新生成。scaling一般和keyGenerateStrategy没有关系。

需要确认下源端p_id的取值是什么,和目标端一致么?

了解了,因为我原来的表是没有雪花ID的,所以我想通过sharding-proxy迁移的过程中来填充雪花算法的ID

那我想问下,如果本身这个字段没有值,想给他加上有什么建议呢

scaling迁移完成之前一般是要做源端和目标端数据一致性校验的,id相关的字段一般都比较重要,不会忽略校验。这样的话数据校验会失败。

建议先在源端把数据补齐。

1 个赞

也就是这个一致性检查会用GENERATED_KEY来做吗
GENERATED_KEY设置后,除了新增数据的id,一致性检查,还会影响什么

具体校验逻辑和指定的校验算法有关,可以通过SPI自定义。
默认校验所有字段的数据。

京ICP备2021015875号