墨墨导读:本文讨论了PostgreSQL 13新版本中的一些隐藏新特性。
数据技术嘉年华,十周年盛大开启,点我立即报名!大会以“自研·智能·新基建——云和数据促创新 生态融合新十年” 为主题,相邀数据英雄,总结过往十年历程与成绩,展望未来十年趋势与目标!
原文作者:JONATHAN S. KATZ 原文标题:Hidden Gems of PostgreSQL 13 原文链接:https://info.crunchydata.com/blog/postgresql-13-hidden-gems 译者:多米爸比
PostgreSQL 13是一个幸运的发行版!该版本有一些非常有影响力的新特性,将在秋季的预定时间发布。
在PostgreSQL发布过程中,我最喜欢的部分之一是回顾和讨论新版本中的特性,并了解它们如何对我们的用户产生正面的影响。例如,在历届PGCon会议上,我了解了PostgreSQL 12如何引入了进行多种身份认证的特性。
每个发行版都会有一些隐藏特性。(这些特性可能不会直接从纸面上看到,但在实际需要时它们会产生很大的作用。)Postgres 13也不例外:这些特性或使写查询更容易,或添加安全层,或帮助您避免服务宕机。
PostgreSQL 13的隐藏"杀手锏"特性有哪些呢?
PostgreSQL 9.4引入了复制槽,复制槽(物理复制槽)提供了一种便捷的方法来防止备库与主备不同步,它也是实现逻辑复制的基本组件。可以说,这使得PostgreSQL流复制设置变得接近“一设即忘”:一旦设置完成,流复制将正常工作,您可能不用担心出现不同步的情况。
但是,这引出了一种新的问题:“未感知的复制槽”。下面根据我个人经验对这一名词进行解释。
复制槽的工作原理:主库PostgreSQL实例会一直保留预写日志(WAL)文件,直到所有备库所需的插槽都确认已接收到特定段为止。只有完成此操作后,主库实例才会移除相应的WAL文件。另外我们知道在标准的PostgreSQL安装中,WAL文件的大小为16MB。
之前我编写了一个使用逻辑复制(当时通过逻辑解码)的应用程序,该程序将从数据库中流式传输所有数据更改,并根据这些更改进行应用(又称为“捕获数据更改”)。有时,不仅该程序的进程崩溃,我的一些监控项也会失败(循环崩溃)。但是,有一个监控项没有失败:数据库磁盘空间耗尽的警告!
事情原由:有一个复制槽未被感知到与备库失联,因此我的数据库主库一直保留WAL文件。如果不进行干预,我的PostgreSQL实例可能会耗尽磁盘空间并完全崩溃。
这引出了PostgreSQL 13的一个隐藏特性:“max_slot_keep_wal_size”。设置参数值后,该值表示如果复制槽被感知到失联,保留WAL文件的最大数量。如果超过该值,PostgreSQL将开始删除最早的WAL文件。
好消息是此特性可以帮助防止由于意外失联的复制槽而导致的服务宕机。但是,您可能会面临备库不同步的问题后必须重建的风险。
不管如何使用复制槽,PostgreSQL流复制还未完全达到“一设即忘”的程度:您确实需要监控PostgreSQL流复制的运行状况。
在数学考试中这不是一个技巧性的问题:PostgreSQL 13在其数学库中添加了gcd(最大公约数)和lcm(最小公倍数)函数!这些函数有助于解决涉及对齐相关的问题,当您遇到这种情况时,您将会对这一特性表达感激!
当使用postgres_fdw将应用程序部署到生产环境时,要考虑很多事情,尤其是在安全性方面。一个重要的考虑因素:数据库实例如何向另一个实例进行身份认证?
PostgreSQL 13通过引入使用基于证书的身份认证功能,扩展了PostgreSQL FDW身份认证的可能性。基于证书的身份认证比基于密码认证更有安全优势。虽然设置证书可能需要花费更多的工作,但从长远来看,它更易于管理和保护安全。
基于身份认证的机制扩展到postgres_fdw,以及下面另一个隐藏特性将对生产系统中的安全性进一步增强!
下面接着说关于认证的隐藏特性…
您是否遇到过想使用加密证书连接到PostgreSQL,但又不想每次都输入交互式的密码?
PostgreSQL 13添加了一个新的客户端连接参数,名为 sslpassword,该参数可让您指定证书的密码作为连接字符串的一部分。这使应用程序更方便地利用加密的证书,而不再需要与用户进行交互!
想充分利用这一隐藏特性,您仍然需要将证书密码保存在安全的位置。
Unicode标准化是unicode字符串比较的一项重要技术。例如,标准化是为SCRAM身份认证准备UTF-8字符串的关键步骤,因为它确保规范等效的字符串可以进行比较。
PostgreSQL 13添加了“标准化”函数,只要服务器使用UTF-8,该函数就可以用于字符串标准化。这个特性有助于在UTF-8字符串上执行查找:您也可以使用标准化函数作为表达式索引的一部分。
在以前的版本您可能知道使用gen_random_uuid()函数在PostgreSQL数据库中生成UUID,在PostgreSQL 13之前必须安装pgcrypto扩展才能使用这些函数。
尽管pgcrypto这个扩展功能很棒,但您肯有很多原因不需要安装它也能生成v4版本的UUID函数。在PostgreSQL 13里是很方便的,因为有这一隐藏特性。
Postgres 13中添加了许多优雅的术语描述,也是我想向您介绍的PostgreSQL术语表。PostgreSQL生态系统中有很多术语,很难完全掌握,包括首字母缩写词,例如我总是会查找ACID的解释,因为这个词的字母顺序我脑子经常会弄乱。
该词汇表是PostgreSQL 13文档中添加的一个很赞的特性,我鼓励您进行查看和挖掘!