MySQL 9.0 C API 开发者指南  /  C API 二进制日志接口  /  C API 二进制日志数据结构

10.2 C API 二进制日志数据结构

用于处理来自服务器的复制事件流的 C API 函数需要一个连接句柄(一个 MYSQL * 指针)和一个指向 MYSQL_RPL 结构的指针,该结构描述了要从服务器二进制日志中读取的复制事件流。例如

MYSQL *mysql = mysql_real_connect(...);

MYSQL_RPL rpl;

# ... initialize MYSQL_RPL members ...

int result = mysql_binlog_open(mysql, &rpl);

本节描述了 MYSQL_RPL 结构成员。连接句柄在 第 5.2 节,“C API 基本数据结构” 中进行了描述。

适用的 MYSQL_RPL 成员取决于要执行的二进制日志操作

  • 在调用 mysql_binlog_open() 之前,调用者必须设置从 file_name_lengthflagsMYSQL_RPL 成员。此外,如果 flags 设置了 MYSQL_RPL_GTID 标志,则调用者必须在调用 mysql_binlog_open() 之前设置从 gtid_set_encoded_sizegtid_set_arg 的成员。

  • 成功调用 mysql_binlog_fetch() 后,调用者会检查 sizebuffer 成员。

MYSQL_RPL 结构成员描述

  • file_name_length

    要读取的二进制日志文件名长度。此成员与 file_name 结合使用;请参阅 file_name 描述。

  • file_name

    要读取的二进制日志文件名

    • 如果 file_nameNULL,则客户端库将其设置为空字符串,并将 file_name_length 设置为 0。

    • 如果 file_name 不为 NULL,则 file_name_length 必须是名称的长度或 0。如果 file_name_length 为 0,则客户端库将其设置为名称的长度,在这种情况下,file_name 必须作为以 null 结尾的字符串给出。

    要从二进制日志的开头读取而无需知道最旧的二进制日志文件名,请将 file_name 设置为 NULL 或空字符串,并将 start_position 设置为 4。

  • start_position

    要开始读取二进制日志的位置。任何给定二进制日志文件中的第一个事件的位置为 4。

  • server_id

    用于标识要从中读取二进制日志的服务器的服务器 ID。

  • flags

    影响二进制日志读取的标志的并集,如果未设置任何标志,则为 0。允许这些标志值

    • MYSQL_RPL_SKIP_HEARTBEAT

      设置此标志可使 mysql_binlog_fetch() 跳过心跳事件。

    • MYSQL_RPL_GTID

      设置此标志以读取 GTID(全局事务 ID)数据。如果设置,您必须在调用 mysql_binlog_open() 之前初始化 MYSQL_RPL 结构中从 gtid_set_encoded_sizegtid_set_arg 的 GTID 相关成员。

      本文档无法详细描述客户端程序如何使用这些 GTID 相关成员。有关更多信息,请检查 mysqlbinlog.cc 源文件。有关基于 GTID 的复制的信息,请参阅 使用全局事务标识符进行复制

  • gtid_set_encoded_size

    GTID 集数据的大小,或 0。

  • fix_gtid_set

    用于 mysql_binlog_open() 的回调函数的地址,以填充命令包 GTID 集,或者如果不存在此类函数,则为 NULL。如果使用回调函数,它应该具有以下调用签名

    void my_callback(MYSQL_RPL *rpl, unsigned char *packet_gtid_set);
  • gtid_set_arg

    GTID 集数据的指针(如果 fix_gtid_setNULL),或要使其可用于回调函数内使用的值的指针(如果 fix_gtid_set 不为 NULL)。gtid_set_arg 是一个通用指针,因此它可以指向任何类型的值(例如,字符串、结构或函数)。它在回调函数中的解释取决于回调函数如何使用它。

  • size

    成功调用 mysql_binlog_fetch() 后,返回的二进制日志事件的大小。EOF 事件的值为 0,非 EOF 事件的值大于 0。

  • buffer

    成功调用 mysql_binlog_fetch() 后,指向二进制日志事件内容的指针。