PG14手动编译安装的数据库,添加动态库后,创建扩展提示:passwordcheck.control: No such file or directory。

postgres=# create extension passwordcheck;

2022-10-10 17:17:53.473 CST [35997] ERROR: could not open extension control file "/home/pg14/soft/share/postgresql/extension/passwordcheck.control": No such file or directory

2022-10-10 17:17:53.473 CST [35997] STATEMENT: create extension passwordcheck;

1、手动编译添加扩展passwordcheck

进入postgresql-14.5源码包解压后的,passwordcheck目录,编译和安装

[pg14@cdh01 passwordcheck]cd /home/pg14/postgresql-14.5/contrib/passwordcheck
[pg14@cdh01passwordcheck] make && make install

[pg14@cdh01passwordcheck]vi /home/pg14/data/postgresql.conf
shared_preload_libraries = 'passwordcheck'

[pg14@cdh01 data]$ pg_ctl restart -D /home/pg14/data/
waiting for server to shut down....2022-10-10 17:03:08.264 CST [35676] LOG: received fast shutdown request
2022-10-10 17:03:08.264 CST [35676] LOG: aborting any active transactions
2022-10-10 17:03:08.266 CST [35676] LOG: background worker "logical replication launcher" (PID 35683) exited with exit code 1
2022-10-10 17:03:08.266 CST [35678] LOG: shutting down
2022-10-10 17:03:08.270 CST [35676] LOG: database system is shut down
done
server stopped
waiting for server to start....2022-10-10 17:03:08.377 CST [35875] LOG: starting PostgreSQL 14.5 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36), 64-bit
2022-10-10 17:03:08.378 CST [35875] LOG: listening on IPv4 address "0.0.0.0", port 5666
2022-10-10 17:03:08.378 CST [35875] LOG: listening on IPv6 address "::", port 5666
2022-10-10 17:03:08.385 CST [35875] LOG: listening on Unix socket "/tmp/.s.PGSQL.5666"
2022-10-10 17:03:08.387 CST [35876] LOG: database system was shut down at 2022-10-10 17:03:08 CST
2022-10-10 17:03:08.388 CST [35875] LOG: database system is ready to accept connections
done
server started

postgres=# create extension passwordcheck;
2022-10-10 17:17:53.473 CST [35997] ERROR: could not open extension control file "/home/pg14/soft/share/postgresql/extension/passwordcheck.control": No such file or directory
2022-10-10 17:17:53.473 CST [35997] STATEMENT: create extension passwordcheck;

安装结束,无报错。创建扩展提示无control文件:ERROR:  could not open extension control file "/home/pg14/soft/share/postgresql/extension/passwordcheck.control": No such file or directory。

2、报错解决办法

手动创建所需的控制文件passwordcheck.control和passwordcheck--1.0.sql。

[pg14@cdh01 extension]$ vi passwordcheck.control 
# spasswordcheck extension
comment = 'postgres user password Check'
default_version = '1.0'
module_pathname = '$libdir/passwordcheck'
relocatable = false
schema = passwordcheck
[pg14@cdh01 extension]$ touch passwordcheck--1.0.sql
[pg14@cdh01 ~]$ psql -p5666 -U postgres
psql (14.5)
Type "help" for help
postgres=# create extension passwordcheck;
CREATE EXTENSION
postgres=# create user u1 with password '123456';
2022-10-10 17:32:18.635 CST [36112] ERROR: password is too short
2022-10-10 17:32:18.635 CST [36112] STATEMENT: create user u1 with password '123456';
ERROR: password is too short
postgres=# create user u1 with password '12345678ab';
CREATE ROLE

参数说明:

comment

一个关于该扩展的注释(任意字符串)。该注释会在初始创建扩展时应用,但是扩展更新时不会引用该注释(因为可能会覆盖用户增加的注释)。扩展的注释也可以通过在脚本文件中写上 COMMENT命令来设置。

default_version

该扩展的默认版本(就是如果在CREATE EXTENSION中没有指定版本时将会被安装的那一个)。尽管可以忽略这个参数,但如果没有出现VERSION选项时那将会导致CREATE EXTENSION失败,因此你通常不会希望这样做。

module_pathname

这个参数的值将被用于替换脚本文件中每一次出现的MODULE_PATHNAME。如果设置,将不会进行替换。通常,这会被设置为$libdir/shared_library_name并且接着MODULE_PATHNAME被用在CREATE FUNCTION命令中进行 C-语言函数的创建,因此该脚本文件不必把共享库的名称硬编码在其中。

trusted

这个参数,如果设置为 true(非默认值),则允许某些非超级用户安装superuser已设置为 true 的扩展。 具体地说,对于在当前数据库上具有CREATE特权的任何人,都允许安装。 当执行CREATE EXTENSION的用户不是超级用户,但允许通过此参数安装时,则此安装或更新脚本作为引导超级用户运行,而不是作为调用用户。

relocatable

如果一个扩展可能在初始创建之后将其所含的对象移动到一个不同的模式中,它就是relocatable。默认值是false,即该扩展是不可重定位的。


参考文献:

​http://postgres.cn/docs/14/extend-extensions.html​