84Beta2Changes

来自 PostgreSQL 维基
跳转到导航跳转到搜索

8.4 Beta 1 和 8.4 Beta 2 之间的重大修复和更改列表

2009-05-14 16:31 heikki

* contrib/pg_standby/pg_standby.c, doc/src/sgml/backup.sgml, doc/src/sgml/pgstandby.sgml, src/backend/access/transam/xlog.c: 在 recovery.conf 中添加 recovery_end_command 选项。 recovery_end_command 在归档恢复结束时运行,提供一个机会进行外部清理。修改 pg_standby,使其不再删除触发文件,现在将使用 recovery_end_command 来完成此操作。

在 pg_standby 中提供一种“智能”故障转移模式,我们不会立即故障转移,而是在恢复完所有未应用的 WAL 后才进行故障转移。这假设所有 WAL 在故障转移前都已归档,这实际上是大多数 pg_standby 用户想要的,从而为您提供零数据丢失。

recovery_end_command 由 Simon Riggs 提供,pg_standby 更改由 Fujii Masao 和我本人提供。

2009-05-13 16:27 tgl

* src/: backend/access/transam/xact.c, backend/utils/adt/xml.c, include/utils/xml.h: 重新编写 xml.c 的内存管理(再次)。放弃将 libxml 的分配重定向到 Postgres 上下文的思路。相反,直接让它使用 malloc,并在需要时添加 PG_TRY 块,以确保我们在错误恢复代码路径中释放 libxml 数据结构。这很丑陋,但似乎更可能与第三方对 libxml 的使用相协调,正如最近关于在 pl/perl 中使用 Perl XML 功能的故障报告以及关于 contrib/xml2 的 bug #4774 中所见。

我保留了分配重定向的代码,但它只在您定义 #define USE_LIBXMLCONTEXT 时构建/使用。这是因为我发现当寻找 libxml 内存泄漏时,将 libxml 的分配集中到一个 palloc 上下文非常有用,而我们未来肯定会在这种方法中遇到更多此类泄漏。但我们不想在正常构建中启用它,因为它破坏了我们想要修复的内容。

我还没有重新缩进现在被 PG_TRY() 包裹的大多数代码部分;这样做是为了方便审查。pg_indent 会修复它。

这是 8.3 中一个已有的错误,但我不敢在该更改获得合理的现场测试之前进行反向补丁。

2009-05-12 12:43 tgl

* src/: backend/access/heap/heapam.c, backend/commands/lockcmds.c, include/access/heapam.h: 修复 LOCK TABLE 以消除可能导致它在表被并发删除时产生奇怪错误的竞争条件。为了做到这一点,我们必须在检查关系特权之前获取每个关系的锁。旧的代码试图以相反的方式进行操作,当有许多其他命令在检查特权之前锁定关系时,这有点意义。我确实保留了在锁定下一个关系之前检查每个关系特权的方式,这是一个 ALTER TABLE 不太挑剔的细节。

2009-05-11 23:11 tgl

* src/: backend/catalog/pg_inherits.c, backend/commands/lockcmds.c, backend/commands/tablecmds.c, backend/optimizer/prep/prepunion.c, backend/parser/parse_coerce.c, include/catalog/pg_inherits.h, include/catalog/pg_inherits_fn.h: 修改 find_inheritance_children() 和 find_all_inheritors() 以添加在扫描 pg_inherits 时锁定关系的能力,以及忽略在我们获得它们锁之前消失的任何关系。这使得使用这些函数在子表上的并发 DROP 操作中变得安全:我们将有效地忽略任何刚删除的子表,而不是像 Thomas Johansson 最近的错误报告(以及类似的过去抱怨)中那样可能会抛出错误。该行为应该不会改变,因为代码本来就在稍后获取这些锁,只是有点晚了。

一个例外是 LockTableCommand(),它仍然表现不安全;但这似乎需要在更改它之前进行更多讨论。

2009-05-11 04:06 mha

* src/backend/libpq/be-secure.c: 支持服务器证书文件中的 SSL 证书链。

Andrew Gierth

2009-05-09 22:51 tgl

* src/bin/pg_dump/pg_dumpall.c: 调整 pg_dumpall,使其仅为设置与安装默认值不同的数据库的数据库在其 CREATE DATABASE 命令中发出 ENCODING、LC_COLLATE 和 LC_CTYPE 选项。这是一种低技术方法,可以避免转储文件中不必要的平台依赖。最终,我们应该有一种与平台无关的方式来指定 LC_COLLATE 和 LC_CTYPE,但这不会发生在 8.4 中,而这个补丁至少避免了那些没有设置每个数据库区域设置的人出现的问题。ENCODING 没有平台依赖问题,但它似乎与区域设置行为一致。

2009-05-09 18:51 tgl

* src/: backend/optimizer/path/costsize.c, backend/optimizer/plan/createplan.c, backend/optimizer/util/restrictinfo.c, include/optimizer/restrictinfo.h: 修复 cost_nestloop 和 cost_hashjoin 以更好地模拟半连接和反连接的行为,即理解匹配和不匹配外部元组的不同成本函数。在 cost_hashjoin 中可以做更多的事情,但这已经帮助很大。根据与 Robert Haas 的讨论。

