Delen via


Volledig vacuüm met behulp van pg_repack in Azure Database for PostgreSQL - Flexible Server

VAN TOEPASSING OP: Azure Database for PostgreSQL - Flexibele server

In dit artikel leert u hoe pg_repack u bloat verwijdert en de flexibele serverprestaties van Azure Database for PostgreSQL verbetert. Bloat is de onnodige gegevens die zich in tabellen en indexen verzamelen vanwege frequente updates en verwijderingen. Bloat kan ertoe leiden dat de database groter wordt dan verwacht en dit kan de prestaties van sommige query's ernstig beïnvloeden. Gebruik pg_repack dit om de verspilde ruimte vrij te maken en de gegevens efficiënter te ordenen.

Wat is pg_repack?

pg_repack is een PostgreSQL-extensie die bloat verwijdert uit tabellen en indexen en deze efficiënter ordenen. pg_repack werkt door een nieuwe kopie van de doeltabel of index te maken, wijzigingen toe te passen die tijdens het proces zijn opgetreden en vervolgens de oude en nieuwe versies atomisch te verwisselen. pg_repack vereist geen downtime of exclusieve toegangsvergrendelingen voor de verwerkte tabel of index, met uitzondering van een korte periode aan het begin en aan het einde van de bewerking. U kunt elke pg_repack tabel of index optimaliseren in uw flexibele Azure Database for PostgreSQL-serverdatabases.

Hoe gebruik ik pg_repack?

Als u deze wilt gebruiken pg_repack, moet u de extensie installeren in uw flexibele Azure Database for PostgreSQL-serverdatabase en vervolgens de pg_repack opdracht uitvoeren, waarbij u de tabelnaam of index opgeeft die u wilt optimaliseren. De extensie verkrijgt vergrendelingen in de tabel of index om te voorkomen dat andere bewerkingen worden uitgevoerd terwijl de optimalisatie wordt uitgevoerd. Hiermee worden de bloat verwijderd en worden de gegevens efficiënter georganiseerd.

Hoe een volledige tabel opnieuw wordt verpakt

Als u een volledige tabel opnieuw wilt verpakken, voert de extensie de volgende stappen uit:

  1. Hiermee maakt u een logboektabel om wijzigingen in de oorspronkelijke tabel vast te leggen.
  2. Voegt een trigger toe aan de oorspronkelijke tabel, logboekregistratie INSERTs, UPDATEs en DELETEs in de logboektabel.
  3. Hiermee maakt u een nieuwe tabel met alle rijen in de oorspronkelijke tabel.
  4. Bouwt indexen op de nieuwe tabel.
  5. Alle wijzigingen die in de logboektabel zijn vastgelegd, worden toegepast op de nieuwe tabel.
  6. Hiermee wisselt u de oorspronkelijke en nieuwe tabellen, inclusief indexen en pop-uptabellen.
  7. Hiermee wordt de oorspronkelijke tabel verwijderd.

Tijdens deze stappen pg_repack is er slechts een exclusieve toegangsvergrendeling gedurende een korte periode, tijdens de eerste installatie (stap 1 en 2) en nogmaals tijdens de laatste swap-and-drop-fase (stap 6 en 7). Voor de rest van de tijd pg_repack hoeft alleen een gedeelde toegangsvergrendeling op de oorspronkelijke tabel te worden opgeslagen, zodat INSERT's, UPDATEs en DELETEs op de gebruikelijke manier kunnen worden voortgezet.

Beperkingen

pg_repack heeft enkele beperkingen waarvan u rekening moet houden voordat u deze gebruikt:

  • De doeltabel moet een PRIMAIRE SLEUTEL of een UNIEKE index in een KOLOM NOT NULL hebben om de bewerking te kunnen laten slagen.
  • Terwijl pg_repack deze wordt uitgevoerd, kunt u geen DDL-opdrachten (Data Definition Language) uitvoeren op de doeltabellen, met uitzondering van VACUUM of ANALYZE. Om ervoor te zorgen dat deze beperkingen worden afgedwongen, pg_repack wordt een gedeelde toegangsvergrendeling op de doeltabel bewaard tijdens het opnieuw verpakken van een volledige tabel.

Instellingen

