PostgreSQL 9.5 中的新功能

Fedora 24艘船 PostgreSQL 9.5,从版本 9.4 的主要升级,包含在 Fedora 23. 新版本 9.5 提供了一些增强和新特性,但也带来了一些兼容性变化,因为它在 PostgreSQL 主要版本之间非常常见。 请注意,在 PostgreSQL 版本控制方案中,9.4 和 9.5 是两个主要版本,而第一个数字主要是市场营销,并且在版本中引入主要功能时会增加。

新功能和 增强功能 在 9.5

分组集

PostgreSQL 一直是传统的 OLTP,而不是 OLAP,但未来可能会改变; 像这样的小步骤 分组集 在此路径上有所帮助,因为 GROUPING SETS 允许使用更复杂的聚合操作(分组)。 CUBE 和 ROLEUP 只是 GROUPING SETS 的特定变体。

关于冲突

用户可能也很高兴 关于冲突 增强,允许在当前语句产生冲突的情况下做一些理智的事情。 这是一种非常通用的方法,有两种可能的解决方案——我们可以将 INSERT 语句转换为 UPDATE 或完全忽略该语句。 此功能通常称为 UPSERT,在其他 DBMS 中,我们可能知道与 MERGE 命令非常相似的东西。 但是,在 PostgreSQL 的情况下,它不是 SQL 标准的 100% MERGE 实现,所以它不是这样调用的。 PostgreSQL 中的 UPSERT 实现也应该更安全,因为如果使用不当,CTE(公用表表达式)可能会导致竞争条件。 一个 example 将新标签插入数据库并忽略重复记录可能如下所示:

INSERT INTO tags (tag) VALUES ('PostgreSQL'),('Database') ON CONFLICT DO NOTHING;

行级安全控制

另一个可以大大简化 SQL 查询的特性是 行级安全控制,允许对特定行进行检查访问。 为了 example,如果每一行都包含有关谁是记录所有者的信息,我们需要在应用程序中检查当前登录的用户是否等于所有者列。 使用行级安全功能,我们可以将其留给 DBMS,因此我们不仅可以保持应用程序逻辑清晰,而且我们还可以更加确定潜在的攻击者不会绕过,因为它在一层进一步检查。 一个 example 如何使用行级安全控制可能如下所示:

CREATE POLICY policy_article_user ON articles
FOR ALL TO PUBLIC
USING (user = current_user);

ALTER TABLE articles ENABLE ROW LEVEL SECURITY;

SELECT * FROM articles;
 id | user | title 
 ---+------+-------------------
  1 | joe  | How I went to Rome
  4 | joe  | My Favorite Recipe
 (2 rows)

有了这个,当前登录的用户只能看到由登录用户创建的项目。

其他改进

您是否尝试过将两台数据库服务器连接到一个实例中,这样应用程序就不需要单独关心与更多服务器的连接? 使用 CREATE FOREIGN TABLE 已经可以做到这一点,但是需要用每一列重新定义每个表。 当然,一旦外部表的结构发生变化,再次更改它。

从 9.5 版本开始,我们可以像这样简单地导入整个模式,因此我们不仅有更简单且不易出错的方法来连接两个远程数据库,而且对于数据迁移也非常方便:

IMPORT FOREIGN SCHEMA invoices
LIMIT TO (customers, customers_invoices)
FROM SERVER invoice.example.com INTO remote_invoices;

我们在 9.5 中还能找到什么? 当然有一些性能增强,但这几乎是每个版本都必须的,对吧? 不过,对于每个版本来说,可能并不常见的是一种全新的索引类型—— BRIN(区块范围指数). 根据文档,它是为处理非常大的表而设计的,其中某些列与其在表中的物理位置具有某种自然的相关性。 在这种情况下,可以使用位图索引扫描,特别是分析查询的性能可能会更好。

从 PostgreSQL 9.4 升级

请注意,从 PostgreSQL 9.4 升级不是自动的. 如果您在以前的某个版本中已经使用过 PostgreSQL,则需要继续升级。 升级过程(在 PostgreSQL 中很常见)不是自动过程,管理员需要手动执行这些步骤。 Fedora 通过提供 postgresql-setup 二进制文件来提供很大帮助,该二进制文件接受 –initdb(用于初始化数据目录)或 –upgrade 参数,并帮助几乎自动执行整个过程。

警告:在继续升级之前不要忘记备份所有数据。

系统升级后(本例中为 F23 到 F24),您在尝试运行 PostgreSQL 服务器后可能会看到如下内容:

$ sudo systemctl start postgresql.service
Job for postgresql.service failed because the control process exited with error code. See "systemctl status postgresql.service" and "journalctl -xe" for details.

那是因为服务器知道数据目录的版本并且拒绝开始不破坏任何东西。 所以让我们继续升级——首先安装升级子包:

$ sudo dnf install postgresql-upgrade

然后运行升级本身:

$ sudo postgresql-setup --upgrade
 * Upgrading database.
 * Upgraded OK.
WARNING: The configuration files were replaced by default configuration.
WARNING: The previous configuration and data are stored in folder
WARNING: /var/lib/pgsql/data-old.
 * See /var/lib/pgsql/upgrade_postgresql.log for details.

此时,您应该真正按照建议查看日志文件,但您现在也应该能够启动服务:

$ sudo systemctl start postgresql.service
$ sudo systemctl status postgresql.service

就这样。 容易,对吧? 与往常一样,欢迎任何反馈。