本文涵蓋鏡像適用於 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 如需不支援的資料類型清單,請參閱 限制。 僅支援具有下列類型的資料行:
bigintbigserialbooleanbyteacharactercharacter varyingdatedouble precisionintegernumericrealserialoidmoneysmallintsmallserialtexttime without time zone-
time with time zone(* 不作為主鍵) timestamp without time zonetimestamp with time zoneuuidxmljsonjsonbinetcidrmacaddrmacaddr8tsvectortsqueryint4rangeint8rangenumrangetsrangetstzrangedaterangecirclelinelsegboxpathpointpolygoninterval
在 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 資料庫 伺服器,並利用系統檢視和函式來驗證設定。
- 執行以下查詢以驗證所有前置條件是否符合,然後再開始 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) |
- 執行以下查詢以驗證來源資料庫中的資料表是否符合複製資格。 排除系統結構(
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. | 警告 | 沒有合適的唯一索引;將使用整列識別(可能影響效能) |
- 執行以下查詢以回傳複製操作中偵測到的錯誤與問題,包括系統範圍錯誤、發布特定錯誤及各表錯誤。
-- 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 | 不支援截斷操作(可能造成資料不一致) |
執行以下查詢以檢查發佈是否正確建立,且複製變更是否順利進行:
select * from azure_cdc.tracked_publications;檢查該發布是否處於啟用狀態,及快照是否已生成。 您也可以透過查詢來檢查是否已產生後續變更批次:
select * from azure_cdc.tracked_batches;如果檢視未
azure_cdc.tracked_publications顯示處理累加變更的任何進度,請執行下列 SQL 查詢,以檢查是否有任何問題回報:SELECT * FROM pg_stat_activity WHERE state = 'idle in transaction';如果未報告任何問題,請執行下列命令,以檢閱鏡像 PostgreSQL 資料庫的目前組態。 確認它已正確啟用。
SELECT * FROM pg_replication_slots;在這裡尋找的關鍵欄是
slot_name和active。 除了 (true) 之外t的任何值都表示潛在問題。如果需要疑難排解,請聯絡支援人員。
受管理的識別
必須啟用適用於 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 權限或權限設定不正確,請使用下列步驟。
- 選取鏡像資料庫項目上的省略符號選項,將
...彈性伺服器 SAMI 新增為使用者。 - 選取 [管理許可權 ] 選項。
- 輸入適用於 PostgreSQL 的 Azure 資料庫彈性伺服器的名稱。 提供 讀取 和 寫入 權限。