文件首頁
MySQL NDB Cluster API 開發人員指南
相關文件 下載本手冊
PDF (美國 Letter) - 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() (已過時)

  • 事件程式碼不會檢查表格綱要版本。當刪除表格時,請務必刪除任何相關的事件。

  • 如果您已收到完整的 epoch,即使發生節點故障,來自此 epoch 的事件也不會重新傳送。但是,如果發生節點故障,後續的 epoch 可能會包含重複的事件,這些事件可以通過重複的主鍵來識別。

    在 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()

描述

此方法用於代替 blob 屬性的 getValue()。此方法返回的 blob 控制代碼 (NdbBlob) 僅支援讀取操作。

若要取得 blob 屬性的先前值,請使用 getPreBlobHandle()

簽名
NdbBlob* getBlobHandle
    (
      const char* name
    )
參數

blob 屬性的 name

回傳值

指向 NdbBlob 物件的指標。

NdbEventOperation::getEpoch()

描述

取得最近檢索的事件資料的 epoch。

此方法是在 NDB 7.4 中新增的,它取代了 getGCI(),後者現在已過時,並可能在未來的 NDB Cluster 版本中移除。

簽名
Uint64 getEpoch
  (
    void
  ) const
參數

.

回傳值

epoch 號碼 (整數)。

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。

此方法會返回最新的 epoch 號碼。

使用此方法取得的 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 屬性的 name

回傳值

指向 NdbBlob 的指標。

NdbEventOperation::getPreValue()

描述

此方法的執行方式與 getValue() 完全相同,不同之處在於它用於定義屬性先前值的檢索操作,而不是目前的值。

簽名
NdbRecAttr* getPreValue
    (
      const char* name,
      char*       value = 0
    )
參數

此方法採用此處列出的兩個參數

  • 屬性的 name (作為常數字元指標)。

  • 指向 value 的指標,使得

    • 如果屬性值不是 NULL,則會在此參數中返回屬性值。

    • 如果屬性值為 NULL,則屬性值僅儲存在此方法返回的 NdbRecAttr 物件中。

    如需關於此參數的詳細資訊,請參閱 value 緩衝區記憶體配置

回傳值

用於保存屬性值的 NdbRecAttr 物件,或指示發生錯誤的 NULL 指標。

NdbEventOperation::getState()

描述

此方法會取得事件操作的目前狀態。

簽名
State getState
    (
      void
    )
參數

.

回傳值

State 值。

NdbEventOperation::getValue()

描述

此方法會定義屬性值的檢索。NDB API 會為要保存返回的屬性值的 NdbRecAttr 物件配置記憶體。

此方法不會從資料庫擷取屬性值,並且在呼叫 execute() 方法且 Ndb::nextEvent() 返回非 NULL 值之前,此方法返回的 NdbRecAttr 物件是無法讀取或列印的。

如果特定屬性未變更,則對應的 NdbRecAttr 將處於 UNDEFINED 狀態。可以使用 NdbRecAttr::isNULL() 進行檢查,在這種情況下,它會返回 -1

getValue() 會檢索目前的值。請使用 getPreValue() 來檢索先前的值。

簽名
NdbRecAttr* getValue
    (
      const char* name,
      char*       value = 0
    )
參數

此方法採用此處列出的兩個參數

  • 屬性的 name (作為常數字元指標)。

  • 指向 value 的指標,使得

    • 如果屬性值不是 NULL,則會在此參數中返回屬性值。

    • 如果屬性值為 NULL,則屬性值僅儲存在此方法返回的 NdbRecAttr 物件中。

    如需關於此參數的詳細資訊,請參閱 value 緩衝區記憶體配置

回傳值

用於保存屬性值的 NdbRecAttr 物件,或指示發生錯誤的 NULL 指標。

value 緩衝區記憶體配置。  應用程式有責任為 value 緩衝區 (如果不是 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()

描述

此方法用於判斷已取用的事件資料是否標示空的 epoch。

此方法是在 NDB 7.4 中新增的。

簽名
bool isEmptyEpoch
    (
      void
    )
參數

.

回傳值

如果此 epoch 為空,則此方法會返回 true;否則,會返回 false

NdbEventOperation::isErrorEpoch()

描述

此方法用於判斷已取用的事件資料是否標示空的 epoch。

此方法是在 NDB 7.4 中新增的。

簽名
bool isErrorEpoch
  (
    NdbDictionary::Event::TableEvent* error_type = 0
  )
參數

如果此為錯誤 epoch,error_type 會包含對應於錯誤的 TableEvent 值。

回傳值

如果此 epoch 發生錯誤,則此方法會返回 true;否則,會返回 false

NdbEventOperation::isOverrun()

描述

此方法用於判斷是否由於緩衝區溢位而發生事件遺失。

簽名
bool isOverrun
    (
      void
    ) const
參數

.

回傳值

如果事件緩衝區已溢位,則此方法會返回 true,否則,會返回 false

NdbEventOperation::mergeEvents()

描述

此方法用於設定合併事件旗標。有關事件合併的資訊,請參閱 Event::mergeEvents()

合併事件旗標預設為 false

簽名
void mergeEvents
    (
      bool flag
    )
參數

一個布林值 flag

回傳值

.

NdbEventOperation::State

本節提供有關 State 資料類型的資訊。

描述

此類型描述事件操作的狀態。

State 值由 getState() 方法傳回。

列舉值

下表顯示可能的值,以及說明。

表 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