pg_dbms_errlog
模仿 Oracle DBMS_ERRLOG 模块来记录特定表的DML错误
仓库
HexaCluster/pg_dbms_errlog
https://github.com/HexaCluster/pg_dbms_errlog
源码
pg_dbms_errlog-2.4.tar.gz
pg_dbms_errlog-2.4.tar.gz
概览
| 扩展包名 | 版本 | 分类 | 许可证 | 语言 |
|---|---|---|---|---|
pg_dbms_errlog | 2.4 | SIM | ISC | C |
| ID | 扩展名 | Bin | Lib | Load | Create | Trust | Reloc | 模式 |
|---|---|---|---|---|---|---|---|---|
| 9270 | pg_dbms_errlog | 否 | 是 | 是 | 是 | 否 | 否 | dbms_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 大版本 | 包名 | 依赖 |
|---|---|---|---|---|---|
| EXT | MIXED | 2.4 | 1817161514 | pg_dbms_errlog | pg_statement_rollback |
| RPM | PGDG | 2.2 | 1817161514 | pg_dbms_errlog_$v | pg_statement_rollback_$v |
| DEB | PIGSTY | 2.4 | 1817161514 | postgresql-$v-pg-dbms-errlog | postgresql-$v-pg-statement-rollback |
构建
您可以使用 pig build 命令构建 pg_dbms_errlog 扩展的 DEB 包:
pig build pkg pg_dbms_errlog # 构建 DEB 包
安装
您可以直接安装 pg_dbms_errlog 扩展包的预置二进制包,首先确保 PGDG 和 PIGSTY 仓库已经添加并启用:
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,可选值为query或off。事务模式确保仅记录已提交事务的错误。pg_dbms_errlog.reject_limit: 事务范围内的错误限制;-1表示无限制,0不记录任何错误并回滚。pg_dbms_errlog.no_client_error: 抑制客户端错误消息的同时保留服务器日志;默认启用。pg_dbms_errlog.frequency和pg_dbms_errlog.max_workers: 异步工作进程的执行频率和并发数。
注意事项
- 调用方需要对目标表和错误表具有 DML 权限;创建错误表还需要上游描述的执行和注册表权限。
INSERT INTO ... SELECT ...是一个 PostgreSQL 语句,无法像 Oracle 那样仅保留成功行。- 语法和其他解析时错误不会被记录。存储查询文本必须保持在 PostgreSQL 的 1 GB 值限制以下。
- 版本
2.4没有更改 SQL API;它修复了工作进程关闭循环和动态后台工作进程崩溃的问题。