有blob字段的表数据恢复失败

【 使用环境 】测试环境
【 OB or 其他组件 】ob-loader-dumper
【 使用版本 】数据库是OceanBase 4.2.1.4,备份和恢复工具是ob-loader-dumper-4.2.1-RELEASE
【问题描述】
备份数据库表数据完成后,执行恢复命令的时候失败。
拥有blob字段的表数据恢复失败,字段默认值是empty_blob(),不能为空。如果该表有数据的blob字段值就是empty_blob(),这条数据会恢复失败。执行恢复的时候执行sql时插入字段值是HEXTORAW(’’),报错信息为 Error: ORA-01400: cannot insert NULL into ‘(txxx)’. Retry Mode: SERIAL.。
备份的时候导出数据文件格式选择 --sql、 --orc、 --par、 --cut都试了,都是报这个错误。

备份命令:
obdumper -h 192.168.7.91 -u ‘fm9@orcl’ -p 1 -P 2881 -D fm9 --sql -f xxx/data/ --table ‘txxx’

恢复命令:
obloader -h 192.168.7.91 -u ‘fm9@orcl’ -p ‘1’ -P 2881 -D fm9 --sql -f xxx/data/

如果将插入字段值改为empty_blob(),就可以正常插入。

【复现路径】
按照问题描述,新建一个表,其中拥有blob字段,插入数据时blob字段值设为empty_blob()。
然后正常执行备份和恢复命令。

针对这个问题,可以先通过 obdiag 工具来收集一些关键的日志信息,以便进一步分析问题的原因。
日志采集场景: 数据备份问题
日志采集命令: obdiag gather scene run --scene=observer.backup

为了更准确地定位问题,请您提供以下信息:

  1. 在备份和恢复的过程中是否有任何错误信息或警告?
  2. 您能否提供尝试插入 empty_blob() 值的具体 SQL 语句?
  3. 您使用的 ob-loader-dumper 版本是多少?
  4. 您能否提供表结构,特别是涉及 BLOB 字段的定义

1、表结构sql
create table tseal (
seal_id number(10) default 0 not null,
add_date number(10) default 0 not null,
update_date number(10) default 0 not null,
update_time number(18,0) default 0 not null,
remark varchar2(256) default ’ ’ not null,
seal blob default empty_blob() not null,
constraint ptseal primary key (seal_id)
) ;

2、ob-loader-dumper版本
4.2.1-RELEASE

3、插入的sql
insert into tseal(seal_id) values(1)

4、备份恢复报错信息
备份结果是正常的,备份出来的sql是INSERT INTO “FM5”.“TSEAL” (“SEAL_ID”,“ADD_DATE”,“UPDATE_DATE”,“UPDATE_TIME”,“REMARK”,“SEAL”) VALUES (1,0,0,0,’ ‘,HEXTORAW(’’));
执行恢复命令时,报错如下
2024-08-13 17:21:40 [WARN] Calculate leader of table “TSEAL” failed, treat it as non-partition table. Remain: 0
2024-08-13 17:21:40 [INFO] Waiting to refresh observer load status …
2024-08-13 17:21:40 [INFO] Refresh observer load status success. Table: “TSEAL”. Remain: 0
2024-08-13 17:21:40 [INFO] Refresh observer load status finished. Elapsed: 22.66 ms
2024-08-13 17:21:40 [INFO] Use c.l.d.LiteBlockingWaitStrategy as available cpu(s) is 8
2024-08-13 17:21:40 [INFO] Create 16 slots for ring buffer finished. [0.0.0.0]
2024-08-13 17:21:40 [INFO] Start 16 database writer threads finished. [0.0.0.0]
2024-08-13 17:21:40 [INFO] Start 16 record file reader threads success
2024-08-13 17:21:40 [WARN] Failed to serialize list to “/home/fm/server/ob_oracle_backup/FM_20240808203802_TOOL/data/data/load.ckpt”. Error: Unable to make field private volatile long java.util.concurrent.atomic.AtomicLong.value accessible: module java.base does not “opens java.util.concurrent.atomic” to unnamed module @17a714ea
2024-08-13 17:21:40 [WARN] Retry Table: “TSEAL”, Partition: 0. Records: 1. Error: ORA-01400: cannot insert NULL into ‘(SEAL)’. Retry Mode: SERIAL.
2024-08-13 17:21:40 [ERROR] Other Error: “ORA-01400: cannot insert NULL into ‘(SEAL)’”. SQL: INSERT INTO “FM9”.“TSEAL” (“SEAL_ID”,“ADD_DATE”,“UPDATE_DATE”,“UPDATE_TIME”,“REMARK”,“SEAL”) VALUES (‘1’,‘0’,‘0’,‘0’,’ ‘,’’);
2024-08-13 17:21:40 [WARN] Failed to serialize list to “/home/fm/server/ob_oracle_backup/FM_20240808203802_TOOL/data/data/load.ckpt”. Error: Unable to make field private volatile long java.util.concurrent.atomic.AtomicLong.value accessible: module java.base does not “opens java.util.concurrent.atomic” to unnamed module @17a714ea
2024-08-13 17:21:40 [INFO] File: “/home/fm/server/ob_oracle_backup/FM_20240808203802_TOOL/data/data/FM5/TABLE/TSEAL.1.0.sql” has been parsed finished
2024-08-13 17:21:41 [INFO] Wait for the all the workers to drain of published events then halt the workers
2024-08-13 17:21:41 [INFO] Close connection count: 2041 of the DataSource. Key: BIZ
2024-08-13 17:21:41 [INFO] Shutdown task context finished
2024-08-13 17:21:41 [ERROR] Error: ORA-01400: cannot insert NULL into ‘(SEAL)’
2024-08-13 17:21:41 [INFO] ---------- Finished Tasks: 1 Running Tasks: 0 Progress: 100.00% ----------

我调整工具版本到4.3.1.1-RELEASE后,执行备份和恢复都正常了,这是后面版本修复了这个问题吗

1 个赞

应该是的