針對適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的 Fabric 鏡像資料庫進行疑難排解

本文涵蓋鏡像適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的疑難排解步驟。

疑難排解鏡像表格選取期間的錯誤/警告訊息

當您建立新的鏡像資料庫時,在 [ 選擇資料 ] 頁面中,您可能會收到一些有關來源資料庫中特定資料表的視覺意見反應。 下表提供潛在問題的清單,包括顯示的訊息,以及如何解決問題的相關說明。

狀態碼 狀態類型 Message Description
SCHEMA_DOES_NOT_EXIST ERROR 模式 {} 不存在 給定的結構描述不存在。 它可能在 Fabric 提取相關表格資訊時已被刪除。 重試。
TABLE_DOES_NOT_EXIST ERROR 在schema {}中,table {} 不存在。 給定的表格不存在。 它可能在 Fabric 提取相關表格資訊時已被刪除。 重試。
FORBIDDEN_CHARS_IN_COLUMN_NAME ERROR 表格 {}{} 的欄名稱中包含禁止字元 {} 資料行名稱中含有不支援的字元。 1
UNSUPPORTED_DATA_TYPE ERROR 表格 {} 的 {} 欄有不支援的資料類型 {} 一個 (或多個) 資料表的資料行目前具有不支援的資料類型。 3
FORBIDDEN_CHARS_IN_TABLE_NAME ERROR 表格{}{}名稱中包含禁止字元 表格名稱有不支援的字元。 1
NOT_REGULAR_TABLE ERROR 表 {}.{} 不是一般表 該表格類型不支援鏡像。 2
HAS_PRIMARY_KEY OK 表 {}{} 具有主鍵 Table 是一般表格,具有用於鏡映的有效主索引鍵。
HAS_UNIQUE_INDEX OK 表 {}.{} 具有合適的唯一索引 Table 沒有主鍵,但有一個 不可空 的唯一索引,用於鏡像。 可空的唯一索引會在複製階段造成錯誤,且不支援。
NO_INDEX_FULL_IDENTITY 警告 表 {}.{} 沒有適用的唯一索引。 使用完整身分識別 Table 沒有主鍵或唯一索引,因此 REPLICA IDENTITY FULL 必須支援鏡像,這可能導致效能問題及額外的 WAL 使用。

1 不支援具有空格 (' ') 字元的物件識別碼。

2 此資料表類型不支援鏡像。 目前不支援檢視、實例化檢視、外部資料表和分割資料表。 TimescaleDB 超表也不支援 Fabric 同步鏡像。

3 如需不支援的資料類型清單,請參閱 限制。 僅支援具有下列類型的資料行:

  • bigint
  • bigserial
  • boolean
  • bytea
  • character
  • character varying
  • date
  • double precision
  • integer
  • numeric
  • real
  • serial
  • oid
  • money
  • smallint
  • smallserial
  • text
  • time without time zone
  • time with time zone (* 不作為主鍵)
  • timestamp without time zone
  • timestamp with time zone
  • uuid
  • xml
  • json
  • jsonb
  • inet
  • cidr
  • macaddr
  • macaddr8
  • tsvector
  • tsquery
  • int4range
  • int8range
  • numrange
  • tsrange
  • tstzrange
  • daterange
  • circle
  • line
  • lseg
  • box
  • path
  • point
  • polygon
  • interval

在 Postgres 中,對應於完全相同時刻但位於不同時區的兩個「時區時間」值被視為不同。 例如: 06:24:00.59+05 並 05:24:00.59+04 對應於相同的紀元時間,但Postgres對它們的處理方式不同。

原始資料庫架構中預設的無限制數值欄位(未定義精確度與縮放)會先轉換為 Decimal128(38, 0),然後複製到 OneLake 資料表,符合 SQL 標準慣例,即未指定縮放率代表整數精確度。

