Tüm Ürünler
Search
Belge Merkezi

ApsaraDB RDS:CDC için replikasyon yuvası kullanma

Son Güncelleme:Oct 10, 2026

PostgreSQL, Change Data Capture (CDC) özelliğini etkinleştirmek için replikasyon yuvalarını kullanarak yerel destek sağlar. Bu konuda, bir ApsaraDB RDS for PostgreSQL örneğinde CDC'nin nasıl yapılandırılacağı açıklanmaktadır.

Ön koşullar

Kullanım notları

  • CDC'yi yalnızca birincil örnekte etkinleştirebilir ve veri değişikliklerini tüketebilirsiniz. Bu özellik salt okunur örneklerde desteklenmez.

  • ApsaraDB RDS for PostgreSQL, Mantıksal Replikasyon Yuvası Yük Devretme özelliğini destekler. Birincil-ikincil geçişi CDC'yi etkilemez. Daha fazla bilgi için bkz. Mantıksal Replikasyon Yuvası Yük Devretme.

  • CDC'yi etkinleştirmeden önce ApsaraDB RDS for PostgreSQL örneğiniz için bir parametreyi değiştirmeniz gerekir. Bu işlem, örneğin yeniden başlatılmasına neden olur. Hizmet kesintilerini önlemek için bu işlemi yoğun olmayan saatlerde gerçekleştirin.

  • ApsaraDB RDS for PostgreSQL örneğinde CDC kullanırken aşağıdaki hususlara dikkat edin:

    • CDC, WAL günlükleri için daha fazla depolama alanı gerektirir. Veri tüketimi anormal durumdaysa veya durursa örnek WAL günlüklerini otomatik olarak temizlemez. Bu durum, günlüklerin birikmesine ve tüm kullanılabilir disk alanını tüketmesine yol açarak örneğin kilitlenmesine neden olabilir. Kilitlenen bir örnek salt okunur hale gelir ve yazma işlemlerini reddeder.

    • Eski veri satırlarının uzun süre saklanması, örnekteki tüm yazma işlemlerini engelleyen bir işlem kimliği sarma sorununa yol açabilir. Hata günlüğünde aşağıdaki mesajlar görülebilir:

      “HINT: Close open transactions soon to avoid wraparound problems. You might also need to commit or roll back old prepared transactions, or drop stale replication slots.”
      “WARNING: oldest xmin is far in the past.”

    PostgreSQL çekirdeğinin eski WAL günlüklerini ve veri satırlarını otomatik olarak temizlemesine olanak tanımak için replikasyon yuvasını manuel olarak silebilirsiniz. Daha fazla bilgi için bkz. CDC'yi devre dışı bırakma.

    Not

    Örneğinizin WAL günlük boyutunu ve disk alanı kullanımını düzenli olarak izleyin ve ilgili uyarıları yapılandırın. Daha fazla bilgi için bkz. Gelişmiş İzleme verilerini görüntüleme ve Uyarı kurallarını yönetme.

CDC'yi etkinleştirme

Adım 1: Test veritabanı oluşturma

  1. Instances sayfasına gidin. Üst gezinme çubuğunda RDS örneğinin bulunduğu bölgeyi seçin. Ardından RDS örneğini bulun ve örneğin kimliğine tıklayın.

  2. Sol gezinme bölmesinde Databases öğesini seçin.

  3. Create Database öğesine tıklayın. testdb veritabanı oluşturulduktan sonra durumu Running olarak değişir ve karakter kümesi UTF8 olur.

    Not

    Bu örnekte testdb adlı bir veritabanı oluşturulmuştur. Ayrıntılı talimatlar için bkz. Veritabanı oluşturma.

Adım 2: Test hesapları oluşturma ve izinleri yapılandırma

  1. Sol gezinme bölmesinde Accounts öğesini seçin.

  2. Yetkili bir hesap (db_admin) ve CDC için standart bir hesap (cdc_user) oluşturmak üzere Create Account öğesine tıklayın.

    Not

    Bu konuda kullanılan hesap adları yalnızca gösterim amaçlıdır. Özel adlar belirtebilirsiniz. Hesap oluşturma hakkında daha fazla bilgi için bkz. Hesap oluşturma.

  3. db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
    Not

    Bir örneğin uç noktasını elde etme hakkında daha fazla bilgi için bkz. Uç noktayı ve bağlantı noktası numarasını görüntüleme veya değiştirme.

  4. cdc_user hesabını replikasyon rolüne eklemek için aşağıdaki komutu çalıştırın:

    ALTER USER cdc_user WITH REPLICATION;

    Sonucu kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz:

    SELECT rolreplication FROM  pg_roles WHERE rolname='cdc_user';

    Örnek çıktı:

     rolreplication
    ----------------
     t
    (1 row)
  5. cdc_user hesabına izin vermek için aşağıdaki komutu çalıştırın:

    GRANT SELECT ON ALL TABLES IN SCHEMA PUBLIC to cdc_user;

Adım 3: Örnek parametrelerini değiştirme

  1. Geçerli parametre ayarlarını sorgulamak için aşağıdaki komutu çalıştırın:

    SELECT name,
           setting,
           short_desc,
           source
    FROM pg_settings
    WHERE name ='wal_level';

    Örnek çıktı:

             name          | setting |                               short_desc                                |       source
    -----------------------+---------+-------------------------------------------------------------------------+--------------------
     wal_level             | replica | Sets the level of information written to the WAL.                       | configuration file
    (1 rows)

    wal_level parametresi, PostgreSQL'in WAL günlüğüne yazdığı bilgi miktarını kontrol eder. Varsayılan değer replica'dır. Bu parametre yalnızca sunucu başlatıldığında ayarlanabilir. Geçerli değerler şunlardır:

    • minimal: Yalnızca bir çökmeden veya acil kapatmadan kurtarmak için gereken bilgileri yazar. Bu düzeyde, bir temel yedekleme ve WAL günlüklerinden veritabanı geri yükleyemezsiniz.

    • replica: WAL arşivlemeyi ve replikasyonu desteklemek için yeterli bilgiyi yazar; buna bir bekleme sunucusunda salt okunur sorgular çalıştırma dahildir.

    • logical: Mantıksal kod çözme için gereken bilgileri ekler.

  2. Instances sayfasına gidin. Üst gezinme çubuğunda RDS örneğinin bulunduğu bölgeyi seçin. Ardından RDS örneğini bulun ve örneğin kimliğine tıklayın.

  3. Sol gezinme bölmesinde Parameters öğesini seçin.

  4. wal_level parametresini logical olarak ayarlayın.

    Not

Adım 4: Mantıksal replikasyon yuvası oluşturma

Not

Adım 3 içindeki parametre değişikliği, ApsaraDB RDS for PostgreSQL örneğinizin yeniden başlatılmasına neden olur. Bu adıma yalnızca örnek yeniden başlatıldıktan ve durumu Running olduktan sonra devam edin.

  1. db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
  2. cdc_replication_slot adında bir replikasyon yuvası oluşturmak için test_decoding çıkış eklentisini kullanarak aşağıdaki komutu çalıştırın:

    SELECT pg_create_logical_replication_slot('cdc_replication_slot', 'test_decoding');
    Not
    • Yuva adı cdc_replication_slot yalnızca gösterim amaçlıdır. Özel bir ad belirtebilirsiniz.

    • PostgreSQL, test_decoding çıkış eklentisini yerel olarak sağladığından herhangi bir değişiklik gerekmez.

    Örnek çıktı:

     pg_create_logical_replication_slot
    ------------------------------------
     (cdc_replication_slot,1/14003428)
    (1 row)

    Yuvanın oluşturulup oluşturulmadığını kontrol etmek için aşağıdaki komutu çalıştırabilirsiniz:

    SELECT * FROM pg_replication_slots;

    Örnek çıktı:

          slot_name       |    plugin     | slot_type | datoid | database | temporary | active | active_pid | xmin | catalog_xmin | restart_lsn | confirmed_flush_lsn | wal_status | safe_wal_size  | two_phase
    ----------------------+---------------+-----------+--------+----------+-----------+--------+------------+------+--------------+-------------+---------------------+------------+----------------+-----------
     cdc_replication_slot | test_decoding | logical   |  18822 | testdb   | f         | f      |            |      |        22356 | 1/140033F0  | 1/14003428          | reserved   |                | f
    (1 row)

Adım 5: Test verisi oluşturma

Üretim ortamını simüle etmek için test verisi oluşturmak amacıyla aşağıdaki komutları çalıştırın:

CREATE TABLE public.tb_test(
    id int NOT NULL PRIMARY KEY
);
ALTER TABLE public.tb_test ADD name varchar(1) NULL;
INSERT INTO public.tb_test SELECT 1, 'A';

