排查 Azure Database for PostgreSQL 灵活服务器中的 Fabric 镜像数据库问题

本文介绍镜像 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 有关不支持的数据类型的列表,请参阅 “限制”。 仅支持具有以下类型的列:

  • 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 以不同的方式对待它们。

在将源数据库架构中的默认不受约束(无定义精度和规模)数字列复制到 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服务器,并使用系统视图和函数执行这些检查以验证配置。

  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:包含具有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)
  1. 执行以下查询以验证源数据库中的表是否有资格进行复制。 排除系统架构(pg_cataloginformation_schemapg_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:总体状态 - OKWARNINGERROR
  • mirroring_data:JSONB 数组,包含详细状态条目,并包括statusstatus_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 警告 没有合适的唯一索引;将使用完整行标识(可能会影响性能)
  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 (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 不支持截断操作(可能导致数据不一致)
  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_nameactive。 除 (true) 之外 t 的任何值都表示存在潜在问题。

  4. 如果需要故障排除,请联系支持人员

托管标识

需要启用 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 权限,或者权限未正确设置,请使用以下步骤。

  1. 通过选择 ... 镜像数据库项上的省略号选项,将灵活服务器 SAMI 添加为用户。
  2. 选择“ 管理权限 ”选项。
  3. 输入 Azure Database for PostgreSQL 灵活服务器的名称。 提供 读取写入 权限。