Loading

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.controltest_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 启用插件。

解决方案

手动创建缺失文件

  1. 直接生成 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
  1. 设置文件权限

确保 PostgreSQL 服务账户(通常为 postgres)有权限读取文件:

sudo chown postgres:postgres /usr/pgsql-13/share/extension/test_decoding*
sudo chmod 644 /usr/pgsql-13/share/extension/test_decoding*
  1. 重启 PostgreSQL 服务
sudo systemctl restart postgresql-13
  1. 验证安装

方法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(因为此插件通过复制槽隐式加载)。

posted @ 2025-03-13 10:32  亚里士多智  阅读(127)  评论(0)    收藏  举报