2015 年 5 月 Fsync 权限错误
2015 年 5 月 Fsync 权限错误常见问题解答
2015 年 5 月 22 日,PostgreSQL 项目发布了一组更新到所有受支持的 PostgreSQL 版本。此批次更新中包含的修复程序之一是在崩溃后重启时强制对所有 PostgreSQL 文件进行 fsync。添加此修复程序是为了防止在托管数据库的系统连续发生多次故障时可能发生的某些数据损坏。
不幸的是,由于文件权限问题,此修复程序会导致某些用户 PostgreSQL 设置出现问题,从而导致 PostgreSQL 拒绝在意外关闭后或从二进制备份 (PITR) 恢复时重启。
此问题将在 2015 年 6 月 4 日更新发布中得到解决。
谁受此错误影响?
以下用户
- 应用了 9.4.2、9.3.7、9.2.11、9.1.16 和/或 9.0.20 PostgreSQL 更新
- 在 postgres 数据目录 (PGDATA) 下拥有一个或多个文件或目录,或者对一个或多个文件或目录的符号链接,这些文件或目录不受“postgres”用户(或其他安装所有者)拥有或写入。
请注意,条件 2 常见于 PostgreSQL 9.1、9.0 和更早版本的 SSL 启用的 Debian 和 Ubuntu 安装,但可能也会影响其他用户。大多数其他平台上的用户不受影响,因为默认情况下 PGDATA 下的所有文件和链接都由“postgres”用户拥有。
症状是什么?
如果您遇到此错误,PostgreSQL 将拒绝在崩溃后或从二进制备份恢复后重启,并显示类似于以下内容的错误消息
* Starting PostgreSQL 9.1 database server * The PostgreSQL server failed to start. Please check the log output: 2015-05-26 03:27:20 UTC [331-1] LOG: database system was interrupted; last known up at 2015-05-21 19:56:58 UTC 2015-05-26 03:27:20 UTC [331-2] FATAL: could not open file "/etc/ssl/certs/ssl-cert-snakeoil.pem": Permission denied 2015-05-26 03:27:20 UTC [330-1] LOG: startup process (PID 331) exited with exit code 1 2015-05-26 03:27:20 UTC [330-2] LOG: aborting startup due to startup process failure
有关更多信息,请参阅原始错误报告。
我遇到了此错误,无法重启 Postgres。怎么办?
作为临时解决方法,将任何符号链接文件的权限更改为 Postgres 用户可写。例如,在 Ubuntu 上,使用 PostgreSQL 9.1,以下操作应该有效
警告:在执行这些命令之前,请确保这些配置文件是符号链接!如果有人自定义了 server.crt 或 server.key 文件,您可以按照以下步骤将其删除。在删除 server.crt 和 server.key 文件之前,最好备份一下它们。
(as root) # go to PGDATA directory cd /var/lib/postgresql/9.1/main ls -l server.crt server.key # confirm both of those files are symbolic links # to files in /etc/ssl before going further # remove symlinks to SSL certs rm server.crt rm server.key # copy the SSL certs to the local directory cp /etc/ssl/certs/ssl-cert-snakeoil.pem server.crt cp /etc/ssl/private/ssl-cert-snakeoil.key server.key # set permissions on ssl certs # and postgres ownership on everything else # just in case chown postgres * chmod 640 server.crt server.key service postgresql start
您需要根据自己的具体情况调整以上示例,但这应该能为您提供一个大致的操作方法。要求是 postgres 用户必须对 PGDATA 中的所有内容或从 PGDATA 符号链接到 PGDATA 的所有内容具有写入权限。
我应该不应用更新吗?
9.4.2 和 9.3.7 更新修复了一个严重错误,该错误会导致在某些情况下出现无法恢复的数据丢失。因此,PostgreSQL 项目认为涉及文件权限的临时解决方法比已修复的错误的风险要小,并建议在您验证并更改文件权限(如果需要)后应用更新。
建议其他不受 fsync 问题影响的用户在下次停机时应用更新。
你们会很快修复它吗?
PostgreSQL 项目预计很快将发布另一个更新,以解决文件权限问题。此更新的预计发布日期是 6 月 4 日。