文档主页
MySQL NDB Cluster API 开发者指南
相关文档 下载本手册
PDF (US Ltr) - 3.6Mb
PDF (A4) - 3.6Mb


2.3.16 NdbEventOperation 类

本节提供有关 NdbEventOperation 类的信息,该类用于监视数据库中的更改(事件)。它提供了用于实现 NDB Cluster 复制的核心功能。

NdbEventOperation 类概述

父类

子类

描述

NdbEventOperation 表示数据库事件。

方法

下表列出了此类的公共方法以及每个方法的用途或用法

表 2.42 NdbEventOperation 类方法和描述

名称 描述
clearError() 清除最近的错误。在 NDB 7.4 中已弃用。
execute() 激活 NdbEventOperation
getBlobHandle() 获取用于读取 blob 属性的句柄
getEpoch() 检索最近检索到的事件数据的纪元。在 NDB 7.4 中添加。
getEventType() 获取事件类型。在 NDB 7.4 中已弃用。
getEventType2() 获取事件类型。在 NDB 7.4 中添加。
getGCI() 检索最近检索到的事件的 GCI。在 NDB 7.4 中已弃用。
getLatestGCI() 检索最近的 GCI(无论是否已检索到相应的事件)。在 NDB 7.4 中已弃用。
getNdbError() 获取最近的错误
getPreBlobHandle() 获取用于读取先前 blob 属性的句柄
getPreValue() 检索属性的先前值
getState() 获取事件操作的当前状态
getValue() 检索属性值
hasError() 是否在此操作中发生错误。在 NDB 7.4 中已弃用。
isConsistent() 检测由节点故障引起的事件丢失。在 NDB 7.4 中已弃用。
isEmptyEpoch() 检测空的纪元。在 NDB 7.4 中添加。
isErrorEpoch() 检测错误纪元,并在存在错误时检索错误。在 NDB 7.4 中添加。
isOverrun() 事件丢失是否由于缓冲区溢出而发生。在 NDB 7.4 中已弃用。
mergeEvents() 使事件可以合并
tableFragmentationChanged() 检查表的碎片是否已更改
tableFrmChanged() 检查表的 .FRM 文件是否已更改
tableNameChanged() 检查表的名称是否已更改
tableRangeListChanged() 检查表范围分区列表名称是否已更改

类型

NdbEventOperation 定义了一种枚举类型,即 State 类型。

创建 NdbEventOperation 的实例。  此类没有公共构造函数或析构函数。相反,NdbEventOperation 的实例是作为对 NdbNdbDictionary 对象的方法调用的结果创建的,但须满足以下条件

  1. 必须存在使用 Dictionary::createEvent() 创建的事件。此方法返回 Event 类的一个实例。

  2. 使用 Ndb::createEventOperation() 实例化 NdbEventOperation 对象,该对象作用于 Event 的实例。

通过调用 Ndb::dropEventOperation 移除此类的实例。

提示

第 2.5.9 节“NDB API 事件处理示例” 中提供了一个详细的示例,演示了如何创建和移除事件操作。

已知问题。  在 NDB API 中使用事件操作时,可能会遇到以下问题

  • 活动 NdbEventOperation 对象的最大数量目前在编译时固定为 2 * MaxNoOfTables

  • 目前,所有 INSERTDELETEUPDATE 事件(以及所有属性更改)都会发送到 API,即使只指定了某些属性也是如此。但是,这些对用户是隐藏的,并且在调用 Ndb::nextEvent() 后仅显示相关数据。

    请注意,可能会发生从 Ndb::pollEvents() 的错误退出,因此以下 nextEvent() 调用将返回零,因为没有可用数据。在这种情况下,只需再次调用 pollEvents() 即可。

    请参见 Ndb::pollEvents()Ndb::nextEvent()(已弃用)

  • 事件代码检查表架构版本。删除表时,请确保删除所有关联的事件。

  • 如果您已收到完整的纪元,则不会重新发送此纪元中的事件,即使发生节点故障也是如此。但是,如果发生了节点故障,则后续纪元可能包含重复的事件,可以通过重复的主键来识别这些事件。

    在 NDB Cluster 复制代码中,INSERT 操作中的重复主键通常通过将此类插入视为 REPLACE 操作来处理。

提示

要查看包含已创建事件的系统表的内容,可以使用 ndb_select_all 实用程序,如下所示

ndb_select_all -d sys 'NDB$EVENTS_0'

NdbEventOperation::clearError()(已弃用)

描述

清除最近与此事件操作关联的错误。

此方法已弃用,将在以后的版本中删除。从 NDB 8.4.0 开始,它不执行任何操作。

签名
void clearError
    (
      void
    )
参数

.

返回值

.

NdbEventOperation::execute()

描述

激活 NdbEventOperation,使其可以开始接收事件。在 Ndb::nextEvent() 返回非 NULL 值后,可以检索已更改的属性值。

