README.md 16.9 KB
Newer Older
忠阳 已提交
1
oblogmsg 是一种数据库增量数据的输出格式,oceanbase 的增量采集模块 liboblog 正是使用的这种消息格式来输出增量数据,oblogmsg 支持 oceanbase 中不同数据类型的增量数据的写入,具有序列化和反序列化的能力。
忠阳 已提交
2
## 如何使用 oblogmsg
忠阳 已提交
3

忠阳 已提交
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
> 前置条件
>
> * cmake: >=3.20.0
> * g++: 支持 C++11 标准



### 以源码方式依赖(推荐方式)

* 可以使用 `git submodule` 的方式将 oblogmsg 作为主项目的子模块
* 在主项目的  CMakeLists.txt 文件中使用 `add_subdirectory(submodule_path_to_oblogmsg)` 来依赖 oblogmsg,该命令执行后将提供 `oceanbase::oblogmsg_shared``oceanbase::oblogmsg_static` 两个 targets
* 在主项目相关  CMakeLists.txt 文件中,对于要依赖 oblogmsg 的 target t1,使用 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_shared)`或者 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_static)`即可

### 依赖编译后的 oblogmsg 库

* 编译、安装 oblogmsg

```shell
# 编译 oblogmsg
git clone https://github.com/oceanbase/oblogmsg.git
mkdir oblogmsg-build
cd oblogmsg-build
cmake -S ../oblogmsg -B .
cmake --build .

# 本地安装
cmake --install . --prefix=${OBLOGMSG_INSTALL_PATH}
```