2009-05-07 18:01 tgl

* contrib/pgbench/pgbench.c, doc/src/sgml/pgbench.sgml: 更改 pgbench 以使用表名 pgbench_accounts、pgbench_branches、pgbench_history 和 pgbench_tellers,而不是只使用 accounts、branches、history 和 tellers。这是为了防止意外地与真实应用程序表发生冲突,据报道至少发生过一次。此外,还删除了它在启动时自动执行的“SET search_path = public”,因为这似乎限制了测试灵活性,而实际上并没有带来多少好处。根据 Joshua Drake 的提议和随后的讨论。

Joshua Drake 和 Tom Lane

2009-05-06 12:15 tgl

* doc/src/sgml/charset.sgml, doc/src/sgml/manage-ag.sgml, doc/src/sgml/ref/create_database.sgml, src/backend/commands/dbcommands.c, src/test/mb/README, src/test/mb/mbregress.sh: 修改 CREATE DATABASE 以强制执行源数据库的编码设置必须用于新数据库,除了从 template0 复制时。这是我们现在对区域设置强制执行的相同规则,并且有相同的动机:除 template0 之外的数据库可能包含与不同设置不一致的数据。这代表了我们在持续过程中锁定可能在后端内部发生编码违规的方式的又一步。根据几天前的讨论。

顺便说一下,修复 mbregress.sh 之前存在的损坏,并在 dbcommands.c 中修复了几个没有指定 sqlstate 代码的 ereport() 调用。

2009-05-05 16:06 tgl

* src/backend/storage/ipc/ipc.c: 安装一个 atexit(2) 回调,确保 proc_exit 的清理处理将在后端进程中的某处直接调用 exit() 时仍然执行,而不是像我们希望的那样通过 proc_exit() 执行。这是对我们可能加载不知道不应该调用 exit() 的第三方代码问题的第二个回应。这样的调用现在将导致一个相当优雅的后端关闭,如果可能的话。(当然,如果调用 exit() 的原因是内存不足或类似情况,我们可能无法恢复,但至少我们会尝试。)

2009-05-05 15:59 tgl

* src/: backend/postmaster/postmaster.c, backend/storage/ipc/ipci.c, backend/storage/ipc/pmsignal.c, backend/storage/lmgr/proc.c, backend/utils/init/globals.c, include/miscadmin.h, include/postmaster/postmaster.h, include/storage/pmsignal.h: 安装一个“死亡开关”以允许 postmaster 检测后端已执行 exit(0) 或 exit(1) 但没有从共享内存中分离的情况。每当第三方代码加载到后端时,我们都面临着这种风险,因为此类代码可能不知道应该通过 proc_exit() 而不是直接调用 exit()。此外,据报道,在 Windows 下,有一些方法可以外部杀死一个进程,导致返回给 postmaster 的状态代码与自愿退出无法区分(感谢您,微软)。如果确实发生这种情况,则系统可能被破坏——例如,死会话可能仍然持有锁。因此,最好的恢复方法是将其视为后端崩溃。

死亡开关在特定子进程获取常规 PGPROC 时被激活,并在释放 PGPROC 时被停用;这些应该是后端中对共享内存资源的第一个和最后一个接触,或者足够接近。这种选择意味着对辅助进程没有覆盖,但我怀疑我们是否需要这样做,因为它们无论如何都不应该执行任何用户提供的代码。

此补丁还通过减少搜索成本来稍微改善了 EXEC_BACKEND ShmemBackendArray 数组的管理。

尽管这个问题由来已久,但缺乏现场投诉似乎意味着它不足以危及反向补丁;至少在我们对这种机制进行更多测试之前不会。

2009-05-05 14:32 petere

* doc/src/sgml/syntax.sgml, src/backend/parser/scan.l, src/test/regress/expected/strings.out, src/test/regress/sql/strings.sql: 出于安全原因,在 standard_conforming_strings 未开启时禁用在字符串常量中使用 Unicode 转义符 (U&)。

2009-05-02 21:17 ishii

* src/backend/utils/mb/Unicode/: euc_kr_to_utf8.map, johab_to_utf8.map, uhc_to_utf8.map, utf8_to_euc_kr.map, utf8_to_johab.map, utf8_to_uhc.map: 更新 UTF-8 <--> EUC_KR、JOHAB、UHC 映射。补丁由 Chuck McDevitt 贡献

2009-05-02 13:27 tgl

* doc/src/sgml/plpgsql.sgml, src/pl/plpgsql/src/pl_exec.c: 修复 plpgsql 的 EXIT,使没有标签的 EXIT 仅匹配循环,而不是 BEGIN 块。这是 Oracle 兼容性所必需的,而且我们最初的文档也明确地说明了这种行为(直到 8.1,文档被调整以匹配代码的行为;但实际上,旧的文档说的是正确的事情,而代码是错误的)。

没有反向补丁,因为这引入了可能破坏工作应用程序的不兼容性。需要发布说明。

2009-04-24 05:43 mha

