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_repack
estensione 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_repack
estensione e sul repack completo della tabella, consulta la documentazione del progetto. GitHub
Al contrarioVACUUM FULL
, l'pg_repack
estensione 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 bloccabili
pg_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, nonpg_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 richiestoFreeStorageSpace
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 AuroraSELECT 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_repack
estensione
-
Installa l'
pg_repack
estensione sulla tua istanza di RDS for Postgre SQL DB eseguendo il comando seguente.CREATE EXTENSION pg_repack;
-
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;
Connect al database utilizzando l'utilità
pg_repack
client. Usa un account con privilegirds_superuser
. Ad esempio, presumiamo che il ruolords_test
abbia i privilegirds_superuser
. La sintassi seguente funzionapg_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 -Urds_test
-kpostgres
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"
-
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
--tableorders
-kpostgres
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
--tableorders
--only-indexes -kpostgres
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'
pgstattuple
estensione 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
registropg_stat_all_tables
per monitorare le modifiche applicate alla nuova tabella.pg_stat_all_tables.n_live_tup
indica 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_statements
estensione 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 laLIMIT
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_repack
estensione 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.