Oracle DataGuard异常:含默认值表数据同步及丢失问题排查
排查主库插入数据丢失且备库未同步的问题(含默认值表)
问题场景
我创建了一张带默认值的表:
CREATE TABLE "TEST"."AA" ( "COL1" VARCHAR2(20 BYTE), "cretime" TIMESTAMP(3) DEFAULT SYSTIMESTAMP );
在主库(PRIMARY_ROLE)执行插入语句:
INSERT INTO "AA"("COL1", "cretime") VALUES ('2', TO_TIMESTAMP('2024-06-03 15:18:18.028', 'SYYYY-MM-DD HH24:MI:SS:FF3'))
执行结果显示影响1行,但备库(STANDBY_ROLE)未同步这条数据,片刻后主库中的该数据也丢失了。在无默认值的其他表插入数据则正常,需要排查是否由默认值导致该问题。
排查步骤
1. 确认事务提交状态
- 检查插入操作是否执行了显式
COMMIT;,若为自动提交模式,确认数据库自动提交配置是否正常。主库数据丢失大概率是事务未提交被回滚,或存在隐式回滚场景。 - 查询主库事务日志,确认该插入事务是否完成提交,是否存在回滚记录。
2. 针对默认值设计多场景测试
- 场景1:使用默认值插入数据
执行以下语句并提交:
观察主库数据是否保留、备库是否同步。若此场景正常,说明手动指定时间戳的插入逻辑存在问题;若同样丢失,则默认值定义大概率是诱因。INSERT INTO "TEST"."AA"("COL1") VALUES ('test_default'); COMMIT; - 场景2:移除默认值后测试原插入语句
先修改表结构:
再执行原插入语句并提交,查看主库数据是否保留、备库是否同步。若恢复正常,可直接确认默认值是问题根源。ALTER TABLE "TEST"."AA" MODIFY "cretime" TIMESTAMP(3);
3. 检查主备同步链路
- 查看备库同步日志,排查是否存在
TEST.AA表的同步报错,比如数据类型不兼容、SYSTIMESTAMP函数在备库无法执行等。同时确认主备库时区、时间配置是否一致。 - 检查主库归档日志,确认该插入操作是否被归档,备库是否正常接收并应用归档日志。
4. 排查数据库异常日志与触发器
- 查看主库alert日志,检查插入操作后是否有表空间不足、约束冲突、触发器执行失败等报错,这些情况会导致事务隐式回滚。
- 确认
TEST.AA表是否存在触发器,比如插入后自动删除/修改数据的逻辑,这也可能导致数据丢失。
内容的提问来源于stack exchange,提问作者wfugui
相关产品推荐
相关产品推荐

