Udostępnij za pośrednictwem


Pełne czyszczenie przy użyciu pg_repack w usłudze Azure Database for PostgreSQL — serwer elastyczny

DOTYCZY: Azure Database for PostgreSQL — serwer elastyczny

Z tego artykułu dowiesz się, jak usunąć pg_repack wzdęcie i poprawić wydajność serwera elastycznego usługi Azure Database for PostgreSQL. Przeładowanie to niepotrzebne dane gromadzące się w tabelach i indeksach z powodu częstych aktualizacji i usuwania. Wzdęcie może spowodować, że rozmiar bazy danych będzie większy niż oczekiwano i może poważnie wpłynąć na wydajność niektórych zapytań. Użyj polecenia pg_repack , aby odzyskać zmarnowane miejsce i wydajniej zreorganizować dane.

Co to jest pg_repack?

pg_repack to rozszerzenie PostgreSQL, które usuwa wzdęcie z tabel i indeksów i efektywniej je reorganizuje. pg_repack program tworzy nową kopię tabeli docelowej lub indeksu, stosując wszelkie zmiany, które wystąpiły podczas procesu, a następnie zamieniając stare i nowe wersje niepodziealnie. pg_repack Nie wymaga żadnych przestojów ani blokad dostępu na wyłączność w przetworzonej tabeli lub indeksie, z wyjątkiem krótkiego okresu na początku i na końcu operacji. Możesz użyć pg_repack polecenia , aby zoptymalizować dowolną tabelę lub indeks w elastycznych bazach danych serwera usługi Azure Database for PostgreSQL.

Jak używać pg_repack?

Aby użyć pg_repackpolecenia , należy zainstalować rozszerzenie w elastycznej bazie danych serwera usługi Azure Database for PostgreSQL, a następnie uruchomić pg_repack polecenie, określając nazwę tabeli lub indeks, który chcesz zoptymalizować. Rozszerzenie uzyskuje blokady w tabeli lub indeksie, aby uniemożliwić wykonywanie innych operacji podczas optymalizacji w toku. Usuwa on wzdęcie i efektywniej reorganizuje dane.

Jak działa ponowne pakowanie pełnej tabeli

Aby wykonać ponowne spakowanie pełnej tabeli, rozszerzenie wykonuje następujące kroki:

  1. Tworzy tabelę dziennika w celu rejestrowania zmian wprowadzonych w oryginalnej tabeli.
  2. Dodaje wyzwalacz do oryginalnej tabeli, rejestrowanie INSERTs, UPDATEs i USUWANIE do tabeli dzienników.
  3. Tworzy nową tabelę zawierającą wszystkie wiersze w oryginalnej tabeli.
  4. Tworzy indeksy w nowej tabeli.
  5. Stosuje wszystkie zmiany zarejestrowane w tabeli dziennika do nowej tabeli.
  6. Zamienia oryginalne i nowe tabele, w tym indeksy i wyskakujące tabele.
  7. Popada oryginalną tabelę.

W trakcie tych kroków pg_repack blokada dostępu na wyłączność jest przechowywana tylko przez krótki okres, podczas początkowej konfiguracji (kroki 1 i 2) i ponownie podczas ostatniej fazy zamiany i upuszczania (kroki 6 i 7). W pozostałej części czasu pg_repack należy przechowywać tylko blokadę dostępu współdzielonego w oryginalnej tabeli, co pozwala na kontynuowanie operacji INSERTs, UPDATEs i DELETEs.

Ograniczenia

pg_repack ma pewne ograniczenia, o których należy pamiętać przed jego użyciem:

  • Tabela docelowa musi mieć KLUCZ PODSTAWOWY lub UNIKATOWY indeks w kolumnie NOT NULL, aby operacja zakończyła się pomyślnie.
  • Podczas pg_repack działania nie można wykonywać żadnych poleceń języka DDL (Data Definition Language) w tabelach docelowych, z wyjątkiem funkcji VACUUM lub ANALYZE. Aby upewnić się, że te ograniczenia są wymuszane, pg_repack blokada dostępu współdzielonego jest przechowywana w tabeli docelowej podczas ponownego pakowania pełnej tabeli.

Ustawienia

Wymagania wstępne

  1. pg_repack Skonfiguruj rozszerzenie, podając listę dozwolonych i tworząc rozszerzenie.

Kompilowanie aplikacji klienckiej pg_repack

