如何使用 Linux 和 libnss-pgsql2 摆脱“无法连接到数据库”?

如何使用 Linux 和 libnss-pgsql2 摆脱“无法连接到数据库”?

我使用 libnss-pgsql2 将虚拟系统用户存储在 PostgreSQL 数据库中。数据库中的虚拟用户工作正常。他们可以登录。我可以通过“id”命令查看他们的 uid、gid 和组。示例:

# id backup001
uid=10001(backup001) gid=10001(backup001) groups=10001(backup001)

但是,在我使用 libnss 的系统上,我经常收到此错误:

Could not connect to database

例如,这种情况经常发生在 cron-jobs 中。我有一个每小时运行一次的 cron-job,它将 postgresql 数据库转储到备份中。对照如下:

04 *  *   *   *     postgres umask 077 && /usr/bin/pg_dumpall | gzip > ~postgres/backup/postgresql-complete-dump-$(date +\%H).sql.gz

这项工作总是出错。因此,我每小时都会收到一封电子邮件。

我的设置非常简单:我用来存储用户的表格布局可以在这里找到: http://p.adora.dk/P2486.html

我在服务器上使用 Debian Squeeze。

相关配置文件是:nsswitch.conf:http://p.adora.dk/P2489.html

(描述:在 /etc/passwd 和 /etc/shadow 中使用“普通”系统用户,但是,如果未找到用户,则继续通过 pgsql 进行查找)

nss-pgsql.conf:http://p.adora.dk/P2487.html

(描述:包含用于查找通常在 /etc/passwd 和 /etc/group 中找到的各种信息的 SQL 查询)

nss-pgsql-root.conf:http://p.adora.dk/P2488.html

(描述:包含用于查找通常在 /etc/shadow 中找到的机密信息的 SQL 查询)

我为调试此问题所做的事情:

  • 验证 nss-pgsql.conf 和 nss-pgsql-root.conf 中的连接字符串是否按预期工作。
  • 已验证不会发生超时。即错误立即回显,而不是在 300 秒后回显。此外,这种情况发生在没有执行任何操作的服务器上 - 因此应该立即建立连接 - 我已经验证确实如此。

我真的希望你能帮助我修复这个错误。

更新 2012-08-22

我尝试在 psql 上执行 strace。strace 的相关部分位于此粘贴的底部: http://paste.adora.dk/P2492.html

我注意到它尝试打开 /etc/nss-pgsql-root.conf 并获得 EACCESS,但是,我不认为这应该是一个问题。此文件应该只能由 root 读取,因为它对应于 /etc/shadow,而 /etc/shadow 也只能由 root 读取。

25341 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
25341 open("/usr/lib/libgpg-error.so.0", O_RDONLY) = 4
25341 read(4, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0 \6\0\0004\0\0\0"..., 512) = 512
25341 fstat64(4, {st_mode=S_IFREG|0644, st_size=11540, ...}) = 0
25341 mmap2(NULL, 14512, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 4, 0) = 0xb6f6c000
25341 mmap2(0xb6f6f000, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 4, 0x2) = 0xb6f6f000
25341 close(4)                          = 0
25341 mprotect(0xb70bf000, 4096, PROT_READ) = 0
25341 mprotect(0xb73d8000, 4096, PROT_READ) = 0
25341 munmap(0xb7414000, 40018)         = 0
25341 open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)
25341 write(2, "\nCould not connect to database\n", 31) = 31

这可能是 libnss-pgsql 中的一个错误....您觉得怎么样?

更新 2012-08-22

好的。我找到了这个五年前的 bug 报告: http://pgfoundry.org/tracker/index.php?func=detail&aid=1010197&group_id=1000039&atid=234

看来这种行为实际上是一个错误。已经提供了补丁,但是错误报告上没有任何活动。也许该项目已被放弃。我当然希望不是 :(

答案1

我认为你的问题的答案就在这一行中:

open("/etc/nss-pgsql-root.conf", O_RDONLY) = -1 EACCES (Permission denied)

尝试放宽此文件的权限,使其可供“组”和“其他”读取,看看是否能解决问题。

您错误地认为该文件对应于/etc/shadow。它对应于/etc/password,可供“组”和“其他”读取。您用于身份验证的 PostgreSQL 数据库和表对应于/etc/shadow

它无法连接到数据库,因为它无法从此文件读取数据库访问凭据。

相关内容