codecamp

PostgreSQL 缺陷报告指南

5.1.标识缺陷
5.2.报告什么

当你在PostgreSQL中找到一个缺陷时,我们希望听到关于它的事情。你的缺陷报告在使得PostgreSQL更可靠的工作上扮演了重要的角色,因为再谨慎也不能保证PostgreSQL的每一部分都能在每一个平台上、每一种环境中工作。

下列建议目的是协助你把缺陷形成便于高效处理的形式。没有人被要求遵循它们,但是这样做对每个人都好。

我们无法保证马上修复每一个缺陷。如果缺陷是明显的、严重的或者影响很多用户,那么这是个好机会让某人去检查它。也可能我们会告诉你升级到一个新的版本来查看缺陷是否在该版本里也存在。或者我们可能决定在我们计划中的某些重大重写完成之前缺陷无法被修复。或者也许就是修复该缺陷太困难并且在日程表上还有更多重要的事情要做。如果你需要立即得到帮助,考虑联系一个商业支持。

标识缺陷

在你报告一个缺陷之前,请阅读再阅读文档来确认你真的可以做你正在尝试的任何东西。如果从文档中无法清楚地知道你是否能做某事,也请把它报告给我们;这是一个文档中的缺陷。如果发现一个程序做的事情和文档说的不一样,那就是一个缺陷。那可能包括(但不限于)下列情况:

  • 一个程序带有一个致命信号或者一个操作系统错误消息终止,它们会指出程序中的一个问题(一个反例是一个磁盘满消息,因为你只能自己修复它)。

  • 一个程序对任何给定的输入产生错误的输出。

  • 一个程序拒绝接受合法的输入(按文档定义)。

  • 一个程序接受非法输入,并且没有提示或者错误消息。但是记住你对非法输入的概念可能是我们认为的一个扩展或兼容性。

  • PostgreSQL根据在被支持平台上的指导无法编译、建立或者安装。

这里的程序指任何可执行文件,不仅仅是后台进程。

很慢或者很占资源不一定是一个缺陷。阅读文档或者在邮件列表中寻求帮助来调优你的应用。无法符合SQL标准也不一定是一个缺陷,除非文档中已经明确地声明指定特性是兼容的。

在你继续之前,检查 TODO 列表和 FAQ 来看你的缺陷是否为已知。如果你不能理解 TODO 列表中的信息,那就报告你的问题。至少我们可以让 TODO 列表更清晰。

报告什么

关于缺陷报告要记住的最重要的事情是说明事实并且只说明事实。不要推断你觉得什么出错了、它看起来在做什么或者程序的哪一部分出错了。如果你不熟悉实现,你可能猜错并且不会帮到我们。而且即使你熟悉实现,受过训练的解释是巨大的补充但是也无法替代事实。如果我们想要修复缺陷,我们还是需要首先重现它。报告最基本的事实相对直接(你可以直接从屏幕上拷贝和粘贴它们)但是可能有太多重要的细节被略去,因为某些人可能认为它不重要(所以没有包含在报告中)或者报告可能以其他方式被理解。

