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:
- Hiermee maakt u een logboektabel om wijzigingen in de oorspronkelijke tabel vast te leggen.
- Voegt een trigger toe aan de oorspronkelijke tabel, logboekregistratie INSERTs, UPDATEs en DELETEs in de logboektabel.
- Hiermee maakt u een nieuwe tabel met alle rijen in de oorspronkelijke tabel.
- Bouwt indexen op de nieuwe tabel.
- Alle wijzigingen die in de logboektabel zijn vastgelegd, worden toegepast op de nieuwe tabel.
- Hiermee wisselt u de oorspronkelijke en nieuwe tabellen, inclusief indexen en pop-uptabellen.
- 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
- 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_repack
wilt 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.
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"
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';
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
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-check
Sla de superusercontroles in de client over. Deze instelling is handig voor het gebruikpg_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 werkenpg_repack
.-D
, :--no-kill-backend
In 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 isfalse
.-E LEVEL
,--elevel=LEVEL
: kies het uitvoerberichtniveau vanDEBUG
, ,NOTICE
INFO
,WARNING
,ERROR
, ,LOG
, enPANIC
FATAL
. De standaardwaarde isINFO
.
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.