Vuoto completo con pg_repack in Database di Azure per PostgreSQL - Server flessibile
SI APPLICA A: Database di Azure per PostgreSQL - Server flessibile
Questo articolo illustra come usare pg_repack
per rimuovere bloat e migliorare le prestazioni del server flessibile Database di Azure per PostgreSQL. Il bloat è l'accumulo di dati non necessari nelle tabelle e negli indici a causa di aggiornamenti e cancellazioni frequenti. Bloat può causare un aumento delle dimensioni del database superiore al previsto e può influire gravemente sulle prestazioni di alcune query. Usare pg_repack
per recuperare lo spazio sprecato e riorganizzare i dati in modo più efficiente.
Che cos'è pg_repack?
pg_repack
è un'estensione PostgreSQL che rimuove bloat dalle tabelle e dagli indici e li riorganizza in modo più efficiente. pg_repack
funziona creando una nuova copia della tabella o dell'indice di destinazione, applicando eventuali modifiche apportate durante il processo e quindi scambiando le versioni precedenti e nuove in modo atomico. pg_repack
non richiede tempi di inattività o blocchi di accesso esclusivi per la tabella o l'indice elaborati, ad eccezione di un breve periodo all'inizio e alla fine dell'operazione. È possibile usare pg_repack
per ottimizzare qualsiasi tabella o indice nei database del server flessibile Database di Azure per PostgreSQL.
Come usare pg_repack?
Per usare pg_repack
, è necessario installare l'estensione nel database del server flessibile Database di Azure per PostgreSQL e quindi eseguire il pg_repack
comando specificando il nome o l'indice della tabella da ottimizzare. L'estensione acquisisce blocchi sulla tabella o sull'indice per impedire l'esecuzione di altre operazioni mentre l'ottimizzazione è in corso. Rimuove il bloat e riorganizza i dati in modo più efficiente.
Funzionamento della ricompressione completa della tabella
Per eseguire una ricompressione completa della tabella, l'estensione segue questa procedura:
- Crea una tabella di log per registrare le modifiche apportate alla tabella originale.
- Aggiunge un trigger alla tabella originale, la registrazione di INSERT, UPDATEs e DELETEs nella tabella dei log.
- Crea una nuova tabella contenente tutte le righe della tabella originale.
- Compila gli indici nella nuova tabella.
- Applica tutte le modifiche registrate nella tabella di log alla nuova tabella.
- Scambia le tabelle originali e nuove, inclusi gli indici e le tabelle di tipo avviso popup.
- Elimina la tabella originale.
Durante questi passaggi, pg_repack
mantiene solo un blocco di accesso esclusivo per un breve periodo, durante la configurazione iniziale (passaggi 1 e 2) e di nuovo durante la fase finale di scambio e rilascio (passaggi 6 e 7). Per il resto del tempo, pg_repack
deve contenere solo un blocco di accesso condiviso sulla tabella originale, consentendo agli INSERT, agli UPDATEs e ai DELETes di procedere come di consueto.
Limiti
pg_repack
presenta alcune limitazioni da tenere presenti prima di usarlo:
- La tabella di destinazione deve avere una chiave PRIMARIA o un indice UNIQUE in una colonna NOT NULL affinché l'operazione abbia esito positivo.
- Durante
pg_repack
l'esecuzione, non è possibile eseguire comandi DDL (Data Definition Language) nelle tabelle di destinazione, ad eccezione di VACUUM o ANALYZE. Per garantire l'applicazione di queste restrizioni,pg_repack
mantiene un blocco di accesso condiviso nella tabella di destinazione durante una ricompressione completa della tabella.
Impostazione
Prerequisiti
- Configurare l'estensione consentendo l'elenco
pg_repack
e creando l'estensione.
Compilare pg_repack'applicazione client
L'uso di questa estensione richiede un'applicazione client che è possibile compilare e installare in un'istanza di Ubuntu.
Per installare la versione 1.4.7 di pg_repack
, eseguire lo script bash seguente in un computer Ubuntu.
# Create the file repository configuration
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
# Import the repository signing key
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
# Update the package lists
sudo apt-get update
# Install required packages to build the code
sudo apt-get install -y postgresql-server-dev-14 unzip make gcc libssl-dev liblz4-dev zlib1g-dev libreadline-dev libzstd-dev
# Download compressed version of build tree for version 1.4.7 of pg_repack
wget 'https://api.pgxn.org/dist/pg_repack/1.4.7/pg_repack-1.4.7.zip'
# Uncompress build tree
unzip pg_repack-1.4.7.zip
# Set current directory to where build tree was uncompressed
cd pg_repack-1.4.7
# Build code
sudo make
# Copy resulting binaries to /usr/local/bin
sudo cp bin/pg_repack /usr/local/bin
# Run pg_repack to check its version
pg_repack --version
Usare pg_repack
Esempio di come eseguire pg_repack
in una tabella denominata info in uno schema pubblico all'interno dell'istanza del server flessibile Database di Azure per PostgreSQL con endpoint pgserver.postgres.database.azure.com, nome utente azureuser e database foo usando il comando seguente.
Usando il client delle preferenze, connettersi all'istanza del server flessibile Database di Azure per PostgreSQL. In questo esempio viene usato psql.
psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
Trovare la versione dell'estensione
pg_repack
installata nel database.SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
La versione dell'estensione deve corrispondere alla versione dell'applicazione client, che è possibile controllare eseguendo questo comando:
azureuser@azureuser:~$ pg_repack --version
Eseguire
pg_repack
il client su una tabella denominata info esistente nel database foo.pg_repack --host=<server>.postgres.database.azure.com --username=<user> --dbname=<database> --table=info --jobs=2 --no-kill-backend --no-superuser-check
opzioni di pg_repack
Opzioni utili pg_repack
per i carichi di lavoro di produzione:
-k
,--no-superuser-check
: ignorare i controlli dell'utente con privilegi avanzati nel client. Questa impostazione è utile per l'usopg_repack
su piattaforme che supportano l'esecuzione come utenti non con privilegi avanzati, ad esempio Database di Azure per PostgreSQL istanze di server flessibili.-j
,--jobs
: creare il numero specificato di connessioni aggiuntive a Database di Azure per PostgreSQL server flessibile e usare queste connessioni aggiuntive per parallelizzare la ricompilazione degli indici in ogni tabella. Le compilazioni di indici paralleli sono supportate solo per i repack full-table.--index
o--only
opzioni di indicizzazione: se l'istanza del server flessibile Database di Azure per PostgreSQL dispone di core aggiuntivi e I/O su disco disponibili, l'uso di questa opzione può essere un modo utile per velocizzarepg_repack
.-D
,--no-kill-backend
: invece di eliminare i client back-end che eseguono query di blocco, ignorare il repacking di una tabella se il blocco non può essere acquisito dopo l'attesa del tempo specificato in--wait-timeout
. Per impostazione predefinita,--wait-timeout
è impostato su 60 secondi. Il valore predefinito per questo parametro èfalse
.-E LEVEL
,--elevel=LEVEL
: scegliere il livello di messaggio di output daDEBUG
,INFO
,NOTICE
WARNING
,ERROR
,LOG
,FATAL
, ePANIC
. Il valore predefinito èINFO
.
Per comprendere tutte le opzioni, vedere la documentazione di pg_repack.
Domande frequenti
È pg_repack un'estensione o un eseguibile lato client come psql o pg_dump?
pg_repack in realtà è entrambi. pg_repack/lib include il codice per l'estensione, inclusi gli elementi dello schema e SQL creati e la libreria C che implementa il codice di diverse di queste funzioni.
D'altra parte, pg_repack/bin ha il codice per l'applicazione client, che sa come interagire con gli elementi programmabilità implementati nell'estensione. Questa applicazione client mira a semplificare la complessità dell'interazione con le diverse interfacce rilevate dall'estensione lato server. Offre all'utente alcune opzioni della riga di comando che sono più facili da comprendere. L'applicazione client è inutile senza l'estensione creata nel database a cui punta. L'estensione lato server autonomamente sarebbe completamente funzionale, ma richiederebbe all'utente di comprendere un modello di interazione complicato. Tale modello consiste nell'esecuzione di query per recuperare i dati usati come input per le funzioni implementate dall'estensione e così via.