在调用 execute() 之前,必须先调用 getValue()getPreValue()getBlobValue()getPreBlobValue() 之一。

在尝试使用此方法之前,您应该阅读 Ndb::nextEvent() (已弃用)NdbEventOperation::getValue() 中提供的说明。另请参见 第 2.3.16 节 “NdbEventOperation 类”

签名
int execute
    (
      void
    )
参数

.

返回值

此方法成功时返回 0,失败时返回 -1

NdbEventOperation::getBlobHandle()

描述

此方法用于代替 getValue() 处理 blob 属性。此方法返回的 blob 句柄 (NdbBlob) 仅支持读取操作。

要获取 blob 属性的先前值,请使用 getPreBlobHandle()

签名
NdbBlob* getBlobHandle
    (
      const char* name
    )
参数

blob 属性的 名称

返回值

指向 NdbBlob 对象的指针。

NdbEventOperation::getEpoch()

描述

获取检索到的最新事件数据的纪元。

此方法在 NDB 7.4 中添加,取代了 getGCI(),后者现已弃用,并将在未来的 NDB Cluster 版本中删除。

签名
Uint64 getEpoch
  (
    void
  ) const
参数

.

返回值

纪元号(整数)。

NdbEventOperation::getEventType() (已弃用)

描述

此方法用于获取事件的类型 (TableEvent)。

此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用 getEventType2()

签名
NdbDictionary::Event::TableEvent getEventType
    (
      void
    ) const
参数

.

返回值

TableEvent 值。

NdbEventOperation::getEventType2()

描述

此方法用于获取事件的类型 (TableEvent)。

此方法在 NDB 7.4 中添加,取代了 getEventType(),后者现已弃用,并将在未来的 NDB Cluster 版本中删除。

签名
getEventType2
    (
      void
    ) const
参数

.

返回值

TableEvent 值。

NdbEventOperation::getGCI() (已弃用)

描述

此方法检索最近检索到的事件的 GCI。

此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用 getEpoch()

签名
Uint64 getGCI
    (
      void
    ) const
参数

.

返回值

最近检索到的事件的全局检查点索引(整数)。

NdbEventOperation::getLatestGCI() (已弃用)

描述

此方法检索最新的 GCI。

此方法返回最新的纪元号。

使用此方法获取的 GCI 不一定与事件相关联。

此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请改用 Ndb::getHighestQueuedEpoch()

签名
Uint64 getLatestGCI
    (
      void
    ) const
参数

.

返回值

最新全局检查点的索引,一个整数。

NdbEventOperation::getNdbError()

描述

此方法检索最近的错误。

签名
const struct NdbError& getNdbError
    (
      void
    ) const
参数

.

返回值

NdbError 结构的引用。

NdbEventOperation::getPreBlobHandle()

描述

此函数与 getBlobHandle() 相同,但用于访问 blob 属性的先前值。请参见 NdbEventOperation::getBlobHandle()

签名
NdbBlob* getPreBlobHandle
  (
    const char* name
  )
参数

blob 属性的 名称

返回值

指向 NdbBlob 的指针。

NdbEventOperation::getPreValue()

描述

此方法的功能与 getValue() 相同,但用于定义检索属性先前值的操作,而不是当前值。

签名
NdbRecAttr* getPreValue
    (
      const char* name,
      char*       value = 0
    )
参数

此方法采用此处列出的两个参数

  • 属性的 名称(作为常量字符指针)。

  • 指向 的指针,以便

    • 如果属性值不是 NULL,则在此参数中返回属性值。

    • 如果属性值为 NULL,则属性值仅存储在此方法返回的 NdbRecAttr 对象中。

    有关此参数的更多信息,请参见 缓冲区内存分配

返回值

一个 NdbRecAttr 对象,用于保存属性的值,或者是一个 NULL 指针,指示发生了错误。

NdbEventOperation::getState()

描述

此方法获取事件操作的当前状态。

签名
State getState
    (
      void
    )
参数

.

返回值

State 值。

NdbEventOperation::getValue()

描述

此方法定义属性值的检索。NDB API 为要保存返回的属性值的 NdbRecAttr 对象分配内存。

此方法 从数据库中获取属性值,并且在此方法返回的 NdbRecAttr 对象上调用 execute() 方法并且 Ndb::nextEvent() 返回非 NULL 值之前,该对象是不可读或不可打印的。

如果特定属性未更改,则相应的 NdbRecAttr 将处于 UNDEFINED 状态。可以使用 NdbRecAttr::isNULL() 进行检查,在这种情况下,该方法返回 -1

getValue() 检索当前值。使用 getPreValue() 检索先前值。

签名
NdbRecAttr* getValue
    (
      const char* name,
      char*       value = 0
    )
参数

此方法采用此处列出的两个参数

  • 属性的 名称(作为常量字符指针)。

  • 指向 的指针,以便

    • 如果属性值不是 NULL,则在此参数中返回属性值。

    • 如果属性值为 NULL,则属性值仅存储在此方法返回的 NdbRecAttr 对象中。

    有关此参数的更多信息,请参见 缓冲区内存分配

