obcdc_tailf 运行报错:[FATAL][DATA_DICT] Can't find suitable data_dict to launch OBCDC

【 使用环境 】
测试环境
【 其他组件 】
obcdc_tailf
【 使用版本 】
OceanBase_CE-v4.3.0.1
【问题描述】

  1. 下载obcdc后,修改 etc/libobcdc.conf 中三个字段的值
    tenant_endpoint=192.168.2.2:2881
    tenant_user=testuser@testtenant
    tenant_password=123456
  2. 执行命令
    bin/obcdc_tailf -f etc/libobcdc.conf -R3600 -o -T1720773346570
  3. 命令结束,log/libobcdc.log 中有错误信息
[2024-07-12 16:38:34.294328] WDIAG [TLOG] get_data_dict_in_log_info_ (ob_log_meta_data_service.cpp:371) [104449][][T0][Y0-0000000000000000-0-0] [lt=24][errcode=-4018] sql_queryer get_data_dict_in_log_info fail(ret=-4018, ret="OB_ENTRY_NOT_EXIST", tenant_id=1004, start_timestamp_ns=1720773346570000, data_dict_in_log_info={snapshot_scn:-1, end_scn:-1, start_lsn:{lsn:18446744073709551615}, end_lsn:{lsn:18446744073709551615}})
[2024-07-12 16:38:34.294344] ERROR issue_dba_error (ob_log.cpp:1891) [104449][][T0][Y0-0000000000000000-0-0] [lt=11][errcode=-4388] Unexpected internal error happen, please checkout the internal errcode(errcode=-4018, file="ob_log_meta_data_service.cpp", line_no=385, info="[FATAL][DATA_DICT] Can't find suitable data_dict to launch OBCDC, please try use online schema(refresh_mode=online && skip_ob_version_compat_check=1)")

稍等,这边联系相关同学查一下

第二行报错找不到数据。
确认是否snapshot_scn >= CLOG最早可用位点

是大于的,我是根据 SELECT CEIL(MAX(BEGIN_SCN)/1000) AS START_TS_US FROM oceanbase.GV$OB_LOG_STAT; 的结果设置的。

之前不加 -T1720773346570 报这样的错

[2024-07-15 09:33:00.093141] ERROR issue_dba_error (ob_log.cpp:1891) [187849][][T0][YDD50C0A80202-0000000000500001-0-0] [lt=31][errcode=-4388] Unexpected internal error happen, please checkout the internal errcode(errcode=-5150, file=“ob_log_rpc.cpp”, line_no=106, info=“rpc fail: req_start_lsn_by_ts”)

SELECT SNAPSHOT_SCN, SCN_TO_TIMESTAMP(SNAPSHOT_SCN) FROM CDB_OB_DATA_DICTIONARY_IN_LOG where tenant_id = 1010 and snapshot_scn >= ${CLOG最早可用位点} order by snapshot_scn ASC limit 1;
使用这条sql的scn试试

报了这个错:
ERROR 1146 (42S02): Table ‘oceanbase.cdb_ob_data_dictionary_in_log’ doesn’t exist

image
我这里看是存在的 你用的是什么用户

我用root和我新创建的用户都试了一遍,都提示表不存在

sys租户的root试过了么

yq@yq_tenant
obclient [oceanbase]> SELECT BEGIN_SCN FROM oceanbase.GV$OB_LOG_STAT;
±--------------------+
| BEGIN_SCN |
±--------------------+
| 2 |
| 1720774942303760869 |
±--------------------+
2 rows in set (0.002 sec)

root@sys
obclient [oceanbase]> SELECT SNAPSHOT_SCN, SCN_TO_TIMESTAMP(SNAPSHOT_SCN) FROM CDB_OB_DATA_DICTIONARY_IN_LOG where tenant_id = 1006 and snapshot_scn >= 1720774942303760869 order by snapshot_scn ASC limit 1;
±--------------------±-------------------------------+
| SNAPSHOT_SCN | SCN_TO_TIMESTAMP(SNAPSHOT_SCN) |
±--------------------±-------------------------------+
| 1720774943266257583 | 2024-07-12 17:02:23.266257 |
±--------------------±-------------------------------+

执行:bin/obcdc_tailf -f etc/libobcdc.conf -R3600 -o -T1720774943267
依然有报错

