
前言
最近,一个非常勤奋的学生,自己动手搭起了repmgr高可用主从环境,看起来,前半个阶段还比较顺利,但是后来还是遇到了一些问题。一时不知道如何解决。
问题如下:
〖熊大〗 老师,请问下,我启动pg_ctl报错,请问如何解决?我在postgres.conf配置了 shared_preload_libraries = 'repmgr'。
光看这个问题,没有进一步的上下文环境,熊大也无从回复。
后续
学生Bob接着提示后文:

熊大,一眼就看出来有些怪怪的,一些符号居然加载不起来,那不就是repmgr与PG版本不匹配,找不着符号吗?
“看起来,像是repmgr和你的Postgresql版本不匹配。你得看下repmgr的官方文档,看它支持的PG版本分别是多少。"
Bob:
把这个去掉shared_preload_libraries = 'repmgr' 就起来了。如:

但主库加hared_preload_libraries = 'repmgr' 就能起来,备库则起不来。版本信息:pg 14.9 repmgr 5.3.3。
熊大思考了一会儿,进一步确认:”备库有什么特殊的地方吗?”
“没有理由主库能加载备库不能。两个库二进制环境一模一样吗”
Bob:“备库好像没什么特殊的,之前忘了加 shared_preload_libraries ,clone后加就报错,数据库重启就不行了”
“如果备库只reload,启动repmgrd报错”

熊大:“配置文件改好后,重新clone。”
Bob: "重启clone,数据库还是起不来,报刚才错误"

这下熊大基本确认了:
“repmgr在从库机器上安装的位置以及版本,上边已经告诉你加载错误了”
Bob:“这文件是有的,路径很主库是一模一样的”


熊大:“你用strings -a repmgr.so | grep 查下那个hook函数,主从节点上都查下。”
Bob:

主节点好像没有, 上面是备库,下图是主库

熊大:“所以啊,你装了不同的repmgr,慢慢细查下吧。”
Bob: “我是主库拷贝到备库的,可能是我之前装15.5后来lib不支持repmgr,我后来改成14.9是不是我没清理干净?那我这文件替换一下试试”
Bob:“谢谢熊大老师,替换一下就可以了”

总结:
作为DBA而言,日常troubleshooting, 了解一些动态库(共享库)加载的基础知识是应该的。上面就直接用到了strings -a去搜索动态库中的符号的基本技能。
潘爱民的《程序员的自我修养-链接、装载和库》这本书,无论是程序员还是系统管理人员,如果能好好的读一读,就不会惧怕稍偏底层的一些基本问题了。
参考:
我是【Sean】, 欢迎大家长按关注并加星公众号:数据库杂记。有好资源相送,同时为你提供及时更新。已关注的朋友,发送0、1到7,都有好资源相送。

往期导读:
1. PostgreSQL中配置单双向SSL连接详解
2. 提升PSQL使用技巧:PostgreSQL中PSQL使用技巧汇集(1)
3. 提升PSQL使用技巧:PostgreSQL中PSQL使用技巧汇集(2)
4. PostgreSQL SQL的基础使用及技巧
5. PostgreSQL开发技术基础:过程与函数




