Úplné vakuum s využitím pg_repack na flexibilním serveru Azure Database for PostgreSQL
PLATÍ PRO: Flexibilní server Azure Database for PostgreSQL
V tomto článku se dozvíte, jak odebrat pg_repack
bloud a zlepšit výkon flexibilního serveru Azure Database for PostgreSQL. Přebujení je hromadění zbytečných dat v tabulkách a indexech v důsledku častých aktualizací a mazání. Bloat může způsobit, že velikost databáze bude větší, než se čekalo, a může vážně ovlivnit výkon některých dotazů. Umožňuje pg_repack
uvolnit nevyužitý prostor a efektivněji uspořádat data.
Co je pg_repack?
pg_repack
je rozšíření PostgreSQL, které odebere z tabulek a indexů bloudí a reorganizuje je efektivněji. pg_repack
funguje vytvořením nové kopie cílové tabulky nebo indexu, použitím všech změn, ke kterým došlo během procesu, a následným prohozením starých a nových verzí atomicky. pg_repack
nevyžaduje žádné výpadky ani výhradní zámky přístupu u zpracované tabulky nebo indexu, s výjimkou krátkého období na začátku a na konci operace. Můžete použít pg_repack
k optimalizaci libovolné tabulky nebo indexu v databázích flexibilních serverů Azure Database for PostgreSQL.
Jak používat pg_repack?
Pokud chcete použít pg_repack
, musíte nainstalovat rozšíření do flexibilní serverové databáze Azure Database for PostgreSQL a pak spustit pg_repack
příkaz, zadejte název tabulky nebo index, které chcete optimalizovat. Rozšíření získá zámky v tabulce nebo indexu, aby se zabránilo provádění jiných operací během probíhající optimalizace. Odebere bloud a reorganizuje data efektivněji.
Jak funguje úplné přebalování tabulek
Pokud chcete znovu zabalit celou tabulku, rozšíření postupuje takto:
- Vytvoří tabulku protokolu, která zaznamená změny provedené v původní tabulce.
- Přidá trigger do původní tabulky, protokolování INSERT, UPDATEs a DELETEs do tabulky protokolů.
- Vytvoří novou tabulku obsahující všechny řádky v původní tabulce.
- Vytvoří indexy v nové tabulce.
- Použije všechny změny zaznamenané v tabulce protokolu na novou tabulku.
- Prohodí původní a nové tabulky, včetně indexů a informačních tabulek.
- Zahodí původní tabulku.
Během těchto kroků pg_repack
uchovává pouze výhradní zámek přístupu po krátkou dobu, během počátečního nastavení (kroky 1 a 2) a znovu během konečné fáze prohození a vyřazení (kroky 6 a 7). Po zbytek času stačí u pg_repack
původní tabulky uchovávat zámek sdíleného přístupu, který umožňuje, aby funkce INSERTs, UPDATEs a DELETEs pokračovaly obvyklým způsobem.
Omezení
pg_repack
má určitá omezení, o nichž byste měli vědět, než ho použijete:
- Aby byla operace úspěšná, musí mít cílová tabulka buď primární klíč, nebo jedinečný index ve sloupci NOT NULL.
- Během
pg_repack
běhu nemůžete v cílových tabulkách s výjimkou funkce VACUUM nebo ANALYZE provádět žádné příkazy jazyka DDL (Data Definition Language). Pokud chcete zajistit, aby se tato omezení vynucují,pg_repack
uchovává zámek sdíleného přístupu v cílové tabulce během opětovného zabalení celé tabulky.
Nastavení
Požadavky
pg_repack
Nakonfigurujte rozšíření povolením a vytvořením rozšíření.
Sestavení klientské aplikace pg_repack
Použití tohoto rozšíření vyžaduje klientskou aplikaci, kterou můžete sestavit a nainstalovat na instanci Ubuntu.
Pokud chcete nainstalovat verzi 1.4.7 z pg_repack
, spusťte na počítači s Ubuntu následující skript Bash.
# 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
Použití rozšíření pg_repack
Příklad spuštění pg_repack
v tabulce s názvem info ve veřejném schématu v instanci flexibilního serveru Azure Database for PostgreSQL s koncovým bodem pgserver.postgres.database.azure.com, uživatelským jménem azureuser a databází pomocí následujícího příkazu.
Pomocí klienta podle vašich preferencí se připojte k instanci flexibilního serveru Azure Database for PostgreSQL. V tomto příkladu používáme psql.
psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
Vyhledejte verzi
pg_repack
rozšíření nainstalovanou v databázi.SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
Verze rozšíření se musí shodovat s verzí klientské aplikace, kterou můžete zkontrolovat spuštěním tohoto příkazu:
azureuser@azureuser:~$ pg_repack --version
Spusťte
pg_repack
klienta s tabulkou s názvem informace, která existuje v databázi.pg_repack --host=<server>.postgres.database.azure.com --username=<user> --dbname=<database> --table=info --jobs=2 --no-kill-backend --no-superuser-check
možnosti pg_repack
Užitečné pg_repack
možnosti pro produkční úlohy:
-k
,--no-superuser-check
: Přeskočte kontroly superuživatele v klientovi. Toto nastavení je užitečné pro použitípg_repack
na platformách, které ho podporují jako neuživatelé, jako jsou instance flexibilních serverů Azure Database for PostgreSQL.-j
,--jobs
: Vytvořte zadaný počet dalších připojení k flexibilnímu serveru Azure Database for PostgreSQL a použijte tato další připojení k paralelizaci opětovného sestavení indexů v každé tabulce. Sestavení paralelního indexu jsou podporována pouze pro přebalování úplné tabulky.--index
Nebo--only
možnosti indexů: Pokud má vaše instance flexibilního serveru Azure Database for PostgreSQL k dispozici další jádra a vstupně-výstupní operace disku, může být použití této možnosti užitečným způsobem, jak zrychlitpg_repack
.-D
,--no-kill-backend
: Namísto zabíjení back-endových klientů, kteří spouští blokující dotazy, přeskočte opětovné zabalení tabulky, pokud zámek nelze získat po čekání na dobu uvedenou v--wait-timeout
. Ve výchozím nastavení--wait-timeout
je nastavená na 60 sekund. Výchozí hodnota pro tento parametr jefalse
.-E LEVEL
,--elevel=LEVEL
: Zvolte úroveň výstupní zprávy zDEBUG
,INFO
,NOTICE
,WARNING
,ERROR
, ,LOG
, ,FATAL
aPANIC
. Výchozí hodnota jeINFO
.
Informace o všech možnostech najdete v dokumentaci pg_repack.
Nejčastější dotazy
Je pg_repack rozšíření nebo spustitelný soubor na straně klienta, jako je psql nebo pg_dump?
pg_repack je ve skutečnosti obojí. pg_repack/lib obsahuje kód pro rozšíření, včetně schématu a artefaktů SQL, které vytvoří, a knihovny jazyka C implementují kód několika těchto funkcí.
Na druhou stranu pg_repack/bin obsahuje kód klientské aplikace, který ví, jak pracovat s elementy programovatelnosti implementovanými v rozšíření. Cílem této klientské aplikace je usnadnit složitost interakce s různými rozhraními, která se zobrazí rozšířením na straně serveru. Nabízí uživateli některé možnosti příkazového řádku, které jsou srozumitelnější. Klientská aplikace je nepoužitá bez rozšíření vytvořeného v databázi, na kterou odkazuje. Rozšíření na straně serveru by samo o sobě bylo plně funkční, ale vyžadovalo by, aby uživatel porozuměl složitému vzoru interakce. Tento model by se skládal z provádění dotazů pro načtení dat, která se používají jako vstup do funkcí implementovaných rozšířením atd.
Související obsah
- Automatické ladění na flexibilním serveru Azure Database for PostgreSQL