Resolución de bloqueadores de vaciado no identificables en RDS para PostgreSQL
En esta sección se analizan otros motivos que pueden impedir que el progreso del vaciado. Actualmente, la función postgres_get_av_diag()
no puede identificar directamente estos problemas.
Páginas no válidas
Se produce un error de página no válida cuando PostgreSQL detecta una discrepancia en la suma de comprobación de una página al acceder a esa página. El contenido resulta ilegible, lo que impide que autovacuum congele las tuplas. Esto detiene de forma efectiva el proceso de limpieza. El siguiente error está escrito en el registro de PostgreSQL:
WARNING: page verification failed, calculated checksum YYYYY but expected XXXX ERROR: invalid page in block ZZZZZ of relation base/XXXXX/XXXXX CONTEXT: automatic vacuum of table
myschema.mytable
Determinar el tipo de objeto
ERROR: invalid page in block 4305910 of relation base/16403/186752608 WARNING: page verification failed, calculated checksum 50065 but expected 60033
A partir del mensaje de error, la ruta base/16403/186752608
proporciona la siguiente información:
-
“base” es el nombre del directorio de datos de PostgreSQL.
-
“16403” es el OID de la base de datos, que puede buscar en el catálogo del sistema
pg_database
. -
“186752608” es el
relfilenode
, que puede utilizar para buscar el nombre del objeto y el esquema en el catálogo del sistemapg_class
.
Al comprobar el resultado de la siguiente consulta en la base de datos afectada, puede determinar el tipo de objeto. La siguiente consulta recupera información de objeto para el oid: 186752608. Sustituya este OID por el correspondiente para el error que haya encontrado.
SELECT relname AS object_name, relkind AS object_type, nspname AS schema_name FROM pg_class c JOIN pg_namespace n ON c.relnamespace = n.oid WHERE c.oid = 186752608;
Para obtener más información, consulte la documentación de PostgreSQL sobre pg_class
relkind
de pg_class
.
Indicaciones
La solución más eficaz para este problema depende de la configuración de la instancia específica de Amazon RDS y del tipo de datos afectados por la página incoherente.
Si el tipo de objeto es un índice:
Se recomienda volver a crear el índice.
-
Uso de la opción
CONCURRENTLY
: antes de la versión 12 de PostgreSQL, la reconstrucción de un índice requería un bloqueo de tabla exclusivo, lo que restringía el acceso a la misma. Con PostgreSQL versión 12 y versiones posteriores, la opciónCONCURRENTLY
permite el bloqueo por filas, lo que mejora significativamente la disponibilidad de la tabla. A continuación, se muestra el comando:REINDEX INDEX
ix_name
CONCURRENTLY;Si bien
CONCURRENTLY
resulta menos disruptivo, puede ser más lento en tablas de uso intensivo. Si es posible, considere la posibilidad de crear el índice durante los períodos de poco tráfico.Para obtener más información, consulte la documentación de PostgreSQL sobre REINDEX
. -
Uso de la opción
INDEX_CLEANUP FALSE
: si los índices son grandes y se calcula que tardarán mucho en completarse, puede desbloquear el autovacuum ejecutando unVACUUM FREEZE
manual y excluyendo los índices. Esta funcionalidad está disponible en la versión 12 y posteriores de PostgreSQL.Omitir los índices le permitirá saltarse el proceso de vaciado del índice incoherente y mitigar el problema del reinicio. Sin embargo, esto no resolverá el problema subyacente de la página no válida. Para solucionar por completo el problema de la página no válida y resolverlo, tendrá que volver a crear el índice.
Si el tipo de objeto es una vista materializada:
Si se produce un error de página no válida en una vista materializada, inicie sesión en la base de datos afectada y actualícela para resolver la página no válida:
Actualice la vista materializada:
REFRESH MATERIALIZED VIEW schema_name.materialized_view_name;
Si se produce un error al actualizar, intente volver a crearla:
DROP MATERIALIZED VIEW schema_name.materialized_view_name; CREATE MATERIALIZED VIEW schema_name.materialized_view_name AS query;
Al actualizar o volver a crear la vista materializada, se restaura sin que esto afecte a los datos de la tabla subyacente.
Para todos los demás tipos de objetos:
Para todos los demás tipos de objetos, puede ponerse en contacto con el servicio de asistencia de AWS.
Incoherencia en los índices
Un índice que no sea coherente desde el punto de vista lógico puede impedir que avance el autovacuum. Los siguientes errores u otros similares se registran durante la fase de vaciado del índice o cuando se accede al índice mediante instrucciones SQL.
ERROR: right sibling's left-link doesn't match:block 5 links to 10 instead of expected 2 in index
ix_name
ERROR: failed to re-find parent key in index "XXXXXXXXXX" for deletion target page XXX CONTEXT: while vacuuming index
index_name
of relationschema.table
Indicaciones
Reconstruya el índice u omita los índices utilizando INDEX_CLEANUP
con un VACUUM FREEZE
manual. Para obtener información sobre cómo reconstruir el índice, consulte Si el tipo de objeto es un índice.
-
Uso de la opción CONCURRENTLY: antes de la versión 12 de PostgreSQL, la reconstrucción de un índice requería un bloqueo de tabla exclusivo, lo que restringía el acceso a la misma. Con PostgreSQL versión 12 y versiones posteriores, la opción CONCURRENTLY permite el bloqueo por filas, lo que mejora significativamente la disponibilidad de la tabla. A continuación, se muestra el comando:
REINDEX INDEX ix_name CONCURRENTLY;
Si bien CONCURRENTLY resulta menos disruptivo, puede ser más lento en tablas de uso intensivo. Si es posible, considere la posibilidad de crear el índice durante los períodos de poco tráfico. Para obtener más información, consulte REINDEX
en la documentación de PostgreSQL. -
Uso de la opción INDEX_CLEANUP FALSE: si los índices son grandes y se calcula que tardarán mucho en completarse, puede desbloquear el autovacuum ejecutando un VACUUM FREEZE manual y excluyendo los índices. Esta funcionalidad está disponible en la versión 12 y posteriores de PostgreSQL.
Omitir los índices le permitirá saltarse el proceso de vaciado del índice incoherente y mitigar el problema del reinicio. Sin embargo, esto no resolverá el problema subyacente de la página no válida. Para solucionar por completo el problema de la página no válida y resolverlo, tendrá que volver a crear el índice.
Tasa de transacciones excepcionalmente alta
En PostgreSQL, las tasas de transacción altas pueden afectar significativamente al rendimiento de autovacuum, lo que implica una limpieza más lenta de las tuplas inactivas y a un aumento del riesgo de reiniciar los ID de transacción. Puede supervisar la tasa de transacciones midiendo la diferencia en max(age(datfrozenxid))
entre dos períodos de tiempo, normalmente por segundo. Además, puede utilizar las siguientes métricas de contador de Información de rendimiento de RDS para medir la tasa de transacciones (la suma de xact_commit y xact_rollback), que es el número total de transacciones.
Contador | Tipo | Unidad | Métrica |
---|---|---|---|
xact_commit |
Transacciones |
Confirmaciones por segundo |
db.Transactions.xact_commit |
xact_rollback |
Transacciones |
Restauraciones por segundo |
db.Transactions.xact_rollback |
Un aumento rápido indica una alta carga de transacciones, lo que puede ser excesivo para autovacuum y provocar sobrecargas, bloqueos y posibles problemas de rendimiento. Esto puede tener un impacto negativo en el proceso de autovacuum de dos maneras:
-
Actividad de la tabla: la tabla específica que se está vaciando podría estar registrando un gran volumen de transacciones, lo que provocaría retrasos.
-
Recursos del sistema: el sistema en general puede estar sobrecargado, lo que dificulta que autovacuum acceda a los recursos necesarios para funcionar de manera eficiente.
Plantéese las siguientes estrategias para permitir que autovacuum funcione de manera más eficaz y pueda seguir el ritmo de sus tareas:
-
Reduzca la tasa de transacciones si es posible. Plantéese la posibilidad de agrupar o agrupar transacciones similares cuando sea posible.
-
Utilice tablas que se actualicen con frecuencia mediante la operación
VACUUM FREEZE
manual cada noche, semana o quincena durante las horas de menor actividad. -
Plantéese la posibilidad de escalar verticalmente su clase de instancia para asignar más recursos del sistema con el fin de administrar el volumen de transacciones elevado y el autovacuum.