支援於原始資料庫的資料定義語言(DDL)操作

  • 重新命名欄位:在 Fabric 中的鏡像表中,會新增具有新名稱的欄位,並包含新插入資料列的資料(對於現有資料列,則為 NULL)。 舊欄位仍會保留現有列的值(因為新列為 NULL)。
  • 新增欄位:新增欄位在鏡像資料表中可見,包含新插入的列資料(現有列為 NULL)。
  • 移除欄位:移除欄位仍可見於鏡像資料表中,並包含現有資料列的資料(新資料列為 NULL)。
  • 更改主鍵:鏡像會話會持續正常進行。

目前不支援對來源資料表執行的其他 DDL 操作,可能導致複寫失敗。

Fabric 容量或工作區的變更

原因 Result 建議的解決方法
Fabric 容量已暫停/刪除 鏡射停止 1. 從 Azure 入口網站恢復或分配容量
2. 移至 Fabric 鏡像資料庫項目。 從工具列中,選取 [停止複寫]。
3. 在 Fabric 入口網站中選取鏡像項目的鏡像資料庫以啟動複寫。
光纖容量已恢復 鏡像處理將不會恢復 1. 移至 Fabric 鏡像資料庫專案。 從工具列中,選取 [停止複寫]。
2. 在 Fabric 入口網站中,選取鏡像項目的 鏡像資料庫 來啟動複寫。
已刪除工作區 螢幕鏡像會自動停止 如果鏡像在適用於 PostgreSQL 的 Azure 資料庫彈性伺服器上仍然作用中,請使用伺服器系統管理員進行連線,並在 PostgreSQL 伺服器上執行下列命令: select azure_cdc.list_tracked_publications();,然後使用傳回的發行集名稱並執行 select azure_cdc.stop_publication(<publication_name>);
Fabric 試用容量已過期 螢幕鏡像會自動停止 請參閱 Fabric 試用容量到期。
超過結構容量 鏡射停止 等到過載狀態結束或更新您的容量。 如需進一步了解 ,請參閱您可以採取的動作,以從超載狀況中復原。 恢復容量後,鏡映會繼續進行。
任何其他資源錯誤 鏡像已停用 為了確保您的計算資源不受影響以及降低對適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的影響,鏡像停用任何持續發生的資源錯誤。
「使用者可以使用 Fabric 外部的應用程式存取儲存在 OneLake 中的資料」設定已停用 「複寫器 - 資料表無法達到複寫狀態」 啟用租用戶設定 使用者可以使用 Fabric 外部的應用程式存取儲存在 OneLake 中的資料。

用於疑難排解的 SQL 查詢

如果你遇到鏡像問題,請連接到原始的 適用於 PostgreSQL 的 Azure 資料庫 伺服器,並利用系統檢視和函式來驗證設定。

  1. 執行以下查詢以驗證所有前置條件是否符合,然後再開始 CDC 鏡像。 此功能檢查各種系統與配置需求,確保伺服器已準備好執行 CDC 作業。
-- Check if all prerequisites are met
SELECT * FROM azure_cdc.check_prerequisites();

-- Example output when all checks pass (on mock mode with identity configured):
 status |                                                               data
--------+----------------------------------------------------------------------------------------------------------------------------------
 ERROR  | [{"status": "ERROR", "details": {"current_value": "12", "required_value": "13"}, "status_code": "MAX_WORKER_PROCESSES_TOO_LOW"}]

-- Example output on standby replica:
 status |                                               data
--------+---------------------------------------------------------------------------------------------------
 ERROR  | [{"status": "ERROR", "status_code": "SERVER_IN_RECOVERY"}]

-- Example output when identity not configured:
 status |                                data
--------+---------------------------------------------------------------------
 ERROR  | [{"status": "ERROR", "status_code": "IDENTITY_NOT_CONFIGURED"}]

退貨:(status text, data jsonb)

  • status:整體狀態 - OK 若所有檢定通過, ERROR 若有任何檢定失敗
  • data: JSONB 陣列包含詳細狀態條目,包含 status、 status_code和 可選性 details

狀態代碼:

