创建扩展auto_explain失败:No such file or directory
原创
©著作权归作者所有:来自51CTO博客作者year小夕的原创作品,请联系作者获取转载授权,否则将追究法律责任
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
打包相关对象到一个扩展中