Riduzione della dimensione nelle tabelle e negli indici con l’estensione pg_repack - 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à.

Riduzione della dimensione nelle tabelle e negli indici con l’estensione pg_repack

Puoi usare l'pg_repackestensione per rimuovere il bloat da tabelle e indici in alternativa a. VACUUM FULL Questa estensione è supportata nelle versioni 9.6.3 e RDS successive di Postgre. SQL Per ulteriori informazioni sull'pg_repackestensione e sul repack completo della tabella, consulta la documentazione del progetto. GitHub

Al contrarioVACUUM FULL, l'pg_repackestensione richiede un lock (AccessExclusiveLock) esclusivo solo per un breve periodo di tempo durante l'operazione di ricostruzione della tabella nei seguenti casi:

  • Creazione iniziale della tabella di log: viene creata una tabella di log per registrare le modifiche che si verificano durante la copia iniziale dei dati, come illustrato nell'esempio seguente:

    postgres=>\dt+ repack.log_* List of relations -[ RECORD 1 ]-+---------- Schema | repack Name | log_16490 Type | table Owner | postgres Persistence | permanent Access method | heap Size | 65 MB Description |
  • swap-and-dropFase finale.

Per il resto dell'operazione di ricostruzione, è sufficiente un ACCESS SHARE blocco sulla tabella originale per copiare le righe da essa alla nuova tabella. Ciò consente alle DELETE operazioni INSERTUPDATE, e di procedere come al solito.

Raccomandazioni

I seguenti consigli si applicano quando si rimuove bloat dalle tabelle e dagli indici utilizzando l'estensione: pg_repack

  • Esegui il repack durante le ore non lavorative o durante una finestra di manutenzione per minimizzarne l'impatto sulle prestazioni di altre attività del database.

  • Monitora attentamente le sessioni di blocco durante l'attività di ricostruzione e assicurati che sulla tabella originale non vi siano attività potenzialmente bloccabilipg_repack, in particolare durante la swap-and-drop fase finale, quando è necessario un blocco esclusivo sulla tabella originale. Per ulteriori informazioni, vedere Identificazione degli elementi che bloccano una query.

    Quando viene visualizzata una sessione di blocco, è possibile interromperla utilizzando il seguente comando dopo un'attenta valutazione. Questo aiuta a continuare pg_repack a completare la ricostruzione:

    SELECT pg_terminate_backend(pid);
  • Durante l'applicazione delle modifiche accumulate dalla tabella di pg_repack's registro su sistemi con un tasso di transazione molto elevato, il processo di applicazione potrebbe non essere in grado di tenere il passo con la frequenza delle modifiche. In questi casi, non pg_repack sarebbe in grado di completare la procedura di candidatura. Per ulteriori informazioni, consulta Monitoraggio della nuova tabella durante il repack. Se gli indici sono molto gonfi, una soluzione alternativa consiste nell'eseguire un reimpacchettamento del solo indice. Ciò consente inoltre di completare più rapidamente VACUUM i cicli di pulizia degli indici.

    È possibile saltare la fase di pulizia dell'indice utilizzando il manuale disponibile nella SQL versione 12 di Postgre, che viene saltata automaticamente durante l'autovacuum di emergenza a VACUUM partire dalla versione 14 di Postgre. SQL Ciò consente di VACUUM completare il processo più rapidamente senza rimuovere il gonfiore dell'indice ed è pensato solo per situazioni di emergenza, ad esempio per impedire il wraparound. VACUUM Per ulteriori informazioni, consulta Avoiding Bloat negli indici nella Guida per l'utente di Amazon Aurora.

Prerequisiti

  • La tabella deve avere PRIMARY KEY un vincolo o non nullo. UNIQUE

  • La versione dell'estensione deve essere la stessa sia per il client che per il server.

  • Assicurati che l'RDSistanza abbia una dimensione FreeStorageSpace superiore alla dimensione totale della tabella senza il problema. Ad esempio, considera la dimensione totale della tabella, compresi gli indici, pari a 2 TB TOAST e il gonfiore totale nella tabella pari a 1 TB. Il valore richiesto FreeStorageSpace deve essere superiore al valore restituito dal seguente calcolo:

    2TB (Table size) - 1TB (Table bloat) = 1TB

    È possibile utilizzare la seguente query per verificare la dimensione totale della tabella e utilizzarla pgstattuple per ricavare bloat. Per ulteriori informazioni, consulta Diagnosticare il gonfiamento di tabelle e indici nella Guida per l'utente di Amazon Aurora

    SELECT pg_size_pretty(pg_total_relation_size('table_name')) AS total_table_size;

    Questo spazio viene recuperato dopo il completamento dell'attività.

  • Assicurati che l'RDSistanza abbia una capacità di elaborazione e IO sufficiente per gestire l'operazione di repack. Potresti prendere in considerazione l'idea di scalare la classe dell'istanza per un equilibrio ottimale delle prestazioni.

