Aracılığıyla paylaş


PostgreSQL için Azure Veritabanı esnek sunucusunda pg_repack kullanarak tam vakum

ŞUNLAR IÇIN GEÇERLIDIR: PostgreSQL için Azure Veritabanı - Esnek Sunucu

Bu makalede, pg_repack kullanarak yükü azaltmayı ve Azure Veritabanı PostgreSQL esnek sunucu performansınızı artırmayı öğreneceksiniz. Şişirme, sık güncelleştirmeler ve silmeler nedeniyle tablolarda ve dizinlerde toplanan gereksiz verilerdir. Bloat, veritabanı boyutunun beklenenden daha büyük büyümesine neden olabilir ve bazı sorguların performansını ciddi şekilde etkileyebilir. Boşa harcanan alanı geri kazanmak ve verileri daha verimli bir şekilde yeniden düzenlemek için kullanın pg_repack .

pg_repack nedir?

pg_repack tablolardan ve dizinlerden blobları kaldıran ve bunları daha verimli bir şekilde yeniden düzenleyen bir PostgreSQL uzantısıdır. pg_repack hedef tablo veya dizinin yeni bir kopyasını oluşturarak, işlem sırasında gerçekleşen değişiklikleri uygulayarak ve ardından eski ve yeni sürümleri atomik olarak değiştirerek çalışır. pg_repack işlemin başında ve sonunda kısa bir süre dışında, işlenen tablo veya dizinde kapalı kalma süresi veya özel erişim kilidi gerektirmez. PostgreSQL için Azure Veritabanı esnek sunucu veritabanlarınızdaki herhangi bir tabloyu veya dizini iyileştirmek için kullanabilirsinizpg_repack.

pg_repack nasıl kullanılır?

pg_repack kullanmak için, uzantıyı PostgreSQL için Azure Veritabanı esnek sunucu veritabanınıza yüklemeniz ve ardından en iyi duruma getirmek istediğiniz tablo adını veya dizini belirterek pg_repack komutunu çalıştırmanız gerekir. Uzantı, iyileştirme devam ederken diğer işlemlerin gerçekleştirilmesini önlemek için tablo veya dizin üzerindeki kilitleri alır. Şişkinliği kaldırır ve verileri daha verimli bir şekilde yeniden düzenler.

Tam tablo yeniden paketleme nasıl çalışır?

Tam tablo yeniden paketleme gerçekleştirmek için uzantı şu adımları izler:

  1. Özgün tabloda yapılan değişiklikleri kaydetmek için bir günlük tablosu oluşturur.
  2. Özgün tabloya bir tetikleyici ekleyerek INSERT, UPDATE ve DELETE işlemlerini günlük tablosuna kaydeder.
  3. Özgün tablodaki tüm satırları içeren yeni bir tablo oluşturur.
  4. Yeni tabloda dizinler oluşturur.
  5. Günlük tablosunda kaydedilen tüm değişiklikleri yeni tabloya uygular.
  6. Dizinler ve bildirim tabloları da dahil olmak üzere özgün ve yeni tabloları değiştirir.
  7. Özgün tabloyu siler.

Bu adımlar sırasında, pg_repack ilk kurulum sırasında (1. ve 2. adım) ve son değiştirme ve bırakma aşamasında (6. ve 7. adım) yalnızca kısa bir süre için özel erişim kilidi tutar. Kalan süre boyunca, yalnızca pg_repack özgün tabloda paylaşılan erişim kilidinin tutulması gerekir, bu da INSERT'lerin, UPDATE'lerin ve DELETE'lerin her zamanki gibi devam edebilmesini sağlar.

Sınırlamalar

pg_repack kullanmadan önce bilmeniz gereken bazı sınırlamalar vardır:

  • İşlemin başarılı olması için hedef tabloda NOT NULL bir sütun üzerinde ya bir Birincil Anahtar ya da Benzersiz bir dizin olması gerekir.
  • Çalışırken pg_repack , hedef tablolarda VACUUM veya ANALYZE dışında herhangi bir Veri Tanım Dili (DDL) komutu gerçekleştiremezsiniz. Bu kısıtlamaların uygulandığından emin olmak için, pg_repack tam tablo yeniden paketleme sırasında hedef tabloda paylaşılan erişim kilidi tutar.

Ayarlama

Önkoşullar

  1. pg_repack uzantısını izin verilenler listesine ekleyerek ve oluşturarak uzantıyı yapılandırın.

pg_repack istemci uygulaması oluşturma

Bu uzantının kullanılması, Ubuntu örneğine oluşturabileceğiniz ve yükleyebileceğiniz bir istemci uygulaması gerektirir.

1.5.1 pg_repacksürümünü yüklemek için bir Ubuntu makinesinde aşağıdaki bash betiğini çalıştırın.

