Freigeben über


Volles Vakuum unter Verwendung von pg_repack in der Azure-Datenbank für PostgreSQL – Flexibler Server

GILT FÜR: Azure Database for PostgreSQL – Flexibler Server

In diesem Artikel erfahren Sie, wie Sie pg_repack verwenden, um Bloat zu entfernen und Ihre Azure Database for PostgreSQL-Flexible Serverleistung zu verbessern. Bloat ist die Anhäufung unnötiger Daten in Tabellen und Indizes aufgrund häufiger Aktualisierungen und Löschungen. Überfrachtung kann dazu führen, dass die Datenbank größer als erwartet wird, was ernsthafte negative Auswirkungen auf die Leistung einiger Abfragen hat. Mit pg_repack können Sie den verschwendeten Platz freigeben und die Daten effizienter reorganisieren.

Was ist pg_repack?

pg_repack ist eine PostgreSQL-Erweiterung, die Überfrachtung aus Tabellen und Indizes entfernt und sie effizienter reorganisiert. pg_repack erstellt eine neue Kopie der Zieltabelle oder des Indexes und wendet dabei alle Änderungen an, die während des Prozesses aufgetreten sind. Danach tauscht die Erweiterung die alten und neuen Versionen atomisch aus. pg_repack erfordert mit Ausnahme eines kurzen Zeitraums am Anfang und Ende des Vorgangs keine Downtime oder exklusive Zugangssperren an der verarbeiteten Tabelle oder dem Index. Sie können pg_repack zum Optimieren von Tabellen oder Indizes für Azure Database for PostgreSQL – Flexibler Server verwenden.

Wie wir pg_repack verwendet?

Um pg_repack verwenden zu können, müssen Sie die Erweiterung in Ihrer Azure Database for PostgreSQL-Flexible Serverdatenbank installieren und dann den Befehl pg_repack ausführen und den Tabellennamen oder Index angeben, den Sie optimieren möchten. Die Erweiterung richtet Sperren für die Tabelle oder den Index ein, um zu verhindern, dass während der Durchführung der Optimierung andere Vorgänge ausgeführt werden. Anschließend wird die Überfrachtung entfernt und die Daten werden effizienter reorganisiert.

Funktionsweise des vollständigen Neupackens einer Tabelle

Um eine Tabelle vollständig neu zu packen, führt die Erweiterung die folgenden Schritte aus:

  1. Erstellen einer Protokolltabelle zum Aufzeichnen von Änderungen, die an der ursprünglichen Tabelle vorgenommen wurden.
  2. Hinzufügen eines Triggers zur ursprünglichen Tabelle, wobei die INSERT-, UPDATE- und DELETE-Vorgänge in der Protokolltabelle protokolliert werden.
  3. Erstellen einer neuen Tabelle mit allen Zeilen der ursprünglichen Tabelle.
  4. Erstellen von Indizes in der neuen Tabelle.
  5. Anwenden aller in der Protokolltabelle aufgezeichneten Änderungen auf die neue Tabelle.
  6. Austauschen der ursprünglichen und neuen Tabellen, einschließlich Indizes und Popuptabellen.
  7. Löschen der ursprünglichen Tabelle.

Während dieser Schritte richtet pg_repack eine exklusive Zugriffssperre nur für einen kurzen Zeitraum während der Ersteinrichtung (Schritte 1 und 2) und erneut während der abschließenden Phase des Austauschens und Entfernens (Swap-and-Drop) (Schritte 6 und 7) ein. Für den Rest der Zeit muss pg_repack nur eine gemeinsame Zugriffssperre für die ursprüngliche Tabelle einrichten, sodass INSERT-, UPDATE- und DELETE-Vorgänge wie gewohnt fortgesetzt werden können.

Einschränkungen

pg_repack unterliegt einigen Einschränkungen, die Sie vor der Verwendung kennen sollten:

  • Die Zieltabelle muss entweder einen PRIMARY KEY oder einen UNIQUE-Index in einer NOT NULL-Spalte aufweisen, damit der Vorgang erfolgreich ausgeführt werden kann.
  • Während pg_repack ausgeführt wird, können Sie mit Ausnahme von VACUUM oder ANALYZE keine DDL-Befehle für die Zieltabellen ausführen. Um sicherzustellen, dass diese Einschränkungen erzwungen werden, richtet pg_repack während eines vollständigen Neupackens einer Tabelle eine geteilte Zugriffssperre für die Zieltabelle ein.

Einrichten

Voraussetzungen

  1. Konfigurieren Sie die pg_repack-Erweiterung, indem Sie die Erweiterung der Positivliste hinzufügen und erstellen.

Erstellen einer pg_repack-Clientanwendung

