PostgreSQL13中安装test_decoding插件
test_decoding是PostgreSQL的一个逻辑解码插件,主要用于将WAL日志转换成可读的格式,方便进行逻辑复制或者数据变更捕获。常被用于配置逻辑复制或者使用类似Debezium这样的工具,用到这个插件。
问题概述
在PostgreSQL 13中安装test_decoding插件,已经安装了postgresql13-contrib包,但显示缺少test_decoding.control文件。
postgres=# CREATE EXTENSION test_decoding;
ERROR: could not open extension control file "/usr/pgsql-13/share/extension/test_decoding.control": No such file or directory
postgres=# CREATE EXTENSION test_decoding;
ERROR: could not find function "test_decoding_slot_create" in file "/usr/pgsql-13/lib/test_decoding.so"
根据 rpm -ql postgresql13-contrib | grep test_decoding 的输出,系统只安装了 test_decoding.so 动态库文件,但缺少关键的 test_decoding.control 和 test_decoding--1.0.sql 文件。
$ rpm -qa |grep postgresql13-contrib
postgresql13-contrib-13.20-1PGDG.rhel7.x86_64
$ rpm -ql postgresql13-contrib | grep test_decoding
/usr/pgsql-13/lib/test_decoding.so
PostgreSQL 的 test_decoding 插件需要以下文件:
- 控制文件:test_decoding.control(位于 share/extension/)
- SQL脚本:test_decoding--1.0.sql(位于 share/extension/)
- 动态库:test_decoding.so(位于 lib/)
环境中缺少前两个文件,导致无法通过 CREATE EXTENSION 启用插件。
解决方案
手动创建缺失文件
- 直接生成 test_decoding.control 和 test_decoding--1.0.sql 文件
# 创建控制文件
sudo tee /usr/pgsql-13/share/extension/test_decoding.control <<EOF
# test_decoding extension
comment = 'test_decoding for logical decoding'
default_version = '1.0'
module_pathname = '\$libdir/test_decoding'
relocatable = false
EOF
# 创建 SQL 脚本文件
sudo tee /usr/pgsql-13/share/extension/test_decoding--1.0.sql <<EOF
CREATE OR REPLACE FUNCTION test_decoding_slot_create(
slot_name name, plugin name DEFAULT 'test_decoding'::name)
RETURNS void
AS '\$libdir/test_decoding', 'test_decoding_slot_create'
LANGUAGE C STRICT;
CREATE OR REPLACE FUNCTION test_decoding_slot_drop(
slot_name name)
RETURNS void
AS '\$libdir/test_decoding', 'test_decoding_slot_drop'
LANGUAGE C STRICT;
EOF
- 设置文件权限
确保 PostgreSQL 服务账户(通常为 postgres)有权限读取文件:
sudo chown postgres:postgres /usr/pgsql-13/share/extension/test_decoding*
sudo chmod 644 /usr/pgsql-13/share/extension/test_decoding*
- 重启 PostgreSQL 服务
sudo systemctl restart postgresql-13
- 验证安装
方法1:通过逻辑复制槽测试
-- 创建逻辑复制槽(无需 CREATE EXTENSION)
postgres=# SELECT * FROM pg_create_logical_replication_slot('test_slot', 'test_decoding');
-- 生成测试数据
postgres=# CREATE TABLE test_tbl (id int);
postgres=# INSERT INTO test_tbl VALUES (1);
-- 查看解码结果
postgres=# SELECT * FROM pg_logical_slot_peek_changes('test_slot', NULL, NULL);
lsn | xid | data
-----------+-----+----------------------------------------------
0/1687050 | 494 | BEGIN 494
0/168B7B8 | 494 | COMMIT 494
0/168B7B8 | 495 | BEGIN 495
0/168B7B8 | 495 | table public.test_tbl: INSERT: id[integer]:1
0/168B828 | 495 | COMMIT 495
0/168B948 | 496 | BEGIN 496
0/168B948 | 496 | table public.test_tbl: INSERT: id[integer]:1
0/168BA18 | 496 | COMMIT 496
-- 清理
postgres=# DROP TABLE test_tbl;
DROP TABLE
postgres=# SELECT pg_drop_replication_slot('test_slot');
pg_drop_replication_slot
--------------------------
方法2:检查插件是否可见
postgres=# SELECT * FROM pg_available_extensions WHERE name = 'test_decoding';
name | default_version | installed_version | comment
---------------+-----------------+-------------------+------------------------------------
test_decoding | 1.0 | | test_decoding for logical decoding
应返回 default_version: 1.0 和 installed_version: null(因为此插件通过复制槽隐式加载)。