Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Ş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:
- Özgün tabloda yapılan değişiklikleri kaydetmek için bir günlük tablosu oluşturur.
- Özgün tabloya bir tetikleyici ekleyerek INSERT, UPDATE ve DELETE işlemlerini günlük tablosuna kaydeder.
- Özgün tablodaki tüm satırları içeren yeni bir tablo oluşturur.
- Yeni tabloda dizinler oluşturur.
- Günlük tablosunda kaydedilen tüm değişiklikleri yeni tabloya uygular.
- Dizinler ve bildirim tabloları da dahil olmak üzere özgün ve yeni tabloları değiştirir.
- Ö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
-
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_repack
sü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.
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"
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';
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
İ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ı gibipg_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.--index
veya--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ırmakpg_repack
iç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ğerdirfalse
.-E LEVEL
,--elevel=LEVEL
: Çıkış mesaj seviyesiniDEBUG
,INFO
,NOTICE
,WARNING
,ERROR
,LOG
,FATAL
vePANIC
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.