PostgreSQL10.4已经正式发布了,新版本在功能方面、性能方面、安全性和可靠性等方面进行增强,可以进行逻辑订阅、后台运行、清理进度、并行增强、简接索引、自动预热共享缓存等,为用户进行数据库系统管理提供新的解决方案。小编还带来了PostgreSQL 10.4教程,需要的朋友可以下载使用。
PostgreSQL 10.4新特性
一、功能增强
1、逻辑订阅。在多个业务之间有少量的数据需要同步、数据汇总、数据拆分、跨云线上线下同步等问题中,逻辑订阅的应用是非常必要的。
2、内置分区表。PostgreSQL 10.4中将加入内置分区表的功能,依旧使用了继承的特性,但不需要手工写规则了。PostgreSQL 10.4 分区表不支持全局索引,因此无法实现全局的唯一约束;更新数据时不能导致数据跨区移动,否则会报错;修改主表的字段名、字段类型时,会自动同时修改所有的分区;TRUNCATE 主表时,会清除所有继承表分区的记录(如果有多级分区,也会一直级联下去);目前支持分区表的ON CONFLICT .. DO NOTHING ,暂时还不支持ON CONFLICT .. DO UPDATE。
3、流式接收端在线压缩WAL。PostgreSQL 10.4中pg_receivexlog 支持对WAL日志在线压缩。pg_receivexlog支持通过开关控制是否需要开启压缩、以及选择压缩级别。pg_receivexlog启动时,自动扫描存放归档文件的目标目录,选择断点续传的位置,然后向PostgreSQL数据库请求相应位置为起点的REDO。
4、查看清理进度。PostgreSQL 10.4增加了对Vacuum的可视化监控;增加了动态视图pg_stat_progress_vacuum;显示每个vacuum worker进程扫描了多少页面、回收了多少页面,结合清理对象的总页面数,可以估计进度。
5、后台运行。10.4增加了对后台运行的支持,提供了三个SQL函数。pg_background_launch : 开启后台work进程与会话,执行用户提供的SQL,返回后台会话的PID;pg_background_result : 根据提供的PID,返回这个后台会话执行SQL的结果;pg_background_detach : 根据提供的PID,返回这个后台会话执行SQL的结果,同时关闭这个后台进程。 pg_background_result还会返回执行所用的时间。
二、性能增强
1、并行增强。10.4 新增了一个参数max_parallel_workers,用于控制整个集群允许开启的用于多核计算的Worker进程。PostgreSQL还增加了一个对元组进行并行排序的模块:原则上,任何现有需要调用tuplesort的功能都可以使用这个并行排序模块基于并行排序模块,将能够支持B-Tree的并行创建(代价模型比较直接)。
2、间接索引。10.4 引入了间接索引的概念,索引项中有堆元组的主键值:只要不更新堆元组的主键,索引键值不变的间接索引都不需要更新;但间接索引不能单独服务于查询,必须经过主键索引中转;主键只能是小于等于 6 字节的类型。
3、用不完全索引支持复合排序。用索引支持排序是很好的手段:ORDER BY a,b,c 可以利用到索引(a,b,c,*);ORDER BY a,b,c 无法利用索引(a,b)或者(a)。10.4 将使得第二种情况能够用上(a,b)或者(a)这样不完全包含排序列的索引:第一个阶段,利用不完全的索引来做基于前几个排序列的排序;第二个阶段,对前几个排序列上值相等的数据,取出后面的列值进行单独排序。当前几个排序列的值分布得比较散时这种利用索引的方法效果比较好。
4、自动预热共享缓存。10.4 中增加了自动预热共享缓存的技术:建立一个预热器后台进程,它在系统关闭时把缓冲池中的数据块信息转储到文件中;重启时,预热器自动把转储出来的数据块重新载入到缓存中。
5、JIT支持。PostgreSQL 10.4 已经开始为 JIT 做铺垫,把SQL执行的框架从递归调用方式改成了非递归的opcode驱动模式,非递归式降低了栈使用和开销,可以在不同的子表达式之间共享一些状态,简单函数以简单跳转实现而不需函数调用。
三、安全性和可靠性
1、安全性增强。PostgreSQL SCRAM机制基于RFC文档 5802 、7677实现,目前只支持SCRAM-SHA-256算法,但是基于SASL认证方法,未来可以支持更多的更强的算法。SCRAM相比md5,可以避免因为数据库存储的加密秘钥泄露导致客户端可以篡改认证协议连接数据库的危险。由于SCRAM和md5不兼容,二者只能选其一。
2、新增内置角色。PostgreSQL 10.4 开始植入了一些内置的角色:pg_backend_pid:可用来取消、中止任何进程,不包含其他超级用户权限;pg_monitor:可以查看统计信息,便于DBA等检查数据库健康状态;pg_read_all_gucs:可以查看所有的 GUC 配置。未来PostgreSQL还会对植入更多的内置角色,让数据库的权限分组管理更加便捷。逐步形成像Oracle这样内部有许多角色可选的状况。
3、防止执行不带条件的更新/删除。不带条件的更新/删除很危险,正常情况下,这样的SQL不应该在业务逻辑中出现。通常出现在SQL注入或者误操作中。10.4 提供了一个参数来防止此类SQL,bool allow_empty_deletes = true;bool allow_empty_updates = true;分别控制是否能执行不带条件的Update或Delete,可以设置为全局、会话级、用户级、库级、或者事务级别。
4、WAL日志支持的Hash索引。很长一段时间,PG中的Hash索引是不做WAL日志的,因此数据库崩溃可能会导致Hash索引不可用。10.4 中为Hash索引的操作加上了WAL支持,现在对Hash索引的创建、插入、分裂等操作都会记录WAL日志,数据库崩溃后可以用这些信息来恢复索引
四、应用开发
1、Libpq增强。支持pipeline batch模式,增加多连接功能。
2、标准/兼容性支持。增加类似serial的identify column:虽然已经可以使用serial来达到同样效果,不过实现这一标准,可以兼容更多的数据库。
PostgreSQL 10.4安装教程
1、下载软件,解压,找到“PostgreSQL-10.4-1-win64-bigsql.exe”文件,进入欢迎安装界面,点击next
2、设置PostgreSQL安装位置,默认的是“C:\PostgreSQL”,可以点文件夹图标修改
3、勾选要安装的组件,建议勾选pgAdmin3
4、输入PostgreSQL密码,点击next
5、按照安装提示操作就可完成安装了。
更新日志
安全问题
这个版本中一个安装漏洞已被修正:
CVE-2018-1115: 在pg_logfile_rotate()函数中有过于宽松的权限控制
请浏览以下的“系统更新”段落了解安装后应执行的步骤。
BUG修正和改进
本次更新修正了近三个所上报的超过50个Bug。部分Bug仅影响10版本,但大部分都对目前在支持的版本有影响。
这些修正包括:
在几个内置函数中修正“不正确的函数非稳态和并行安全标记”的问题,以确保正确的查询优化;
几处有关分区的修正,包括潜在的宕机以及允许布尔值TRUE 和 FALSE 作为分区边界;
修正当一条记录值可以标记为dead-but-not-yet-vacuumed(已呆死但还未清除)的 TOAST OID,这样会导致类似“unexpected chunk number 0 (expected 1) for toast value nnnnn"的错误提示;
修正"CREATE TABLE ... LIKE"在32位平台上使用bigint identity 列的问题;
修正一个查询在重复执行hash join时的内存泄漏;
几处使用GROUPING SET的查询可能引起宕机的问题;
在提交一个预处理的事务时,避免当一个”查询取消“或是”会话强制终止“的中断导致的问题;
在autovacuum自动清理进程的计划中减少锁定,以防止潜在的进程并发操作的失效;
修正可能的REFRESH MATERIALIZED VIEW CONCURRENTLY (并发刷新物化视图)的低效执行;
几处使用"index-only"扫描的查询规划更新;
在使用SERIALIZABLE或是REPEATABLE READ的事务模式下并发执行CREATE INDEX CONCURRENTLY指令时的更新,以避免死锁的发生;
几处对SP-GiST 索引的修正,包括TEXT字段列的搜索时的内码自适应;
修正几处有关GiST, SP-GiST 和 Bloom 索引的分区表对记录记数的处理;
几处有关逻辑解码和复制的更新;
修正在导出时,几处对使用列表值类型的GUC变量的不合适的引用,包括local_preload_libraries, session_preload_libraries, shared_preload_libraries, temp_tabl espaces;
几处对 pg_stat_activity的更新;
几处对ecpg的更新;
修正pg_recvlogical,以保证与PostgreSQL 10以下版本的兼容性;
几处有关pg_rewind的更新;
本次更新也包含2018d版本的时区数据,包括对Palestine 和Antarctica时区的更新,加上对Portugal及其殖民属地历史数据的更新,也包括Enderbury, Jamaica, Turks & Caicos Islands 和Uruguay。
系统更新
所有PostgreSQL的更新版本是累进方式的。对一般小版本的更新,并不需要用户对数据进行导出和导入或是使用pg_upgrade进行更新(不过对这次更新,用户需要浏览下面有关"volatility 和 parallel-safety 函数标记的段落操作"),只需要停止PostgreSQL服务,更新一下服务器的二进制文件即可。
用户跳过了一个或是多个补丁版本可能也需要额外的后续操作,请浏览详细的发布说明来检查更早版本升级的细节。
安装后处理CVE-2018-1115问题的步骤
如果你在PostgreSQL 9.6或是10版本安装了"adminpack"扩展,你需要使用数据库管理员的权限在所有安装了“adminpack”扩展的数据库,运行以下指令:
ALTER EXTENSION adminpack UPDATE;
安装后对 MARKINGS 功能的处理步骤
应标记为"volatile"状态的函数
cursor_to_xml
cursor_to_xmlschema
query_to_xml
query_to_xml_and_xmlschema
query_to_xmlschema
应标记为"parallel-unsafe"状态的函数
binary_upgrade_create_empty_extension
brin_desummarize_range
brin_summarize_new_values
brin_summarize_range
cursor_to_xml
cursor_to_xmlschema
gin_clean_pending_list
pg_import_system_collations
ts_rewrite
ts_stat
如你使用上述任何函数,你需要按下述方法更新他们的标记状态:
方法1: 在每一个数据库中的pg_proc表中,手工在更新函数的标记内容。你可以使用数据库管理员权限,通过执行以内容实现目的:
方法2 : 运行pg_upgrade至一个含有标记更新的版本(比如10.4版本或以上)。