下列项应该被包含在每一个缺陷报告中:

  • 从程序启动开始的准确步骤序列,我们需要它们来重现问题。这应该是自包含的,如果输出是依赖于表中的数据,那么只发送一个裸的SELECT语句而不发送前面的CREATE TABLEINSERT语句是不够的。我们没有时间来对你的数据库模式做逆向工程,而且即使我们能够通过我们自己的数据来弥补,我们也很可能会错过问题。

    SQL 相关问题的一个测试样例的最佳格式是一个可以通过psql前端运行并展示该问题的文件(注意不要在你的~/.psqlrc启动文件中包含任何东西)。一种简单的创建该文件的方法是使用pg_dump来转储出表声明和设置场景的数据,然后增加问题查询。我们鼓励你最小化你的例子的尺寸,但是这不是绝对必要的。如果缺陷是可重现的,我们以两种方法都可以找到它。

    如果你的应用使用某些其他客户端接口(例如PHP),那么请尝试隔离出错的查询。我们将可能无法设置一个网页服务器来重现你的问题。在任何情况中记住提供准确的输入文件,不要猜测问题是因为大文件中等大小的数据库等而发生,因为这些信息用起来太不准确。

  • 你得到的输出。请不要说它无法工作或者崩溃了。如果有一个错误消息,请展示它,即使你不理解它。如果程序带着一个操作系统错误而终止,请说出它。如果根本没有发生任何事情,也说出来。虽然你的测试样例的结果是一次程序崩溃,但是显然它不一定会在我们的平台上发生。如果可能的话,最简单的事情就是从终端上复制你的输出。

    注意:

    如果你正在报告一个错误消息,请获得消息的最冗长的形式。在psql中,预先执行\set VERBOSITY verbose。如果你在从服务器日志抽取消息,设置运行时参数log_error_verbosityverbose,这样所有的细节将被记录在日志中。

    注意:

    在致命错误的情况中,客户端报告的错误消息可能不会包含所有可用的信息。请也看看数据库服务器的日志输出。如果你没有保留你的服务器的日志输出,这将是一个最好的时机开始记录它。

  • 你所期望的输出也是需要说明的很重要的内容。如果你只写这个命令给我那个输出。这不是我所期待的。,我们可能自己运行它、扫描输出并且认为它看起来 OK 并且正是我们期望的。我们不会花时间来理解你的命令背后的准确语义。特别是避免仅仅说这不是 SQL 所说的/Oracle 所作的。SQL中挖掘出正确的行为不是一个有趣的工作,我们也没法去了解所有的其他关系型数据库的行为(如果你的问题是一个程序崩溃,你显然可以忽略这一项)。

  • 任何命令行选项和其他启动选项,包括任何相关的环境变量或者你从默认修改过的配置文件。再次,请提供准确的信息。如果你在使用一个预打包的发布并且它在系统启动时自动开始数据库服务器,你应当尝试找出它是怎样启动的。

  • 任何你做的和安装指导上不同的地方。

  • PostgreSQL的版本。你可以运行命令SELECT version();来找出你连接到的服务器的版本。大部分可执行程序也支持一个--version选项,至少postgres --versionpsql --version可以工作。如果该函数或选项不存在,那么你的版本就已经老得无法保证可以升级了。如果你运行的是一个预打包的版本(如 RPM),请说明并且包括该包的任何子版本。如果你在谈论一个 Git 快照,也请说明并且包括提交哈希值。

    如果你的版本比 13.1 更老,我们将几乎肯定会告诉你进行升级。在每一个新的发布中都包含很多缺陷修复和改进,因此很有可能你在旧版本PostgreSQL中碰到的一个缺陷已经被修复了。我们对使用旧版本PostgreSQL的站点只提供有限的支持。如果你需要更多支持,请考虑咨询一个商业支持。

  • 平台信息。这包括内核名称和版本、C 库、处理器、内存信息等等。在大部分情况中,提供厂家和版本就足够了,但是不要假定每个人都了解Debian中到底包含什么或者每个人都运行在 x86_64 上。如果你碰到的是安装问题,那么你机器上的工具链(编译器、make等等)的信息也是需要被报告的。

不要担心你的缺陷报告变得太长。这就是生活。最好是第一次就报告所有的东西,而不是让我们去从你那里询问。在另一方面,如果你的输入文件太大,最好先问问是否有人有兴趣去看它。这里有一篇文章勾勒了一些报告缺陷的提示。

不要把你所有的时间花费在指出输入中的哪些改变让问题消失。这可能对解决问题没有什么帮助。如果发现缺陷不能被立马解决,你将还有时间去寻找和分享你的解决方法。同样,不要浪费你的时间去猜测为什么缺陷会存在。我们将尽快找出原因。

在编写一份缺陷报告时,请避免使用含糊的术语。这个软件包从整体上被称为PostgreSQL,有时会简称为Postgres。如果你要谈论特定的后端进程,不要只说PostgreSQL 崩溃了。一个单一后端进程的崩溃和其父 postgres进程崩溃是完全不同的;当你想说一个单一后端进程垮掉时,请不要说服务器崩溃了,反之亦然。还有,如交互式前端psql等的客户端程序和后端是完全独立的。请尽量确定问题是发生在客户端还是服务器端。

注意:

为了防止出现大量的垃圾邮件,除非您订阅,否则上述所有列表都将被审核。 这意味着在邮件被发送之前,将有一些延迟。 如果您想订阅列表,请访问https://lists.postgresql.org/获取说明。


PostgreSQL 进一步的信息
PostgreSQL 从头开始
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

PostgreSQL SQL语言

PostgreSQL 服务器管理

PostgreSQL 客户端接口

PostgreSQL 服务器编程

PostgreSQL 参考

PostgreSQL 内部

PostgreSQL 附录

PostgreSQL 参考书目

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }