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, PostgreSQL Bölüm Yöneticisi (pg_partman
) uzantısını kullanarak PostgreSQL için Azure Veritabanı - Esnek Sunucuyu iyileştirmeyi öğreneceksiniz.
Veritabanındaki tablolar genişlediğinde, ne sıklıkta vakumlandıklarını, ne kadar alan kapladıklarını ve dizinlerinin nasıl verimli tutulacaklarını yönetmek zordur. Bu zorluk sorguları yavaşlatabilir ve performansı etkileyebilir. Büyük tabloların bölümlenmesi bu durumlar için bir çözümdür.
Bu makalede, PostgreSQL için Azure Veritabanı esnek sunucunuzda tabloların aralık tabanlı bölümlerini oluşturmak için kullanırsınızpg_partman
.
Önkoşullar
Uzantıyı pg_partman
etkinleştirmek için şu adımları izleyin:
Azure portalında için sunucu parametreleri
azure.extensions
listesinden öğesini seçinpg_partman
.CREATE EXTENSION pg_partman;
İlgili
pg_partman_bgw
uzantıyı öğesineshared_preload_libraries
ekleyin. Zamanlanmış işlevinirun_maintenance()
sunar. içinde olarak ayarlanmış bölüm kümeleriniautomatic_maintenance
ON
part_config
üstlenir.Arka Plan Yazıcı (BGW) işlemini etkileyen aşağıdaki yapılandırma seçeneklerini değiştirmek için Azure portalında sunucu parametrelerini kullanabilirsiniz:
pg_partman_bgw.dbname
:Gerekli. Bu parametre, çalıştırılması gereken bir veya daha fazla veritabanırun_maintenance()
içermelidir. Birden fazla veritabanı varsa virgülle ayrılmış bir liste kullanın. Hiçbir şey ayarlanmadıysa yordamıpg_partman_bgw
çalıştırmaz.pg_partman_bgw.interval
: Yordamarun_maintenance()
çağrılar arasındaki saniye sayısı. Varsayılan değer (3600
1 saat). Bu değeri projenin gereksinimlerine göre güncelleştirebilirsiniz.pg_partman_bgw.role
: Yordamınrun_maintenance()
olarak çalıştığı rol. Varsayılanpostgres
değeridir. Yalnızca tek bir rol adına izin verilir.pg_partman_bgw.analyze
: bağımsız değişkeniylep_analyze
run_maintenance()
aynı amaç. Varsayılan olarak olarak olarak ayarlanırOFF
.pg_partman_bgw.jobmon
: bağımsız değişkeniylep_jobmon
run_maintenance()
aynı amaç. Varsayılan olarak olarak olarak ayarlanırON
.
Not
Bir kimlik özelliği dizileri kullandığında, üst tablodaki veriler yeni sıra değerleri alır. Veriler doğrudan alt tabloya eklendiğinde yeni sıra değerleri oluşturmaz.
Uzantı,
pg_partman
tablonunUNLOGGED
olup olmadığını denetlemek için bir şablon kullanır. Bu, komutunALTER TABLE
bir bölüm kümesi için bu durumu değiştirebileceği anlamına gelir. Şablondaki durumu değiştirerek, şablonu gelecekteki tüm bölümlere uygulayabilirsiniz. Ancak mevcut alt tablolar için komutunu el ile kullanmanızALTER TABLE
gerekir. Bu hata nedenini gösterir.
İzinleri ayarlama
ile pg_partman
süper kullanıcı rolü gerekli değildir. Tek gereksinim, işlevleri çalıştıran pg_partman
rolün yeni nesnelerin oluşturulacağı tüm bölüm kümelerine ve şemalara sahip olmasıdır.
için pg_partman
ayrı bir rol oluşturmanızı ve şema ve üzerinde çalışacak tüm nesneler pg_partman
üzerinde sahiplik vermenizi öneririz:
CREATE ROLE partman_role WITH LOGIN;
CREATE SCHEMA partman;
GRANT ALL ON SCHEMA partman TO partman_role;
GRANT ALL ON ALL TABLES IN SCHEMA partman TO partman_role;
GRANT EXECUTE ON ALL FUNCTIONS IN SCHEMA partman TO partman_role;
GRANT EXECUTE ON ALL PROCEDURES IN SCHEMA partman TO partman_role;
GRANT ALL ON SCHEMA <partition_schema> TO partman_role;
GRANT TEMPORARY ON DATABASE <databasename> to partman_role; -- This allows temporary table creation to move data.
Bölüm oluşturma
Uzantı yalnızca pg_partman
aralık türündeki bölümleri destekler, tetikleyici tabanlı bölümleri desteklemez. Aşağıdaki kod, bir tablonun bölümlenmesine nasıl pg_partman
yardımcı olduğunu gösterir:
CREATE SCHEMA partman;
CREATE TABLE partman.partition_test
(a_int INT, b_text TEXT,c_text TEXT,d_date TIMESTAMP DEFAULT now())
PARTITION BY RANGE(d_date);
CREATE INDEX idx_partition_date ON partman.partition_test(d_date);
işlevini kullanarak create_parent
, bölüm tablosunda istediğiniz bölüm sayısını ayarlayabilirsiniz:
SELECT public.create_parent(
p_parent_table := 'partman.partition_test',
p_control := 'd_date',
p_type := 'native',
p_interval := 'daily',
p_premake :=20,
p_start_partition := (now() - interval '10 days')::date::text
);
UPDATE public.part_config
SET infinite_time_partitions = true,
retention = '1 hour',
retention_keep_table=true
WHERE parent_table = 'partman.partition_test';
Yukarıdaki komut, yerel bölümleme kullanarak sütuna p_control
göre daha küçük bölümlere ayrılırp_parent_table
. (Diğer seçenek tetikleyici tabanlı bölümlemedir, ancak pg_partman
şu anda desteklemez.) Bölümler günlük aralıklarla oluşturulur.
Örnek, varsayılan değerini 4
kullanmak yerine önceden 20 sonraki bölüm oluşturur. Ayrıca, bölümlerin başlaması gereken geçmiş tarihten bahsettiğiniz öğesini de belirtir p_start_partition
.
create_parent()
işlevi iki tabloyu doldurur: part_config
ve part_config_sub
. Bir bakım işlevi vardır. run_maintenance()
Bu yordam için düzenli aralıklara göre çalışacak bir cron
iş zamanlayabilirsiniz. Bu işlev bir part_config
tablodaki tüm üst tabloları denetler ve bunlar için yeni bölümler oluşturur veya tabloların ayarlanan bekletme ilkesini çalıştırır. içindeki işlevler ve tablolar hakkında daha fazla bilgi edinmek için GitHub'daki pg_partman
PostgreSQL Bölüm Yöneticisi Uzantısı belgelerine bakın.
uzantısı aracılığıyla pg_partman_bgw
arka planda her run_maintenance()
çalıştırıldığında yeni bölümler oluşturmak için aşağıdaki UPDATE
deyimi çalıştırın:
UPDATE partman.part_config SET premake = premake+1 WHERE parent_table = 'partman.partition_test';
Premake aynıysa ve yordamınız run_maintenance()
çalıştırılırsa, o gün için yeni bölüm oluşturulmaz. Ertesi gün için, ön yapım geçerli günden tanımladığından, işlevinizin run_maintenance()
yürütülmesiyle bir gün için yeni bir bölüm oluşturulur.
Aşağıdaki INSERT INTO
komutları kullanarak her ay için 100.000 satır ekleyin:
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(1,100000),GENERATE_SERIES(1, 100000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(1, 100000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-03-01',timestamp '2024-03-30', interval '1 day ') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(100000,200000),GENERATE_SERIES(100000,200000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(100000,200000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-04-01',timestamp '2024-04-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(200000,300000),GENERATE_SERIES(200000,300000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(200000,300000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-05-01',timestamp '2024-05-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(300000,400000),GENERATE_SERIES(300000,400000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(300000,400000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-06-01',timestamp '2024-06-30', interval '1 day') ;
INSERT INTO partman.partition_test SELECT GENERATE_SERIES(400000,500000),GENERATE_SERIES(400000,500000) || 'abcdefghijklmnopqrstuvwxyz',
GENERATE_SERIES(400000,500000) || 'zyxwvutsrqponmlkjihgfedcba', GENERATE_SERIES (timestamp '2024-07-01',timestamp '2024-07-30', interval '1 day') ;
Oluşturulan bölümleri görmek için PostgreSQL'de aşağıdaki komutu çalıştırın:
\d+ partman.partition_test;
Çalıştırdığınız deyiminin SELECT
çıktısı aşağıdadır:
Bir bakım yordamını el ile çalıştırma
komutunu kullanmak pg_partman_bgw
yerine el ile çalıştırabilirsinizpartman.run_maintenance()
. Bakım yordamını el ile çalıştırmak için aşağıdaki komutu kullanın:
SELECT partman.run_maintenance(p_parent_table:='partman.partition_test');
Uyarı
Bölümleri oluşturmadan önce veri eklerseniz, veriler varsayılan bölüme gider. Varsayılan bölümde daha sonra oluşturmak istediğiniz yeni bir bölüme ait veriler varsa, varsayılan bölüm ihlali hatası alırsınız ve yordam çalışmaz. Daha önce önerilen premake değerini değiştirin ve ardından yordamı çalıştırın.
Bakım yordamı zamanlama
kullanarak pg_cron
bakım yordamını çalıştırın:
İlk olarak sunucunuzda etkinleştirin
pg_cron
. Azure portalında ,shared_preload_libraries
vecron.database_name
sunucu parametrelerineazure. extensions
ekleyinpg_cron
.Kaydet düğmesini seçin ve dağıtımın bitmesine izin verin.
Dağıtım tamamlandıktan
pg_cron
sonra otomatik olarak oluşturulur. Yüklemeyi denerseniz aşağıdaki iletiyi alırsınız:CREATE EXTENSION pg_cron;
ERROR: extension "pg_cron" already exists
İşi zamanlamak
cron
için aşağıdaki komutu kullanın:SELECT cron.schedule_in_database('sample_job','@hourly', $$SELECT partman.run_maintenance(p_parent_table:= 'partman.partition_test')$$,'postgres');
Tüm
cron
işleri görüntülemek için aşağıdaki komutu kullanın:SELECT * FROM cron.job;
-[ RECORD 1 ]----------------------------------------------------------------------- jobid | 1 schedule | @hourly command | SELECT partman.run_maintenance(p_parent_table:= 'partman.partition_test') nodename | /tmp nodeport | 5432 database | postgres username | postgres active | t jobname | sample_job
İşin çalıştırma geçmişini denetlemek için aşağıdaki komutu kullanın:
SELECT * FROM cron.job_run_details;
İşi henüz çalıştırmadığınız için sonuçlar sıfır kayıt gösterir.
İşin zaman çizelgesini
cron
silmek için aşağıdaki komutu kullanın:SELECT cron.unschedule(1);
Sık sorulan sorular
pg_partman_bgw
Neden sağladığım aralık temelinde bakım yordamı çalıştırılmıyor?Sunucu parametresini
pg_partman_bgw.dbname
denetleyin ve uygun veritabanı adıyla güncelleştirin. Ayrıca, sunucu parametresinipg_partman_bgw.role
denetleyin ve uygun rolü sağlayın. Ayrıca, uzantıyı oluşturmak için Postgres yerine aynı kullanıcıyı kullanarak sunucuya bağlandığınızdan emin olmanız gerekir.Bakım yordamını çalıştırırken
pg_partman_bgw
bir hatayla karşılaşıyorum. Nedenler ne olabilir?Önceki yanıta bakın.
Bölümleri önceki günden itibaren başlayacak şekilde Nasıl yaparım??
İşlev,
p_start_partition
bölümün oluşturulması gereken tarihi ifade eder. Şu komutu çalıştırın:SELECT public.create_parent( p_parent_table := 'partman.partition_test', p_control := 'd_date', p_type := 'native', p_interval := 'daily', p_premake :=20, p_start_partition := (now() - interval '10 days')::date::text );