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.
- Menggunakan utilitas baris perintah Slonik dengan skrip pembukaan REPAIR CONFIG atau
- 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.