返回值

一个 NdbRecAttr 对象,用于保存属性的值,或者是一个 NULL 指针,指示发生了错误。

缓冲区内存分配。  应用程序负责为 缓冲区分配足够的内存(如果不是 NULL),并且必须正确对齐此缓冲区。仅当缓冲区在 4 字节边界上对齐并且以字节为单位的属性大小(计算方式为 NdbRecAttr::get_size_in_bytes())是 4 的倍数时,才会直接使用该缓冲区(从而避免了复制损失)。

NdbEventOperation::hasError() (已弃用)

描述

此方法用于确定是否存在与此事件操作关联的错误。

此方法已弃用,并将在未来的版本中删除。在 NDB 8.4 及更高版本中,它返回一个常量。请改用 getEventType2() 来确定事件类型。请参见 Event::TableEvent

签名
int hasError
    (
      void
    ) const
参数

.

返回值

NDB 8.3 及更早版本:如果发生了事件丢失,则此方法返回 0;否则,它返回 1。

NDB 8.4 及更高版本:始终返回 0

NdbEventOperation::isConsistent() (已弃用)

描述

此方法用于确定在节点发生故障后是否发生了事件丢失。

此方法在 NDB 7.4 中已弃用,并将在未来的版本中删除。在 NDB 7.4 及更高版本中,请使用 getEventType2() 来确定事件的类型是否为 TE_INCONSISTENT。请参见 Event::TableEvent

签名
bool isConsistent
    (
      void
    ) const
参数

.

返回值

如果发生了事件丢失,则此方法返回 false;否则,它返回 true

NdbEventOperation::isEmptyEpoch()

描述

此方法用于确定消耗的事件数据是否标记为空纪元。

此方法在 NDB 7.4 中添加。

签名
bool isEmptyEpoch
    (
      void
    )
参数

.

返回值

如果此纪元为空,则该方法返回 true;否则,它返回 false

NdbEventOperation::isErrorEpoch()

描述

此方法用于确定消耗的事件数据是否标记为空纪元。

此方法在 NDB 7.4 中添加。

签名
bool isErrorEpoch
  (
    NdbDictionary::Event::TableEvent* error_type = 0
  )
参数

如果这是一个错误纪元,则 error_type 包含与该错误相对应的 TableEvent 值。

返回值

如果此纪元出错,则该方法返回 true;否则,它返回 false

NdbEventOperation::isOverrun()

描述

此方法用于确定是否由于缓冲区溢出而发生了事件丢失。

签名
bool isOverrun
    (
      void
    ) const
参数

.

返回值

如果事件缓冲区已溢出,则此方法返回 true,否则返回 false

NdbEventOperation::mergeEvents()

描述

此方法用于设置合并事件标志。有关事件合并的信息,请参见 Event::mergeEvents()

默认情况下,合并事件标志为 false

签名
void mergeEvents
    (
      bool flag
    )
参数

布尔值 标志

返回值

.

NdbEventOperation::State

本节提供有关 State 数据类型的信息。

描述

此类型描述事件操作的状态。

getState() 方法返回 State 值。

枚举值

下表显示了可能的值及其说明

表 2.43 NdbEventOperation 数据类型值和说明

名称 描述
EO_CREATED 事件操作已创建,但尚未调用 execute()
EO_EXECUTING 已为此事件操作调用了 execute() 方法。
EO_DROPPED 事件操作正在等待删除,并且不再可用。
EO_ERROR 发生了错误,并且事件操作不可用。

NdbEventOperation::tableFragmentationChanged()

描述

此方法用于测试表的碎片是否已在与 TE_ALTER 事件相关的连接中更改。(请参见 Event::TableEvent。)

签名
bool tableFragmentationChanged
    (
      void
    ) const
参数

.

返回值

如果表的碎片已更改,则返回 true;否则,该方法返回 false

NdbEventOperation::tableFrmChanged()

描述

使用此方法确定表 .FRM 文件是否已在与 TE_ALTER 事件相关的连接中更改。(请参见 Event::TableEvent。)

签名
bool tableFrmChanged
    (
      void
    ) const
参数

.

返回值

如果表 .FRM 文件已更改,则返回 true;否则,该方法返回 false

NdbEventOperation::tableNameChanged()

描述

此方法测试在 TE_ALTER 表事件之后,表名是否已更改。(请参阅 Event::TableEvent。)

签名
bool tableNameChanged
    (
      void
    ) const
参数

.

返回值

如果表名已更改,则返回 true;否则,该方法返回 false

NdbEventOperation::tableRangeListChanged()

描述

使用此方法可以检查表范围分区列表名称是否在 TE_ALTER 事件中发生了更改。

签名
bool tableRangeListChanged
    (
      void
    ) const
参数

.

返回值

如果范围或列表分区名称已更改,则此方法返回 true;否则返回 false