PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

“PERINGATAN:Ditemukan ketidakcocokan antara sl_table dan pg_class.” di Slony-I

PERINGATAN:Ketidakcocokan ditemukan antara sl_table dan pg_class. Perintah slonik REPAIR CONFIG mungkin berguna untuk memperbaiki ini.
26-04-2014 07:32:54 PDT FATAL slon_node_health_check() mengembalikan false – masalah kesehatan yang fatal!
PERBAIKAN CONFIG mungkin berguna untuk memperbaiki masalah ini

Anda melihat pesan PERINGATAN ini di log dan segera menghentikan replikasi, jika Slony telah mengamati ketidakcocokan pg_class.oid dan sl_table.tabreloid dari tabel replikasi di sebuah node. Karena, dengan arsitektur slony menyimpan semua objek yang mereplikasi informasi OID dalam katalognya yang diambil pada waktu konfigurasi dari pg_class.oid.

Dalam hal ini pg_class.oid !=sl_table.tabreloid ?

Sebagian besar kasus, sebuah node memindahkan tempatnya menggunakan pg_dump/pg_restore dengan menyebabkan objek OID berubah.

Untuk meniru pesan PERINGATAN di atas, saya telah menggunakan dua setup replikasi node antara dua database pada cluster yang sama [5432] untuk beberapa tabel. (Lihat di sini tentang cara mengatur replikasi Slony). Berikut informasi OID saat ini pada node budak (database demo) untuk salah satu objek 'dtest':

demo=# select oid,relfilenode,relname from pg_class where relname='dtest';
oid | relfilenode | relname
-------+-------------+---------
26119 | 26119 | detest
(1 row)
demo=# select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Ok, 'dtest' OID 26119 disimpan di katalog slony di sl_table.tabreloid.(Slony schema _rf). Ambil backup logis dan restore database demo yang sama hanya untuk mengubah objek OID seperti di bawah ini:(Ingat, proses Slon dihentikan saat ini)

-bash-4.1$ pg_dump -Fc -p 5432 -U postgres demo >/tmp/demo93.dmp
-bash-4.1$ psql -c "alter database demo rename to demo_bk;"
-bash-4.1$ psql -c "create database demo;"
-bash-4.1$ pg_restore -Fc -p 5432 -U postgres -d demo /tmp/demo93.dmp
-bash-4.1$ psql -c "select oid,relfilenode,relname from pg_class where relname='dtest';"
oid | relfilenode | relname
-------+-------------+---------
26640 | 26640 | dtest
(1 row)
-bash-4.1$ psql -c "select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';"
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Sekarang, pg_class.oid dari 'dtest' telah berubah menjadi 26640 sedangkan sl_table.tab_reloid masih mencerminkan OID lama 26119. Pada tahap ini jika kita memulai proses slon pada dasarnya berhenti dengan pesan PERINGATAN pada ketidakcocokan OID dengan menjalankan kueri pg_class.oid =sl_table.tabreloid. Saat mengembalikan hasil yang salah, itu tidak akan bergerak maju sampai diperbaiki. Kita juga dapat memanggil fungsi slon_node_health_check() secara eksplisit untuk verifikasi :

demo=# select _rf.slon_node_health_check();
WARNING: table [id,nsp,name]=[1,a,public] - sl_table does not match pg_class/pg_namespace
WARNING: table [id,nsp,name]=[2,dtest,public] - sl_table does not match pg_class/pg_namespace
WARNING: table [id,nsp,name]=[3,movepage,public] - sl_table does not match pg_class/pg_namespace
WARNING: Mismatch found between sl_table and pg_class. Slonik command REPAIR CONFIG may be useful to rectify this.
slon_node_health_check
------------------------
f
(1 row)

Kami dapat memperbaikinya dengan dua cara.

  1. Menggunakan utilitas baris perintah Slonik dengan skrip pembukaan REPAIR CONFIG atau
  2. Menggunakan fungsi katalog Slony updatereloid() dalam terminal psql.

Metode 1: Buat skrip pembukaan seperti di bawah ini dan jalankan dengan perintah slonik. Saya akan menggunakan metode kedua, ini hanya untuk referensi.

demo=# o /tmp/repair_conf.slonik
demo=# select 'REPAIR CONFIG ( SET ID = '||set_id||', EVENT NODE = 1 );' FROM _rf.sl_set;
demo=# o

Add nodes information at the beginning of the file "/tmp/repair_conf.slonik"

cluster name = rf;
node 1 admin conninfo = 'host=localhost dbname=postgres user=postgres port=5432 password=postgres';
node 2 admin conninfo = 'host=localhost dbname=demo user=postgres port=5432 password=postgres';

REPAIR CONFIG ( SET ID = 1, EVENT NODE = 2 );
REPAIR CONFIG ( SET ID = 2, EVENT NODE = 2 );
REPAIR CONFIG ( SET ID = 3, EVENT NODE = 2 );

-bash-4.1$ slonik /tmp/repair_conf.slonik

Metode 2: Berikan id set tabel dan informasi node ke suatu fungsi:

demo=# select _rf.updatereloid(tab_set,2) from _rf.sl_table ;   
updatereloid
--------------
1
1
1
(3 rows)

Keren, mari cek informasi OID sekarang di slave node (demo database) dari pg_class dan _slonycatalog.sl_table

-bash-4.1$  psql -d demo -c "select oid,relfilenode,relname from pg_class where relname='dtest';"
oid | relfilenode | relname
-------+-------------+---------
26119 | 26119 | dtest
(1 row)

-bash-4.1$ psql -d demo -c "select tab_id,tab_reloid,tab_relname from _rf.sl_table where tab_relname='dtest';"
tab_id | tab_reloid | tab_relname
--------+------------+-------------
2 | 26119 | dtest
(1 row)

Setelah pembaruan, slony akan mulai menyinkronkan tanpa masalah apa pun.
Terima kasih kepada tim Slony-I.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana Sinh() Bekerja di PostgreSQL

  2. Perbedaan antara teks dan varchar (karakter bervariasi)

  3. Mendeteksi Apakah Nilai Berisi Setidaknya Satu Digit Numerik di PostgreSQL

  4. Apakah ada cara untuk menonaktifkan pembaruan/penghapusan tetapi masih mengizinkan pemicu untuk melakukannya?

  5. Bagaimana cara mengubah jenis kolom di Heroku?