Sdílet prostřednictvím


Ú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:

  1. Vytvoří tabulku protokolu, která zaznamená změny provedené v původní tabulce.
  2. Přidá trigger do původní tabulky, protokolování INSERT, UPDATEs a DELETEs do tabulky protokolů.
  3. Vytvoří novou tabulku obsahující všechny řádky v původní tabulce.
  4. Vytvoří indexy v nové tabulce.
  5. Použije všechny změny zaznamenané v tabulce protokolu na novou tabulku.
  6. Prohodí původní a nové tabulky, včetně indexů a informačních tabulek.
  7. 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

  1. 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.

  1. 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"
    
  2. Vyhledejte verzi pg_repack rozšíření nainstalovanou v databázi.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. 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
    
  4. 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 zrychlit pg_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 je false.

  • -E LEVEL, --elevel=LEVEL: Zvolte úroveň výstupní zprávy z DEBUG, INFO, NOTICE, WARNING, ERROR, , LOG, , FATALa PANIC. Výchozí hodnota je INFO.

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.