चेतावनी:sl_table और pg_class के बीच बेमेल पाया गया। Slonik कमांड REPAIR CONFIG इसे ठीक करने के लिए उपयोगी हो सकता है।
2014-04-26 07:32:54 PDT FATAL slon_node_health_check() झूठी वापसी - घातक स्वास्थ्य समस्या!
REPAIR CONFIG इस समस्या को ठीक करने में सहायक हो सकती है।
आप इस चेतावनी संदेश को लॉग में देखते हैं और प्रतिकृति को तत्काल रोक देते हैं, यदि स्लोनी ने एक नोड में एक प्रतिकृति तालिका के pg_class.oid और sl_table.tabreloid का बेमेल देखा है। क्योंकि, आर्किटेक्चर द्वारा slony pg_class.oid से कॉन्फ़िगर समय पर कैप्चर किए गए कैटलॉग में सभी प्रतिकृति ऑब्जेक्ट्स OID जानकारी रखता है।
किस मामले में pg_class.oid !=sl_table.tabreloid ?
ज्यादातर मामलों में, एक नोड ने OID को बदलने के लिए pg_dump/pg_restore का उपयोग करके अपना स्थान बदल दिया।
उपरोक्त चेतावनी संदेश की नकल करने के लिए, मैंने कुछ तालिकाओं के लिए एक ही क्लस्टर [5432] पर दो डेटाबेस के बीच दो नोड प्रतिकृति सेटअप का उपयोग किया है। (स्लोनी प्रतिकृति को सेटअप करने के तरीके के बारे में यहां देखें)। यहाँ एक वस्तु 'dtest' के लिए दास नोड (डेमो डेटाबेस) पर वर्तमान OID जानकारी है:
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)
ठीक है, 'dtest' OID 26119 sl_table.tabreloid में स्लोनी कैटलॉग में संग्रहीत है। (स्लोनी स्कीमा _rf)। नीचे दिए गए ऑब्जेक्ट OID को बदलने के लिए तार्किक बैकअप लें और उसी डेमो डेटाबेस को पुनर्स्थापित करें:(याद रखें, इस समय स्लोन प्रक्रिया रोक दी गई है)
-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)
अब, 'dtest' का pg_class.oid 26640 में बदल गया है जबकि sl_table.tab_reloid अभी भी पुराने OID 26119 को दर्शाता है। इस स्तर पर यदि हम स्लोन प्रक्रिया शुरू करते हैं तो यह अनिवार्य रूप से एक क्वेरी चलाकर OID के बेमेल होने पर चेतावनी संदेश के साथ बंद हो जाता है। pg_class.oid =sl_table.tabreloid। गलत परिणाम लौटाने पर यह तब तक आगे नहीं बढ़ेगा जब तक कि यह तय न हो जाए। हम सत्यापन के लिए स्पष्ट रूप से slon_node_health_check() फ़ंक्शन को भी कॉल कर सकते हैं:
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)
हम इसे दो तरह से ठीक कर सकते हैं।
- प्रस्तावना स्क्रिप्ट REPAIR CONFIG या के साथ Slonik कमांड लाइन उपयोगिता का उपयोग करना
- psql टर्मिनल के भीतर Slony कैटलॉग फ़ंक्शन updatereloid() का उपयोग करना।
विधि 1: नीचे दी गई प्रस्तावना स्क्रिप्ट बनाएं और स्लोनिक कमांड के साथ निष्पादित करें। मैं दूसरी विधि का उपयोग करूंगा, यह सिर्फ संदर्भ के लिए है।
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
विधि 2: किसी फ़ंक्शन के लिए टेबल-सेट आईडी और नोड जानकारी पास करें:
demo=# select _rf.updatereloid(tab_set,2) from _rf.sl_table ;
updatereloid
--------------
1
1
1
(3 rows)
बढ़िया, अब pg_class और _slonycatalog.sl_table
से स्लेव नोड (डेमो डेटाबेस) पर OID जानकारी की जाँच करें।-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)
अपडेट के बाद, slony बिना किसी समस्या के सिंक करना शुरू कर देगा।
स्लोनी-I टीम को धन्यवाद।