如果您在PostgreSQL中发现了错误,我们希望听取您的反馈。您的错误报告在提高PostgreSQL的可靠性方面发挥着重要作用,因为即使是最细致的维护也不能保证PostgreSQL的各个部分在每种平台下都能在所有情况下正常工作。
以下建议旨在帮助您编写能够以有效的方式处理的错误报告。没有人必须遵守这些建议,但这样做往往对每个人都有利。
我们无法承诺立即修复所有错误。如果该错误很明显、很严重或影响了许多用户,那么很可能会有人对此进行调查。我们也可能会让您更新到较新的版本以查看该错误是否还会发生。或者,我们可能会判定在计划进行一些重大重写之前无法修复该错误。或者,修复该错误可能太困难,而且还有更重要的事情需要处理。如果您需要立即获得帮助,请考虑签订商用支持合同。
在报告错误之前,请仔细阅读文档,以验证您是否真的可以执行您尝试执行的操作。如果无法从文档中明确得到您是否可以执行某项操作,请对此进行报告;这是文档中的一个错误。如果事实证明某个程序执行的操作与文档中描述的操作不同,则这是一个错误。这种情况可能包括但不限于以下情况
程序以致命信号或会指向程序问题的操作系统错误消息终止。(一个反例可能是“磁盘已满”消息,因为您必须自己修复它。)
对于任何给定的输入,程序生成了错误的输出。
程序拒绝接受有效输入(如文档中所定义)。
程序接受无效输入,却不发出任何通知或错误消息。但请记住,您认为的无效输入可能是我们认为的扩展或与传统做法的兼容性。
PostgreSQL未能根据受支持平台上的说明进行编译、构建或安装。
此处“程序”是指任何可执行文件,不仅包括后端进程。
执行速度慢或占用大量资源不一定是一个错误。请阅读文档或在某个邮件列表中寻求帮助以调整您的应用程序。未能遵守SQL标准也不一定是一个错误,除非明确声明了具体功能的兼容性。
在您继续之前,请检查 TODO 列表和常见问题解答,以查看您的错误是否已知。如果您无法解码 TODO 列表上的信息,请报告您的问题。我们起码可以将 TODO 列表做得更清晰。
关于错误报告,最重要的规则是仅陈述事实。不要猜测您认为出了什么问题、它“似乎做什么”或程序的哪一部分有故障。如果您不熟悉实施过程,您很可能会猜测错误,并且毫无帮助。即使您熟悉,有教育意义的解释也能很好地补充事实,但不能替代事实。如果我们要修复错误,我们仍然必须首先亲自查看发生的情况。报告基本事实相对直接(您可能可以从屏幕复制并粘贴它们),但经常因为有人认为它无关紧要或报告内容无论如何都会被理解而忽略了重要的细节。
每个错误报告中应包含以下内容
重现问题必要的 从程序启动 开始的步骤的准确顺序。它应自包含;仅仅发送一个光秃秃的 SELECT
语句是不够的,没有前面的 CREATE TABLE
和 INSERT
语句,如果输出应该取决于表中的数据。我们没有时间对您的数据库模式进行逆向工程,并且如果我们应该自己编造数据,我们很可能会错过问题。
与 SQL 相关的问题的最佳测试用例格式是可以通过 psql 前端运行的文件,该文件展示了问题。(确保您的 ~/.psqlrc
启动文件中没有任何内容。)创建一个此文件的一个简单方法是使用 pg_dump 导出设置场景所需的表声明和数据,然后添加问题查询。我们鼓励您尽可能减小示例的大小,但这并不是绝对必要的。如果错误可以重现,我们会找到解决方法。
如果您的应用程序使用其他一些客户端界面,例如 PHP,请尝试隔离含有问题的查询。我们不太可能设置一个 Web 服务器来重现您的问题。无论如何,请务必提供准确的输入文件;不要根据 “大文件” 或 “中型数据库” 等猜测问题,因为这些信息太不准确,无法使用。
得到的输出。请不要说 “不起作用” 或 “崩溃了”。如果有错误消息,请显示出来,即使你无法理解。如果程序因操作系统错误而终止,请说明具体是什么错误。如果没有任何结果,也请说明。即使测试用例的结果是程序崩溃或其他显而易见的问题,但可能不会在我们的平台上发生。如果可能的话,最简单的方法是从终端复制输出。
如果你正在报告一个错误消息,请获取消息最详细的形式。在 psql中,提前输入 \set VERBOSITY verbose
。如果你正在从服务器日志中提取消息,将运行时参数 log_error_verbosity 设置为 verbose
,以便记录所有详细信息。
在发生致命错误的情况下,客户端报告的错误消息可能并不包含所有可用信息。请同时查看数据库服务器的日志输出。如果你没有保留服务器的日志输出,那么现在开始这样做是一个好时机。
说明期望的输出非常重要。如果你仅仅写 “此命令给我该输出。” 或 “这不是我期望的。”,我们可能会自己运行它,扫描输出,并认为它看起来还可以,完全符合预期。我们不应该花时间解码命令背后的确切语义。特别是不要仅仅说 “这不是 SQL/Oracle 所说的/做的。” 从中挖掘出正确的行为SQL并不是一件有趣的事情,我们也不知道其他所有关系数据库的行为。(如果你的问题是程序崩溃,显然可以省略此项。)
有任何命令行选项和其他启动选项,包括任何与默认值不同的相关环境变量或配置文件。同样,请提供确切的信息。如果你正在使用预先打包的发行版,它在启动时启动数据库服务器,你应该设法找出如何做到这一点。
在安装说明中,所做的任何与众不同之处。
PostgreSQL 版本。你可以运行命令 SELECT version();
来找出你连接的服务器版本。大多数可执行程序还支持一个 --version
选项;至少 postgres --version
和 psql --version
应该能工作。如果函数或选项不存在,则你的版本太旧了,需要升级。如果你运行的是预打包版本,例如 RPM,请说出来,包括包可能拥有的任何子版本。如果你正在谈论 Git 快照,请提及它,包括提交哈希值。
如果你的版本低于 17.1,我们几乎可以肯定你需要升级。每个新版本都有众多 bug 修复和改进,因此在旧版本 PostgreSQL 中遇到的 bug 可能已修复。对于那些正在使用旧版本 PostgreSQL 的网站,我们只能提供有限的支持;如果你要求的超出我们可以提供的支持范围,请考虑购买商用支持合同。
平台信息。这包括内核名称和版本、C 库、处理器、内存信息等。在大多数情况下,报告供货商和版本就足够了,但不要假设每个人都知道 “Debian” 确切包含什么,或者每个人都运行 x86_64。如果你在安装时遇到问题,还必须提供有关机器上的工具链的信息(编译器、make 等)。
如果你的 bug 报告变得冗长,不要害怕。这是生活中的事实。与其我们不得不从你那里挤出事实,不如第一次就报告所有内容。另一方面,如果你的输入文件很大,可以先询问是否有人愿意研究一下。以下是一篇文章,其中概述了有关报告 bug 的更多提示。
不要把所有时间都花在弄清楚输入中的哪些更改导致了问题的解决。这样做可能并不会有助于解决问题。如果事实证明无法立即修复 bug,你仍有时间找到并分享你的解决方法。另外,再次强调,不要浪费时间猜测 bug 出现的原因。我们很快就会弄清楚。
在撰写 bug 报告时,请避免混淆术语。整个软件包被称为 “PostgreSQL”,有时简称 “Postgres”。如果你特别指后台进程,请予以说明,不要仅仅说 “PostgreSQL crashed”。单个后台进程崩溃与父进程 “postgres” 崩溃截然不同;请不要在单个后台进程终止时说 “服务器崩溃了”,反之亦然。此外,客户端程序(例如交互式前端 “psql”)与后端完全分开。请尽量明确问题出现在客户端还是服务器端。
一般来说,将 Bug 报告发送到 Bug 报告邮件列表 <[email protected]>
。建议您对电子邮件信息使用描述性主题,也许可以使用错误信息的一部分。
另一种方法是填写项目 网站 上提供的 Bug 报告 Web 表单。通过这种方式输入 Bug 报告会将其邮寄到 <[email protected]>
邮件列表。
如果你的 Bug 报告有安全影响,并且你希望它不再公开存档中立即可见,请不要将其发送到 pgsql-bugs
。可以将安全问题私下举报至 <[email protected]>
。
不要向任何用户邮件列表发送 Bug 报告,例如 <[email protected]>
或 <[email protected]>
。这些邮件列表用于回答用户问题,并且他们的订阅者通常不希望收到 Bug 报告。更重要的是,他们不太可能修复这些问题。
此外,请 不 向开发者邮件列表 <[email protected]>
发送报告。此列表用于讨论 PostgreSQL 的开发,如果我们能将 Bug 报告分开,会非常棒。如果问题需要更多检查,我们可能会选择在 pgsql-hackers
上展开关于你的 Bug 报告的讨论。
如果文档有问题,报告它的最佳位置是文档邮件列表 <[email protected]>
。请具体说明你对文档的哪一部分不满意。
如果你的 Bug 是不受支持平台上的移植问题,请发送邮件至 <[email protected]>
,以便我们(和你)能够在你的平台上移植 PostgreSQL。
由于大量垃圾邮件的出现,上述所有列表都会受到审核,除非你订阅。这意味着在邮件发送之前会有一定的延迟。如果您希望订阅这些列表,请访问 https://lists.postgresql.org/ 以获取说明。