Indicizzare di nuovo una tabella quando l'autovacuum è in esecuzione - Amazon Relational Database Service

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Indicizzare di nuovo una tabella quando l'autovacuum è in esecuzione

Se un indice diventa corrotto, l'autovacuum continua a elaborare la tabella e avrà esito negativo. Setenti di eseguire un vacuum manuale in questa situazione, riceverai un messaggio di errore come il seguente.

postgres=> vacuum freeze pgbench_branches; ERROR: index "pgbench_branches_test_index" contains unexpected zero page at block 30521 HINT: Please REINDEX it.

Quando l'indice è corrotto e l'autovacuum sta tentando l'esecuzione sulla tabella, ci sarà una contesa con una sessione di autovacuum già in esecuzione. Quando si REINDEXimpartisce un comando, si disattiva un blocco esclusivo sul tavolo. Le operazioni in scrittura sono bloccate e anche quelle in lettura che utilizzano l’indice specifico.

Per indicizzare di nuovo una tabella quando l'autovacuum è in esecuzione sulla tabella
  1. Apri due sessioni nel database che contiene la tabella da sottoporre a vacuum. Per la seconda sessione, utilizzare "screen" o un'altra utility che mantiene la sessione se la connessione viene interrotta.

  2. Nella prima sessione, avvia la sessione PID di autovacuum in esecuzione sul tavolo.

    Eseguite la seguente query per ottenere il risultato della sessione PID di autovacuum.

    SELECT datname, usename, pid, current_timestamp - xact_start AS xact_runtime, query FROM pg_stat_activity WHERE upper(query) like '%VACUUM%' ORDER BY xact_start;
  3. Nella sessione due, rilasciare il comando di reindicizzazione.

    \timing on Timing is on. reindex index pgbench_branches_test_index; REINDEX Time: 9.966 ms
  4. Nella sessione uno, se l'autovacuum bloccava il processo, in pg_stat_activity vedi che l'attesa è "T" per la sessione di vacuum. In questo caso, termina il processo di autovacuum.

    SELECT pg_terminate_backend('the_pid');

    In questo momento, inizia la sessione. È importante notare che l'autovacuum si riavvia immediatamente poiché questa tabella è probabilmente la più alta nella lista di lavori.

  5. Avvia il comando nella sessione due, quindi termina il processo di autovacuum nella sessione 1.

  翻译: