发布日期:. 2013-09-09
PostgreSQL 9.3中主要的改进包括:
下面的章节是对以上条例更加详细的解释。
对于那些想要从任何以前的版本中迁移数据的人来说,需要使用 pg_dumpall或 pg_upgrade转储/恢复。
版本9.3包含一些可能影响与以前版本兼容性的修改。观察下列的不兼容性:
重命名replication_timeout
为
wal_sender_timeout
(Amit Kapila)
这些设置控制WAL发送超时。
要求超级用户权限设置commit_delay
,
因为它现在可以潜在的延迟其他会话 (Simon Riggs)
允许内存中排序使用它们分配的所有内存 (Jeff Janes)
基于以前的行为设置work_mem
的用户可能需要重新访问该设置。
如果一个元组在被更新或删除之前早已被一个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
中,
存储缺省的外键匹配类型(non-FULL
, non-PARTIAL
)
为s
,代表“简单的” (Tom Lane)
以前这种情况通过u
表示,代表“未指定”。
下面你将找到PostgreSQL 9.3和以前的主版本之间详细的变化。
阻止非键字段行更新阻塞外键检查 (Álvaro Herrera, Noah Misch, Andres Freund, Alexander Shulgin, Marti Raudsepp, Alexander Shulgin)
这个修改提高了并发性,并减少了更新的表包含在外键约束中时死锁的可能性。
UPDATE
并不改变任何现在在行上采用新的NO KEY UPDATE
锁模式的外键中引用的字段,虽然外键约束使用新的KEY SHARE
锁模式,
这与NO KEY UPDATE
并不冲突。所以这里没有阻塞,除非修改了外键字段。
添加配置变量lock_timeout
,
允许限制一个会话将等待多长时间去请求任何一个锁 (Zoltán Böszörményi)
为范围类型收集并使用上界、下界和范围长度的直方图 (Alexander Korotkov)
为索引访问改善优化器的成本估算 (Tom Lane)
为通过散列聚合实现DISTINCT
改善优化器的哈希表尺寸估计 (Tom Lane)
抑制非操作符结果并限制规划节点 (Kyotaro Horiguchi, Amit Kapila, Tom Lane)
当规划器只关心总的开销时,通过没有保持规划在基本的便宜启动成本上减少规划器开销 (Tom Lane)
添加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)
添加可选的能力到checksum 数据页并报告损坏 (Simon Riggs, Jeff Davis, Greg Smith, Ants Aasma)
checksum选项可以在initdb期间设置。
分离统计收集器的数据文件到独立的全局和每数据库文件 (Tomas Vondra)
这减少了统计数据追踪的I/O需求。
修复统计收集器,以便在系统时钟倒退的情况下正确的操作 (Tom Lane)
以前,统计收集器会停止,直到时间再次到达最后记录的时间。
当我们想要在这里停止记录时,发出一个告知性的消息到主进程标准错误 (Tom Lane)
这会帮助用户减少在主进程启动期间只记录标准错误的常见配置中,在哪里查看日志输出的混淆。
当发生认证失败时,记录相关的pg_hba.conf
行,
简化意外失败的调试 (Magnus Hagander)
改进LDAP错误报告和文档 (Peter Eisentraut)
在URL格式中添加对指定LDAP认证参数的支持,每RFC 4516 (Peter Eisentraut)
修改ssl_ciphers
参数,
以DEFAULT
启动,而不是以ALL
启动,
然后删除不安全的密码 (Magnus Hagander)
这会产生一个更合适的SSL密码设置。
分析并加载pg_ident.conf
一次,
而不是在每个连接中 (Amit Kapila)
这类似于pg_hba.conf
的处理。
大大的减少了System V 共享内存的需求 (Robert Haas)
在类Unix的系统上,mmap()
现在用于大多数PostgreSQL
的共享内存。对于大多数用户,这将消除任何为共享内存调整内核参数的需要。
允许主进程监听多个Unix域套接字 (Honza Horák)
配置参数unix_socket_directory
被
unix_socket_directories
取代,它接受一个路径列表。
允许配置文件的路径被处理 (Magnus Hagander, Greg Smith, Selena Deckelmann)
这样一个路径在服务器配置文件中用
include_dir
指定。
为shared_buffers
增加最大initdb配置值到128MB (Robert Haas)
这是initdb打算在postgresql.conf
中设置的最大值;以前的最大值是32MB。
在主进程退出时,删除外部PID文件, 如果有 (Peter Eisentraut)
允许流复制备用遵循时间线切换 (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án Böszörményi, Magnus Hagander)
这简化了设置一个备用服务器。
允许pg_receivexlog
和pg_basebackup
--xlog-method
处理流时间线切换 (Heikki Linnakangas)
添加wal_receiver_timeout
参数控制WAL接收器的超时 (Amit Kapila)
这允许更快速的检测连接失败。
改变WAL记录格式, 以允许跨页面分离记录头 (Heikki Linnakangas)
新的格式更紧凑,并且书写更有效。
添加对事件触发器的支持 (Dimitri Fontaine, Robert Haas, Álvaro Herrera)
这允许DDL命令运行时,以启用事件的语言书写的服务器端的函数被调用。
允许外部数据封装器 支持在外部表上写入(插入/更新/删除) (KaiGai Kohei)
添加CREATE SCHEMA ... IF NOT EXISTS
子句 (Fabrízio de Royes Mello)
让REASSIGN OWNED
也修改共享对象的所有权 (Álvaro Herrera)
如果给定的初始值字符串对于事务数据类型来说不是有效的输入,
那么让CREATE AGGREGATE
投诉 (Tom Lane)
抑制CREATE TABLE
关于隐式索引和序列创建的消息 (Robert Haas)
这些消息现在在DEBUG1
冗长模式中出现,所以它们缺省将不显示。
当一个不存在的模式在表名中指定时,允许
DROP TABLE IF EXISTS
成功 (Bruce Momjian)
以前,如果该模式不存在,它抛出一个错误。
提供带有约束违反细节 的客户端作为单独的字段 (Pavel Stehule)
这允许客户端检索表、字段、数据类型或约束名错误细节。以前这样的信息必须从错误字符串中提取。 客户端库支持需要访问这些字段。
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)
VIEWs
添加物化视图 (Kevin Grittner)
不像普通视图,基础表是读取每个访问的,物化视图在创建或刷新时创建物理表。 访问物化视图然后从它的物理表中读取。 现在还没有任何增量刷新物化视图或通过基础表访问自动访问它们的便利。
让简单视图自动可更新 (Dean Rasheed)
从一个基础表中引用一些或所有字段的简单视图现在缺省是可更新的。
更复杂的视图可以使用INSTEAD OF
触发器或INSTEAD
规则使其可更新。
添加CREATE RECURSIVE VIEW
语法
(Peter Eisentraut)
内部的,这些翻译为CREATE VIEW ... WITH RECURSIVE ...
。
改善视图/规则打印代码,以处理引用的表重命名或字段重命名、添加或删除了的情况 (Tom Lane)
表和字段重命名会产生的情况是:如果我们只是替代新的名称为一个规则或视图的原始文本, 那么结果是有歧义的。这个修改修复了规则转储代码,当需要保存原来的语义时, 插入手动制作的表和字段别名。
添加array_remove()
和array_replace()
函数 (Marco Nenciarini, Gabriele Bartolini)
改进format()
,
提供字段宽度和左/右对齐选项 (Pavel Stehule)
让to_char()
,
to_date()
,
和to_timestamp()
正确的处理负的世纪值(BC) (Bruce Momjian)
以前,该行为不是错误就是与正的/AD处理不一致,比如, 格式标记“IYYY-IW-DY”。
让to_date()
和to_timestamp()
在混合ISO和Gregorian周/天命名时返回正确的结果 (Bruce Momjian)
在每个SELECT
目标列表项和FROM
项之后,
让pg_get_viewdef()
缺省开始一个新行 (Marko Tiikkaja)
这减少了视图打印中的线段长度,例如在pg_dump 的输出中。
修复map_sql_value_to_xml_value()
,以与基础类型相同的打印方式,
打印域类型的值 (Pavel Stehule)
对于某些内建类型,比如boolean
,有特殊的格式规则;
这些规则现在也应用到这些类型上的域。
允许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语法中的某些地方,关键字必须加引号用作标识符,即使它们名义上是未保留的。
阻止SPI元组表在子事务退出期间泄露 (Tom Lane)
在任何失败的子事务的结尾,内核SPI代码现在释放任何在该子事务期间创建的SPI元组表。
这避免了对使用SPI代码的需要,保持在错误恢复代码中追踪这样的元组表和手动释放它们。
未能这样做会在PL/pgSQL和可能其他SPI客户端中导致一些事物寿命内存泄露问题。
SPI_freetuptable()
现在保护自己免受多次释放请求,所以任何现有代码需要小心清理,
不应该被这个修改破坏。
允许SPI函数访问被COPY
处理的行数 (Pavel Stehule)
添加命令行工具pg_isready, 检查服务器是否准备好了接受连接 (Phil Sorber)
为pg_restore,
clusterdb,
reindexdb,
和vacuumdb
支持多个--table
参数 (Josh Kupershmidt)
这类似于pg_dump的--table
选项的工作方式。
添加--dbname
选项到
pg_dumpall,
pg_basebackup,
和pg_receivexlog,
允许指定一个连接字符串 (Amit Kapila)
添加libpq函数PQconninfo()
,
返回连接信息 (Zoltán Böszörményi, Magnus Hagander)
调整函数开销设置,这样psql选项卡实现和模式搜索更有效 (Tom Lane)
提高psql的选项卡实现覆盖(Jeff Janes, Dean Rasheed, Peter Eisentraut, Magnus Hagander)
允许psql --single-transaction
模式在从标准输入中读取时工作 (Fabien Coelho, Robert Haas)
以前这个选项只在从一个文件中读取时工作。
当连接到一个老的服务器时,删除psql警告 (Peter Eisentraut)
当连接到一个比psql的主版本更新的服务器时,仍然发出一个警告。
添加psql命令\watch
,重复的执行一个SQL命令 (Will Leinweber)
添加psql命令\gset
,
在psql变量中存储查询结果 (Pavel Stehule)
添加SSL信息到psql的\conninfo
命令 (Alastair Turner)
添加“Security”字段到psql的\df+
输出 (Jon Erdman)
允许psql命令\l
接受一个数据库名字模式 (Peter Eisentraut)
在psql中,如果没有活动的连接,则不允许\connect
使用缺省 (Bruce Momjian)
如果服务器崩溃可能会出现这种情况。
在用psql的\g
file
SQL命令执行失败之后正确的重置状态 (Tom Lane)
以前,来自随后的SQL命令的输出会意外的继续进行同一个文件。
添加一个latex-longtable
输出格式到psql (Bruce Momjian)
这个格式允许表跨越多个页面。
添加border=3
输出模式到psql latex
格式 (Bruce Momjian)
在psql的仅元组和扩展输出模式中,不再为零行发出“(No rows)” (Peter Eisentraut)
在psql的未对齐、扩展输出模式中,不再为零行输出一个空行 (Peter Eisentraut)
添加pg_dump --jobs
选项并行转储表 (Joachim Wieland)
让pg_dump输出函数有一个更加可预见的顺序 (Joel Jacobson)
修复pg_dump发出的tar文件,与POSIX一致 (Brian Weaver, Tom Lane)
添加--dbname
选项到pg_dump,
与其他客户端命令一致 (Heikki Linnakangas)
最后提供的数据库名可能没有标志。
让initdb同步最近创建的数据目录 (Jeff Davis)
这确保了在initdb之后很快系统崩溃情况下的数据完整性。
可以使用--nosync
禁用此功能。
添加initdb --sync-only
选项同步数据目录到持久存储 (Bruce Momjian)
这是通过pg_upgrade使用的。
在文件系统的挂载点上放置数据目录时,让initdb发出一个警告 (Bruce Momjian)
添加基础设施以允许插件后端工作进程 (Álvaro Herrera)
创建一个集中的超时API (Zoltán Böszörményi)
创建libpgcommon并删除这里的pg_malloc()
和其他函数
(Álvaro Herrera, Andres Freund)
这允许libpgport只用于可移植性相关的代码。
为嵌入在较大结构内的列表连接添加支持 (Andres Freund)
为所有信号使用SA_RESTART
,包括SIGALRM
(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
,因为他们更好的表现为
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
lex的方式,大大的减少了词法分析程序表的大小 (Heikki Linnakangas)
集中flex和bison make规则 (Peter Eisentraut)
这对于pgxs作者是有用的。
修改许多内部后端函数,返回对象OID
而不是空 (Dimitri Fontaine)
这对于事件触发器是有用的。
为事务回调构造pre-commit/pre-prepare/pre-subcommit事件 (Tom Lane)
使用事务回调的可加载模块可能需要修改,以处理这些新的事件类型。
添加函数pg_identify_object()
,
生产一个机器可读的数据库对象的描述 (Álvaro Herrera)
添加在ALTER
对象之后的服务器挂钩 (KaiGai Kohei)
实现一个通用二进制堆并将它用于合并附加操作 (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位整数表示WAL位置(XLogRecPtr
),
替代两个32位的整数 (Heikki Linnakangas)
通常,需要读取WAL格式的工具将需要调整。
允许PL/Python支持平台特定的包含路径 (Peter Eisentraut)
允许OS X上的PL/Python 建立Python的定制版本 (Peter Eisentraut)
添加一个Postgres外部数据封装器 贡献模块,以允许访问其他Postgres服务器 (Shigeru Hanada)
这个外部数据封装器支持写。
添加pg_xlogdump贡献程序 (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库查看支持哪个连接选项。
允许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的日志 (Álvaro Herrera)
改进拷贝/连接期间pg_upgrade的状态显示 (Bruce Momjian)
添加--foreign-keys
选项到pgbench (Jeff Janes)
这添加了外键约束到pgbench创建的标准表,用于外键性能测试。
允许pgbench集合性能统计和每--aggregate-interval
秒产生输出 (Tomas Vondra)
添加pgbench --sampling-rate
选项,
控制事务日志的百分比 (Tomas Vondra)
减少并改进pgbench的初始化模式的状态消息输出 (Robert Haas, Peter Eisentraut)
添加pgbench -q
模式,每5秒打印一行输出 (Tomas Vondra)
在初始化期间输出pgbench经过和预估的剩余时间 (Tomas Vondra)
允许pgbench使用更大的比例系数,当请求的比例系数超过20000时,
改变相关的字段从integer
到bigint
(Greg Smith)
允许创建EPUB格式文档 (Peter Eisentraut)
更新FreeBSD内核配置文档 (Brad Davis)
改进WINDOW
函数文档
(Bruce Momjian, Florian Pflug)
添加使用说明, 在macOS上建立文档工具链 (Peter Eisentraut)
改进commit_delay
文档 (Peter Geoghegan)