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_upgrade
No 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
select
en 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_upgrade cualquier 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_upgrade creará 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_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 , , . _.* _ , _ . |
Estas son las reglas habituales para row_constructor . Es inusual usarlo de UPDATE esta 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_with
se 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ónIS NOT NULL
en 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
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.