Per utilizzare l'pg_repackestensione
  1. Installa l'pg_repackestensione sulla tua istanza di RDS for Postgre SQL DB eseguendo il comando seguente.

    CREATE EXTENSION pg_repack;
  2. Esegui i seguenti comandi per concedere l'accesso in scrittura alle tabelle di registro temporanee create da. pg_repack

    ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT INSERT ON TABLES TO PUBLIC; ALTER DEFAULT PRIVILEGES IN SCHEMA repack GRANT USAGE, SELECT ON SEQUENCES TO PUBLIC;
  3. Connect al database utilizzando l'utilità pg_repack client. Usa un account con privilegi rds_superuser. Ad esempio, presumiamo che il ruolo rds_test abbia i privilegi rds_superuser. La sintassi seguente funziona pg_repack per tabelle complete, inclusi tutti gli indici delle tabelle del database. postgres

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test -k postgres
    Nota

    È necessario connettersi utilizzando l'opzione -k. L'opzione a non è supportata.

    La risposta del pg_repack client fornisce informazioni sulle tabelle dell'istanza DB che vengono reimballate.

    INFO: repacking table "pgbench_tellers" INFO: repacking table "pgbench_accounts" INFO: repacking table "pgbench_branches"
  4. La sintassi seguente ripacchetta una singola tabella, orders inclusi gli indici nel database. postgres

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders -k postgres

    La sintassi seguente riimpacchetta solo gli indici per la tabella nel database. orders postgres

    pg_repack -h db-instance-name.111122223333.aws-region.rds.amazonaws.com -U rds_test --table orders --only-indexes -k postgres

Monitoraggio della nuova tabella durante il repack

  • La dimensione del database viene aumentata della dimensione totale della tabella meno il bloat, fino alla swap-and-drop fase di repack. È possibile monitorare il tasso di crescita delle dimensioni del database, calcolare la velocità del repack e stimare approssimativamente il tempo necessario per completare il trasferimento iniziale dei dati.

    Ad esempio, considera la dimensione totale della tabella di 2 TB, la dimensione del database di 4 TB e il volume totale della tabella di 1 TB. Il valore della dimensione totale del database restituito dal calcolo al termine dell'operazione di repack è il seguente:

    2TB (Table size) + 4 TB (Database size) - 1TB (Table bloat) = 5TB

    È possibile stimare approssimativamente la velocità dell'operazione di repack campionando il tasso di crescita in byte tra due momenti nel tempo. Se il tasso di crescita è di 1 GB al minuto, possono essere necessari 1000 minuti o 16,6 ore circa per completare l'operazione iniziale di creazione della tabella. Oltre alla creazione iniziale della tabella, deve applicare pg_repack anche le modifiche maturate. Il tempo necessario dipende dalla velocità di applicazione delle modifiche in corso e delle modifiche maturate.

    Nota

    È possibile utilizzare l'pgstattupleestensione per calcolare il rigonfiamento nella tabella. Per ulteriori informazioni, consulta pgstattuple.

  • Il numero di righe nella tabella di pg_repack's log, secondo lo schema repack, rappresenta il volume delle modifiche in sospeso da applicare alla nuova tabella dopo il caricamento iniziale.

    È possibile controllare la tabella di pg_repack's registro pg_stat_all_tables per monitorare le modifiche applicate alla nuova tabella. pg_stat_all_tables.n_live_tupindica il numero di record in attesa di applicazione alla nuova tabella. Per ulteriori informazioni, vedere pg_stat_all_tables.

    postgres=>SELECT relname,n_live_tup FROM pg_stat_all_tables WHERE schemaname = 'repack' AND relname ILIKE '%log%'; -[ RECORD 1 ]--------- relname | log_16490 n_live_tup | 2000000
  • Puoi utilizzare l'pg_stat_statementsestensione per scoprire il tempo impiegato da ogni fase dell'operazione di repack. Ciò è utile in preparazione all'applicazione della stessa operazione di reimballaggio in un ambiente di produzione. È possibile modificare la LIMIT clausola per estendere ulteriormente l'output.

    postgres=>SELECT SUBSTR(query, 1, 100) query, round((round(total_exec_time::numeric, 6) / 1000 / 60),4) total_exec_time_in_minutes FROM pg_stat_statements WHERE query ILIKE '%repack%' ORDER BY total_exec_time DESC LIMIT 5; query | total_exec_time_in_minutes -----------------------------------------------------------------------+---------------------------- CREATE UNIQUE INDEX index_16493 ON repack.table_16490 USING btree (a) | 6.8627 INSERT INTO repack.table_16490 SELECT a FROM ONLY public.t1 | 6.4150 SELECT repack.repack_apply($1, $2, $3, $4, $5, $6) | 0.5395 SELECT repack.repack_drop($1, $2) | 0.0004 SELECT repack.repack_swap($1) | 0.0004 (5 rows)

Il reimballaggio è un' out-of-placeoperazione completa, quindi la tabella originale non ne risente e non prevediamo problemi imprevisti che richiedano il ripristino della tabella originale. Se il repack fallisce in modo imprevisto, è necessario verificare la causa dell'errore e risolverlo.

Dopo aver risolto il problema, rilascia e ricrea l'pg_repackestensione nel database in cui esiste la tabella e riprova il passaggio. pg_repack Inoltre, la disponibilità di risorse di calcolo e l'accessibilità simultanea della tabella svolgono un ruolo cruciale nel completamento tempestivo dell'operazione di repack.