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

postgres=# show shared_preload_libraries ;
shared_preload_libraries
passwordcheck,pg_stat_statements,auto_explain
(1 row)
postgres=# create extension auto_explain;
ERROR: could not open extension control file "/home/pg14/soft/share/postgresql/extension/auto_explain.control": No such file or directory

1、手动编译添加扩展auto_explain

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

[pg14@cdh01 auto_explain]$ cd /home/pg14/postgresql-14.5/contrib/auto_explain

[pg14@cdh01 auto_explain]$ make

make -C ../../src/backend generated-headers

make[1]: Entering directory `/home/pg14/postgresql-14.5/src/backend'

make -C catalog distprep generated-header-symlinks

make[2]: Entering directory `/home/pg14/postgresql-14.5/src/backend/catalog'

make[2]: Nothing to be done for `distprep'.

make[2]: Nothing to be done for `generated-header-symlinks'.

make[2]: Leaving directory `/home/pg14/postgresql-14.5/src/backend/catalog'

make -C utils distprep generated-header-symlinks

make[2]: Entering directory `/home/pg14/postgresql-14.5/src/backend/utils'

make[2]: Nothing to be done for `distprep'.

make[2]: Nothing to be done for `generated-header-symlinks'.

make[2]: Leaving directory `/home/pg14/postgresql-14.5/src/backend/utils'

make[1]: Leaving directory `/home/pg14/postgresql-14.5/src/backend'

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -I. -I. -I../../src/include -D_GNU_SOURCE -c -o auto_explain.o auto_explain.c

gcc -std=gnu99 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Werror=vla -Wendif-labels -Wmissing-format-attribute -Wformat-security -fno-strict-aliasing -fwrapv -fexcess-precision=standard -O2 -fPIC -shared -o auto_explain.so auto_explain.o -L../../src/port -L../../src/common -Wl,--as-needed -Wl,-rpath,'/home/pg14/soft/lib',--enable-new-dtags

[pg14@cdh01 auto_explain]$ make install

make -C ../../src/backend generated-headers

make[1]: Entering directory `/home/pg14/postgresql-14.5/src/backend'

make -C catalog distprep generated-header-symlinks

make[2]: Entering directory `/home/pg14/postgresql-14.5/src/backend/catalog'

make[2]: Nothing to be done for `distprep'.

make[2]: Nothing to be done for `generated-header-symlinks'.

make[2]: Leaving directory `/home/pg14/postgresql-14.5/src/backend/catalog'

make -C utils distprep generated-header-symlinks

make[2]: Entering directory `/home/pg14/postgresql-14.5/src/backend/utils'

make[2]: Nothing to be done for `distprep'.

make[2]: Nothing to be done for `generated-header-symlinks'.

make[2]: Leaving directory `/home/pg14/postgresql-14.5/src/backend/utils'

make[1]: Leaving directory `/home/pg14/postgresql-14.5/src/backend'

/bin/mkdir -p '/home/pg14/soft/lib/postgresql'

安装结束,无报错。接下来添加shared_preload_libraries,重启数据库,创建auto_explain扩展测试。


vi postgresql.conf

shared_preload_libraries = 'passwordcheck,pg_stat_statements,auto_explain'

auto_explain.log_min_duration = '2s' #记录运行超过5s的执行计划

创建扩展提示无control文件:ERROR:  could not open extension control file "/home/pg14/soft/share/postgresql/extension/auto_explain.control": No such file or directory

[pg14@cdh01 data]$ pg_ctl restart -D /home/pg14/data/
waiting for server to shut down.... done
server stopped
waiting for server to start....2022-10-19 15:34:41.099 CST user=,db=,id=[8169]LOG: redirecting log output to logging collector process
2022-10-19 15:34:41.099 CST user=,db=,id=[8169]HINT: Future log output will appear in directory "/pglog".
done
server started
postgres=# create extension auto_explain;

ERROR: could not open extension control file "/home/pg14/soft/share/postgresql/extension/auto_explain.control": No such file or directory

2、排查原因

查看报错目录,无auto_explain.control文件

[pg14@cdh01 data]$ ls -l /home/pg14/soft/share/postgresql/extension
[pg14@cdh01 passwordcheck]$ ls -l /home/pg14/soft/share/postgresql/extension/
total 100
-rw-rw-r-- 1 pg14 pg14 0 Oct 10 17:26 passwordcheck--1.0.sql
-rw-rw-r-- 1 pg14 pg14 177 Oct 10 17:25 passwordcheck.control
-rw-r--r-- 1 pg14 pg14 307 Oct 11 16:44 pgcrypto--1.0--1.1.sql
-rw-r--r-- 1 pg14 pg14 483 Oct 11 16:44 pgcrypto--1.1--1.2.sql
-rw-r--r-- 1 pg14 pg14 2346 Oct 11 16:44 pgcrypto--1.2--1.3.sql
-rw-r--r-- 1 pg14 pg14 5708 Oct 11 16:44 pgcrypto--1.3.sql
-rw-r--r-- 1 pg14 pg14 152 Oct 11 16:44 pgcrypto.control

3、解决办法

创建所需的control控制文件

手起创建auto_explain.control

[pg14@cdh01 extension]$ cd /home/pg14/soft/share/postgresql/extension/
[pg14@cdh01 extension]$ vi auto_explain.control

# auto_explain extension

comment = 'auto_explain sql exceted functions'
default_version = '1.0'
module_pathname = '$libdir/auto_explain'
relocatable = true
trusted = true

​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​​,即该扩展是不可重定位的。


创建一个空的auto_explain文件

[pg14@cdh01 extension]$ touch auto_explain--1.0.sql

4、扩展创建成功

postgres=# create extension auto_explain;
CREATE EXTENSION

​打包相关对象到一个扩展中​