E.26. 版本 9.3 #
发行日期:. 2013-09-09
E.26.1. 概述
PostgreSQL 9.3 的主要增强包括:
上述各项在下面的章节中有更详细的说明。
E.26.2. 迁移到版本 9.3
对于希望从任何早期版本迁移数据的用户,需要使用pg_dumpall进行转储/恢复,或者使用pg_upgrade。
版本 9.3 包含许多可能影响与以前版本兼容性的变更。请注意以下不兼容之处:
E.26.2.1. 服务器设置
把
replication_timeout重命名为wal_sender_timeout(Amit Kapila)这个设置控制 WAL 发送端的超时。
设置
commit_delay现在需要超级用户权限,因为它如今有可能延迟其他会话(Simon Riggs)允许内存中排序使用其完整的内存分配(Jeff Janes)
基于旧行为设置了
work_mem的用户可能需要重新审视该设置。
E.26.2.2. 其他
如果要更新或删除的元组已被
BEFORE触发器更新或删除,则抛出错误(Kevin Grittner)此前,原本打算执行的更新会被静默跳过,造成逻辑不一致,因为触发器可能已经基于预期的更新把数据传播到了其他地方。现在会抛出错误,以防止不一致的结果被提交。如果此变更影响你的应用,最好的解决办法通常是把数据传播动作移到
AFTER触发器。如果查询调用的易变函数修改了稍后又被查询本身修改的行,也会抛出此错误。这类情况此前同样会导致静默跳过更新。
修改多列
ON UPDATE SET NULL/SET DEFAULT外键操作的行为,使其影响约束的所有列,而不只是UPDATE中被更改的那些列(Tom Lane)此前,我们只会设置那些与被
UPDATE更改的被引用列相对应的引用列。这是 SQL-92 的要求,但 SQL 标准的较新版本规定了新的行为。当
search_path发生变化时,强制对缓存的计划重新规划(Tom Lane)此前,如果查询以新的
search_path设置重新执行,当前会话中已生成的缓存计划不会重做,导致令人惊讶的行为。修复
to_number(),使其正确处理用作千位分隔符的句点(Tom Lane)此前,即使区域设置表明句点不是小数点、并且使用了
D格式代码指定使用区域特定的小数点,句点仍被视为小数点。如果同时使用FM格式,这会导致错误答案。修复带集合返回函数参数的
STRICT非集合返回函数,使其正确返回空行(Tom Lane)传递给严格函数的空值本应产生空输出,但该输出行却被完全抑制了。
把 WAL 存储为连续流,而不是每 4GB 跳过最后 16MB 的段(Heikki Linnakangas)
此前,由于这种跳过,名称以
FF结尾的 WAL 文件不会被使用。如果你的 WAL 备份或恢复脚本考虑了这一行为,则需要调整。在
pg_constraint.confmatchtype中,把默认外键匹配类型(非FULL、非PARTIAL)存储为表示“simple”的s(Tom Lane)此前这种情况用表示“unspecified”的
u表示。
E.26.3. 变更
下面是PostgreSQL 9.3 与上一个主版本之间变更的详细说明。
E.26.3.1. 服务器
E.26.3.1.1. 锁定
防止非键字段的行更新阻塞外键检查([Aacute]lvaro Herrera、Noah Misch、Andres Freund、Alexander Shulgin、Marti Raudsepp、Alexander Shulgin)
此变更提高了并发性,并降低了更新外键约束相关表时发生死锁的概率。不更改外键所引用列的
UPDATE现在对行采用新的NO KEY UPDATE锁模式,而外键检查使用新的KEY SHARE锁模式,它与NO KEY UPDATE不冲突。因此,除非外键列被更改,否则不会发生阻塞。新增配置变量
lock_timeout,用于限制会话等待获取任一锁的最长时间(Zolt[aacute]n Böszörm[eacute]nyi)
E.26.3.1.2. 索引
E.26.3.1.3. 优化器
为范围类型收集并使用上下界以及范围长度的直方图(Alexander Korotkov)
改进优化器对索引访问的代价估计(Tom Lane)
改进优化器对通过哈希聚合实现
DISTINCT的哈希表大小估计(Tom Lane)抑制无操作的 Result 和 Limit 计划节点(Kyotaro Horiguchi、Amit Kapila、Tom Lane)
当优化器只关心总代价时,不再以启动代价低为由保留计划,从而降低优化器开销(Tom Lane)
E.26.3.1.4. 常规性能
新增
COPY FREEZE选项,以避免稍后把元组标记为冻结的开销(Simon Riggs、Jeff Davis)改进
NUMERIC计算的性能(Kyotaro Horiguchi)改进等待
commit_delay的会话间的同步(Peter Geoghegan)这大大提升了
commit_delay的实用性。改进
CREATE TEMPORARY TABLE ... ON COMMIT DELETE ROWS选项的性能:在未触及任何临时表的事务中不再截断这类临时表(Heikki Linnakangas)让清理在移除过期元组后重新检查可见性(Pavan Deolasee)
这提高了页面被标记为全可见的机会。
新增逐资源所有者的锁缓存(Jeff Janes)
这加快了持有大量锁的多语句事务在语句完成时的锁簿记速度;它对 pg_dump 尤其有用。
避免在创建新关系的事务提交时扫描整个关系缓存(Jeff Janes)
这加快了在连续的小事务中创建大量表的会话的速度,例如 pg_restore 运行。
改进删除大量关系的事务的性能(Tomas Vondra)
E.26.3.1.5. 监控
新增可选能力:为数据页计算校验和并报告损坏(Simon Riggs、Jeff Davis、Greg Smith、Ants Aasma)
校验和选项可以在 initdb 期间设置。
把统计收集器的数据文件拆分为独立的全局文件和逐数据库文件(Tomas Vondra)
这减少了统计跟踪所需的 I/O。
修复统计收集器在系统时钟回拨情况下无法正常工作的问题(Tom Lane)
此前,统计收集会停止,直到时间再次达到先前记录的最晚时间。
在即将停止向 postmaster 标准错误输出日志时,向其发出一条提示性消息(Tom Lane)
在仅在 postmaster 启动期间向标准错误记录日志的常见配置中,这应有助于减少用户对到哪里查找日志输出的困惑。
E.26.3.1.6. 认证
当认证失败时,记录相关的
pg_hba.conf行,以便于调试意外失败(Magnus Hagander)改进 LDAP 的错误报告和文档(Peter Eisentraut)
新增对以 URL 格式(按 RFC 4516)指定 LDAP 认证参数的支持(Peter Eisentraut)
把
ssl_ciphers参数改为以DEFAULT而不是ALL开头,然后移除不安全的密码套件(Magnus Hagander)这应能产生更合适的 SSL 密码套件集。
只解析和加载一次
pg_ident.conf,而不是在每次连接期间进行(Amit Kapila)这与
pg_hba.conf的处理方式类似。
E.26.3.1.7. 服务器设置
大幅降低对 System V 共享内存的需求(Robert Haas)
在类 Unix 系统上,PostgreSQL 的大部分共享内存现在使用
mmap()。对大多数用户而言,这将消除为共享内存调整内核参数的需要。允许 postmaster 监听多个 Unix 域套接字(Honza Hor[aacute]k)
配置参数
unix_socket_directory被unix_socket_directories取代,后者接受目录列表。允许处理包含配置文件的目录(Magnus Hagander、Greg Smith、Selena Deckelmann)
这样的目录通过服务器配置文件中的
include_dir指定。把 initdb 配置的
shared_buffers最大值提高到 128MB(Robert Haas)这是 initdb 尝试在
postgresql.conf中设置的最大值;此前的最大值是 32MB。postmaster 退出时移除外部 PID 文件(如果存在)(Peter Eisentraut)
E.26.3.2. 复制和恢复
允许流复制备库跟随时间线切换(Heikki Linnakangas)
这允许流式备库从新提升为主库的从库接收 WAL 数据。此前,其他备库需要重新同步才能开始跟随新的主库。
新增 SQL 函数
pg_is_in_backup()和pg_backup_start_time()(Gilles Darold)这些函数报告基础备份的状态。
改进禁用
synchronous_commit时流式日志传送的性能(Andres Freund)允许把流式备库提升为主库的速度大大加快(Simon Riggs、Kyotaro Horiguchi)
把最后一个检查点的重做位置加入pg_controldata的输出(Fujii Masao)
这一信息有助于确定恢复需要哪些 WAL 文件。
允许pg_receivexlog等工具在体系结构不同的计算机上运行(Heikki Linnakangas)
WAL 文件仍然只能在与会与主库相同体系结构的服务器上重放;但由于流复制协议现在与机器无关,它们可以被传输并存储在任何体系结构的机器上。
让pg_basebackup的
--write-recovery-conf输出最小化的recovery.conf文件(Zolt[aacute]n Böszörm[eacute]nyi、Magnus Hagander)这简化了备库服务器的搭建。
允许pg_receivexlog和pg_basebackup的
--xlog-method处理流式时间线切换(Heikki Linnakangas)新增
wal_receiver_timeout参数,用于控制 WAL 接收端的超时(Amit Kapila)这可以更快地检测到连接失败。
更改 WAL 记录格式,允许把记录头拆分到多个页面(Heikki Linnakangas)
新格式略微更紧凑,写入效率更高。
E.26.3.3. 查询
E.26.3.4. 对象操作
新增对事件触发器的支持(Dimitri Fontaine、Robert Haas、[Aacute]lvaro Herrera)
这允许在运行 DDL 命令时调用以事件启用语言编写的服务器端函数。
允许外部数据包装器支持对外部表的写入(插入/更新/删除)(KaiGai Kohei)
新增
CREATE SCHEMA ... IF NOT EXISTS子句(Fabr[iacute]zio de Royes Mello)让
REASSIGN OWNED也更改共享对象的所有权([Aacute]lvaro Herrera)让
CREATE AGGREGATE在给定的初始值字符串不是转换数据类型的有效输入时报错(Tom Lane)抑制
CREATE TABLE关于隐式创建索引和序列的消息(Robert Haas)这些消息现在以
DEBUG1详细级别出现,因此默认不会显示。当表名中指定了不存在的模式时,允许
DROP TABLE IF EXISTS成功执行(Bruce Momjian)此前,如果模式不存在,它会抛出错误。
以独立字段的形式向客户端提供约束违规细节(Pavel Stehule)
这允许客户端获取表、列、数据类型或约束名的错误细节。此前这类信息必须从错误字符串中提取。访问这些字段需要客户端库的支持。
E.26.3.4.1. ALTER
支持
ALTER TYPE ... ADD VALUE中的IF NOT EXISTS选项(Andrew Dunstan)这对有条件地向枚举类型添加值很有用。
新增
ALTER ROLE ALL SET,用于为所有用户建立设置(Peter Eisentraut)这允许设置应用于所有数据库中的所有用户。
ALTER DATABASE SET此前已允许为单个数据库中的所有用户添加设置。postgresql.conf有类似效果。新增对
ALTER RULE ... RENAME的支持(Ali Dar)
E.26.3.4.2. VIEWs
新增物化视图(Kevin Grittner)
与每次访问都读取基础表的普通视图不同,物化视图在创建或刷新时创建物理表。对物化视图的访问随后从其物理表读取。目前还没有增量刷新物化视图或通过基础表访问自动访问它们的机制。
使简单视图自动可更新(Dean Rasheed)
引用单个基础表部分或全部列的简单视图现在默认可更新。更复杂的视图可以通过
INSTEAD OF触发器或INSTEAD规则使其可更新。新增
CREATE RECURSIVE VIEW语法(Peter Eisentraut)在内部,这会被转换为
CREATE VIEW ... WITH RECURSIVE ...。改进视图/规则打印代码,以处理被引用表被重命名、或列被重命名、添加或删除的情况(Tom Lane)
表和列的重命名可能造成这样的情况:如果只是把新名称替换进规则或视图的原始文本,结果就会有歧义。此变更修复了规则转储代码,使其在需要时插入构造的表和列别名以保持原始语义。
E.26.3.5. 数据类型
E.26.3.6. 函数
新增
array_remove()和array_replace()函数(Marco Nenciarini、Gabriele Bartolini)改进
format(),提供字段宽度和左/右对齐选项(Pavel Stehule)让
to_char()、to_date()和to_timestamp()正确处理负的(公元前)世纪值(Bruce Momjian)此前的行为要么错误,要么与正数/AD(公元)的处理不一致,例如在使用格式掩码 “IYYY-IW-DY” 时。
让
to_date()和to_timestamp()在混用 ISO 与公历周/日标记时返回正确结果(Bruce Momjian)让
pg_get_viewdef()默认在每个SELECT目标列表项和FROM项之后换行(Marko Tiikkaja)这缩短了视图打印时的行长度,例如在pg_dump输出中。
修复
map_sql_value_to_xml_value(),使域类型值的打印方式与其基础类型的打印方式一致(Pavel Stehule)某些内建类型(如
boolean)有特殊的格式化规则;这些规则现在也适用于基于这些类型的域。
E.26.3.7. 服务器端语言
E.26.3.7.1. PL/pgSQL Server-Side Language
允许 PL/pgSQL 在
RETURN中使用组合类型表达式(Asif Rehman)此前,在返回组合类型的函数中,
RETURN只能引用该类型的变量。允许 PL/pgSQL 以独立字段的形式访问约束违规细节(Pavel Stehule)
允许 PL/pgSQL 访问
COPY处理的行数(Pavel Stehule)在 PL/pgSQL 函数中执行的
COPY现在会更新GET DIAGNOSTICS x = ROW_COUNT获取的值。允许非保留关键字在 PL/pgSQL 的所有位置用作标识符(Tom Lane)
在 PL/pgSQL 语法的某些位置,关键字必须加引号才能用作标识符,即使它们名义上是非保留的。
E.26.3.8. Server Programming Interface (SPI)
防止子事务中止时 SPI 元组表的泄漏(Tom Lane)
现在,任何失败的子事务结束时,SPI 核心代码会释放该子事务期间创建的所有 SPI 元组表。这免除了使用 SPI 的代码跟踪此类元组表并在错误恢复代码中手工释放它们的需要。此前未做到这一点曾导致 PL/pgSQL 或许还有其他 SPI 客户端中的若干事务级内存泄漏问题。
SPI_freetuptable()现在可以防止多次释放请求,因此现有的确做了清理的代码不会因这一变更而破坏。允许 SPI 函数访问
COPY处理的行数(Pavel Stehule)
E.26.3.9. 客户端应用程序
新增命令行工具pg_isready,用于检查服务器是否准备好接受连接(Phil Sorber)
支持为pg_restore、clusterdb、reindexdb和vacuumdb指定多个
--table参数(Josh Kupershmidt)这与pg_dump的
--table选项的工作方式类似。为pg_dumpall、pg_basebackup和pg_receivexlog新增
--dbname选项,用于指定连接串(Amit Kapila)新增 libpq 函数
PQconninfo(),用于返回连接信息(Zolt[aacute]n Böszörm[eacute]nyi、Magnus Hagander)
E.26.3.9.1. psql
调整函数代价设置,使 psql 的 Tab 补全和模式搜索更高效(Tom Lane)
扩大 psql Tab 补全的覆盖范围(Jeff Janes、Dean Rasheed、Peter Eisentraut、Magnus Hagander)
允许 psql 的
--single-transaction模式在从标准输入读取时工作(Fabien Coelho、Robert Haas)此前此选项只在从文件读取时有效。
移除 psql 连接较旧服务器时的警告(Peter Eisentraut)
当连接比 psql 更新的大版本的服务器时仍会发出警告。
E.26.3.9.1.1. Backslash Commands
新增 psql 命令
\watch,用于重复执行 SQL 命令(Will Leinweber)新增 psql 命令
\gset,用于把查询结果存入 psql 变量(Pavel Stehule)在 psql 的
\conninfo命令中新增 SSL 信息(Alastair Turner)在 psql 的
\df+输出中新增“Security”列(Jon Erdman)允许 psql 命令
\l接受数据库名模式(Peter Eisentraut)在 psql 中,如果没有活动连接,不允许
\connect使用默认值(Bruce Momjian)如果服务器曾崩溃,就可能出现这种情况。
修复用 psql 的
\gfile执行的 SQL 命令失败后状态未正确重置的问题(Tom Lane)此前,后续 SQL 命令的输出会意外地继续写入同一文件。
E.26.3.9.1.2. 输出
为 psql 新增
latex-longtable输出格式(Bruce Momjian)这种格式允许表格跨越多页。
为 psql 的
latex格式新增border=3输出模式(Bruce Momjian)在 psql 的只显示元组和扩展输出模式下,零行时不再输出“(No rows)”(Peter Eisentraut)
在 psql 的非对齐扩展输出模式下,零行时不再打印空行(Peter Eisentraut)
E.26.3.9.2. pg_dump
为 pg_dump 新增
--jobs选项,用于并行转储表(Joachim Wieland)让 pg_dump 以更可预测的顺序输出函数(Joel Jacobson)
修复 pg_dump 生成的 tar 文件,使其符合 POSIX(Brian Weaver、Tom Lane)
为 pg_dump 新增
--dbname选项,以与其他客户端命令保持一致(Heikki Linnakangas)数据库名此前已可以不带标志放在最后提供。
E.26.3.9.3. initdb
让 initdb 对新创建的数据目录执行 fsync(Jeff Davis)
这确保 initdb 之后不久发生系统崩溃时的数据完整性。可以使用
--nosync禁用。新增 initdb 的
--sync-only选项,用于把数据目录同步到持久存储(Bruce Momjian)它被pg_upgrade使用。
让 initdb 在数据目录被放在文件系统挂载点顶层时发出警告(Bruce Momjian)
E.26.3.10. 源代码
新增允许插件式后台工作进程的基础设施([Aacute]lvaro Herrera)
创建集中化的超时 API(Zolt[aacute]n Böszörm[eacute]nyi)
创建 libpgcommon,并把
pg_malloc()等函数移到那里([Aacute]lvaro Herrera、Andres Freund)这使得 libpgport 可以只用于可移植性相关代码。
新增对嵌入在更大结构体中的列表链接的支持(Andres Freund)
对所有信号(包括
SIGALRM)使用SA_RESTART(Tom Lane)确保翻译
errcontext()消息时使用正确的文本域(Heikki Linnakangas)统一客户端内存分配函数的命名(Tom Lane)
新增对“静态断言”的支持:如果某个编译期常量条件不满足,将在编译时失败(Andres Freund、Tom Lane)
在客户端代码中支持
Assert()(Andrew Dunstan)新增修饰,告知 C 编译器某些
ereport()和elog()调用不会返回(Peter Eisentraut、Andres Freund、Tom Lane、Heikki Linnakangas)允许通过
PG_REGRESS_DIFF_OPTS向回归测试输出比较工具传递选项(Peter Eisentraut)为
CREATE INDEX CONCURRENTLY新增隔离测试(Abhijit Menon-Sen)移除
int2/int4的 typedef,因为用int16/int32表示更好(Peter Eisentraut)修复 Mac OS X 上的 install-strip(Peter Eisentraut)
移除 configure 标志
--disable-shared,因为它不再受支持(Bruce Momjian)用 Perl 重写 pgindent(Andrew Dunstan)
提供 Emacs 宏,把 Perl 格式设置为与 PostgreSQL 的 perltidy 设置一致(Peter Eisentraut)
每当后端文法被更改时,运行工具检查关键字列表(Tom Lane)
更改
UESCAPE的词法分析方式,以大幅减小词法分析器表的大小(Heikki Linnakangas)集中化 flex 和 bison 的 make 规则(Peter Eisentraut)
这对 pgxs 作者很有用。
把许多内部后端函数改为返回对象
OID而不是 void(Dimitri Fontaine)这对事件触发器很有用。
为事务回调新创 pre-commit/pre-prepare/pre-subcommit 事件(Tom Lane)
使用事务回调的可加载模块可能需要修改以处理这些新的事件类型。
新增函数
pg_identify_object(),用于生成数据库对象的机器可读描述([Aacute]lvaro Herrera)新增对象
ALTER之后的服务器钩子(KaiGai Kohei)实现通用二叉堆,并将其用于 Merge-Append 操作(Abhijit Menon-Sen)
提供工具,帮助在更新
src/timezone/data文件时检测时区缩写变更(Tom Lane)为 libpq 和 ecpg 库新增 pkg-config 支持(Peter Eisentraut)
移除
src/tools/backend,因为其内容已移至 PostgreSQL wiki(Bruce Momjian)把 WAL 读取拆分为独立设施(Heikki Linnakangas、Andres Freund)
用 64 位整数(
XLogRecPtr)而不是两个 32 位整数表示 WAL 位置(Heikki Linnakangas)一般来说,需要读取 WAL 格式的工具都需要调整。
允许 PL/Python 支持平台特定的头文件目录(Peter Eisentraut)
允许 OS X 上的 PL/Python 针对自定义版本的 Python 构建(Peter Eisentraut)
E.26.3.11. 附加模块
新增 Postgres 外部数据包装器 contrib 模块,用于访问其他 Postgres 服务器(Shigeru Hanada)
这个外部数据包装器支持写入。
新增 pg_xlogdump contrib 程序(Andres Freund)
在 pg_trgm 中新增对正则表达式搜索索引的支持(Alexander Korotkov)
改进 pg_trgm 对多字节字符的处理(Tom Lane)
在没有 wcstombs() 或 towlower() 库函数的平台上,这可能导致 pg_trgm 索引中非 ASCII 数据的内容发生不兼容变更。在这种情况下,应对这些索引执行
REINDEX以确保正确的搜索结果。为 pgstattuple 新增函数,用于报告 GIN 索引待处理插入列表的大小(Fujii Masao)
让oid2name、pgbench和vacuumlo设置
fallback_application_name(Amit Kapila)改进pg_test_timing的输出(Bruce Momjian)
改进pg_test_fsync的输出(Peter Geoghegan)
为 dblink 创建专用外部数据包装器,并带自己的选项验证函数(Shigeru Hanada)
使用这个 FDW 定义 dblink 连接的目标时,不再使用硬编码的连接选项列表,而是查询底层 libpq 库以了解它支持哪些连接选项。
E.26.3.11.1. pg_upgrade
允许 pg_upgrade 并行执行转储和恢复(Bruce Momjian、Andrew Dunstan)
这允许并行转储/恢复数据库的模式,以及按表空间并行复制/链接数据文件。使用
--jobs选项指定并行度。让 pg_upgrade 在当前目录中创建 Unix 域套接字(Bruce Momjian、Tom Lane)
这降低了有人在升级期间意外连接的可能性。
让 pg_upgrade 的
--check模式正确检测非默认套接字目录的位置(Bruce Momjian、Tom Lane)改进 pg_upgrade 在多表数据库下的性能(Bruce Momjian)
通过显示已执行的命令来改进 pg_upgrade 的日志([Aacute]lvaro Herrera)
改进 pg_upgrade 复制/链接期间的状态显示(Bruce Momjian)
E.26.3.11.2. pgbench
为 pgbench 新增
--foreign-keys选项(Jeff Janes)这会为 pgbench 创建的标准表添加外键约束,用于外键性能测试。
允许 pgbench 聚合性能统计,并每
--aggregate-interval秒生成一次输出(Tomas Vondra)为 pgbench 新增
--sampling-rate选项,用于控制记录日志的事务百分比(Tomas Vondra)精简并改进 pgbench 初始化模式的状态消息输出(Robert Haas、Peter Eisentraut)
为 pgbench 新增
-q模式,每五秒打印一行输出(Tomas Vondra)在初始化期间输出 pgbench 的已用时间和预计剩余时间(Tomas Vondra)
允许 pgbench 使用大得多的缩放因子:当请求的缩放因子超过 20000 时,把相关列从
integer改为bigint(Greg Smith)
E.26.3.12. 文档
允许创建 EPUB 格式的文档(Peter Eisentraut)
更新 FreeBSD 内核配置文档(Brad Davis)
改进
WINDOW函数的文档(Bruce Momjian、Florian Pflug)新增在 macOS 上搭建文档工具链的说明(Peter Eisentraut)
改进
commit_delay的文档(Peter Geoghegan)