Actualización de la versión de PostgreSQL, o ¿Cómo no eliminar la base de datos al actualizar?

Decidimos compartir una nota (lista de verificación) de nuestro equipo de actualización de PostgreSQL. En él, tomamos como base las características presentadas en el lanzamiento de la documentación oficial de PostgreSQL, realizamos un análisis por problemas de compatibilidad y quién debe prestar atención a la funcionalidad actualizada.





Mi nombre es Alexander Kotsyuruba, gestiono el desarrollo de servicios internos en DomClick.ru.



El artículo está dividido en partes con títulos. Cada encabezado se refiere a la actualización de PostgreSQL de una versión a otra. Dentro de cada capítulo, hemos destacado:



  • Característica
  • Riesgo de posibles incompatibilidades

    • Interrupción de la aplicación
    • Caída en el rendimiento
  • A quién buscar al actualizar

    • Administrador de sistema
    • Desarrollador
  • Comentario


Vamos a empezar.



Métodos de actualización



  • pg_upgradeNo es la forma más confiable de actualizar PostreSQL. Por ejemplo, es posible que obtenga un error mientras REINDEX de una versión anterior de PostgreSQL.
  • 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 . . , , , , .


Resuelve el problema de "hinchar" la base de datos debido a que "abrió una transacción y se fue de vacaciones"; actualizaciones irreflexivas que llevan horas; tanto selecten el maestro como en el esclavo. Esta es una de las dos opciones, gracias a las cuales será posible resolver el problema, debido a que no pueden recargar solicitudes largas de maestro a esclavo.



PostgreSQL 9.6 -> 10.0



Característica Riesgo Quién debería prestar atención Comentario
Después de actualizar desde pg_upgradecualquier versión principal anterior de PostgreSQL, los índices hash deben reconstruirse (Mithun Sai, Robert Haas, Amit Kapila).



Este requisito se debe a mejoras significativas en los índices hash. Para facilitar la tarea de reindexar, pg_upgradecreará un guión auxiliar.
Interrupción de la aplicación Administrador de sistema Otro argumento en contra 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, , . _.* _ , _.
Estas son las reglas habituales para row_constructor. Es inusual usarlo de UPDATEesta manera. En la práctica, no he visto tales casos, aunque tal sintaxis apareció en la documentación en PostgreSQL 8.2. En la versión 10, parece que esta sintaxis se llevó a un estándar que se usa en otras versiones de PostgreSQL. No importa lo extraño que pueda parecer, es posible insertar un código de este tipo.


Características interesantes



Publicación / suscripción de replicación lógica


Una función útil que se puede utilizar para actualizar con un tiempo de inactividad mínimo.



Partición declarativa de tablas


La nueva sintaxis declarativa simplifica la partición de tablas.



Mejora de la paralelización de consultas


Inicialmente, la versión 9.6 introdujo soporte para la ejecución paralela de consultas grandes. Pero solo se refería a escaneos, uniones y agregaciones.



En 10.0, a su vez, apareció la posibilidad de ejecución paralela:



  • Escaneo de índice de árbol B
  • Escaneo de mapa de bits
  • Fusionar uniones
  • Subconsultas no correlacionadas


Protección con contraseña más sólida con SCRAM-SHA-256


Puede ser incompatible con algunas bibliotecas de conexión PostgreSQL no estándar (no libpq).



PostgreSQL 10.0 -> 11.0



Característica Riesgo Quién debería prestar atención Comentario
La correcta manipulación de expresiones con rutas relativas en xmltable(), xpath()y otras funciones que el trabajo con XML (Markus Winand)



De acuerdo con el estándar SQL, las rutas relativas se debe considerar desde el nodo del documento XML, y no desde el nodo raíz, ya que estas funciones a sus obras.
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, .


La búsqueda por prefijo es bastante común. Para esto, agregamos un operador especial con soporte para índices especiales. Y lo que es más interesante, la documentación oficial no dice ni una palabra sobre este operador. En cambio, starts_withse menciona una función, una función interna en la que se basa este operador, pero su uso no proporciona aceleración mediante un índice.



Reducir una expresión = a una expresión IS NOT NULLen la que son equivalentes (Tom Lane)



Esto mejora la puntuación de selectividad.


Curiosamente, hemos encontrado un diseño así en la práctica. Aparentemente, estos casos no son infrecuentes.



PostgreSQL 11.0 -> 12.0



Característica Riesgo Quién debería prestar atención Comentario
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.


Otro argumento no está a favor pg_upgrade.



Conclusión



Esta lista de verificación es nuestro extracto de los recursos oficiales de PostgreSQL. En la práctica, dependiendo de los enfoques de desarrollo, la importancia de cierta compatibilidad para usted puede ser diferente. Me alegraría que el artículo salvara a alguien de la pérdida de datos o redujera los costos laborales de actualizar PostgreSQL.



PD



Gracias a Oleg Samoilov (splarv) para obtener ayuda en la preparación del artículo.



All Articles