枚举字段,未知原因丢失数据,显示空字符

【 使用环境 】生产环境
【 OB or 其他组件 】oceanbase
【 使用版本 】4.2.2.0-CE
【问题描述】
表结构:
CREATE TABLE sale_trade_detail (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
if_valid tinyint(1) DEFAULT ‘1’ COMMENT ‘是否有效’,
invalid_reason varchar(50) DEFAULT NULL COMMENT ‘失效原因’,
plat_code enum(‘其他’,‘shopee’,‘aliexpress’,‘amazon’,‘lazada’,‘tiktok’,‘mercado’,‘walmart’,‘wish’,‘ebay’,‘ebay虚拟仓’,‘shopee_cnsc’,‘amazonMCF’,‘joom’,‘fyndiq’,‘shopify’,‘coupang’,‘temu’,‘pinduoduo’,‘shein自营’,‘shein商城’,‘miravia’,‘AE全托管’,‘AE半托管’,‘AE自营’,‘daraz’,‘ozon’,‘Wildberries’) DEFAULT NULL COMMENT ‘平台代码’,
trade_date date DEFAULT NULL COMMENT ‘交易日期’,
PRIMARY KEY (id),
) AUTO_INCREMENT = 2219988 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 3 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0 TABLEGROUP = ‘prod’ ;

字段platCode是个枚举字段。
查询结果出现了一列不再枚举范围的数据
image

正常使用insert、update语句修改platCode,如果不在上述枚举范围,都会报错:

只有这行数据绕过了platCode的枚举检查。
这行数据是从rdsMysql 通过dts同步过来的。
查看源库这行数据,是有正常值’shopee’ 的。
怀疑是在转储或者合并期间丢失了数据或者执行ddl的时候丢失了数据
期间有执行过修改platCode枚举范围的ddl语句

1 个赞

空值应该表现是NULL,而非空串,反馈另一个租户出现2条空串数据,已经手动更新修复,需要排查当前租户数据变成空串原因。
为null时:
image

1 个赞

可以把字段定义成not null试试

1 个赞

黑屏执行sql查询。结果与开发工具结果一致
d49ae29af0ba0a27470e03dc918d40e

1 个赞

改成not null。 空串数据还是存在的

1 个赞

=’’ 和 is null看那个能查出来呢

1 个赞

看下有调整过sql_mode操作吗,如果是非严格模式下,空串是可以插入的。

1 个赞



没有改过

1 个赞

只有 =’’ 查询出来

1 个赞

会话级别ocp上是查不出来的,需要咱们内部确认下是否有调整sql_mode操作。

1 个赞

这个怎么确认。没有操作过这个参数。
而且原数据并不是空串,而是’shopee’

1 个赞

可以在gv$ob_sql_audit 审计视图中确认。但是该视图数据不持久化存储,如果时间太久可能数据被淘汰,无法判断的。
例如:关键字
select * from gv$ob_sql_audit where query_sql like ‘%sql_mode%’ or query_sql like ‘%plat_code=’’%’ or query_sql like ‘%sale_trade_detail%’ 等信息。

最好能找到数据为空串时间前后的完整gv$ob_sql_audit 信息,方便确认前后问题复现场景。

1 个赞


查询这个sql发现, 近期其他库做同步时,有设置sql_mode为空串的记录。 但没有找到当前问题出现的数据库出现问题的记录

其他库有枚举字段被更新为空串现象吗? 看下sql_audit 视图REQUEST_TIME最大最小时间,和出问题库数据枚举为空串时间是否吻合,前提是需要知道被更新为空串时的时间。

其他库,是近期才同步的。 而且也没有包含枚举字段的表···
时间是对不上的

如果能复现的话 可以观察下,目前看记录的行为,是有可能是sql_mode导致的。

咱们的场景需要调整 sql_mode ,这个是否合理,也需要确认下。