1,375 22/03/2026 07/04/2026 3 min

PostgreSQL è un potente sistema di gestione di database relazionali, ma, come ogni software, può presentare problematiche. Tra queste, gli indici corrotti possono causare rallentamenti significativi e errori durante le query. Questo articolo si concentrerà su come diagnosticare e ripristinare indici corrotti in PostgreSQL 15, assicurando la continuità dell'operatività.

Prerequisiti

  • Accesso al server PostgreSQL con privilegi adeguati.
  • Conoscenza di base delle operazioni SQL e dell'architettura di PostgreSQL.
  • Backup recente del database per evitare perdite di dati.

Step per la Diagnosi degli Indici Corrotti

1. Identificazione dei Sintomi

Prima di tutto, bisogna riconoscere i sintomi di un indice corrotto. Questi possono includere:

  • Query che impiegano più tempo del solito.
  • Messaggi di errore durante l'esecuzione delle query, come invalid page header.
  • Risultati incoerenti nelle query.

2. Esecuzione del Comando di Diagnosi

Una volta identificati i sintomi, è possibile eseguire un controllo degli indici. Utilizzare il comando REINDEX in combinazione con pg_class e pg_index:

SELECT c.relname, i.indisvalid
FROM pg_class c
JOIN pg_index i ON c.oid = i.indrelid
WHERE i.indisvalid = false;

# Output: Elenco degli indici non validi

Perché funziona: questo comando utilizza le tabelle di sistema di PostgreSQL per identificare gli indici non validi.

3. Verifica della Corruzione

Se si sospetta una corruzione, è utile eseguire:

REINDEX INDEX nome_indice;

# Output: Ripristino dell'indice specifico

Perché funziona: questo comando ricostruisce l'indice specificato, risolvendo eventuali problemi di corruzione.

Step per il Ripristino di Indici Corrotti

1. Eseguire il Backup

Prima di effettuare modifiche, è fondamentale eseguire un backup del database:

pg_dump -U utente -F c -b -v -f "backup_file" nome_database;

# Output: File di backup creato

Perché funziona: il backup garantirà che i dati possano essere recuperati in caso di errori durante il ripristino.

2. Ripristino dell'Indice

Una volta confermata la corruzione, procedere con il ripristino:

REINDEX TABLE nome_tabella;

# Output: Indici della tabella ripristinati

Perché funziona: questo comando ricostruisce tutti gli indici associati alla tabella specificata.

3. Verifica Post-Ripristino

Dopo il ripristino, è importante verificare che gli indici siano nuovamente validi:

SELECT c.relname, i.indisvalid
FROM pg_class c
JOIN pg_index i ON c.oid = i.indrelid
WHERE i.indisvalid = false;

# Output: Conferma che non ci siano indici non validi

Perché funziona: riutilizzando il comando precedente, possiamo assicurarci che tutti gli indici siano stati ripristinati correttamente.

Verifica Finale

Dopo aver eseguito i passaggi sopra indicati, tornare a eseguire le query problematiche per assicurarsi che non ci siano più problemi di prestazioni.

Troubleshooting

Se si riscontrano ulteriori problemi, considerare i seguenti messaggi di errore comuni:

Errore 1: invalid page header

Messaggio: invalid page header in block ...

Causa: L'indice è corrotto a causa di un crash del server o problemi hardware.

Fix: Eseguire REINDEX come descritto precedentemente.

Errore 2: index "nome_indice" does not exist

Messaggio: index "nome_indice" does not exist

Causa: L'indice potrebbe essere stato eliminato o non creato correttamente.

Fix: Ricreare l'indice utilizzando il comando CREATE INDEX.

Errore 3: could not open file "base/...../....": No such file or directory

Messaggio: could not open file

Causa: Problemi con il filesystem o corruzione dei dati.

Fix: Verificare lo stato del filesystem e considerare il ripristino da un backup.

Conclusione

Gestire indici corrotti in PostgreSQL 15 può sembrare complesso, ma seguendo i passaggi descritti è possibile affrontare e risolvere il problema efficacemente. È cruciale mantenere un backup regolare e monitorare le prestazioni delle query per prevenire situazioni di emergenza.

Il prossimo passo concreto è implementare un sistema di check regolare per gli indici, utilizzando script automatizzati per garantire la stabilità del tuo database nel lungo termine.