Adım 6: Yuvadan veri okuma

  1. cdc_user hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.

    psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U cdc_user -d testdb
  2. Değişiklikleri replikasyon yuvasından okumak için aşağıdaki komutu çalıştırın:

    SELECT * FROM pg_logical_slot_peek_changes('cdc_replication_slot', null, null);

    Örnek çıktı:

        lsn     |  xid  |                                  data
    ------------+-------+-------------------------------------------------------------------------
     1/14003D90 | 22376 | BEGIN 22376
     1/1401DDE8 | 22376 | COMMIT 22376
     1/1401DDE8 | 22377 | BEGIN 22377
     1/1401E100 | 22377 | COMMIT 22377
     1/1401E2A8 | 22382 | BEGIN 22382
     1/1401E2A8 | 22382 | table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A'
     1/1401E3C0 | 22382 | COMMIT 22382
    (7 rows)

Adım 7: Veri değişikliklerini tüketme

  1. Veritabanı bağlantısından çıkmak için \q komutunu çalıştırın.

  2. Veri değişikliklerini tüketmek için aşağıdaki komutu çalıştırın:

    Not

    pg_recvlogical komutunu postgres kullanıcısı olarak çalıştırmanız gerekir. su - postgres komutunu çalıştırarak kullanıcıları değiştirebilirsiniz. -bash: pg_recvlogical: command not found hatasıyla karşılaşırsanız çözüm için SSS bölümüne bakın.

    pg_recvlogical -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -U <privileged account> -d <test database> --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -

    Komut örneği:

    pg_recvlogical -h pgm-*****.pgsql.singapore.rds.aliyuncs.com -U db_admin -d testdb --create-slot --if-not-exists --slot=cdc_replication_slot --plugin=test_decoding --start -f -

    Örnek çıktı:

    BEGIN 22376
    COMMIT 22376
    BEGIN 22377
    COMMIT 22377
    BEGIN 22382
    table public.tb_test: INSERT: id[integer]:1 name[character varying]:'A'
    COMMIT 22382

CDC'yi devre dışı bırakma

Veri tüketimi anormal durumdaysa veya durursa WAL günlükleri birikebilir ve tüm kullanılabilir disk alanını tüketerek sonunda örneği kilitleyebilir. Bu sorunu çözmek için pasif replikasyon yuvalarını manuel olarak silebilirsiniz; bu işlem, PostgreSQL çekirdeğinin eski WAL günlüklerini temizlemesine olanak tanır.

Pasif replikasyon yuvalarını konsoldan, bir API çağrısı yoluyla veya bir SQL komutu çalıştırarak silebilirsiniz:

  • Konsolda: WAL günlüklerini yönetme.

  • API kullanımı: DeleteSlot.

  • SQL komutu kullanımı:

    1. db_admin hesabını kullanarak ApsaraDB RDS for PostgreSQL örneğine bağlanın.

      psql -h <endpoint of the ApsaraDB RDS for PostgreSQL instance> -p 5432 -U db_admin -d testdb
    2. Pasif yuvaların adlarını ve bilgilerini görüntülemek için aşağıdaki komutu çalıştırın:

      SELECT slot_name, slot_type, database, active, safe_wal_size
      FROM pg_replication_slots
      WHERE active = 'f';

      Örnek çıktı:

            slot_name       | slot_type | database | active | safe_wal_size
      ----------------------+-----------+----------+--------+---------------
       cdc_replication_slot | logical   | testdb   | f      |
      (1 row)
    3. Mantıksal replikasyon yuvasını silmek için aşağıdaki komutu çalıştırın:

      SELECT pg_drop_replication_slot('cdc_replication_slot');

SSS

  • S: Veri tüketirken -bash: pg_recvlogical: command not found hatası alırsam ne yapmalıyım?

    C: pg_recvlogical , varsayılan test_decoding çıkış eklentisini kullanan PostgreSQL için yerel bir mantıksal kod çözme aracıdır. Bu eklenti, PostgreSQL kaynak kodu paketinin contrib/test_decoding dizininde bulunur. PostgreSQL'i kaynak kodundan derleyip yükleyin. Kurulumdan sonra pg_recvlogical aracı, istemci yükleme yolunun /bin dizininde yer alır. PostgreSQL'i kaynaktan yükleme hakkında daha fazla bilgi için bkz. Kaynak Koddan Yükleme.

  • S: Bir replikasyon yuvasını manuel olarak sildim ancak sistem WAL günlüklerini otomatik olarak temizlemedi ve bunlar disk alanını tüketmeye devam ediyor. Ne yapmalıyım?

    C: Saklanan günlük dosyası sayısını azaltmak için wal_keep_segments parametresini varsayılan değeri olan 128 olarak değiştirebilirsiniz. Örnek parametrelerini değiştirme hakkında daha fazla bilgi için bkz. ApsaraDB RDS for PostgreSQL örneğinin parametrelerini değiştirme.