# 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.5.1 of pg_repack
wget 'https://api.pgxn.org/dist/pg_repack/1.5.1/pg_repack-1.5.1.zip'
# Uncompress build tree
unzip pg_repack-1.5.1.zip
# Set current directory to where build tree was uncompressed
cd pg_repack-1.5.1
# 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 kullanın

pg_repack uygulamasının info adlı bir tabloda, ortak bir şemada ve PostgreSQL için Azure Veritabanı esnek sunucu örneğinde nasıl çalıştırılacağına dair bir örnek; uç nokta olarak pgserver.postgres.database.azure.com, kullanıcı adı olarak azureuser ve veritabanı adı olarak foo'nun kullanılması ile aşağıdaki komutu kullanarak gösterilmektedir.

  1. Tercihinizin istemcisini kullanarak PostgreSQL için Azure Veritabanı esnek sunucu örneğine bağlanın. Bu örnekte psql kullanıyoruz.

        psql "host=<server>.postgres.database.azure.com port=5432 dbname=<database> user=<user> password=<password> sslmode=require"
    
  2. Veritabanında pg_repack uzantısının yüklü sürümünü tespit edin.

    SELECT installed_version FROM pg_available_extensions WHERE name = 'pg_repack';
    
  3. Uzantının sürümü, istemci uygulamasının sürümüyle eşleşmelidir; bu sürümü şu komutu çalıştırarak de kontrol edebilirsiniz:

    azureuser@azureuser:~$ pg_repack --version
    
  4. İstemciyi, pg_repack veritabanında bulunan info adlı bir tabloya karşı çalıştırın.

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

pg_repack seçenekleri

Üretim iş yükleri için yararlı pg_repack seçenekler:

  • -k, --no-superuser-check: İstemcide süper kullanıcı denetimlerini atlayın. Bu ayar, süper kullanıcı olmayanlar olarak çalıştırmayı destekleyen platformlarda, esnek PostgreSQL için Azure Veritabanı sunucuları gibi pg_repack kullanmak için faydalıdır.

  • -j, --jobs: Esnek PostgreSQL için Azure Veritabanı sunucuya belirtilen sayıda ek bağlantı oluşturun ve her tablodaki dizinlerin yeniden oluşturulmasını paralelleştirmek için bu ek bağlantıları kullanın. Paralel dizin derlemeleri yalnızca tam tablo yeniden paketlemeleri için desteklenir.

  • --indexveya --only dizin seçenekleri: PostgreSQL için Azure Veritabanı esnek sunucu örneğinizde fazladan çekirdekler ve disk G/Ç'leri varsa, bu seçeneğin kullanılması işlemini hızlandırmak pg_repackiçin yararlı bir yol olabilir.

  • -D, --no-kill-backend: Engelleme sorguları çalıştıran arka uç istemcilerini sonlandırmak yerine, belirtilen --wait-timeout süresi içinde kilit alınamıyorsa tabloyu yeniden paketlemeyi atlayın. Varsayılan olarak --wait-timeout 60 saniye olarak ayarlanır. Bu parametre için varsayılan değerdir false.

  • -E LEVEL, --elevel=LEVEL: Çıkış mesaj seviyesini DEBUG, INFO, NOTICE, WARNING, ERROR, LOG, FATAL ve PANIC arasından seçin. Varsayılan değer: INFO.

Tüm seçenekleri anlamak için pg_repack belgelerine bakın.

Sık Sorulan Sorular

pg_repack bir uzantı mı yoksa psql veya pg_dump gibi istemci tarafında çalışan bir yürütülebilir dosya mı?

pg_repack aslında ikisi de. pg_repack/lib , oluşturduğu şema ve SQL yapıtları ve bu işlevlerden birkaçının kodunu uygulayan C kitaplığı dahil olmak üzere uzantının koduna sahiptir.

Öte yandan pg_repack/bin, uzantıda uygulanan programlama öğeleriyle nasıl etkileşim kuracaklarını bilen istemci uygulamasının koduna sahiptir. Bu istemci uygulaması, sunucu tarafı uzantısının ortaya çıkardığı farklı arabirimlerle etkileşim kurmanın karmaşıklığını kolaylaştırmayı amaçlar. Kullanıcıya anlaşılması daha kolay olan bazı komut satırı seçenekleri sunar. İstemci uygulaması, işaret edildiği veritabanında oluşturulan uzantı olmadan işe yaramaz. Kendi başına sunucu tarafı uzantısı tamamen işlevsel olacaktır, ancak kullanıcının karmaşık bir etkileşim desenini anlamasını gerektirir. Bu düzen, uzantı tarafından uygulanan işlevlere giriş olarak kullanılan verileri almak için sorguların yürütülmesinden vb. oluşur.