狀態碼 Level Description
IDENTITY_NOT_CONFIGURED(身份未配置) ERROR 服務主體憑證未設定(azure.service_principal_id 或 azure.service_principal_tenant_id GUC 未設定)
CDC 管理員角色不存在 ERROR azure_cdc_admin 角色在資料庫中並不存在
USER_NOT_CDC_ADMIN ERROR 目前使用者沒有azure_cdc_admin角色
無創建特權_NO_CREATE_PRIVILEGE_ON_DATABASE ERROR 目前使用者在資料庫上沒有 CREATE 權限
已達發佈限制 ERROR 資料庫已達到最大出版數量(1)
伺服器恢復中 ERROR 伺服器是備用副本,處於復原模式(備用伺服器不支援 CDC 鏡像)
MAX_WORKER_PROCESSES_TOO_LOW ERROR max_worker_processes低於建議的門檻(13)
  1. 執行以下查詢以驗證來源資料庫中的資料表是否符合複製資格。 排除系統結構(pg_catalog、 information_schema、 pg_toast)及擴充功能擁有的資料表。
SELECT * FROM azure_cdc.get_all_tables_mirror_status();
 table_schema | table_name | mirroring_status |                      mirroring_data
--------------+------------+------------------+------------------------------------------------------
 public       | customers  | OK               | [{"status": "OK", "status_code": "HAS_PRIMARY_KEY"}]
 public       | orders     | OK               | [{"status": "OK", "status_code": "HAS_UNIQUE_INDEX"}]
 public       | logs       | WARNING          | [{"status": "WARNING", "status_code": "NO_INDEX_FULL_IDENTITY"}]

返回: 集合 (table_schema text, table_name text, mirroring_status text, mirroring_data jsonb)

  • table_schema: 表格的結構名稱
  • table_name:表格名稱
  • mirroring_status:整體狀態 - OK、 WARNING,或 ERROR
  • mirroring_data: JSONB 陣列包含詳細狀態條目,包含 status、 status_code和 可選性 details

狀態代碼:

狀態碼 Level Description
SCHEMA_不存在 ERROR 指定的結構不存在
表格不存在 ERROR 指定的資料表不存在於結構中
欄位名稱中禁止使用的字符 ERROR 欄位名稱包含禁用字元(例如空格)
FORBIDDEN_CHARS_IN_TABLE_NAME ERROR 資料表名稱包含禁用字元
UNSUPPORTED_DATA_TYPE 警告 表格中有不支援的資料型態欄位
錯誤類型_UNSUPPORTED_TYPE_IN_REPLICA_IDENTITY ERROR 副本身份欄位中不支援的資料型別(當沒有唯一索引存在時)
非常規表格 ERROR 表格不是一般且永久的表格(例如,檢視表、暫存表格、分割表)
NOT_TABLE_OWNER ERROR 目前的使用者並非該表格的擁有者
HAS_PRIMARY_KEY OK 表格有一個主鍵
HAS_UNIQUE_INDEX OK 該表格具有合適的唯一索引
If a translation or localization is deemed necessary, it might not directly translate the term but rather describe its function or role in the system. 警告 沒有合適的唯一索引;將使用整列識別(可能影響效能)
  1. 執行以下查詢以回傳複製操作中偵測到的錯誤與問題,包括系統範圍錯誤、發布特定錯誤及各表錯誤。
-- Get only system-wide errors
SELECT * FROM azure_cdc.get_health_status('', '');

-- Get system-wide errors and publication-specific errors
SELECT * FROM azure_cdc.get_health_status('my_database', 'my_publication');

參數:

  • db_name (文字):資料庫名稱
  • pub_name (正文):出版名稱

態度:

  • 當兩個參數azure_cdc.get_health_status('', '')皆為空字串時(): 僅回傳系統範圍的錯誤(錯誤類型 'S')。
  • 當使用有效的資料庫和發佈名稱進行呼叫時,將返回全系統錯誤以及指定的發佈和資料表特定的錯誤。

返回: 集合 (error_time timestamptz, schema_name text, table_name text, error_type char(1), error_code text, params jsonb)

錯誤類型:

錯誤類型 Description
S 系統範圍錯誤
P 出版物專屬錯誤
T 資料表特定錯誤

錯誤代碼:

