Japin

登高必自卑,行远必自迩

以下信息侧重于使用 GNU C 库 (glibc) 的操作系统,其中包括最流行的 Linux 发行版。所有版本的 PostgreSQL 都会受到影响。其他操作系统原则上可能存在相同的问题,但我们尚未收集任何相关信息。

PostgreSQL 使用操作系统的 C 库提供的语言环境数据对文本进行排序。排序发生在各种上下文中,包括用户输出、合并连接、B 树索引和范围分区。在后两种情况下,排序后的数据被持久化到磁盘。如果 C 库中的语言环境在数据库的生命周期中发生变化,则持久化的数据可能会与预期的排序顺序不一致,从而导致错误的查询结果和其他不正确的行为。例如,如果索引未按照索引扫描所期望的方式进行排序,则查询可能无法找到实际存在的数据,并且更新可能会插入不应允许的重复数据。同样,在分区表中,查询可能会在错误的分区中查找,而更新可能会写入错误的分区。因此,对于数据库的正确操作,避免语言环境在数据库的生命周期内发生不兼容的变化是至关重要的。

操作系统供应商,尤其是 GNU C 库的作者,不时地以较小的方式更改语言环境以纠正错误或添加对更多语言的支持。虽然这在理论上违反了上述规则,但从历史上看,它影响的用户很少,也没有受到广泛关注。但是,在 2018-08-01 发布的 glibc 版本 2.28 中,包含了对语言环境数据的重大更新,这可能会影响许多用户的数据。需要注意的是,更新本身是合法的,因为它使语言环境符合当前的国际标准。但是,如果将这些更新应用于现有的 PostgreSQL 系统,则必然会出现问题。

操作系统供应商负责将 glibc 更新集成到 Linux 发行版中。我们希望长期支持 Linux 发行版的供应商不会在给定版本中对其发行版应用不兼容的语言环境更新,但这只是一种预期,因为我们无法预测或影响未来的行动。此外,PostgreSQL 目前无法检测到不兼容的 glibc 更新。因此,在规划任何更新或升级时需要一些手动操作。

阅读全文 »

最近,应用开发报来一个问题,错误信息如下:

1
2
ERROR:  could not read block 0 in file "base/16385/2294016": read only 0 of 8192 bytes
CONTEXT: SQL function "obj_description" during startup

这个错误信息和之前遇到的 PostgreSQL HASH 索引拾遗一文的情况很像。但是这里的数据库是 10.4,且是单节点模式,因此排除 HASH 索引的问题。

阅读全文 »

在 PostgreSQL 中,查询一般会经历以下几个阶段:

  1. 应用程序连接到 PostgreSQL 并发送查询请求,随后等待返回结果。
  2. 解析器(parser)检查应用程序传输的查询的语法是否正确并创建查询树(query tree)。
  3. 重写系统(rewrite system)采用解析器阶段创建的查询树,并查找存储在系统表中的规则来重写查询树,例如视图。
  4. 规划器/优化器(planner/optimizer)采用(重写的)查询树并创建一个查询计划,该计划将作为执行器(executor)的输入。
    它首先创建得到相同结果的所有路径。例如,在表上有索引,那么将会创建两个查询路径:顺序扫描和索引扫描。接下来估计每条路径的执行成本并选择最便宜的路径,将最便宜的路径扩展为执行器可以使用的完整计划。
  5. 执行器递归地遍历计划树并以计划表示的方式检索行。执行器在扫描表时会使用存储系统、执行排序和连接、估算条件并最后归还得到的行。
阅读全文 »

pg_cron 是 PostgreSQL 数据库的一个作业调度器插件,通过该插件我们可以定时的执行一些特殊的任务。它遵循 Linux crontab 的配置语法,您可以通过在线工具 crontab.guru 来验证您的 cron 表达式。目前,pg_cron 仅支持 PostgreSQL 10 及其之后的版本。本文将简要介绍 pg_cron 的安装及其使用。

阅读全文 »

上一篇中我介绍了如何在 PostgreSQL 数据库中使用存储过程来发送 HTTP 请求,本文则介绍如何使用 PostgreSQL 的存储过程发送邮件。

Oracle 数据库提供了 ult_smtp 来发送邮件,PostgreSQL 同样的不支持该功能,因此只能采取曲线救国的策略,本文将采用 plpython3u 来编写存储过程并发送邮件。

阅读全文 »

在 Oracle 迁移到 PostgreSQL 数据库的过程中,我们通常使用 PostgreSQL 中的 VARCHAR 类型替换 Oracle 中的 VARCHAR2 类型。本文将针对 Oracle 中的 VARCHAR2 类型和 PostgreSQL 中的 VARCHAR 类型进行简要的比较。

阅读全文 »
0%