Die Verwendung dieser Erweiterung erfordert eine Clientanwendung, die Sie auf einer Instanz von Ubuntu erstellen und installieren können.

Um Version 1.4.7 von pg_repack zu installieren, führen Sie das folgende Bash-Skript auf einem Ubuntu-Computer aus.

# 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

pg_repack verwenden

Beispiel für die Ausführung von pg_repack in einer Tabelle mit benannten Informationen in einem öffentlichen Schema in der Azure Database for PostgreSQL-Flexible Serverinstanz mit Endpunkt pgserver.postgres.database.azure.com, Benutzernamen azureuser und Datenbank foo mithilfe des folgenden Befehls.

  1. Verwenden Sie Ihren bevorzugten Client, und stellen Sie eine Verbindung mit der Instanz des flexiblen Azure Database for PostgreSQL-Servers her. In diesem Beispiel wird psql verwendet.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. Suchen Sie die Version der in der Datenbank installierten pg_repack-Erweiterung.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. Die Version der Erweiterung muss mit der Version der Clientanwendung übereinstimmen. Das können Sie mit dem folgenden Befehl überprüfen:

    azureuser@azureuser:~$ pg_repack --version
    
  4. Führen Sie den pg_repack-Client für eine Tabelle mit dem Namen Info aus, die in der Datenbank foo vorhanden ist.

    pg_repack --host=<server>.postgres.database.azure.com --username=<user> --dbname=<database> --table=info --jobs=2 --no-kill-backend --no-superuser-check
    

Optionen für pg_repack

Nützliche pg_repack-Optionen für Produktionsworkloads:

  • -k, --no-superuser-check: Überspringen der Superuser-Prüfungen im Client. Diese Einstellung ist hilfreich für die Verwendung von pg_repack auf Plattformen, die eine Ausführung als Nicht-Superuser unterstützen, z. B. Azure Database for PostgreSQL-Flexible Serverinstanzen.

  • -j, --jobs: Erstellen der angegebenen Anzahl zusätzlicher Verbindungen zu Azure Database for PostgreSQL-Flexible Server, und Verwenden dieser zusätzlichen Verbindungen, um die Neuerstellung von Indizes in jeder Tabelle zu parallelisieren. Parallele Indexbuilds werden nur für vollständiges Neupacken von Tabellen unterstützt.

  • --index, --only indizierte Optionen: Wenn Ihre Azure Database for PostgreSQL-Flexible Serverinstanz für zusätzliche Kerne und Datenträger-E/A verfügbar ist, kann die Verwendung dieser Option eine nützliche Möglichkeit sein, pg_repack zu beschleunigen.

  • -D, --no-kill-backend: Anstatt Back-End-Clients zu beenden, die blockierende Abfragen ausführen, wird die Neupackung einer Tabelle übersprungen, wenn die Sperre nicht abgerufen werden kann, nachdem die in --wait-timeout angegebene Zeit gewartet wurde. Standardmäßig ist --wait-timeout auf 60 Sekunden festgelegt. Der Standardwert für diesen Parameter ist false.

  • -E LEVEL, --elevel=LEVEL: Wählen Sie die Ausgabemeldungsebene aus DEBUG, INFO, NOTICE, WARNING, ERROR, LOG, FATAL und PANIC aus. Der Standardwert ist INFO.

Detaillierte Informationen zu allen Optionen finden Sie in der Dokumentation zu pg_repack

Häufig gestellte Fragen

Ist pg_repack eine Erweiterung oder eine clientseitige ausführbare Datei wie psql oder pg_dump?

pg_repack ist in der Tat beides. pg_repack/lib enthält den Code für die Erweiterung, einschließlich der von ihr erstellten Schema- und SQL-Artefakte, und die C-Bibliothek, die den Code mehrerer dieser Funktionen implementiert.

Andererseits enthält pg_repack/bin den Code für die Clientanwendung, der weiß, wie mit den von der Erweiterung erstellten Programmierartefakten interagiert werden kann. Diese Clientanwendung zielt darauf ab, die Komplexität der Interaktion mit den verschiedenen Schnittstellen zu erleichtern, die von der serverseitigen Erweiterung angezeigt werden. Sie bietet dem Benutzer einige Befehlszeilenoptionen, die leichter zu verstehen sind. Die Clientanwendung ohne die in der Datenbank erstellte Erweiterung, auf die verwiesen wird, ist nutzlos. Die serverseitige Erweiterung selbst wäre voll funktionsfähig, erfordert jedoch, dass der Benutzer ein kompliziertes Interaktionsmuster versteht. Dieses Muster besteht darin, Abfragen auszuführen, um Daten abzurufen, die als Eingabe für Funktionen verwendet werden, die von der Erweiterung implementiert werden, usw.