Aracılığıyla paylaş


PostgreSQL için Azure Veritabanı - Esnek Sunucuda pg_partman etkinleştirme ve kullanma

Ş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:

  1. Azure portalında için sunucu parametreleri azure.extensionslistesinden öğesini seçinpg_partman.

    Azure uzantıları listesinde pg_partman uzantısının seçimini gösteren ekran görüntüsü.

    CREATE EXTENSION pg_partman; 
    
  2. İlgili pg_partman_bgw uzantıyı öğesine shared_preload_librariesekleyin. Zamanlanmış işlevini run_maintenance()sunar. içinde olarak ayarlanmış bölüm kümelerini automatic_maintenanceONpart_configüstlenir.

    pg_partman_bgw uzantısının seçimini gösteren ekran görüntüsü.

    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: Yordama run_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ın run_maintenance() olarak çalıştığı rol. Varsayılan postgres değeridir. Yalnızca tek bir rol adına izin verilir.

    • pg_partman_bgw.analyze: bağımsız değişkeniyle p_analyzerun_maintenance()aynı amaç. Varsayılan olarak olarak olarak ayarlanır OFF.

    • pg_partman_bgw.jobmon: bağımsız değişkeniyle p_jobmonrun_maintenance()aynı amaç. Varsayılan olarak olarak olarak ayarlanır ON.

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 tablonun UNLOGGEDolup olmadığını denetlemek için bir şablon kullanır. Bu, komutun ALTER 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ız ALTER TABLE gerekir. Bu hata nedenini gösterir.  

İzinleri ayarlama

ile pg_partmansü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); 

pg_partman için tablo çıktısının ekran görüntüsü.

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 4kullanmak 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_partmanPostgreSQL 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;

Bölümleri olan tablo çıktısının ekran görüntüsü.

Çalıştırdığınız deyiminin SELECT çıktısı aşağıdadır:

Açıklama planı çıkışının ekran görüntüsü.

Bir bakım yordamını el ile çalıştırma

komutunu kullanmak pg_partman_bgwyerine 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_cronbakım yordamını çalıştırın:

  1. İlk olarak sunucunuzda etkinleştirin pg_cron . Azure portalında , shared_preload_librariesve cron.database_name sunucu parametrelerine azure. extensionsekleyinpg_cron.

    Azure uzantıları için sunucu parametresine pg_cron eklemeyi gösteren ekran görüntüsü.

    Paylaşılan ön yükleme kitaplıkları için sunucu parametresine pg_cron eklemeyi gösteren ekran görüntüsü.

    Cron veritabanı adı için sunucu parametresini gösteren ekran görüntüsü.

  2. 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
    
  3. İş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'); 
    
  4. 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 
    
  5. İş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.

  6. İş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 parametresini pg_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  
    );