pg_dbms_errlog

模仿 Oracle DBMS_ERRLOG 模块来记录特定表的DML错误

概览

扩展包名版本分类许可证语言
pg_dbms_errlog2.4SIMISCC
ID扩展名BinLibLoadCreateTrustReloc模式
9270pg_dbms_errlogdbms_errlog
相关扩展pg_statement_rollback pg_dbms_metadata pg_dbms_lock pg_dbms_job

Requires pg_statement_rollback and shared_preload_libraries=pg_dbms_errlog; restart required.

版本

类型仓库版本PG 大版本包名依赖
EXTMIXED2.41817161514pg_dbms_errlogpg_statement_rollback
RPMPGDG2.21817161514pg_dbms_errlog_$vpg_statement_rollback_$v
DEBPIGSTY2.41817161514postgresql-$v-pg-dbms-errlogpostgresql-$v-pg-statement-rollback
OS / PGPG18PG17PG16PG15PG14
el8.x86_64
el8.aarch64
el9.x86_64
el9.aarch64
el10.x86_64
el10.aarch64
d12.x86_64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
d12.aarch64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
d13.x86_64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
d13.aarch64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u22.x86_64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u22.aarch64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u24.x86_64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u24.aarch64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u26.x86_64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
u26.aarch64
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4
PIGSTY 2.4

构建

您可以使用 pig build 命令构建 pg_dbms_errlog 扩展的 DEB 包:

pig build pkg pg_dbms_errlog         # 构建 DEB 包

安装

您可以直接安装 pg_dbms_errlog 扩展包的预置二进制包,首先确保 PGDGPIGSTY 仓库已经添加并启用:

pig repo add pgsql -u          # 添加仓库并更新缓存

使用 pig 或者是 apt/yum/dnf 安装扩展:

pig install pg_dbms_errlog;          # 当前活跃 PG 版本安装
pig ext install -y pg_dbms_errlog -v 18  # PG 18
pig ext install -y pg_dbms_errlog -v 17  # PG 17
pig ext install -y pg_dbms_errlog -v 16  # PG 16
pig ext install -y pg_dbms_errlog -v 15  # PG 15
pig ext install -y pg_dbms_errlog -v 14  # PG 14
dnf install -y pg_dbms_errlog_18       # PG 18
dnf install -y pg_dbms_errlog_17       # PG 17
dnf install -y pg_dbms_errlog_16       # PG 16
dnf install -y pg_dbms_errlog_15       # PG 15
dnf install -y pg_dbms_errlog_14       # PG 14
apt install -y postgresql-18-pg-dbms-errlog   # PG 18
apt install -y postgresql-17-pg-dbms-errlog   # PG 17
apt install -y postgresql-16-pg-dbms-errlog   # PG 16
apt install -y postgresql-15-pg-dbms-errlog   # PG 15
apt install -y postgresql-14-pg-dbms-errlog   # PG 14

预加载配置

shared_preload_libraries = 'pg_statement_rollback, pg_dbms_errlog';

创建扩展

CREATE EXTENSION pg_dbms_errlog CASCADE;  -- 依赖: pg_statement_rollback

用法

来源:

pg_dbms_errlog 为 PostgreSQL 提供了类似 Oracle 的 DML 错误日志功能。它会将 INSERT, UPDATE, 或 DELETE 失败时产生的错误排队,通过后台工作进程写入注册的 ERR$_... 表,并允许脚本在回滚到保存点后继续执行。这需要 pg_statement_rollback 权限或由调用方显式管理保存点。

启用扩展

将库添加到 shared_preload_libraries,确保 max_worker_processes 能容纳 pg_dbms_errlog.max_workers 加上固定的工作进程数,并重启 PostgreSQL:

shared_preload_libraries = 'pg_dbms_errlog'
CREATE EXTENSION pg_dbms_errlog;

为每个 DML 目标创建并注册一个错误表:

CREATE TABLE raises (
    employee_id integer,
    salary integer CHECK (salary > 8000)
);

CALL dbms_errlog.create_error_log('raises');
-- Creates and registers public."ERR$_raises" by default.

错误发生后记录和继续

LOAD 'pg_statement_rollback';

SET pg_statement_rollback.enabled = on;
SET pg_dbms_errlog.enabled = on;
SET pg_dbms_errlog.query_tag = 'daily_load';
SET pg_dbms_errlog.reject_limit = 10;

BEGIN;
INSERT INTO raises VALUES (145, 15400);
INSERT INTO raises VALUES (161, 7700);  -- logged failure
ROLLBACK TO SAVEPOINT "PgSLRAutoSvpt";
INSERT INTO raises VALUES (175, 9680);
COMMIT;

SELECT * FROM "ERR$_raises";

错误表包含 pg_err_number$, pg_err_mesg$, pg_err_optyp$, pg_err_tag$, pg_err_query$pg_err_detail$

API 和配置索引

  • dbms_errlog.create_error_log(dml_table_name, err_log_table_name, err_log_table_owner, err_log_table_space): 创建并注册一个错误表。
  • dbms_errlog.publish_queue(wait_for_completion): 请求工作进程处理排队的错误;默认情况下,PUBLIC 无法执行此操作。
  • dbms_errlog.queue_size(): 报告排队中的错误数量。
  • pg_dbms_errlog.synchronous: 默认为 transaction,可选值为 queryoff。事务模式确保仅记录已提交事务的错误。
  • pg_dbms_errlog.reject_limit: 事务范围内的错误限制;-1 表示无限制,0 不记录任何错误并回滚。
  • pg_dbms_errlog.no_client_error: 抑制客户端错误消息的同时保留服务器日志;默认启用。
  • pg_dbms_errlog.frequencypg_dbms_errlog.max_workers: 异步工作进程的执行频率和并发数。

注意事项

  • 调用方需要对目标表和错误表具有 DML 权限;创建错误表还需要上游描述的执行和注册表权限。
  • INSERT INTO ... SELECT ... 是一个 PostgreSQL 语句,无法像 Oracle 那样仅保留成功行。
  • 语法和其他解析时错误不会被记录。存储查询文本必须保持在 PostgreSQL 的 1 GB 值限制以下。
  • 版本 2.4 没有更改 SQL API;它修复了工作进程关闭循环和动态后台工作进程崩溃的问题。