链接libobcdc.so报告找不到oceanbase::logmessage::ITableMeta::getColNames

对oceanbase/src/logservice/libobcdc/tests/demo/obcdc_demo.cpp做了一点修改:

    auto tbMeta = record->getTableMeta();
    auto cNames = tbMeta->getColNames();

编译时报告找不到getColNames:

g++ -std=c++11 -o demo -I$PWD  -I$PWD/libobcdc -I$PWD/oblogmsg -L$PWD -lobcdc -fPIC obcdc_demo.cpp 
/usr/bin/ld: /tmp/ccJiHLd6.o: in function `handle_cdc_record(oceanbase::logmessage::ILogRecord*)':
obcdc_demo.cpp:(.text+0x5f0): undefined reference to `oceanbase::logmessage::ITableMeta::getColNames[abi:cxx11]()'
collect2: error: ld returned 1 exit status

依赖库为:
oceanbase-ce-cdc-4.2.1.2-102000052023120111.el7.x86_64.rpm
oceanbase-ce-libs-4.2.1.2-102000042023120514.el7.x86_64.rpm

目录结构:

ll
total 504140
-rwxr-xr-x 1 shang shang       429 Dec 25 19:11 build_cdc_demo.sh
lrwxrwxrwx 1 shang shang        15 Dec 26 19:20 libaio.so -> libaio.so.1.0.1
lrwxrwxrwx 1 shang shang        15 Dec 26 19:20 libaio.so.1 -> libaio.so.1.0.1
-rwxr-xr-x 1 shang shang      7848 Dec  5 15:31 libaio.so.1.0.1
lrwxrwxrwx 1 shang shang        15 Dec 26 19:20 libmariadb.so -> libmariadb.so.3
-rwxr-xr-x 1 shang shang    460680 Dec  5 15:31 libmariadb.so.3
drwxr-sr-x 1 shang shang        40 Dec 27 19:07 libobcdc
-rw-r--r-- 1 shang shang      5487 Dec 26 20:04 libobcdc.conf
lrwxrwxrwx 1 shang shang        13 Dec 26 19:20 libobcdc.so -> libobcdc.so.4
lrwxrwxrwx 1 shang shang        19 Dec 26 19:20 libobcdc.so.4 -> libobcdc.so.4.2.1.2
-rwxr-xr-x 1 shang shang 515715000 Dec  1 12:45 libobcdc.so.4.2.1.2
drwxr-xr-x 1 shang shang        96 Dec 26 20:16 log
-rw-r--r-- 1 shang shang      7219 Dec 28 09:10 obcdc_demo.cpp
-rw-r--r-- 1 shang shang       475 Dec 25 19:11 obcdc_dlopen.cpp
drwxr-xr-x 1 shang shang       212 Dec 27 19:06 oblogmsg
-rw-r--r-- 1 shang shang      1193 Dec 25 19:11 README.md

obcdc_demo.zip (2.3 KB)

为啥需要修改obcdc_demo.cpp,重新编译,是想实现什么目的?

改了代码还是要在oceanbase的仓库之下编译的。否则要把OceanBase依赖的一些环境,比如gcc、clang等都拉过来放到你的编译环境。

那个demo拿到record后,什么也没做,我就是要打印出DML的列名和值。

我的理解是,libobcdc做为一个so, 并提供了相应的header文件,就是一个完整的组件。我写一个c++程序,包含这个头文件,链接这个so,就不应该再依赖oceanbase本身才对。

如果去掉getColNames,是可以编译运行的,也能获取到binlog。但没有列名,我就不知道每一个对应表中的实际列。如,我拿到一个INSERT event:

BEGIN: Wed Dec 27 18:58:37 2023

INSERT: Wed Dec 27 18:58:37 2023
, test.db2.x2:
  pkinfo: (0,1)
  pk cols:0,1
  new tuple:
    [0]11
    [1]1
    [2]111

COMMIT: Wed Dec 27 18:58:37 2023

实际对应表中的(c2,c1,c3).

基本上就是按照这个文档,开发一个自己的增量捕获和消费工具: https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000221093

@shang152 getColNames 这个是在logmessage库里,你需要同时把logmessage的库链接进来。看到你的目录下是有oblogmsg目录的,oblogmsg 的库可以通过编译源码或者从rpm包中下载。如果还有困难可以继续联系我。