* 主项目中依赖编译、安装后的 oblogmsg
  * 在主项目  CMakeLists.txt 文件中使用 `set(CMAKE_PREFIX_PATH $ENV{OBLOGMSG_INSTALL_PATH} ${CMAKE_PREFIX_PATH})` 设置 oblogmsg 库搜索路径
  * 然后使用 `find_package(oblogmsg REQUIRED)`使加载 oblogmsg,该命令执行成功后将提供 `oceanbase::oblogmsg_shared``oceanbase::oblogmsg_static` 两个 targets
  * 在主项目相关  CMakeLists.txt 文件中,对于要依赖 oblogmsg 的 target t1,使用 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_shared)`或者 `target_link_libraries(t1 PRIVATE oceanbase::oblogmsg_static)`即可

忠阳 已提交
38 39
## oblogmsg 部分接口说明
### 创建一个 record
忠阳 已提交
40 41 42 43 44

     1. void ILogRecord::setSrcType(int type)
        功能描述:
            设置数据源的类型
        参数:
忠阳 已提交
45
            type  有效值有0x00,0x01,0x02,0x03,0x04,0x05,对应数据源分别是 MYSQL,OCEANBASE,HBASE,ORACLE,OCEANBASE_1_0,DB2,liboblog 设置的值是0x04,即数据源是 OCEANBASE_1_0 
忠阳 已提交
46 47 48 49 50 51 52
        返回值:
            无返回值

     2. void ILogRecord::setCheckpoint(uint64_t file, uint64_t offset)
        功能描述:
            设置当前的分析位点信息
        参数:
忠阳 已提交
53 54
            file 一个秒级的 unix 时间戳
            offset file 参数中 unix 时间戳的微秒级
忠阳 已提交
55 56 57 58 59
        返回值:
            无返回值

     3. int ILogRecord::setRecordType(int aType)
        功能描述:
忠阳 已提交
60
            设置一条 record 的操作类型
忠阳 已提交
61
        参数:
忠阳 已提交
62
            aType 一般有七种类型 插入操作0x00 (EINSERT),更新操作0x01 (EUPDATE),删除操作0x02 (EDELETE),心跳包0x04 (HEARTBEAT),事物开始0x06 (EBEGIN),事物提交0x07 (ECOMMIT), DDL 操作0x08 (EDDL)
忠阳 已提交
63 64 65 66 67
        返回值:
            固定返回0

     4. void ILogRecord::setDbname(const char *dbname)
        功能描述:
忠阳 已提交
68
            设置一条 record 来源的 db 名字
忠阳 已提交
69
        参数:
忠阳 已提交
70
            dbname record 的来源的数据库名字
忠阳 已提交
71 72 73 74 75
        返回值:
            无返回值

     5. void ILogRecord::setTbname(const char *tbname)
        功能描述:
忠阳 已提交
76
            设置一条 record 的 table 名字
忠阳 已提交
77
        参数:
忠阳 已提交
78
            dbname record 的表名
忠阳 已提交
79 80 81 82 83
        返回值:
            无返回值

     6. void ILogRecord::setTableMeta(ITableMeta* tblMeta)
        功能描述:
忠阳 已提交
84
            设置一个 record 的元数据信息
忠阳 已提交
85
        参数:
忠阳 已提交
86
            tblMeta record 的元数据信息,内存需由调用方申请和释放
忠阳 已提交
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
        返回值:
            无返回值

     7. void ITableMeta::setName(const char* name)
        功能描述:
            设置元数据中的表名字
        参数:
            name 表的名字
        返回值:
            无返回值

     8. void ITableMeta::setUKs(const char* uks)
        功能描述:
            设置元数据中的UK字段名字
        参数:
忠阳 已提交
102
            uks 包含有 uk 字段的名字的字符串,格式为 (col1,col2,col3...),当有多个 uk 时,例如 (col1,col2),(col2,col3),需要合并成一个字符串 (col1,col2,col3) 传入
忠阳 已提交
103 104 105 106 107
        返回值:
            无返回值

     9. void ITableMeta::setPKs(const char* pks)
        功能描述:
忠阳 已提交
108
            设置元数据中的 PK 字段名字
忠阳 已提交
109
        参数:
忠阳 已提交
110
            pks 包含 pk 字段的名字的一个字符串,格式为 (col1,col2,col3...)
忠阳 已提交
111 112 113 114 115
        返回值:
            无返回值

    10. void ITableMeta::setPkinfo(const char* info)
        功能描述:
忠阳 已提交
116
           设置元数据中的 PK 字段 id
忠阳 已提交
117
        参数:
忠阳 已提交
118
            info 包含有 pk 字段 id 的一个字符串,格式为(0,1,2,3...),从0开始
忠阳 已提交
119 120 121 122 123
        返回值:
            无返回值

    11. void ITableMeta::setUkinfo(const char* info)
        功能描述:
忠阳 已提交
124 125 126
            设置元数据中的 UK 字段 id
        参数: 
            info 包含有 uk 字段 id 的一个字符串,格式为(0,1,2,3...),当有多个uk时,传入格式为(0,1),(1,2),(0,3)...
忠阳 已提交
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
        返回值:
            无返回值

    12. int ITableMeta::append(const char* colName, IColMeta* colMeta);
        功能描述:
            向一个表的元数据信息添加一个列的元数据信息
        参数:
            colName 列的名字
            colMeta 列的元数据信息
        返回值:
            -1 此列名在表中已存在时,添加会失败,返回-1
            0 添加成功

    13. void IColMeta::setName(const char* name)
        功能描述:
            为一个列的元数据信息设置列名
        参数:
            name 此列的名字
        返回值:
            无返回值

    14. void IColMeta::setType(int type)
        功能描述:
            设置列的类型
        参数:
忠阳 已提交
152
            type 列的类型,可设置的值详见 include/MetaInfo.h 中的枚举类型 logmsg_field_types
忠阳 已提交
153 154 155 156 157 158 159 160 161 162 163 164 165
        返回值:
            无返回值

    15. void IColMeta::setLength(long length)
        功能描述:
            设置列的字节长度
        参数:
            length 该列的字节长度
        返回值:
            无返回值

    16. void IColMeta::setIsPK(bool b)
        功能描述:
忠阳 已提交
166
            设置该列是否时 pk
忠阳 已提交
167
        参数:
忠阳 已提交
168
            b  设置为 true 时,该列为 uk,false 时,该列不是 uk
忠阳 已提交
169 170 171 172 173 174 175
        返回值:
            无返回值

    17. void IColMeta::setIsUK(bool b)
        功能描述:
            设置该列是否时uk
        参数:
忠阳 已提交
176
            b  设置为 true 时,该列为 uk,false 时,该列不是 uk
忠阳 已提交
177 178 179 180 181 182 183
        返回值:
            无返回值

    18. void IColMeta::setNotNull(bool b)
        功能描述:
            设置该列是否有非空约束
        参数:
忠阳 已提交
184
            b  设置为 true 时,该列不能为空,false 时,该列可以为空
忠阳 已提交
185 186 187 188 189
        返回值:
            无返回值

    19. void ILogRecord::setOldColumn(BinLogBuf* buf, int size)
        功能描述:
忠阳 已提交
190
            初始化一片空间用来存放前镜像的字段值,空间大小为 size 个 BinLogBuf 的大小,size 必须比大于等于表的字段数目,该空间由调用方申请和释放
忠阳 已提交
191 192
        参数:
            buf 空间的首地址
忠阳 已提交
193
            size 空间中 BinLogBuf 的个数,一般为表的字段数目
忠阳 已提交
194 195 196 197 198
        返回值:
             无返回值

    20. void ILogRecord::setNewColumn(BinLogBuf* buf, int size)
        功能描述:
忠阳 已提交
199
            初始化一片空间用来存放后镜像的字段值,空间大小为 size 个 BinLogBuf 的大小,size 必须比大于等于表的字段数目,该空间由调用方申请和释放
忠阳 已提交
200 201
        参数:
            buf 空间的首地址
忠阳 已提交
202
            size 空间中 BinLogBuf 的个数,一般为表的字段数目
忠阳 已提交
203 204 205 206 207
        返回值:
             无返回值

    21. int ILogRecord::putOld(const char* pos, int len)
        功能描述:
忠阳 已提交
208
            添加一个前镜像中字段的值到 record 中
忠阳 已提交
209 210 211 212 213 214 215
        参数:
            pos 字段值的起始地址
            len 字段值的长度
        返回值:
            固定返回0
    22. int ILogRecord::putNew(const char* pos, int len)
        功能描述:
忠阳 已提交
216
            添加一个后镜像中字段的值到 record 中
忠阳 已提交
217 218 219 220 221 222 223 224 225 226
        参数:
            pos 字段值的起始地址
            len 字段值的长度
        返回值:
            固定返回0

    23. const char* ILogRecord::toString(size_t *size, bool reserveMemory)
        功能描述:
            序列化一个record
        参数:
忠阳 已提交
227 228
            size 一个 size_t 类型的地址,序列化完成后,会将序列化后数据的长度写入该地址
            reserveMemory 是否保留序列化之后的数据到 record 的数据区,若不保留,改 record 在序列化之后,里面所存储的数据会被清空,将不可用
忠阳 已提交
229 230 231 232 233 234
        返回值:
            NULL 序列化失败
            非空指针 序列化之后的数据首地址

    24. ILogRecord::bool parsedOK()
        功能描述:
忠阳 已提交
235
            获取一个 record 是否已经完成序列化
忠阳 已提交
236 237 238
        参数:

        返回值:
忠阳 已提交
239 240
            true 此 record 已经完成序列化,或者此 record 是由一段数据反序列化后创建的
            false 此 record 还未进行序列化
忠阳 已提交
241

忠阳 已提交
242
### 反序列化一个 record,或者从一个已经序列化过的 record 中( ILogRecord::parsedOK() 返回 true )解析数据
忠阳 已提交
243 244 245

     1. int ILogRecord::parse(const void* ptr, size_t size)
        功能描述:
忠阳 已提交
246
            反序列化一个 record
忠阳 已提交
247 248 249 250 251 252 253 254 255 256 257 258 259
        参数:
            ptr  保存着序列化数据的首地址
            size 序列化数据的长度
        返回值:
            0 成功
            其他值 失败

     2. int ILogRecord::getSrcType()
        功能描述:
            获取数据源的类型
        参数:

        返回值:
忠阳 已提交
260
            返回一个int型数值,有效值有0x00,0x01,0x02,0x03,0x04,0x05,对应数据源分别是 MYSQL,OCEANBASE,HBASE,ORACLE,OCEANBASE_1_0,DB2,liboblog 设置的值是0x04,即数据源是 OCEANBASE_1_0
忠阳 已提交
261 262 263 264 265 266 267

     3. uint64_t ILogRecord::getCheckpoint1()/uint64_t ILogRecord::getCheckpoint2()
        功能描述:
            获取分析的位点信息
        参数:

        返回值:
忠阳 已提交
268 269
            getCheckpoint1:返回一个秒级的 unix 时间戳
            getCheckpoint2:返回 unix 时间戳的微秒级,可利用 getCheckpoint1*1000000+getCheckpoint2 做为分析的断点位置
忠阳 已提交
270 271 272

     4. int ILogRecord::recordType()
        功能描述:
忠阳 已提交
273
            获取一条 record 的操作类型
忠阳 已提交
274 275 276
        参数:

        返回值:
忠阳 已提交
277
            返回一个int类型数值,一般有七种类型,插入操作0x00 (EINSERT),更新操作0x01 (EUPDATE),删除操作0x02 (EDELETE),心跳包0x04 (HEARTBEAT),事物开始0x06 (EBEGIN),事物提交0x07 (ECOMMIT),DDL 操作0x08 (EDDL)
忠阳 已提交
278 279 280

     5. const char* ILogRecord::dbname() const
        功能描述:
忠阳 已提交
281
            获取一条 record 来源的 db 名字
忠阳 已提交
282 283 284
        参数:

        返回值:
忠阳 已提交
285
            返回一个char*类型的指针,该指针指向 record 的来源的数据库名字
忠阳 已提交
286 287 288

     6. const char* ILogRecord::tbname() const
        功能描述:
忠阳 已提交
289
            获取一条 record 的 table 名字
忠阳 已提交
290 291 292
        参数:

        返回值:
忠阳 已提交
293
            返回一个 char* 类型的指针,该指针指向 record 的来源的表名字
忠阳 已提交
294 295 296

     7. int ILogRecord::getTableMeta(ITableMeta*& tblMeta)
        功能描述:
忠阳 已提交
297
            从一个 record 获取表的元数据信息,从一个序列化过的 record 取值时,由调用方为 tblMeta 申请和释放内存
忠阳 已提交
298 299 300 301 302 303 304 305 306 307 308 309
        参数:
            tblMeta 表元数据信息的首地址
        返回值:
            0 成功
            其他值 失败

     8. const char* ITableMeta::getName()
        功能描述:
            获取元数据中的表名字
        参数:
            name 表的名字
        返回值:
忠阳 已提交
310
            返回一个 char* 类型的指针,该指针指向 record 的元数据中的表名字
忠阳 已提交
311 312 313

     9. const char* ITableMeta::getUKs()
        功能描述:
忠阳 已提交
314
            获取元数据中的 UK 字段名字
忠阳 已提交
315 316 317
        参数:

        返回值:
忠阳 已提交
318
            返回一个 char* 指针,指向包含有 uk 字段的名字的字符串,格式为 (col1,col2,col3...)
忠阳 已提交
319 320 321

    10. const char* ITableMeta::getPKs()
        功能描述:
忠阳 已提交
322
            获取元数据中的 PK 字段名字
忠阳 已提交
323 324 325
        参数:

        返回值:
忠阳 已提交
326
            返回一个 char* 指针,指向包含 pk 字段的名字的一个字符串,格式为 (col1,col2,col3...)
忠阳 已提交
327 328 329

    11. const char* ITableMeta::getPkinfo()
        功能描述:
忠阳 已提交
330
            获取元数据中的 PK 字段 id,从0开始
忠阳 已提交
331 332 333
        参数:

        返回值:
忠阳 已提交
334
            返回一个 char* 指针,指向包含有 pk 字段 id 的一个字符串,格式为 (0,1,2,3...)
忠阳 已提交
335 336 337

    12. const char* ITableMeta::getUkinfo()
        功能描述:
忠阳 已提交
338
            设置元数据中的 PK 字段 id,从0开始
忠阳 已提交
339 340 341
        参数:

        返回值:
忠阳 已提交
342
            返回一个 char* 指针,指向包含有 uk 字段 id 的一个字符串,格式为(0,1,2,3...)
忠阳 已提交
343 344 345 346 347 348 349 350 351 352 353 354 355 356 357

    13. int ITableMeta::getColCount()
        功能描述:
            获取元数据中的字段数量
        参数:

        返回值:
            返回字段的数量

    14. const char* IColMeta::getName()
        功能描述:
            获取一个列的元数据中的列名
        参数:

        返回值:
忠阳 已提交
358
            返回一个 char* 指针,指向元数据的列名
忠阳 已提交
359 360 361 362 363 364 365

    15. int IColMeta::getType()
        功能描述:
            获取列的类型
        参数:

        返回值:
忠阳 已提交
366
            返回一个 int 型数值,详见 include/MetaInfo.h 中的枚举类型 logmsg_field_types
忠阳 已提交
367 368 369 370 371 372 373 374 375 376 377

    16. long IColMeta::getLength()
        功能描述:
            获取列的字节长度
        参数:

        返回值:
            列的字节长度

    17. bool IColMeta::isPK()
        功能描述:
忠阳 已提交
378
            获取该列是否时 pk
忠阳 已提交
379 380 381
        参数:

        返回值:
忠阳 已提交
382
            返回一个 bool 类型,为 true 时,该列为 uk,false 时,该列不是 uk
忠阳 已提交
383 384 385

    18. bool IColMeta::isUK()
        功能描述:
忠阳 已提交
386
            获取该列是否时 uk
忠阳 已提交
387 388 389
        参数:

        返回值:
忠阳 已提交
390
            返回一个 bool 类型,为 true 时,该列为 uk,false 时,该列不是 uk
忠阳 已提交
391 392 393 394 395 396 397

    19. bool IColMeta::isNotNull()
        功能描述:
            获取该列是否有非空约束
        参数:

        返回值:
忠阳 已提交
398
            返回一个 bool 类型,为 true 时,该列有非空约束,false 时,该列可以为空
忠阳 已提交
399 400 401

    20. StrArray* ILogRecord::parsedOldCols() const
        功能描述:
忠阳 已提交
402
            获取 record 中前镜像的所有字段值
忠阳 已提交
403 404 405
        参数:

        返回值:
忠阳 已提交
406
            返回一个 StrArray 类型的指针,该指针指向存着前镜像的值,可通过 StrArray->size() 接口获取数据的列数,StrArray->elementAt(int i, const char*& s, size_t& length) 接口获取每列的数据
忠阳 已提交
407 408 409

    21. StrArray* ILogRecord::parsedNewCols() const
        功能描述:
忠阳 已提交
410
            获取 record 中后镜像的所有字段值
忠阳 已提交
411 412 413
        参数:

        返回值:
忠阳 已提交
414
            返回一个 StrArray 类型的指针,该指针指向存着后镜像的值,可通过 StrArray->size() 接口获取数据的列数,StrArray->elementAt(int i, const char*& s, size_t& length) 接口获取每列的数据
忠阳 已提交
415

忠阳 已提交
416
### 从一个未序列化过的 record 中( ILogRecord::parsedOK() 返回 false )解析前后镜像字段的数据
忠阳 已提交
417 418 419

     1. int ILogRecord::getTableMeta(ITableMeta*& tblMeta)
        功能描述:
忠阳 已提交
420
            从一个 record 获取表的元数据信息,从一个未序列化过的 record 取值时,tblMeta 必须为一个空指针
忠阳 已提交
421
        参数:
忠阳 已提交
422
            tblMeta 需为一个空指针,该接口会将此指针指向 record 的元数据地址,内存由 oblogmsg 管理,调用方不需要释放
忠阳 已提交
423 424 425 426 427 428
        返回值:
            0 成功
            其他值 失败

     2. BinLogBuf* ILogRecord::newCols(unsigned int& count)
        功能描述:
忠阳 已提交
429
            获取 record 中后镜像的所有字段值
忠阳 已提交
430 431 432
        参数:
            count 用来返回数据的列数
        返回值:
忠阳 已提交
433
            返回一个 BinLogBuf 类型的指针,该指针指向一个拥有 count 个 BinLogBuf 的空间,每个 BinLogBuf.buf 成员即是字段的值,BinLogBuf.buf_used_size 为字段值的长度
忠阳 已提交
434 435 436

     3. BinLogBuf* ILogRecord::oldCols(unsigned int& count)
        功能描述:
忠阳 已提交
437
            获取 record 中后镜像的所有字段值
忠阳 已提交
438 439 440
        参数:
            count 用来返回数据的列数
        返回值:
忠阳 已提交
441
            返回一个 BinLogBuf 类型的指针,该指针指向一个拥有 count 个 BinLogBuf 的空间,每个 BinLogBuf.buf 成员即是字段的值,BinLogBuf.buf_used_size 为字段值的长度