本文介绍镜像 Azure Database for PostgreSQL 灵活服务器的故障排除步骤。
排查在选择用于镜像的表时出现的错误或警告消息
创建新的镜像数据库时,在 “选择数据 ”页中,可能会收到有关源数据库中特定表的一些视觉反馈。 下表提供了潜在问题的列表,包括显示的消息以及有关如何解决问题的相关说明。
| 状态代码 | 状态类型 | Message | Description |
|---|---|---|---|
SCHEMA_DOES_NOT_EXIST |
错误 | 架构 {} 不存在 | 给定架构不存在。 当 Fabric 正在拉取相关表信息时,它可能已被删除。 重试。 |
TABLE_DOES_NOT_EXIST |
错误 | 在架构 {}中,表 {} 不存在。 | 给定表不存在。 当 Fabric 正在拉取相关表信息时,它可能已被删除。 重试。 |
FORBIDDEN_CHARS_IN_COLUMN_NAME |
错误 | 表 {}{} 包含的列名 {} 中有禁止字符。 | 给定列的名称中包含不被支持的字符。 1 |
UNSUPPORTED_DATA_TYPE |
错误 | 表{}。{}中列{}的数据类型不受支持 | 表的一个或多个列当前不支持数据类型。 3 |
FORBIDDEN_CHARS_IN_TABLE_NAME |
错误 | 表 {}{} 包含名称中的禁止字符 | 表名包含不受支持的字符。 1 |
NOT_REGULAR_TABLE |
错误 | 表 {}。{} 不是常规表 | 表类型不支持用于镜像。 2 |
HAS_PRIMARY_KEY |
好的 | 表 {}.{} 具有主键 | 表是常规表,具有用于镜像的有效主键。 |
HAS_UNIQUE_INDEX |
好的 | 表{}拥有一个合适的唯一索引{}。 | 表没有主键,但具有 不可为 null 的唯一索引,该索引将用于镜像。 可为 Null 的唯一索引会在复制阶段导致错误,并且不被支持。 |
NO_INDEX_FULL_IDENTITY |
警告 | 表 {}{}没有合适的唯一索引。 使用完整身份信息 | 表没有主键或唯一索引,因此 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 以不同的方式对待它们。
在将源数据库架构中的默认不受约束(无定义精度和规模)数字列复制到 OneLake 表之前,这些列将转换为 Decimal128(38, 0),与 SQL 标准惯例保持一致,未指定规模意味着整数精度。
源数据库支持的数据定义语言(DDL)操作
- Rename column:新名称的列将添加到Fabric中的镜像表中,并包含新插入行的数据(对于现有行将为 NULL)。 旧列仍然保留现有行的值,而新行的值为空。
- 添加列:添加的列在镜像表中可见,并包含新插入行的数据(对于现有行是 NULL)。
- 删除列:被删除的列在镜像表中仍然可见,并包含现有行的数据(对于新行,其值为 NULL)。
- 更改主键:镜像会话会定期继续。
当前不支持对源表执行任何其他 DDL 操作,并可能导致复制失败。
Fabric 容量或工作区的更改
| 原因 | 结果 | 建议的解决方法 |
|---|---|---|
| 构造容量已暂停/删除 | 镜像停止 | 1. 从 Azure 门户重新启用或分配容量 2.转到 Fabric 镜像数据库项。 在工具栏中,选择“ 停止复制”。 3.通过在 Fabric 门户中为镜像项选择 镜像数据库 来启动复制。 |
| 恢复构造容量 | 不会恢复镜像功能 | 1. 转到 Fabric 的镜像数据库项。 在工具栏中,选择“ 停止复制”。 2.通过在 Fabric 门户中为镜像项选择 镜像数据库 来启动复制。 |
| 工作区已删除 | 镜像自动停止 | 如果在 Azure Database for PostgreSQL 灵活服务器上,数据库镜像功能仍处于活动状态,请以服务器管理员身份连接,并在 PostgreSQL 服务器上执行以下命令:select azure_cdc.list_tracked_publications();,然后使用返回的发布名称并执行 select azure_cdc.stop_publication(<publication_name>);。 |
| Fabric 试用容量已过期 | 镜像自动停止 | 请参阅 Fabric 试用容量过期。 |
| 超出结构容量 | 镜像暂停 | 等待重载状态结束或更新容量。 请参阅 在重载情况下可采取的恢复措施以了解更多信息。 容量恢复后,镜像操作将继续进行。 |
| 任何其他资源错误 | 镜像已禁用 | 为了确保计算资源不受影响,并最大程度地减少对 Azure Database for PostgreSQL 灵活服务器的影响,镜像会禁用任何永久性资源错误。 |
| “用户可以使用 Fabric 外部的应用访问 OneLake 中存储的数据”设置已禁用 | 复制器 - 表无法达到复制状态 | 启用租户设置 用户可以使用 Fabric 外部的应用访问 OneLake 中存储的数据。 |
用于故障排除的 SQL 查询
如果遇到镜像问题,请连接到源Azure Database for PostgreSQL服务器,并使用系统视图和函数执行这些检查以验证配置。
- 执行以下查询,验证启动 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:包含具有statusstatus_code和可选details的详细状态条目的 JSONB 数组。
状态代码:
| 状态代码 | 级别 | Description |
|---|---|---|
| 身份_未配置 (IDENTITY_NOT_CONFIGURED) | 错误 | 未配置服务主体凭据(未设置azure.service_principal_id或azure.service_principal_tenant_id GUC) |
| CDC_ADMIN_ROLE_NOT_EXISTS | 错误 | 数据库中不存在azure_cdc_admin角色 |
| USER_NOT_CDC_ADMIN | 错误 | 当前用户没有“azure_cdc_admin”角色 |
| 无数据库创建权限 (NO_CREATE_PRIVILEGE_ON_DATABASE) | 错误 | 当前用户缺少对数据库的 CREATE 权限 |
| 发布限制已达到 | 错误 | 已达到数据库的最大发布数(1 个) |
| 服务器_正在恢复 (SERVER_IN_RECOVERY) | 错误 | 服务器是恢复模式下的备用副本(备用服务器不支持 CDC 镜像) |
| MAX_WORKER_PROCESSES_TOO_LOW (最大工作进程设置过低) | 错误 | 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。
状态代码:
| 状态代码 | 级别 | Description |
|---|---|---|
| SCHEMA_DOES_NOT_EXIST | 错误 | 指定的架构不存在 |
| 表不存在 | 错误 | 架构中不存在指定的表 |
| FORBIDDEN_CHARS_IN_COLUMN_NAME | 错误 | 列名包含禁止字符(例如空格) |
| 禁用字符_表名称中 | 错误 | 表名包含禁止字符 |
| UNSUPPORTED_DATA_TYPE | 警告 | 表中有列的数据类型不受支持 |
| UNSUPPORTED_TYPE_IN_REPLICA_IDENTITY | 错误 | 副本标识列中不支持的数据类型(不存在唯一索引时) |
| 非正规表格 | 错误 | 表不是常规永久表(例如视图、临时表、分区) |
| NOT_TABLE_OWNER | 错误 | 当前用户不是表的所有者 |
| HAS_PRIMARY_KEY | 好的 | 表具有主键 |
| HAS_UNIQUE_INDEX | 好的 | 表具有合适的唯一索引 |
| NO_INDEX_FULL_IDENTITY | 警告 | 没有合适的唯一索引;将使用完整行标识(可能会影响性能) |
- 执行以下查询以返回复制操作期间检测到的错误和问题,包括系统范围内的错误、发布特定的错误和每个表的错误。
-- 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(text):出版物名称
行为:
- 使用两个参数的空字符串调用时(
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_已达到最大工作者数量 | S | 最大工人数已达到 |
| 已达到发布的最大系统数量上限 | S | 数据库已达到最大发布数 |
| CDC_ERR_SYS_ONELAKE_PERMISSION_DENIED(访问被拒绝) | S | OneLake 操作的权限被拒绝 |
| CDC_ERR_SYS_ONELAKE_ARTIFACT_DOES_NOT_EXIST | S | 找不到 OneLake 工件 |
| CDC_ERR_SYS_ONELAKE_COMM_FAILED(系统与OneLake通信失败) | 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(许可被拒) | P | OneLake 操作的权限被拒绝 |
| CDC_ERR_PUB_ONELAKE_ARTIFACT_DOES_NOT_EXIST | P | 找不到 OneLake 工件 |
| CDC_ERR_PUB_ONELAKE_通信失败 | 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的任何值都表示存在潜在问题。如果需要故障排除,请联系支持人员。
托管标识
需要启用 Azure Database for PostgreSQL 灵活服务器的系统分配托管身份(SAMI),并将其设为主身份。 有关详细信息,请参阅 PostgreSQL 弹性服务器的系统分配托管标识。
启用后,如果稍后禁用再重新启用 SAMI 设置状态,将导致将 Azure Database for PostgreSQL 灵活服务器镜像到 Fabric OneLake 的过程失败。
使用以下查询验证是否已启用 SAMI: show azure.service_principal_id;
SAMI 权限
请勿删除 Fabric 镜像数据库项上的 Azure Database for PostgreSQL 灵活服务器系统分配的托管标识(SAMI)参与者权限。
如果误删了 SAMI 权限,Azure Database for PostgreSQL 灵活服务器的镜像功能将无法按预期运行。 无法从源数据库镜像新数据。
如果删除 适用于 PostgreSQL 的 Azure 数据库灵活服务器 SAMI 权限,或者权限未正确设置,请使用以下步骤。
- 通过选择
...镜像数据库项上的省略号选项,将灵活服务器 SAMI 添加为用户。 - 选择“ 管理权限 ”选项。
- 输入 Azure Database for PostgreSQL 灵活服务器的名称。 提供 读取 和 写入 权限。