我叫Alexander Kotsyuruba,我在DomClick.ru负责内部服务的开发。
文章分为带有标题的部分。每个标题均指将PostgreSQL从一个版本升级到另一个版本。在每一章中,我们重点介绍了:
- 特征
- 潜在风险不相容
- 应用程序中断
- 性能下降
- 更新时寻找谁
- 系统管理员
- 开发者
- 评论
所以,让我们开始吧。
更新方式
pg_upgrade
这不是更新PostreSQL的最可靠方法。例如,当您使用PostgreSQL以前的版本进行REINDEX时,可能会出错。logical replication
— , downtime . , logical replication 10. pglogical ( 2ndquadrant), 9.4 12. , PostgreSQL<10.0, .pg_dumpall
— . — downtime.pg_dumpall --globals-only
pg_dump --create
. , , , PostgreSQL.
PostgreSQL 9.5 -> 9.6
to_char() ( )
, to_char('-4 years'::interval, 'YY') -04 , -4 . |
- to_char() , . |
||
extract() ( )
extract() «», . infinity -infinity , (, year, epoch), NULL (, day, hour). . |
extract() c , . |
||
pg_stat_activity , ( , )
, . pg_stat_activity . . waiting wait_event_type wait_event . |
- . . | ||
, email host ( )
, , tsvector , . |
, , . PostgreSQL . pg_dump , . .. pg_upgrade . |
||
CREATEUSER/NOCREATEUSER CREATE ROLE ( )
CREATEUSER SUPERUSER . , ( ), CREATEROLE . , , . |
, 9.6. | ||
, pg_ , ( )
. , initdb . |
|||
psql -c --no-psqlrc ( , )
--no-psqlrc ( -X ). psql. |
psql. | ||
pg_restore -t, , ( ) | |||
NextXID pg_controldata ( , )
--ID- : . / LSN, . |
|||
, , ( )
, . , ( pg_upgrade ), ALTER EXTENSION UPDATE ( ). |
pg_upgrade extension. pg_upgrade |
MVCC ( )
, , . , , , .old_snapshot_threshold
, MVCC . . , , , , .
解决了由于“打开交易去度假”而使数据库“膨胀”的问题;漫长的更新需要数小时;
select
在主机和从机上都长。这是两个选项之一,由于这两个选项无法将较长的请求从主机重新加载到从机,因此可以解决该问题。
PostgreSQL 9.6-> 10.0
特征 | 风险 | 谁要注意 | 评论 |
---|---|---|---|
从pg_upgrade 任何先前的PostgreSQL主版本升级后,必须重建哈希索引(Mithun Sai,Robert Haas,Amit Kapila)。
此要求是由于哈希索引机制的重大改进而导致的。为了方便重新编制索引的任务,它将 pg_upgrade 创建一个辅助脚本。 |
应用程序中断 | 系统管理员 | 另一种反对 pg_upgrade |
pg_xlog pg_wal , pg_clog pg_xact ( )
— , , , . . |
|||
SQL, «xlog» «wal» ( )
, pg_switch_xlog() pg_switch_wal() , pg_receivexlog — pg_receivewal , --xlogdir — --waldir . pg_xlog ; «xlog» . |
|||
WAL location lsn ( )
. |
|||
pg_basebackup WAL, ( )
pg_basebackup -X/--wal-method stream . none . pg_basebackup -x ( -X fetch ). |
|||
pg_hba.conf ( )
replication . , , all . - replication . , . |
|||
pg_ctl ( )
pg_ctl -w . |
|||
log_directory pg_log log ( ) |
|||
ssl_dh_params_file OpenSSL DH ( )
dh1024.pem. , dh1024.pem ; , DH. |
|||
DH, DH- OpenSSL, 2048 ( )
DH 1024 2048 , DH . SSL, Java Runtime Environment 6, DH 1024 , , SSL. , DH 1024 . |
|||
( )
password_encryption off plain . UNENCRYPTED CREATE/ALTER USER ... PASSWORD . --unencrypted createuser . , , . password_encryption md5 . |
|||
min_parallel_table_scan_size min_parallel_index_scan_size ( , )
min_parallel_relation_size , . |
«» . | ||
shared_preload_libraries ( )
, SQL- . |
|||
sql_inheritance ( )
, , . SQL , , PostgreSQL 7.1. |
|||
/ ( )
configure --disable-integer-datetimes . , PostgreSQL 8.3. |
: rpm, deb, etc. | ||
- 1.0 ( )
PostgreSQL 6.3. |
|||
contrib/tsearch2 ( )
, PostgreSQL 8.3. |
|||
createlang droplang ( )
PostgreSQL 9.1. CREATE EXTENSION DROP EXTENSION . |
|||
, , SELECT ( )
, , SELECT , , LATERAL FROM . , . , NULL . , , , . , , , CASE COALESCE . |
set-returning function (.. , ) FROM . , - SELECT . - , . . |
||
UPDATE ... SET (_) = _ ( )
_ ROW ; . _ , _ ROW , , . _.* _ , _ . |
这些是的通常规则row_constructor 。以UPDATE 这种方式使用它只是不寻常的。在实践中,尽管这种语法出现在PostgreSQL 8.2的文档中,但我从未见过这种情况。在版本10中,似乎已将此语法引入了其他版本PostgreSQL中使用的标准。不管看起来多么奇怪,都可以插入这样的代码。 |
有趣的功能
通过发布/订阅方案进行逻辑复制
一项有用的功能,可用于以最少的停机时间进行升级。
声明式表分区
新的声明性语法简化了表分区。
改善查询并行化
最初9.6引入了对大型查询的并行执行的支持。但它只涉及扫描,联接和聚合。
反过来,在10.0中,出现了并行执行的可能性:
- B树索引扫描
- 位图扫描
- 合并加入
- 不相关的子查询
使用SCRAM-SHA-256加强密码保护
可能与某些非标准(非libpq)PostgreSQL连接库不兼容。
PostgreSQL 10.0-> 11.0
特征 | 风险 | 谁要注意 | 评论 |
---|---|---|---|
与相对路径表达式的正确处理xmltable() ,xpath() 以及其他功能与XML工作(马库斯Winand)
从根节点根据该SQL标准,相对路径应当从XML文档节点考虑,而不是如用于这些功能的事情。 |
SQL. , XML. , . | ||
pg_dump , ( )
, GRANT/REVOKE ALTER DATABASE SET , pg_dumpall . pg_dump --create pg_restore --create . pg_dumpall -g , . pg_dumpall ( -g ) .
pg_dump pg_restore --create / ; .
pg_dumpall , , , . CREATE DATABASE , .
pg_dumpall --clean postgres template1, , . |
. , .. . . , pg_dump/pg_restore --create . , , . |
||
( , )
, . |
|||
adminpack pg_file_read() , pg_file_length() pg_logfile_rotate() ( )
. adminpack , ALTER EXTENSION ... UPDATE . |
|||
replacement_sort_tuples ( )
, . |
text ^@ text
SP-GiST ( )
LIKE '%'
btree, .
按前缀搜索是很常见的。为此,我们添加了一个支持特殊索引的特殊运算符。最有趣的是,官方文档中没有对这个运算符说一句话。相反,提到了一个函数
starts_with
-该运算符所基于的内部函数,但是其使用并不能使用索引来提供加速。
将表达式还原为等价=
的表达式IS NOT NULL
(Tom Lane)
这可以提高选择性得分。
奇怪的是,我们在实践中遇到了这样的设计。显然,这种情况并不罕见。
PostgreSQL 11.0-> 12.0
btree ( , )
/ , , . .
,pg_upgrade
.
另一个论点是不赞成的
pg_upgrade
。
结论
此清单是我们从PostgreSQL官方资源中摘录的。实际上,根据开发方法的不同,某些兼容性对您的重要性可能有所不同。如果本文能使某人免于数据丢失或减少更新PostgreSQL的人工成本,我将感到高兴。
PS
感谢Oleg Samoilov(杂种),以帮助您准备本文。