Oracle CDC 實例與目標 SQL Server 實例上相同名稱的 SQL Server 資料庫相關聯。 此資料庫稱為 Oracle CDC 資料庫(或 CDC 資料庫)。
CDC 資料庫是使用 Oracle CDC 設計工具控制台建立和設定,其中包含下列元素:
藉由啟用 SQL Server CDC 資料庫而建立的資料結構
cdc。Oracle CDC 實例所使用的 一組cdc.xdbcdc_xxxx 數據表。
一組空白鏡像數據表,其中包含 Tuphe Source Oracle 資料庫中所擷取數據表的定義。
SQL Server CDC 機制所產生的一組變更數據表和變更存取函式,與一般、非 Oracle、SQL Server CDC 中使用的變更數據表和存取函式相同。
架構 cdc 最初只有 dbowner 固定資料庫角色的成員可以存取。 變更數據表和變更函式的存取權是由與 SQL Server CDC 相同的安全性模型所決定。 如需安全性模型的詳細資訊,請參閱 安全性模型。
建立 CDC 資料庫
在大部分情況下,CDC 資料庫是使用 CDC 設計工具控制台建立,但也可以使用使用 CDC 設計工具主控台所產生的 CDC 部署腳本來建立。 SQL Server 系統管理員可以視需要變更資料庫設定(例如記憶體、安全性或可用性等專案)。
如需使用 CDC 設計工具控制台來建立資料庫數據表和必要腳本的詳細資訊,請參閱 使用新增實例精靈。
CDC 資料庫使用者角色
為 CDC 建立並啟用 CDC 資料庫時,會在 CDC 資料庫中建立名為 cdc_service 的資料庫使用者,並與 Oracle CDC 服務設定的 SQL Server 登入相關聯。 此用戶成為 db_datareader、 db_datawriter和 db_ddladmin 資料庫角色的成員。 如果 SQL Server 登入也是與 dbo 使用者相關聯的 ,則 不會建立cdc_service 。
此角色指派可讓 Oracle CDC 服務使用擷取的數據以及控制資訊來更新架構底下的 cdc 數據表。
建立 CDC 資料庫並設定 CDC 來源 Oracle 資料表時,CDC 資料庫擁有者可以授與鏡像數據表的 SELECT 許可權,並定義 SQL Server CDC 控制角色,以控制誰存取變更數據。
鏡像數據表
針對每個擷取的數據表, <schema-name>。<數據表名稱>,在 Oracle 源資料庫中,CDC 資料庫中會建立類似的空白數據表,其架構和數據表名稱相同。 無法擷取具有架構名稱 cdc 的 Oracle 源數據表(不區分大小寫),因為 cdc SQL Server 中的架構會保留給 SQL Server CDC。
鏡像數據表是空的;其中不會儲存任何數據。 它們可用來啟用 Oracle CDC 實例所使用的標準 SQL Server CDC 基礎結構。 為防止數據插入或更新至鏡像數據表,PUBLIC 會拒絕所有 UPDATE、DELETE 和 INSERT 作業。 這可確保無法修改它們。
異動數據的存取權
由於 SQL Server 安全性模型用來存取與擷取實例相關聯的變更數據,因此使用者必須獲得 select 相關聯鏡像數據表之所有擷取數據行的存取權(原始 Oracle 數據表的訪問許可權不提供對 SQL Server 中變更數據表的存取權)。 如需 SQL Server 安全性模型的詳細資訊,請參閱 安全性模型。
此外,如果在建立擷取實例時指定了閘控角色,呼叫者也必須是指定之閘控角色的成員。 其他一般性變更資料擷取功能用於存取元數據,可透過PUBLIC角色供所有資料庫使用者使用。儘管如此,傳回的元數據通常受限於基礎源資料表的選擇性存取,以及任何已定義之控制角色的成員資格。
建立擷取實例時,呼叫SQL Server CDC 元件所產生的特殊數據表型函式,即可讀取異動數據。 如需此函式的詳細資訊,請參閱異動數據擷取函式 (Transact-SQL)。
透過 Integration Services CDC 來源元件存取 CDC 數據受限於相同的規則。
CDC 資料庫數據表
本節說明 CDC 資料庫中的下表。
變更資料表 (_CT)
變更數據表是從鏡像數據表建立的。 它們包含從 Oracle 資料庫擷取的變更數據。 資料表會根據下列慣例來命名:
[cdc]。[<capture-instance>_CT]
一開始針對資料表 <schema-name>.<table-name>啟用擷取時,預設擷取實例名稱為 <schema-name>_<table-name>。 例如,Oracle HR.EMPLOYEES 表的預設擷取實例名稱為 HR_EMPLOYEES,相關聯的變更數據表為 [cdc]。 [HR_EMPLOYEES_CT]。
擷取數據表是由 Oracle CDC 實例寫入。 建立擷取實例時,會使用 SQL Server 所產生的特殊數據表值函式來讀取它們。 例如: fn_cdc_get_all_changes_HR_EMPLOYEES 。 如需這些 CDC 函式的詳細資訊,請參閱異動數據擷取函式 (Transact-SQL)。
cdc.lsn_time_mapping
[cdc].[lsn_time_mapping] 資料表是由 SQL Server CDC 元件產生。 在 Oracle CDC 的情況下,其使用方式與一般用途不同。
針對 Oracle CDC,此資料表中儲存的 LSN 值是以與變更相關聯的 Oracle 系統變更號碼 (SCN) 值為基礎。 LSN 值的前 6 個字節是原始的 Oracle SCN 數位。
此外,使用 Oracle CDC 時,時間數據行 (tran_begin_time 和 tran_end_time) 也會儲存變更的 UTC 時間,而不是與一般 SQL Server CDC 一樣的地方時間。 這可確保日光節約時間變更不會影響儲存在lsn_time_mapping中的數據。
cdc.xdbcdc_config
此數據表包含 Oracle CDC 實例的組態數據。 它會使用 CDC 設計工具控制台進行更新。 此數據表只有一個數據列。
下表描述 cdc.xdbcdc_config 數據表數據行。
| 項目 | 說明 |
|---|---|
| 版本 | 這會追蹤 CDC 實例組態的版本。 每次更新數據表,以及每次新增新的擷取實例或移除現有的擷取實例時,都會更新它。 |
| connect_string | Oracle 連接字串。 基本範例為:<server>:<port>/<instance> (例如, erp.contoso.com:1521/orcl。連接字串也可以指定 Oracle Net connect 描述元,例如 (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp) (HOST=erp.contoso.com) (PORT=1521)) (CONNECT_DATA=(SERVICE_NAME=orcl)))。如果使用目錄伺服器或 tnsnames,連接字串可以是連線的名稱。 如需有關 Oracle 連接字串的詳細資訊,請參閱 https://go.microsoft.com/fwlink/?LinkId=231153,此處提供 Oracle CDC 服務所用的 Oracle 立即用戶端的 Oracle 資料庫連接字串之詳細資訊。 |
| 使用 Windows 驗證 | 布林值,可以是: 0:提供 Oracle 使用者名稱和密碼進行驗證 (預設值) 1:Windows 驗證可用來連線到 Oracle 資料庫。 只有當 Oracle 資料庫設定為使用 Windows 驗證時,才可以使用此選項。 |
| 用戶名 | 日誌挖掘 Oracle 資料庫用戶的名稱。 只有當 use_windows_authentication = 0 時,才強制這樣做。 |
| 密碼 | 擁有日誌挖掘功能的 Oracle 資料庫用戶密碼。 只有在 use_windows_authentication = 0 時,才強制執行此設定。 |
| 暫存交易超時時間 (transaction_staging_timeout) | 未提交的 Oracle 交易在寫入 cdc.xdbcdc_staged_transactions 資料表之前,會以秒為單位保留於記憶體中的時間。 預設值是 120 秒。 |
| 記憶體限制 | 可用於快取的記憶體中資料的容量限制,以 Mb 為單位。 較低的設定會導致將更多交易寫入 cdc.xdbcdc_staged_transactions 數據表。 預設值為 50 Mb。 |
| 選項 | 名稱[=value][; ] 格式的選項清單 - 用於指定次要選項(例如追蹤、微調)。 如需可用選項的描述,請參閱下表。 |
下表描述可用的選項。
| 名稱 | 預設 | 最小值 | 麥克斯 | 靜態的 | 說明 |
|---|---|---|---|---|---|
| 追蹤 | 否 | - | - | 否 | 可用的值: 真實 假 上 off |
| CDC 更新狀態間隔 | 10 | 1 | 120 | 否 | 為交易配置的記憶體區塊大小(以 KB 為單位)(交易可以配置多個區塊)。 請參閱 cdc.xdbcdc_config 數據表中的memory_limit數據行。 |
| 目標最大批次交易數量 | 100 | 1 | 1000 | 對 | 在 SQL Server CT 資料表更新中,可視為一筆交易處理的 Oracle 交易數量上限。 |
| target_idle_lsn_update_interval | 10 | 0 | 1 | 否 | 當擷取的數據表沒有活動時,更新 lsn_time_mapping 數據表的間隔(以秒為單位)。 |
| 追蹤保留期 | 24 | 1 | 24*31 | 否 | 時間量(以小時為單位將訊息保留在追蹤數據表中)。 |
| sql_reconnect_interval (SQL 重新連接間隔) | 2 | 2 | 3600 | 否 | 重新連線到 SQL Server 之前等待的時間量(以秒為單位)。 除了 SQL Server 用戶端的連線逾時之外,也會使用此間隔。 |
| sql_reconnect_limit | -1 | -1 | -1 | 否 | SQL Server 重新連線的上限。 默認 -1 表示進程會嘗試重新連線,直到停止為止。 |
| 重啟限制 | 6 | -1 | 3600 | 否 | 在大部分情況下,CDC 服務會自動重新啟動異常結束的 CDC 實例。 此屬性定義服務在每小時發生若干次失敗後停止並重啟實例。 值 -1 表示應該一律重新啟動實例。 服務會在設定資料表更新後,重新啟動實例。 |
| cdc_memory_report 內存報告 | 0 | 0 | 1000 | 否 | 如果參數的值已變更,CDC 實例會在追蹤數據表上列印其記憶體報告。 |
| 目標指令超時 | 600 | 1 | 3600 | 否 | 使用 SQL Server 的命令逾時。 |
| 原始字符集 | - | - | - | 對 | 可以設定為要使用的特定 Oracle 編碼方式,而不是 Oracle 資料庫代碼頁。 當字元數據使用的實際編碼方式與 Oracle 資料庫代碼頁所表示的編碼不同時,可能會使用此方式。 |
| 來源錯誤重試間隔 | 30 | 1 | 3600 | 否 | 在重試操作之前使用,用於應對多種錯誤,例如連線錯誤或系統數據表之間暫時不同步的情況。 |
| source_prefetch_size (來源預取大小) | 100 | 1 | 一萬 | 對 | 預先擷取批次的大小。 |
| source_max_tables_in_query | 100 | 1 | 一萬 | 對 | 在切換至讀取 Oracle 記錄檔之前,WHERE 子句中的數據表數目上限,而不需篩選數據表。 |
| source_read_retry_interval | 2 | 1 | 3600 | 否 | 來源在嘗試再次讀取 EOF 上的 Oracle 事務歷史記錄之前等候的時間量。 |
| 來源重新連接間隔 | 30 | 1 | 3600 | 否 | 嘗試重新連線至源資料庫之前,要等候多久(以秒為單位)。 |
| 原始重新連接限制 | -1 | -1 | 否 | 源資料庫重新連線的最大上限。 默認 -1 表示進程會嘗試重新連線,直到停止為止。 | |
| source_command_timeout | 30 | 1 | 3600 | 否 | 使用 Oracle 的連線逾時。 |
| 來源連接超時 | 30 | 1 | 3600 | 否 | 使用 SQL Server 的連線逾時。 |
| 追蹤資料錯誤 | 對 | - | - | 否 | 布林值。 True 表示記錄資料轉換和截斷錯誤。 |
| 停止於更改破壞資料結構的CDC | 否 | - | - | 否 | 布林值。
True 表示當偵測到重大架構變更時停止。 False 表示刪除鏡像資料表和擷取實例。 |
| source_oracle_home | - | - | 否 | 可以設定為 CDC 實例用來連線到 Oracle 的特定 Oracle Home 路徑或 Oracle Home 名稱。 |
cdc.xdbcdc_state
此數據表包含 Oracle CDC 實例保存狀態的相關信息。 擷取狀態用於故障復原和故障轉移的情境,並用於健康狀況監控。
下表描述 cdc.xdbcdc_state 數據表數據行。
| 項目 | 說明 |
|---|---|
| 地位 | 目前 Oracle CDC 實例的狀態代碼。 狀態描述 CDC 的目前狀態。 |
| 子狀態 | 第二個層級狀態,提供目前狀態的其他資訊。 |
| 活動中 | 布林值,可以是: 0:Oracle CDC 實例進程不在作用中。 1:Oracle CDC 實例進程作用中。 |
| 錯誤 | 布林值,可以是: 0:Oracle CDC 實例進程未處於錯誤狀態。 1:Oracle CDC 實例處於錯誤狀態。 |
| status_message | 提供錯誤或狀態描述的字串。 |
| 時間戳 | 上次更新擷取狀態的時間戳記(UTC)。 |
| 啟用捕捉節點 | 主機的名稱(主機可以是叢集上的節點),目前正在執行 Oracle CDC 服務和 Oracle CDC 實例(正在處理 Oracle 事務歷史記錄)。 |
| 最後交易時間戳記 | 時間戳記,記錄最後寫入變更資料表的交易時間(UTC)。 |
| 最後變更時間戳記 | 從來源 Oracle 事務歷史記錄讀取最近變更記錄的時間時間戳。 此時間戳有助於識別 CDC 程式的目前延遲。 |
| 交易日志头部_cn | 從 Oracle 事務歷史記錄讀取的最新變更號碼 (CN)。 |
| 交易記錄尾部_cn | Oracle 事務記錄上的變更編號(CN),是 Oracle CDC 實例在重新啟動或復原時重新定位的地方。 |
| current_cn | 已知存在於源資料庫中的最新變更號碼 (CN)。 |
| 軟體版本 | Oracle CDC 服務的內部版本。 |
| 已完成交易 | 自 CDC 上次重設後處理的交易數目。 |
| 書面更改 | 寫入 SQL Server 變更資料表的變更記錄數目。 |
| 閱讀變更 | 從來源 Oracle 事務歷史記錄讀取的變更記錄數目。 |
| 分段交易 | cdc.xdbcdc_staged_transactions 數據表中 暫存的目前使用中交易數目。 |
cdc.xdbcdc_trace
此數據表包含 CDC 實例作業的相關信息。 儲存在此數據表中的資訊包括錯誤記錄、值得注意的狀態變更,以及追蹤記錄。 錯誤資訊也會寫入 Windows 事件記錄檔,以確保在cdc.xcbcdc_trace 資料表無法使用時,該資訊仍然可供使用。
下表描述 cdc.xdbcdc_trace 表的欄位。
| 項目 | 說明 |
|---|---|
| 時間戳 | 寫入追蹤記錄時的確切 UTC 時間戳。 |
| 類型 | 包含下列其中一個值。 錯誤 資訊 追踪 |
| 節點 | 寫入記錄的節點名稱。 |
| 地位 | 狀態數據表所使用的狀態代碼。 |
| 子狀態 | 狀態數據表所使用的子狀態代碼。 |
| 狀態訊息 | 狀態數據表所使用的狀態消息。 |
| 數據 | 當錯誤或追蹤記錄包含有效負載時的其他資料(例如損毀的日誌記錄)。 |
cdc.xdbcdc_staged_transactions
此數據表會儲存大型或長時間執行交易的變更記錄,直到擷取交易認可或回復事件為止。 Oracle CDC 服務會先依交易提交時間對擷取的日誌記錄排序,然後再依每個交易內的時間順序排序。 相同交易的記錄檔記錄會儲存在記憶體中,直到交易結束,然後寫入目標變更數據表或捨棄(如果是復原)。 由於記憶體數量有限,因此大型交易會寫入 cdc.xdbcdc_staged_transactions 數據表,直到交易完成為止。 交易在執行時間較長時,也會被寫入暫存表。 因此,當 Oracle CDC 實例重新啟動時,不需要從 Oracle 事務歷史記錄重新讀取舊的變更。
下表描述 cdc.xdbcdc_staged_transactions 表的欄位。
| 項目 | 說明 |
|---|---|
| 交易識別碼 | 正在暫存的交易唯一交易識別碼。 |
| seq_num | 目前交易的xcbcdc_staged_transactions行數(從 0 開始)。 |
| data_start_cn | 此行數據中第一個變更的變更編號 (CN)。 |
| 資料結束_中國 | 此數據列中數據中最後一個變更的變更編號 (CN)。 |
| 數據 | BLOB 形式的分階段交易變更。 |