【 使用环境 】 测试环境
【 OB or 其他组件 】OMS
【 使用版本 】4.2.7_CE
【问题描述】通过OMS 尝试使用结构迁移+全量迁移+增量同步 的方式将postgresql 15 部分表的结构和数据迁移到OceanBase_CE 4.3.5.0 。
OMS 自动把 原格式为 TIMESTAMP WITH TIME ZONE 的数据类型的列对应映射为了DATETIME(6) 。
发现在迁移 原格式为 TIMESTAMP WITH TIME ZONE 的数据到 ob时,时区信息丢失,而且是 UTC 时间,也就是减了 8 小时的数据。所以在全量验证的时候一直需要订正。想知道这个是否也会影响到增量同步数据时候,导致增量进入的数据的时间也存在时区问题减少了 8 小时,是否有哪里的参数可以调整?
在源端postgresql 写的时区信息是多少?
组件中的 Incr-Sync增量同步组件的配置中各连接都有发现 “timezone”:string"+08:00"。
Store增量拉取组件的配置参数中未发现相关参数。
Full-Import 全量导入组件 的配置中各连接有发现 “timezone”:string"+08:00"。
Full-Verification 全量校验组件组件中 PG 相关配置有发现 “timezone”:string"+08:00",OB 配置部分未发现。
能否将源端建表语句发一下,再给几条样例数据
CREATE TABLE public.pei (
id serial4 NOT NULL, – id
create_time timestamptz NULL,
update_time timestamptz NULL,
CONSTRAINT pei_pk PRIMARY KEY (id)
)
;
INSERT INTO pei (create_time,update_time) VALUES
(‘2025-02-11 18:05:17.080’,‘2025-02-11 18:06:18.453’),
(‘2025-02-11 18:05:17.051’,‘2025-02-11 18:05:17.051’),
(‘2025-01-15 14:52:19.942’,‘2025-01-15 14:52:37.994’),
(‘2025-01-15 14:52:19.936’,‘2025-01-15 14:52:19.936’),
(‘2025-01-15 14:51:04.578’,‘2025-02-11 17:48:19.603’),
(‘2025-01-15 14:51:04.565’,‘2025-01-15 14:51:04.565’),
(‘2025-01-13 16:19:31.699’,‘2025-01-14 14:33:58.413’),
(‘2025-01-13 16:19:31.692’,‘2025-01-13 16:19:31.692’),
(‘2025-01-13 16:04:44.862’,‘2025-01-13 16:04:57.735’),
(‘2025-01-13 16:04:44.855’,‘2025-01-13 16:04:44.855’);
INSERT INTO pei (create_time,update_time) VALUES
(‘2025-01-13 16:03:05.691’,‘2025-01-13 16:03:21.930’),
(‘2025-01-13 16:03:05.680’,‘2025-01-13 16:03:05.680’),
(‘2025-01-13 15:53:26.464’,‘2025-01-13 16:04:21.802’),
(‘2025-01-13 15:53:26.415’,‘2025-01-13 16:04:21.802’),
(‘2025-01-09 17:15:55.593’,‘2025-01-13 16:02:40.714’),
(‘2025-01-09 17:15:55.588’,‘2025-01-13 16:02:40.714’),
(‘2025-01-09 17:08:23.269’,‘2025-01-09 17:08:23.269’),
(‘2025-01-09 17:08:23.262’,‘2025-01-09 17:08:23.262’),
(‘2025-01-09 17:04:08.564’,‘2025-01-09 17:10:04.584’);
“id”,“create_time”,“update_time”
6789,2025-02-11 18:05:17.080 +0800,2025-02-11 18:06:18.453 +0800
6788,2025-02-11 18:05:17.051 +0800,2025-02-11 18:05:17.051 +0800
6787,2025-01-15 14:52:19.942 +0800,2025-01-15 14:52:37.994 +0800
6786,2025-01-15 14:52:19.936 +0800,2025-01-15 14:52:19.936 +0800
6785,2025-01-15 14:51:04.578 +0800,2025-02-11 17:48:19.603 +0800
6784,2025-01-15 14:51:04.565 +0800,2025-01-15 14:51:04.565 +0800
6783,2025-01-13 16:19:31.699 +0800,2025-01-14 14:33:58.413 +0800
6782,2025-01-13 16:19:31.692 +0800,2025-01-13 16:19:31.692 +0800
6781,2025-01-13 16:04:44.862 +0800,2025-01-13 16:04:57.735 +0800
6780,2025-01-13 16:04:44.855 +0800,2025-01-13 16:04:44.855 +0800
6779,2025-01-13 16:03:05.691 +0800,2025-01-13 16:03:21.930 +0800
6778,2025-01-13 16:03:05.680 +0800,2025-01-13 16:03:05.680 +0800
6777,2025-01-13 15:53:26.464 +0800,2025-01-13 16:04:21.802 +0800
6776,2025-01-13 15:53:26.415 +0800,2025-01-13 16:04:21.802 +0800
6775,2025-01-09 17:15:55.593 +0800,2025-01-13 16:02:40.714 +0800
6774,2025-01-09 17:15:55.588 +0800,2025-01-13 16:02:40.714 +0800
6773,2025-01-09 17:08:23.269 +0800,2025-01-09 17:08:23.269 +0800
6772,2025-01-09 17:08:23.262 +0800,2025-01-09 17:08:23.262 +0800
6771,2025-01-09 17:04:08.564 +0800,2025-01-09 17:10:04.584 +0800
这个和表结构没什么问题吧,就是timestamptz 类型数据,好像连接的时候时区不一致。
– [INFO] [CONVERT] create_time
TIMESTAMP WITH TIME ZONE → DATETIME(6)
– [INFO] [CONVERT] update_time
TIMESTAMP WITH TIME ZONE → DATETIME(6)
CREATE TABLE pei
(
id
int(11) NOT NULL AUTO_INCREMENT COMMENT ‘id’,
create_time
datetime(6) DEFAULT NULL,
update_time
datetime(6) DEFAULT NULL
PRIMARY KEY (id
)
) AUTO_INCREMENT = 6790 AUTO_INCREMENT_MODE = ‘ORDER’ DEFAULT CHARSET = utf8mb4 ROW_FORMAT = DYNAMIC COMPRESSION = ‘zstd_1.3.8’ REPLICA_NUM = 1 BLOCK_SIZE = 16384 USE_BLOOM_FILTER = FALSE TABLET_SIZE = 134217728 PCTFREE = 0
ob 中的对应表结构
上面的insert sql默认的时区是什么?
时区?
create_time timestamptz NULL,
update_time timestamptz NULL, 这两个类型,你这边给的insert数据中没有时区信息,数据库默认时区是啥?
pg的版本号麻烦也发一下
默认时区都是+8:00
PostgreSQL 15.3 (Ubuntu 15.3-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit
pg中查询出来麻烦截图看一下
select * from pei
问题是在全量校验的时候,可以看我前面的截图,你可以看到两个图里的时区是不一样的,但是没有任何修改,只是重新发起了一次全量校验不一致的表。
执行这个看一下
show timezone;