对 DBA 最好的 PostgreSQL 10 ============================================================ 上周发布了一个新的 PostgreSQL 10!公告、发布说明和“新功能”概述可以在[这里][3]、[这里][4]和[这里][5]看到 - 强烈建议阅读,所以将它列出来。像往常一样,已经有相当多的博客覆盖了所有新的东西,但我猜每个人都有自己认为重要的角度,所以与 9.6 版一样我再次在这里列出我印象中最有趣/相关的功能。 与往常一样,升级或初始化一个新集群的用户将获得更好的性能(例如,更好的并行索引扫描、合并 join 和不相关的子查询,更快的聚合、远程服务器上更加智能的 join 和聚合),这些都开箱即用,但本文中我像将一些不能开箱即用,实际上你需要采取一些步骤才能从中获益。下面高亮展示的功能是从 DBA 的角度来编的,很快有一篇文章从开发者的角度讲述更改。 ### 升级注意事项 首先有些从现有设置升级的提示 - 有一些小的事情会导致从 9.6 或更旧的版本迁移时引起问题,所以在真正的升级之前,一定要在单独的副本上测试升级,并遍历发行说明中所有可能的问题。最值得注意的缺陷是: * 所有包含 “xlog” 的函数都被重命名为使用 “wal” 而不是 “xlog”。 后一个命名可能与正常的服务器日志混淆,因此“以防万一”更改。如果使用任何第三方备份/复制/H A工具,请检查它们是否为最新版本。 * 服务器日志(错误消息/警告等)的 pg_log 文件夹已重命名为 “log”。 确保验证你的日志解析/grep 脚本(如果有)可以工作。 * 默认情况下,查询将最多使用 2 个后台进程。 如果在 CPU 数量较少的机器上在 postgresql.conf 设置中使用默认值 10,则可能会看到资源使用率峰值,因为默认情况下并行处理已启用 - 这是一件好事,因为它应该意味着更快的查询。如果需要旧的行为,请将 max_parallel_workers_per_gather 设置为0。 * 默认情况下,本地主机的复制连接已启用 为了简化测试等,本地主机和本地 Unix 套接字复制连接现在在 pg_hba.conf 中以“信任”模式启用(无密码)!因此,如果其他非 DBA 用户也可以访问真实的生产计算机,请确保更改配置。 ### 从 DBA 的角度来看我的最爱 * 逻辑复制 这个期待已久的功能在你只想要复制一张单独的表或者字表或者所有表时有简单的设置和最小的性能损失,也意味着之后主要版本的零停机升级!历史上(需要 Postgres 9.4+),这可以通过使用第三方扩展或缓慢的基于触发器的解决方案来实现。对我而言这是 10 最好的功能。 * 声明分区 以前管理分区的方法通过继承并创建触发器来重路由插入到正确的表中,这一点很烦人,更不用说性能的影响了。目前支持的是 “range” 和 “list” 分区方案。如果有人在某些 DB 引擎中缺少 “哈希” 分区,则可以使用带表达式的 “list” 分区来实现相同的功能。 * 可用的哈希索引 哈希索引现在是 WAL 记录的,因此是崩溃安全,并获得了一些性能改进,因此对于简单的搜索,由于更大的数据,它们比标准的 B 树快。还有更大的索引大小。 * 跨列优化器统计 这样的统计数据需要在一组表的列上手动创建,以指出这些值实际上是以某种方式相互依赖的。这将能够应对计划器认为返回的数据很少(概率的乘积通常会产生非常小的数字)并选择例如一个在大量数据下性能不好的“嵌套循环” join 的慢查询问题。 * 副本上的并行快照 现在可以在 pg_dump 中使用多个进程(-jobs标志)来极大地加快备用服务器上的备份。 * 更好地调整并行处理 worker 的行为 参考 max_parallel_workers 和 min_parallel_table_scan_size/min_parallel_index_scan_size 参数。我建议增加一点后两者的默认值(8MB、512KB)。 * 新的内置监控角色,便于加工 新的角色 pg_monitor、pg_read_all_settings、pg_read_all_stats 和 pg_stat_scan_tables 能更容易进行各种监控任务 - 以前必须使用超级用户帐户或一些 SECURITY DEFINER 包装函数。 * 用于更安全的副本生成的临时 (每个会话) 复制槽 * 用于检查 B 树索引的有效性的一个新的 Contrib 扩展 几个智能检查发现结构不一致和页面级校验和未覆盖的内容。希望不久的将来能更加深入。 * Psql 查询工具现在支持基本分支(if/elif/else) 例如下面的将启用具有特定版本分支(对 pg_stat* 视图等有不同列名)的单个维护/监视脚本,而不是许多版本特定的脚本。 ``` SELECT :VERSION_NAME = '10.0' AS is_v10 \gset \if :is_v10 SELECT 'yippee' AS msg; \else SELECT 'time to upgrade!' AS msg; \endif ``` 这次就这样了!当然有很多其他的东西没有列出,所以对于全职 DBA,我一定会建议更全面地看发布记录。非常感谢那 300 多为这个版本做出贡献的人! -------------------------------------------------------------------------------- via: http://www.cybertec.at/best-of-postgresql-10-for-the-dba/ 作者:[ Kaarel Moppel][a] 译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.cybertec.at/author/kaarel-moppel/ [1]:http://www.cybertec.at/author/kaarel-moppel/ [2]:http://www.cybertec.at/best-of-postgresql-10-for-the-dba/ [3]:https://www.postgresql.org/about/news/1786/ [4]:https://www.postgresql.org/docs/current/static/release-10.html [5]:https://wiki.postgresql.org/wiki/New_in_postgres_10