* doc/src/sgml/libpq.sgml, doc/src/sgml/runtime.sgml, src/interfaces/libpq/fe-connect.c, src/interfaces/libpq/fe-secure.c, src/interfaces/libpq/libpq-int.h: 再次删除 sslverify 参数,用两个新的 sslmode 值替换它:“verify-ca”和“verify-full”。

由于“prefer”仍然是默认值,这将使证书验证默认关闭,这将导致更少的升级问题。

2009-04-22 20:23 tgl

* doc/src/sgml/config.sgml, doc/src/sgml/ref/prepare_transaction.sgml, src/backend/access/transam/twophase.c, src/backend/access/transam/varsup.c, src/backend/utils/misc/guc.c, src/backend/utils/misc/postgresql.conf.sample, src/test/regress/expected/prepared_xacts.out, src/test/regress/expected/prepared_xacts_1.out, src/test/regress/pg_regress.c, src/test/regress/sql/prepared_xacts.sql: 将 max_prepared_transactions 的默认值更改为零,并添加文档警告,除非打算积极使用准备好的事务并且已安装合适的事务管理器,否则不要将其设置为非零值。 这应该有助于防止我们多次遇到的场景,即准备好的事务被遗忘并最终导致严重的维护问题(甚至反环绕关闭)。

我们最初将默认值设置为非零值的唯一真正原因是支持该功能的回归测试。 为了仍然能够做到这一点,调整 pg_regress 以在“make check”期间强制使用非零值。 由于我们无法在“make installcheck”中强制使用非零值,因此添加一个变体回归测试“expected”文件,其中显示了当 max_prepared_transactions 为零时将获得的结果。

此外,扩展事务环绕警告的 HINT 消息,以提及旧的准备好的事务可能导致该问题。

所有内容均按今天的讨论进行。

2009-04-21 11:49 momjian

* doc/src/sgml/ref/psql-ref.sgml, src/bin/psql/command.c, src/bin/psql/describe.c, src/bin/psql/describe.h, src/bin/psql/help.c, src/test/regress/expected/polymorphism.out: 为 psql \df 和 \df 输出添加 agg/normal/trigger/window 标志。

David Fetter

2009-04-19 17:08 tgl

* src/backend/: commands/copy.c, parser/scan.l: 修复反转义检查,以便我们拒绝 \000 以及其他无效编码序列。 根据前几天讨论的内容。

2009-04-19 14:52 tgl

* doc/src/sgml/plpgsql.sgml, src/pl/plpgsql/src/gram.y, src/pl/plpgsql/src/pl_comp.c, src/pl/plpgsql/src/pl_funcs.c, src/pl/plpgsql/src/plpgsql.h, src/pl/plpgsql/src/scan.l, src/test/regress/expected/plpgsql.out, src/test/regress/sql/plpgsql.sql: 修改 plpgsql 的扫描器,使其以更接近核心 SQL 扫描器的方式处理注释和字符串文字。 用户可见的效果是

* 块注释(斜杠星号注释)现在嵌套,如 SQL 规范所示。

* 在 standard_conforming_strings 模式下,反斜杠作为非 E 字符串文字的最后一个字符现在被正确地视为普通字符;以前它被误解为转义结束引号。 (由于字符串还必须通过核心扫描器,因此这总是会导致语法错误。)

* 以前,RAISE 格式字符串中的反斜杠始终被视为引用下一个字符,而与模式无关。 现在,它们在 standard_conforming_strings 处于开启状态时是普通字符,而在关闭状态时,它们会引入与核心 SQL 扫描器中相同的转义集。 此外,escape_string_warning 现在对 RAISE 格式字符串有效。 这些更改使 RAISE 格式字符串的工作原理与任何其他字符串文字一样。

这是通过从核心扫描器复制粘贴大量逻辑来实现的。 最好考虑完全去除 plpgsql 的扫描器,转而使用核心扫描器。 但是,这涉及比我在 beta 版期间可以证明的更多更改——特别是,核心扫描器必须变得可重入。

顺便说一下,删除了使 plpgsql 扫描器发出 T_FUNCTION 或 T_TRIGGER 作为虚构的第一个标记的 kluge。 据推测,这在过去曾经有价值,但现在它只是扫描器和语法的不必要的复杂化。

2009-04-12 17:02 adunstan

* src/bin/pg_dump/pg_backup_archiver.c: 修复逻辑以检测并行还原项中涉及排他锁的冲突或块。 如果当前运行的项需要对候选项需要任何类型的锁的任何项进行排他锁,反之亦然,那么候选项不允许现在运行,必须等待以后。

2009-04-11 16:23 tgl

* src/bin/pg_dump/pg_dumpall.c: 修复 pg_dumpall,以便在指定 --clean 时,它以有一定工作机会的顺序删除角色和表空间。 根据 Kevin Bailey 的投诉。

这是一个预先存在的错误,但鉴于缺乏先前的投诉,我不确定是否值得回溯修复。 在大多数情况下,DROP 命令的失败并不重要。

顺便说一下,修复 dumpCreateDB() 的查询中的语法错误,用于旧服务器;这些错误显然是在最近的二进制升级补丁中引入的。