更新PostgreSQL版本,或如何在更新时不删除​​数据库?

我们决定共享PostgreSQL升级团队的备忘录(清单)。在其中,我们以PostgreSQL官方文档发布中提供的功能为基础,对兼容性问题进行了分析,并且谁应该注意更新的功能。





我叫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_receivexlogpg_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_constructorUPDATE这种方式使用它只是不寻常的在实践中,尽管这种语法出现在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



特征 风险 谁要注意 评论
substring(), SQL, , «» ( )



, , , ; , %#"aa*#"% , a.
, , SQL. - substring() , , . , .
recovery.conf postgresql.conf ( , , -, )



recovery.conf , , . recovery.signal standby.signal. trigger_file promote_trigger_file, standby_mode .
recovery_target* ( )



, recovery_target, recovery_target_lsn, recovery_target_name, recovery_target_time recovery_target_xid. , . , , .
( )



recovery_target_timeline latest. current.
pg_verify_checksums pg_checksums ( )
pg_restore -f — ( )



, , .
\pset format psql ( )



, , \pset format a aligned; asciidoc, .
\pset psql. , , psql \pset.
btree 8 ( )



REINDEX , pg_upgrade, .
. , . , . pg_upgrade.
( )



, dynamic_shared_memory_type none.
(CTE), . , , , , . 12- CTE . , , , . , .



, pg_stat_statments . , template1.




btree ( , )



/ , , . .



, pg_upgrade.


另一个论点是不赞成的pg_upgrade



结论



此清单是我们从PostgreSQL官方资源中摘录的。实际上,根据开发方法的不同,某些兼容性对您的重要性可能有所不同。如果本文能使某人免于数据丢失或减少更新PostgreSQL的人工成本,我将感到高兴。



PS



感谢Oleg Samoilov(杂种),以帮助您准备本文。



All Articles