Vereisten

  1. Configureer de extensie door de pg_repack extensie toe te staan en te maken.

Pg_repack-clienttoepassing bouwen

Voor het gebruik van deze extensie is een clienttoepassing vereist die u kunt bouwen en installeren op een exemplaar van Ubuntu.

Als u versie 1.4.7 van pg_repackwilt installeren, voert u het volgende bash-script uit op een Ubuntu-computer.

# 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 gebruiken

Voorbeeld van het uitvoeren pg_repack van een tabel met de naam info in een openbaar schema in het flexibele azure Database for PostgreSQL-serverexemplaren met eindpunt pgserver.postgres.database.azure.com, gebruikersnaam azureuser en database-foo met behulp van de volgende opdracht.

  1. Maak met behulp van de client van uw voorkeur verbinding met het flexibele serverexemplaren van Azure Database for PostgreSQL. In dit voorbeeld gebruiken we psql.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. Zoek de versie van pg_repack de extensie die in de database is geïnstalleerd.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. De versie van de extensie moet overeenkomen met de versie van de clienttoepassing, die u kunt controleren door deze opdracht uit te voeren:

    azureuser@azureuser:~$ pg_repack --version
    
  4. Voer pg_repack de client uit op een tabel met de naam info die bestaat in database-foo.

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

opties voor pg_repack

Handige pg_repack opties voor productieworkloads:

  • -k, : --no-superuser-checkSla de superusercontroles in de client over. Deze instelling is handig voor het gebruik pg_repack van platforms die ondersteuning bieden voor het uitvoeren ervan als niet-supergebruikers, zoals azure Database for PostgreSQL flexibele serverexemplaren.

  • -j, --jobs: Maak het opgegeven aantal extra verbindingen met de flexibele Azure Database for PostgreSQL-server en gebruik deze extra verbindingen om de herbouw van indexen in elke tabel te parallelliseren. Parallelle index builds worden alleen ondersteund voor het opnieuw verpakken van volledige tabellen.

  • --index of --only indexenopties: als uw flexibele Server-exemplaar van Azure Database for PostgreSQL extra kernen en schijf-I/O beschikbaar heeft, kan het gebruik van deze optie een handige manier zijn om sneller te werken pg_repack.

  • -D, : --no-kill-backendIn plaats van back-endclients te doden die blokkerende query's uitvoeren, slaat u het opnieuw verpakken van een tabel over als de vergrendeling niet kan worden verkregen nadat u hebt gewacht op de tijd die is opgegeven in --wait-timeout. --wait-timeout Standaard is dit ingesteld op 60 seconden. De standaardwaarde voor deze parameter is false.

  • -E LEVEL, --elevel=LEVEL: kies het uitvoerberichtniveau van DEBUG, , NOTICEINFO, WARNING, ERROR, , LOG, en PANICFATAL. De standaardwaarde is INFO.

Raadpleeg de documentatie van pg_repack voor meer informatie over alle opties.

Veelgestelde vragen

Is pg_repack een extensie of een uitvoerbaar bestand aan de clientzijde, zoals psql of pg_dump?

pg_repack is eigenlijk beide. pg_repack/lib heeft de code voor de extensie, met inbegrip van het schema en SQL-artefacten dat wordt gemaakt, en de C-bibliotheek die de code van verschillende van deze functies implementeert.

Aan de andere kant heeft pg_repack/bin de code voor de clienttoepassing, die weet hoe moet worden gecommuniceerd met de programmeerelementen die in de extensie zijn geïmplementeerd. Deze clienttoepassing is erop gericht om de complexiteit van interactie met de verschillende interfaces die worden weergegeven door de extensie aan de serverzijde te vereenvoudigen. Het biedt de gebruiker een aantal opdrachtregelopties die gemakkelijker te begrijpen zijn. De clienttoepassing is nutteloos zonder de extensie die is gemaakt in de database waarnaar deze verwijst. De extensie aan de serverzijde zou volledig functioneel zijn, maar vereist dat de gebruiker een gecompliceerd interactiepatroon begrijpt. Dat patroon zou bestaan uit het uitvoeren van query's om gegevens op te halen die worden gebruikt als invoer voor functies die door de extensie zijn geïmplementeerd, enzovoort.