Użycie tego rozszerzenia wymaga aplikacji klienckiej, którą można skompilować i zainstalować w wystąpieniu systemu Ubuntu.

Aby zainstalować wersję 1.4.7 programu pg_repack, uruchom następujący skrypt powłoki bash na maszynie z systemem Ubuntu.

# 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

Korzystanie z polecenia pg_repack

Przykład uruchamiania pg_repack w tabeli o nazwie info w schemacie publicznym w wystąpieniu serwera elastycznego usługi Azure Database for PostgreSQL z pgserver.postgres.database.azure.com punktu końcowego, nazwy użytkownika azureuser i foo bazy danych przy użyciu następującego polecenia.

  1. Korzystając z klienta preferencji, połącz się z wystąpieniem serwera elastycznego usługi Azure Database for PostgreSQL. W tym przykładzie użyto narzędzia psql.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. Znajdź wersję pg_repack rozszerzenia zainstalowaną w bazie danych.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. Wersja rozszerzenia musi być zgodna z wersją aplikacji klienckiej, którą można sprawdzić, uruchamiając następujące polecenie:

    azureuser@azureuser:~$ pg_repack --version
    
  4. Uruchom pg_repack klienta względem tabeli o nazwie info , która istnieje w bazie danych foo.

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

opcje pg_repack

Przydatne pg_repack opcje dla obciążeń produkcyjnych:

  • -k, --no-superuser-check: Pomiń kontrole superużytkownika w kliencie. To ustawienie jest przydatne w przypadku używania pg_repack na platformach, które obsługują uruchamianie go jako nieużytkowników, takich jak wystąpienia serwera elastycznego usługi Azure Database for PostgreSQL.

  • -j, --jobs: Utwórz określoną liczbę dodatkowych połączeń z serwerem elastycznym usługi Azure Database for PostgreSQL i użyj tych dodatkowych połączeń, aby zrównać ponowne kompilowanie indeksów w każdej tabeli. Kompilacje indeksów równoległych są obsługiwane tylko w przypadku ponownego tworzenia pełnych tabel.

  • --indexlub --only opcje indeksów: jeśli wystąpienie serwera elastycznego usługi Azure Database for PostgreSQL ma dodatkowe rdzenie i dostępne we/wy dysku, użycie tej opcji może być przydatnym sposobem przyspieszenia.pg_repack

  • -D, --no-kill-backend: Zamiast zabijać klientów zaplecza, którzy uruchamiają zapytania blokujące, pomiń ponowne spakowanie tabeli, jeśli nie można uzyskać blokady po oczekiwaniu na czas określony w --wait-timeout. Domyślnie --wait-timeout jest ustawiona wartość 60 sekund. Wartość domyślna tego parametru to false.

  • -E LEVEL, --elevel=LEVEL: wybierz poziom komunikatów wyjściowych z DEBUG, , WARNINGERRORNOTICELOGINFOFATAL, i .PANIC Wartość domyślna to INFO.

Aby zrozumieć wszystkie opcje, zapoznaj się z dokumentacją pg_repack.

Często zadawane pytania

Czy pg_repack rozszerzenia lub pliku wykonywalnego po stronie klienta, takiego jak psql czy pg_dump?

pg_repack jest rzeczywiście oba. pg_repack/lib zawiera kod rozszerzenia, w tym schemat i tworzone artefakty SQL, oraz bibliotekę języka C implementujące kod kilku z tych funkcji.

Z drugiej strony pg_repack /bin zawiera kod aplikacji klienckiej, który wie, jak wchodzić w interakcje z elementami możliwości programowania zaimplementowanymi w rozszerzeniu. Ta aplikacja kliencka ma na celu ułatwienie złożoności interakcji z różnymi interfejsami, które są udostępniane przez rozszerzenie po stronie serwera. Oferuje on użytkownikowi niektóre opcje wiersza polecenia, które są łatwiejsze do zrozumienia. Aplikacja kliencka jest bezużyteczna bez rozszerzenia utworzonego w bazie danych, na którą wskazuje. Rozszerzenie po stronie serwera byłoby w pełni funkcjonalne, ale wymagałoby od użytkownika zrozumienia skomplikowanego wzorca interakcji. Ten wzorzec polegałby na wykonywaniu zapytań w celu pobrania danych używanych jako dane wejściowe do funkcji implementowanych przez rozszerzenie itp.