5月11日——13日,第八届中国数据库技术大会(DTCC2017)在北京国际会议中心举行。会议期间,共有近5000名IT人士到场交流分享技术理念,盛况空前。本届DTCC大会以“数据驱动·价值发现”为主题,同时汇集了来自互联网、电子商务、金融、电信、政府、行业协会等20多个行业领域的120多位技术专家,共同探讨Oracle、MySQL、NoSQL、云端数据库、智能数据平台、区块链、数据可视化、深度学习等领域的前瞻性热点话题与技术。
在13日下午的开源技术分会场上,武汉大学副教授彭煜玮对PostgreSQL 10.0 版本的新特性进行了解读,以帮助大家对此版本有更深入的认识与了解。
PostgreSQL 10.0将是更改版本号规则后的第一个发行版,社区在这个新版本中增加了丰富的新特性和加强。彭煜玮此次解读的内容包括功能增强、性能增强、安全性和可靠性增强、应用开发以及迁移的注意事项。
功能增强
·逻辑订阅。在多个业务之间有少量的数据需要同步、数据汇总、数据拆分、跨云线上线下同步等问题中,逻辑订阅的应用是非常必要的。
·内置分区表。PostgreSQL 10.0中将加入内置分区表的功能,依旧使用了继承的特性,但不需要手工写规则了。PostgreSQL 10.0 分区表不支持全局索引,因此无法实现全局的唯一约束;更新数据时不能导致数据跨区移动,否则会报错;修改主表的字段名、字段类型时,会自动同时修改所有的分区;TRUNCATE 主表时,会清除所有继承表分区的记录(如果有多级分区,也会一直级联下去);目前支持分区表的ON CONFLICT .. DO NOTHING ,暂时还不支持ON CONFLICT .. DO UPDATE。
·流式接收端在线压缩WAL。PostgreSQL 10.0 中pg_receivexlog 支持对WAL日志在线压缩。pg_receivexlog支持通过开关控制是否需要开启压缩、以及选择压缩级别。pg_receivexlog启动时,自动扫描存放归档文件的目标目录,选择断点续传的位置,然后向PostgreSQL数据库请求相应位置为起点的REDO。
·查看清理进度。PostgreSQL 10.0增加了对Vacuum的可视化监控;增加了动态视图pg_stat_progress_vacuum;显示每个vacuum worker进程扫描了多少页面、回收了多少页面,结合清理对象的总页面数,可以估计进度。
·后台运行。10.0增加了对后台运行的支持,提供了三个SQL函数。pg_background_launch : 开启后台work进程与会话,执行用户提供的SQL,返回后台会话的PID;pg_background_result : 根据提供的PID,返回这个后台会话执行SQL的结果;pg_background_detach : 根据提供的PID,返回这个后台会话执行SQL的结果,同时关闭这个后台进程。 pg_background_result还会返回执行所用的时间。
性能增强
·并行增强。10.0 新增了一个参数max_parallel_workers,用于控制整个集群允许开启的用于多核计算的Worker进程。PostgreSQL还增加了一个对元组进行并行排序的模块:原则上,任何现有需要调用tuplesort的功能都可以使用这个并行排序模块基于并行排序模块,将能够支持B-Tree的并行创建(代价模型比较直接)。
·间接索引。10.0 引入了间接索引的概念,索引项中有堆元组的主键值:只要不更新堆元组的主键,索引键值不变的间接索引都不需要更新;但间接索引不能单独服务于查询,必须经过主键索引中转;主键只能是小于等于 6 字节的类型。
·用不完全索引支持复合排序。用索引支持排序是很好的手段:ORDER BY a,b,c 可以利用到索引(a,b,c,*);ORDER BY a,b,c 无法利用索引(a,b)或者(a)。10.0 将使得第二种情况能够用上(a,b)或者(a)这样不完全包含排序列的索引:第一个阶段,利用不完全的索引来做基于前几个排序列的排序;第二个阶段,对前几个排序列上值相等的数据,取出后面的列值进行单独排序。当前几个排序列的值分布得比较散时这种利用索引的方法效果比较好。
·自动预热共享缓存。10.0 中增加了自动预热共享缓存的技术:建立一个预热器后台进程,它在系统关闭时把缓冲池中的数据块信息转储到文件中;重启时,预热器自动把转储出来的数据块重新载入到缓存中。
·JIT支持。PostgreSQL 10.0 已经开始为 JIT 做铺垫,把SQL执行的框架从递归调用方式改成了非递归的opcode驱动模式,非递归式降低了栈使用和开销,可以在不同的子表达式之间共享一些状态,简单函数以简单跳转实现而不需函数调用。
安全性和可靠性
·安全性增强。PostgreSQL SCRAM机制基于RFC文档 5802 、7677实现,目前只支持SCRAM-SHA-256算法,但是基于SASL认证方法,未来可以支持更多的更强的算法。SCRAM相比md5,可以避免因为数据库存储的加密秘钥泄露导致客户端可以篡改认证协议连接数据库的危险。由于SCRAM和md5不兼容,二者只能选其一。
·新增内置角色。PostgreSQL 10.0 开始植入了一些内置的角色:pg_backend_pid:可用来取消、中止任何进程,不包含其他超级用户权限;pg_monitor:可以查看统计信息,便于DBA等检查数据库健康状态;pg_read_all_gucs:可以查看所有的 GUC 配置。未来PostgreSQL还会对植入更多的内置角色,让数据库的权限分组管理更加便捷。逐步形成像Oracle这样内部有许多角色可选的状况。
·防止执行不带条件的更新/删除。不带条件的更新/删除很危险,正常情况下,这样的SQL不应该在业务逻辑中出现。通常出现在SQL注入或者误操作中。10.0 提供了一个参数来防止此类SQL,bool allow_empty_deletes = true;bool allow_empty_updates = true;分别控制是否能执行不带条件的Update或Delete,可以设置为全局、会话级、用户级、库级、或者事务级别。
·WAL日志支持的Hash索引。很长一段时间,PG中的Hash索引是不做WAL日志的,因此数据库崩溃可能会导致Hash索引不可用。10.0 中为Hash索引的操作加上了WAL支持,现在对Hash索引的创建、插入、分裂等操作都会记录WAL日志,数据库崩溃后可以用这些信息来恢复索引
应用开发
·Libpq增强。支持pipeline batch模式,增加多连接功能。
·标准/兼容性支持。增加类似serial的identify column:虽然已经可以使用serial来达到同样效果,不过实现这一标准,可以兼容更多的数据库。
迁移的注意事项
使用pg_upgrade升级时,Hash索引需要重建;XLOG相关的系统管理函数重命名,xlog改为wal;不再支持浮点 datetimes/timestamps类型,编译项
--disable-integer-datetimes去除;不再支持client/server protocol version 1.0;不再支持contrib/tsearch2;不再支持version-0版本的C语言函数。
自PostgreSQL发布以来就受到了众多DBA的喜爱,而且广受好评,此次10.0版本的更新想必也时刻牵动着PostgreSQL粉丝们的心。一年一个大版本是PostgreSQL社区的传统,不过发布时间通常为秋天,仍需等待一段时间。看到如此“巨大”的升级更新,大家一定都迫不及待了吧。