錯誤碼 類型 Description
CDC_ERR_SYS_MAX_NUMBER_OF_WORKERS_REACHED - 已達到系統可用工作器數量上限 S 已達到工人最大數量
CDC_ERR_SYS_已達最大出版數量上限 S 資料庫已達到出版物數量的上限
CDC_ERR_SYS_ONELAKE_PERMISSION_DENIED S OneLake行動的許可被拒絕
CDC_ERR_SYS_ONELAKE_工件不存在 S OneLake 元件未找到
CDC_ERR_SYS_ONELAKE_COMM_FAILED S OneLake 通訊中斷
CDC_ERR_SYS_ONELAKE_BAD_REQUEST S 對 OneLake 的不正當請求
CDC_ERR_PUB_SNAPSHOT_TIMEOUT(發佈快照超時錯誤) P 快照在逾時後未準備好
CDC_ERR_PUB_SNAPSHOT_WORKER_TIMEOUT P 針對特定資料表的快照工作者逾時
CDC_ERR_PUB_ONELAKE_PERMISSION_DENIED (OneLake 權限被拒絕) P OneLake行動的許可被拒絕
CDC_ERR_PUB_ONELAKE_ARTIFACT_DOES_NOT_EXIST P OneLake 元件未找到
CDC_ERR_PUB_ONELAKE_COMM_FAILED P OneLake 通訊中斷
CDC_ERR_PUB_MAX_NUMBER_OF_WORKERS_REACHED(已達最大工作者數量限制) P 已達到發布的最大工作執行者數量
CDC_ERR_PUB_ONELAKE_BAD_REQUEST P 對 OneLake 的不正當請求
CDC_ERR_PUB_TOO_MANY_ERRORS(發布錯誤過多) P 出版過程中錯誤太多
CDC_ERR_TABLE_TRUNCATE_NOT_SUPPORTED T 不支援截斷操作(可能造成資料不一致)
  1. 執行以下查詢以檢查發佈是否正確建立,且複製變更是否順利進行:

    select * from azure_cdc.tracked_publications;
    

    檢查該發布是否處於啟用狀態,及快照是否已生成。 您也可以透過查詢來檢查是否已產生後續變更批次:

    select * from azure_cdc.tracked_batches;
    
  2. 如果檢視未 azure_cdc.tracked_publications 顯示處理累加變更的任何進度,請執行下列 SQL 查詢,以檢查是否有任何問題回報:

    SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';
    
  3. 如果未報告任何問題,請執行下列命令,以檢閱鏡像 PostgreSQL 資料庫的目前組態。 確認它已正確啟用。

    SELECT * FROM pg_replication_slots;
    

    在這裡尋找的關鍵欄是 slot_name 和 active。 除了 (true) 之外 t 的任何值都表示潛在問題。

  4. 如果需要疑難排解,請聯絡支援人員。

受管理的識別

必須啟用適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的系統指派受控識別 (SAMI),而且必須是主要身分識別。 如需詳細資訊,請參閱 PostgreSQL 彈性伺服器的系統指派受控識別。

啟用後,如果 SAMI 設定狀態隨後被停用再重新啟用,那麼 適用於 PostgreSQL 的 Azure 資料庫 彈性伺服器向 Fabric OneLake 的鏡像將會失敗。

使用下列查詢確認 SAMI 已啟用: show azure.service_principal_id;

SAMI 權限

請勿移除適用於 PostgreSQL 的 Azure 資料庫彈性伺服器系統指派受控識別 (SAMI) 參與者對 Fabric 鏡像資料庫專案的許可權。

如果您不小心移除 SAMI 許可權,Azure PostgreSQL 資料庫的彈性伺服器鏡像不會如預期般運作。 無法從來源資料庫同步任何新資料。

如果您移除適用於 PostgreSQL 的 Azure 資料庫彈性伺服器 SAMI 權限或權限設定不正確,請使用下列步驟。

  1. 選取鏡像資料庫項目上的省略符號選項,將 ... 彈性伺服器 SAMI 新增為使用者。
  2. 選取 [管理許可權 ] 選項。
  3. 輸入適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的名稱。 提供 讀取 和 寫入 權限。