对 DBA 最重要的 PostgreSQL 10 新亮点
============================================================

前段时间新的重大版本的 PostgreSQL 10 发布了！ 强烈建议阅读[公告][3]、[发布说明][4]和“[新功能][5]”概述可以在[这里][3]、[这里][4]和[这里][5]。像往常一样，已经有相当多的博客覆盖了所有新的东西，但我猜每个人都有自己认为重要的角度，所以与 9.6 版一样我再次在这里列出我印象中最有趣/相关的功能。

与往常一样，升级或初始化一个新集群的用户将获得更好的性能（例如，更好的并行索引扫描、合并 join 和不相关的子查询，更快的聚合、远程服务器上更加智能的 join 和聚合），这些都开箱即用，但本文中我想讲一些不能开箱即用，实际上你需要采取一些步骤才能从中获益的内容。下面重点展示的功能是从 DBA 的角度来汇编的，很快也有一篇文章从开发者的角度讲述更改。

### 升级注意事项

首先有些从现有设置升级的提示 - 有一些小的事情会导致从 9.6 或更旧的版本迁移时引起问题，所以在真正的升级之前，一定要在单独的副本上测试升级，并遍历发行说明中所有可能的问题。最值得注意的缺陷是：

*   所有包含 “xlog” 的函数都被重命名为使用 “wal” 而不是 “xlog”。
	
	后一个命名可能与正常的服务器日志混淆，因此这是一个“以防万一”的更改。如果使用任何第三方备份/复制/HA 工具，请检查它们是否为最新版本。
*   存放服务器日志（错误消息/警告等）的 pg_log 文件夹已重命名为 “log”。
	
	确保验证你的日志解析或 grep 脚本（如果有）可以工作。
*   默认情况下，查询将最多使用 2 个后台进程。

	如果在 CPU 数量较少的机器上在 `postgresql.conf` 设置中使用默认值 `10`，则可能会看到资源使用率峰值，因为默认情况下并行处理已启用 - 这是一件好事，因为它应该意味着更快的查询。如果需要旧的行为，请将 `max_parallel_workers_per_gather` 设置为 `0`。
*   默认情况下，本地主机的复制连接已启用。

	为了简化测试等工作，本地主机和本地 Unix 套接字复制连接现在在 `pg_hba.conf` 中以“<ruby>信任<rt>trust</rt></ruby>”模式启用（无密码）！因此，如果其他非 DBA 用户也可以访问真实的生产计算机，请确保更改配置。

### 从 DBA 的角度来看我的最爱

*   逻辑复制

	这个期待已久的功能在你只想要复制一张单独的表、部分表或者所有表时只需要简单的设置而性能损失最小，这也意味着之后主要版本可以零停机升级！历史上（需要 Postgres 9.4+），这可以通过使用第三方扩展或缓慢的基于触发器的解决方案来实现。对我而言这是 10 最好的功能。
*   声明分区

	以前管理分区的方法通过继承并创建触发器来把插入操作重新路由到正确的表中，这一点很烦人，更不用说性能的影响了。目前支持的是 “range” 和 “list” 分区方案。如果有人在某些数据库引擎中缺少 “哈希” 分区，则可以使用带表达式的 “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)
校对：[wxy](https://github.com/wxy)

本文由 [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