[2024-07-15 11:11:46.443091] ERROR issue_dba_error (ob_log.cpp:1891) [241266][][T0][Y0-0000000000000000-0-0] [lt=42][errcode=-4388] Unexpected internal error happen, please checkout the internal errcode(errcode=-4018, file="ob_log_meta_data_service.cpp", line_no=385, info="[FATAL][DATA_DICT] Can't find suitable data_dict to launch OBCDC, please try use online schema(refresh_mode=online && skip_ob_version_compat_check=1)")
[2024-07-15 11:11:46.443120] EDIAG [TLOG] get_data_dict_in_log_info_ (ob_log_meta_data_service.cpp:385) [241266][][T0][Y0-0000000000000000-0-0] [lt=28][errcode=-4018] [FATAL][DATA_DICT] Can't find suitable data_dict to launch OBCDC, please try use online schema(refresh_mode=online && skip_ob_version_compat_check=1)(ret=-4018, ret="OB_ENTRY_NOT_EXIST", tenant_id=1006, start_timestamp_ns=1720774943267000) BACKTRACE:0x1e274c4d 0xe42b0f6 0xe42ac91 0xe42a90c 0xe378145 0xe45727c 0xe451c6a 0xe44f5b6 0xe787be1 0xe792697 0xe4d9c5e 0xe4d51cf 0xe4c756e 0xe4bea0d 0xe4bd9ca 0x562350bc17d7 0x562350bc128c 0x7fe4daa21555 0x562350bc0cd2

CDC能正常跑起来需要保证回拉的事务的日志也在归档范围内
获取租户某个日志流的归档进度(用于判断某个日志流指定LSN的日志是否在归档范围内):
SELECT * FROM CDB_OB_LS_LOG_ARCHIVE_PROGRESS WHERE TENANT_ID=xxx AND LD_ID = yyy;

或者尝试下从最新位点同步数据

SELECT * FROM CDB_OB_LS_LOG_ARCHIVE_PROGRESS WHERE TENANT_ID=1006;
输出内容为空

另外,用当前时间去启动tailf也是报同样的错

oceanbase.CDB_OB_ARCHIVELOG。检查一下归档是否开启了

root@sys 执行
select * from oceanbase.CDB_OB_ARCHIVELOG;
输出为空

root@yq_tenant 执行
alter system archivelog;
输出
ERROR 9091 (HY000): Already in ARCHIVELOG mode

麻烦老师确认下 备份介质挂载 是否正常,集群备份必须挂在备份介质的
如已挂载按以下方式获取下开启归档失败的日志:

登录业务租户执行开启归档操作

1)设置trace信息
SET ob_enable_show_trace=‘ON’;

2)执行开启归档
ALTER SYSTEM ARCHIVELOG;

3)获取上个命令的trace
select last_trace_id();

4)获取trace对应的节点
select query_sql,svr_ip from gv$ob_sql_audit where trace_id=‘第三步获取的trace信息’;

5)取对应的svr_ip节点 过滤日志
grep “第三步获取的trace信息” observer.log*
grep “第三步获取的trace信息” rootservice.log*

6)提供日志信息即可。

一定要打开日志归档才能使用tailf吗?我看这篇文档里提到不开归档应该也能做CDC吧?
https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000641948
同步单租户-未开启归档

这个报错说明找不到合适的数据字典来启动CDC
(1)检查下你的testuser是否有testtenant的oceanbase库的读权限?
(2)检查下租户的oceanbase库(oracle租户可以看sys schema)下的DBA_OB_DATA_DICTIONARY_IN_LOG表中是否有snapshot_scn <= 1720773346570000000的记录?如果没有,说明启动位点前还没有生成过数据字典;CDC也无法启动(可以参考报错日志中的提示,修改etc/libobcdc.conf中的CDC配置后再启动:refresh_mode=online 和skip_ob_version_compat_check=1)
(3)确保请求的CLOG没有被回收(或已经通过OB的ARCHIVELOG功能归档到其他介质且归档未被回收)

obcdc_tailf时OBCDC的测试工具,下游应用应当直接适配和使用动态库libobcdc.so.4
4.x版本推荐开启OB的归档日志,因为租户本地存储的CLOG会比较有限,很容易发生日志回收,4.x版本开始支持消费归档日志,尽量减少日志回收导致数据同步链路断流的风险。

2 个赞