尝试通过 "pgsql" DSN 连接到 PostgreSQL DB 在 FreeSWITCH 1.8 上返回 "ERR [unable to open database file]"

当我尝试连接到远程的 PostgreSQL 服务器时,使用 pgsql 连接字符串和 FreeSWITCH Lua API 时,我得到了以下错误信息:

2019-08-23[ERR] switch_core_db.c:223 SQL ERR [unable to open database file]

连接字符串如下:

conn_string =
  "pgsql://hostaddr=1.2.3.4"                 ..
  " dbname=my-db"                            ..
  " user=postgres"                           ..
  " password=postgres"                       ..
  " options='-c client_min_messages=NOTICE'" ..
  " application_name='freeswitch'"

freeswitch.Dbh(conn_string)

(根据 文档 推荐的方式)

这种设置一直非常完美,即使在 FreeSWITCH 服务重启后也是如此。 然而,我在 Debian 9 上愚蠢地进行了 sudo apt update && sudo apt upgrade 操作,之后就出问题了。

点赞
用户1498178
用户1498178

在我最后的挣扎中,我决定使用一个新的FreeSWITCH安装重新创建整个VM,并在Debian 9 Stretch安装指南中找到了一个新节:

1.10 不兼容的更改

因为现在即使仍使用1.8 repo,Fs1.10包也被安装了,你最好意识到一项不兼容的更改:

pgsql不再是核心的一部分,但在mod_pgsql而被赋予的命名中

你不应该在modules.conf.xml中加载mod_pgsql(不起作用),但是在同一个“autoload_configs”目录下的一个特殊的附加xml文件中。

文件名:pre_load_modules.conf.xml

<configuration name="pre_load_modules.conf" description="Modules">
  <modules>
    <!-- 数据库 -->
    <!-- <load module="mod_mariadb"/> -->
    <load module="mod_pgsql"/>
  </modules>
</configuration>

所以当我执行sudo apt upgrade时,FreeSWITCH从1.8升级到了1.10。


(2019/08/23) 更新: 尽管上面的警告,更新pre_load_modules.conf.xml也没有用。只有在将mod_pgsql添加到modules.conf.xml后它才连接成功。

在Debian 9 Stretch上的完整解决方案

  1. <load module="mod_pgsql"/>添加到modules.conf.xml
  2. sudo systemctl stop freeswitch
  3. sudo systemctl start freeswitch

(2019/09/03) 更新和警告来自SignalWire平台工程师Andrey Volk

Andrey Volk:“如果您不知道自己在做什么,请不要将mod_pgsql添加到modules.conf.xml中。请使用pre_load_modules.conf.xml。如果出现任何问题,请创建一个Jira票据。”

toraritte:“为什么在module.conf.xml中加载mod_pgsql会有问题?”

Andrey Volk:“区别在于Core也可能想要使用该数据库。但它是Core,会在任何模块之前加载。因此,我们需要一个特殊的地方,在任何其他模块类型之前加载数据库模块(以防其中一个是Core的模块)。另一方面,如果Core不使用该数据库模块,那么使用哪个文件并不重要。它应该首先加载。如果是用于LUA,请在LUA之前加载。但我们不建议/记录这一点。

如果pre_load_modules.conf.xml没有被识别,那么它可能是一个坏升级的结果。确保所有freeswitch软件包都已经升级(包括主要的软件包)。

2019-08-24 03:22:56