工作5年,我学会了用插件来辅助PostgreSQL

来源:这里教程网 时间:2026-03-14 21:29:47 作者:
作者:IT邦德
中国DBA联盟(ACDU)成员,10余年DBA工作经验,
Oracle、PostgreSQL ACE
CSDN博客专家及B站知名UP主,全网粉丝10万+
擅长主流Oracle、MySQL、PG、高斯及Greenplum备份恢复,
安装迁移,性能优化、故障应急处理
微信:jem_db
QQ交流群:587159446
公众号:IT邦德

文章目录

  • 前言
  • 1.DBA那些辛酸的过往
  • 2.安全加固插件
  • passwordcheck插件
  • 2.1 修改规则
  • 2.2 编译passwordcheck
  • 2.3 测试检查
  • 3.审计插件
  • pgaudit插件
  • 3.1 pgaudit安装
  • 3.2 开启审计
  • 4.远程访问插件
  • postgres_fdw插件
  • 4.1 创建安装插件
  • 4.2 权限配置
  • 4.3 创建外部服务
  • 4.4 创建映射用户
  • 4.5 创建外部表
  • 5.推荐插件
  • 6.总结

    前言

    PostgreSQL运维的使用总结,只谈使用经验,不聊原理

    1.DBA那些辛酸的过往

    数据库问题排查一天,被 Diss 排查问题慢......
    核心表误删除数据,手足无措,看是哪个家伙写的,竟然是...
    客户线上部署PG,应该如何完善体系化,让客户dis吗?
    故障排查,问题还没有找到,头顶的灯却早已照亮了整层楼......
    PostgreSQL运维,一些必要的插件安装是非常重要的

    2.安全加固插件

    ::: block-2

    passwordcheck插件

    PostgreSQL数据库密码复杂度设置可以通过安装passwordcheck扩展插件来实现,该插件默认的密码复杂度规则是密码长度必须大于等于8、必须包含字母和非字母、密码不能包含用户名。如果这些规则仍然不能满足你的密码强度要求,那么还可以安装cracklib以及字典来提高密码强度。 :::

    2.1 修改规则

    默认密码复杂度规则:
    1.密码长度必须大于等于8
    2.必须包含字母和非字母
    3.密码不能包含用户名
    可根据实际需要更改最小密码长度,默认值为8,
    建议更改为10或更大。
    注意:此处的#号并非注释,不要去掉。
    cd /pgccc/soft/postgresql-15.6/contrib/
    cd passwordcheck
    编辑修改passwordcheck.c文件中的MIN_PWD_LENGTH
    /* passwords shorter than this 
    will be rejected */
    #define MIN_PWD_LENGTH 10

    2.2 编译passwordcheck

    --使用make命令编译安装插件。
    cd /pgccc/soft/postgresql-15.6/contrib/passwordcheck
    make && make install

    2.3 测试检查

    --修改参数
    alter system set shared_preload_libraries='passwordcheck';
    --重启PG
    pg_ctl restart
    --密码校验
    postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
    ERROR:  password is too short
    postgres=# create user pgtest password 'pgtest1234';
    ERROR:  password must not contain user name
    postgres=# create user pgtest password 'pg12345678';
    CREATE ROLE

    3.审计插件

    ::: block-2

    pgaudit插件

    能够提供详细的会话和对象审计日志,是PG的一个扩展插件。pgAudit通过标准PostgreSQL日志记录工具提供详细的会话和/或对象审核日志记录。 :::

    3.1 pgaudit安装

    官网:
    https://www.pgaudit.org/
    下载安装包一定要注意pgaudit与PG版本的对应
    wget https://codeload.github.com/pgaudit/pgaudit/tar.gz/refs/tags/1.6.2 -O pgaudit-1.6.2.tar.gz
    tar -xzvf 1.6.2.tar.gz
    cd pgaudit-1.6.2/
    make install USE_PGXS=1
    安装插件
    alter system set shared_preload_libraries='pgaudit';
    pg_ctl restart
    create extension pgaudit;
    \dx
    select name,setting from pg_settings where name like 'pgaudit%';
    select * from pg_available_extensions where name like '%audit%';
    show shared_preload_libraries;

    3.2 开启审计

    1.会话审计日志记录
    会话审计日志提供用户在后端执行的所有语句的详细日志。
    使用pgaudit.log设置启用会话日志记录。
    set pgaudit.log = 'write, ddl';
    set pgaudit.log_relation = on;
    set pgaudit.log_client=on;
    SELECT pg_reload_conf();
    select name,setting,source from pg_settings where name like 'pgaudit%';
    postgres=> create table t_jeames(id int);
    postgres=> insert into t_jeames select generate_series(1,10000);
    postgres=> delete  from t_jeames;
    postgres=# drop table t_jeames;

    2.对象审计日志记录
    通过创建role 来实现, 
    原理就是把想要审计的对象的具体操作赋权给一个 role, 
    然后在设置 pgaudit.role 。
    目前只能支持, SELECT, INSERT, UPDATE and DELETE 这4中类型,
    相对于 read, write 来说更细粒度了
    --创建角色: audit_account
    create role audit_account password 'audit_account';
    设置对象 t_jeames 的insert, update, delete.select 为审计行为
    postgres=# alter system set pgaudit.role = 'audit_account';
    postgres=# grant select,insert,update,delete on t_jeames to audit_account;
    postgres=# select pg_reload_conf();
    --修改数据
    postgres=# delete from t_jeames where id < 5000;
    postgres=# update t_jeames set id = 1000+ id ;
    postgres=# select * from t_jeames limit 2;

    4.远程访问插件

    ::: block-2

    postgres_fdw插件

    通过 postgres_fdw访问远程PostgreSQL数据库表。 步骤如下: 1.在源端(本地库)创建 postgres_fdw 插件 2.创建 foreign server 外部服务(即:指连接外部数据源的连接信息) 3.创建映射用户(映射用户指定了访问外部表的本地用户和远程用户信息) 4.创建外部表(外部表的表定义建议和远端表结构一致) :::

    4.1 创建安装插件

    本地库做如下的操作:
    --编译安装
    [postgres@centos79 ~]$ cd /pgccc/soft/postgresql-15.6/contrib
    [postgres@centos79 contrib]$ cd postgres_fdw
    [postgres@centos79 postgres_fdw]$ make install
    --再次确认插件
    [root@centos79 ~]# cd /pgccc/pgsql-15/share/extension

    --postgres 超级用户登录 PostgreSQL
    [postgres@centos79 ~]$ psql
    postgres=# CREATE EXTENSION postgres_fdw;
    postgres=# \dx

    4.2 权限配置

    本地库做如下的操作:
    若使用超级用户使用postgres_fdw可以跳过
    普通用户使用postgres_fdw需要单独授权
    GRANT USAGE ON FOREIGN DATA WRAPPER postgres_fdw TO pgtest;

    4.3 创建外部服务

    本地库做如下的操作:
    外部服务定义了远端PostgreSQL数据库的IP、端口、数据库连接信息
    CREATE SERVER fdwpg2 FOREIGN DATA WRAPPER 
    postgres_fdw OPTIONS (host 'pg2host', port '5432', dbname 'devdb');

    4.4 创建映射用户

    本地库做如下的操作:
    映射用户指定了连接源端 PostgreSQL 数据库的用户名和密码信息
    CREATE USER MAPPING FOR pgtest
    SERVER fdwpg2 OPTIONS (user 'pg2user', password 'pg2user');
    FOR:配置的用户为本地的数据库用户
    OPTIONS :配置的是远端PostgreSQL数据库的用户和密码

    4.5 创建外部表

    --远端数据库创建测试表
    CREATE TABLE pg2_fdw (id int4 ,info text) ;
    INSERT INTO pg2_fdw (id , info ) VALUES (1, 'a'),(2, 'b');
    ---创建外部表(本地库)
    CREATE FOREIGN TABLE ft_fdw (
    id int4,
    info text
    ) SERVER fdwpg2 OPTIONS (schema_name 'pg2user', table_name 'pg2_fdw');
    通过外部表访问远端数据表
    注意:远端数据库pg_hba.conf文件需要允许本地库访问策略
    select * from pg2_fdw;

    5.推荐插件

    6.总结

    PostgreSQL 提供使用 extension 的方式来扩展数据库的功能,您可以发现,PostgreSQL的许多功能也都通过插件的形式完成,也正是由于使用的插件的形式,使得这些插件功能基本不受PostgreSQL核心升级的影响,这也是PostgreSQL数据库能够持续发展的一个重要的原因

  • 相关推荐