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_repack
polecenia , 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:
- Tworzy tabelę dziennika w celu rejestrowania zmian wprowadzonych w oryginalnej tabeli.
- Dodaje wyzwalacz do oryginalnej tabeli, rejestrowanie INSERTs, UPDATEs i USUWANIE do tabeli dzienników.
- Tworzy nową tabelę zawierającą wszystkie wiersze w oryginalnej tabeli.
- Tworzy indeksy w nowej tabeli.
- Stosuje wszystkie zmiany zarejestrowane w tabeli dziennika do nowej tabeli.
- Zamienia oryginalne i nowe tabele, w tym indeksy i wyskakujące tabele.
- 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
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.
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"
Znajdź wersję
pg_repack
rozszerzenia zainstalowaną w bazie danych.SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
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
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żywaniapg_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.--index
lub--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 tofalse
.-E LEVEL
,--elevel=LEVEL
: wybierz poziom komunikatów wyjściowych zDEBUG
, ,WARNING
ERROR
NOTICE
LOG
INFO
FATAL
, i .PANIC
Wartość domyślna toINFO
.
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.