共享库的作用是在编程中预先编译好的代码,可以在程序中重复使用,比如一些数学函数,可以不需要自己编写,直接调用相关函数即可实现,也就是一些通用的代码,我们就不用再重复造轮子去实现。
如libc是linux 中一个标准的c库,在linux中,支持两种类型的lib库:

  1. 静态库:在编译时候,静态绑定程序
  2. 动态或共享库:在启动程序并加载到内存时加载库到内存中,并在运行时进行绑定
    共享库都是以.so结尾的文件。

linux上的共享库路径:
默认在/usr/local/lib, /usr/local/lib64, /usr/lib,/usr/lib64,系统启动的库文件在/lib,/lib64。
postgresql 共享库的路径在<install_directory>/lib下,也就是一般我们配置的环境变量$PGHOME/lib下。我们可以设置LD_LIBRARY_PATH环境变量,指定相关库的路径。

比如我一般都会这样设置

export LD_LIBRARY_PATH=$PGHOME/lib:/lib64:/usr/lib64:/usr/local/lib64:/lib:/usr/lib:/usr/local/lib:

创建一个C程序共享库文件: first.so

/*创建一个共享库文件*/
gcc -shared -o first.so -fPIC first.c
/*运行可执行文件*/
gcc first.c first.so
./a.out 
./a.out: error while loading shared libraries: first.so: cannot open shared object file: No such file or directory
/*必须指定位置才可运行*/
#pwd
/root
# export LD_LIBRARY_PATH=/root
./a.out 
Hello! This is a test prgoram.

那么我们理解一下PG中的shared_preload_libraries参数又是什么呢?
shared_preload_libraries:在postmaster启动的时候加载,因此在fork后台进程之前,需要注册共享内存,锁,钩子程序,需要加载多个共享库,用逗号分隔。
session_preload_libraries:是在fork后台进程之后加载,不需要注册共享内存
local_preload_libraries:和session_preload_libraries类似,但是仅限于插件目录,可以由普通用户设置。
load:载入一个共享库文件.

PostgreSQL 中创建插件大多是动态库共享对象,因此执行创建插件时,共享对象会加载并调用。

根据插件的使用情况,可能需要在后postgresql.conf中添加shared_preload_libraries.

例如,pg_stat_statements必须要将其添加postgresql.conf中的shared_preload_libraries来加载,因为它需要额外的共享内存。这意味着需要重新启动数据库才能添加或删除模块。

参考:
https://www.postgresql.org/docs/13/runtime-config-client.html#RUNTIME-CONFIG-CLIENT-PRELOAD
https://www.postgresql.org/docs/13/sql-load.html
https://postgreshelp.com/shared-preload-libraries/#What_is_shared_library

Logo

更多推荐