PostgreSQL 动态更新 C 语言函数

原创
2018/11/07 08:58
阅读数 301

PostgreSQL 对于 C 语言编写的函数(包括其他与 C 语言兼容的语言,如 C++、Rust 等),是动态装载的,用 CREATE FUNCTION 创建完函数后,并不会立即装载,而是有连接建立之后,客户端第一次调用时才会进行装载,而且是装入到会话进程的内存里面去了。这时候,就算我们把 .so 文件删除,如果会话之前已调过一次函数的话,客户端还是可以继续调用函数的。

如果我们改写了函数代码,重新生成了 .so 文件,把新的 .so 文件覆盖老版本的 .so 文件,这时候在已有的会话里调用函数的话,有时候会报函数版本错误“ERROR unrecognized function API version, sql status: XX000”;有时候更严重,会导致当前会话的进程 Segment Fault,导致整个 PostgreSQL 崩溃而重启。这时候就算用 CREATE OR REPLACE FUNCTION 来重新装载函数也不行,也会导致 PostgreSQL 重启。

唯一可行的解决方案就是把 .so 文件版本化,每个编译出来的 .so 文件加上版本号,每个版本的文件都不同,把新版本的文件拷到 PKGLIBDIR 下,再用 CREATE OR REPLACE FUNCTION 替换掉老版本的函数,这样就算在已建立的会话里调用时,也是调的新版本的函数了。老版本的 .so 文件也可以删除了。

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部