हाल ही में, एक ग्राहक जो Oracle को SQL सर्वर से जोड़ने के लिए हमारे SQL सर्वर ODBC ड्राइवर का उपयोग कर रहा था, ने हमें निम्न त्रुटि की सूचना दी:
ORA-28545: error diagnosed by Net8 when connecting to an agent Unable to retrieve text of NETWORK/NCR message 65535 ORA-02063: preceding 2 lines from SQLSERVERLINK
यह "कैचॉल" त्रुटि हो सकती है यदि:
- पर्यावरण सही ढंग से सेट नहीं है (उदाहरण के लिए LD_LIBRARY_PATH unixODBC लाइब्रेरी निर्देशिकाओं को इंगित नहीं करता है, या ODBCSYSINI odbc.ini की प्रति वाली निर्देशिका को इंगित नहीं करता है जहां लक्ष्य ODBC DSN परिभाषित किया गया है।)
- एक 64-बिट DG4ODBC लाइब्रेरी का उपयोग 32-बिट ODBC लाइब्रेरी के साथ किया जा रहा है और इसके विपरीत।
- आपके DG4ODBC कॉन्फ़िगरेशन में निर्दिष्ट SID tnsnames.ora में निर्दिष्ट होस्ट पर नहीं चल रहा है।
हालांकि जांच के बाद इनमें से कोई भी मामला लागू नहीं हुआ। हमें संदेह था कि इसका कारण Oracle गलत कॉन्फ़िगरेशन समस्या थी, क्योंकि हालांकि DG4ODBC डिबगिंग सक्षम थी, कोई DG4ODBC डिबग फ़ाइल जेनरेट नहीं की जा रही थी यानी Oracle DG4ODBC लाइब्रेरी को लोड करने तक नहीं पहुंच रहा था।
ऐसे मामलों में, हम ग्राहक की Oracle कॉन्फिग फाइलों का अनुरोध करते हैं, ताकि हम उनके सेटअप को पुन:पेश कर सकें, क्योंकि .ora फ़ाइल में गुम या गलत ब्रैकेट को खोजना मुश्किल हो सकता है।
हम ग्राहक की त्रुटि को पुन:उत्पन्न करने में असमर्थ थे, आपूर्ति की गई कॉन्फिग फाइलों ने हमारे लिए पूरी तरह से काम किया।
अगला चरण strace
. का उपयोग करना था "हुड के नीचे" देखने के लिए कि ओरेकल श्रोता शुरू होने पर कौन सी कॉन्फ़िगरेशन फाइलें लोड की जा रही थीं। ऐसा करने के लिए, हमने ग्राहक से कहा:
- Oracle उपयोगकर्ता के रूप में दो शेल सत्र प्रारंभ करें।
- खोल 1 में, Oracle श्रोता को रोकें।
- श्रोता को इस कमांड से शुरू करें:
strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
- शेल 2 में, SQL*PLus प्रारंभ करें और DG4ODBC / SQL सर्वर डेटाबेस लिंक के विरुद्ध SQL कथन चलाएँ।
- खोल 2 में, Oracle श्रोता को रोकें।
स्ट्रेस लॉग, /tmp/easysoft.log, ने अंतर्निहित समस्या को उजागर किया। प्रारंभ में, Oracle श्रोता श्रोता को लोड करने और पढ़ने में सक्षम था:
53049 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = 3 53049 read(3, "#/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora Network Configuration File: \n# Generated by Oracle configuration tools.\n\nLISTENER =\n (DESCRIPTION_LIST =\n (DESCRIPTION =\n (ADDRESS = (PROTOCOL = TCP)..., 4096) = 577
हालाँकि, ग्राहक का Oracle सेटअप था:उपयोगकर्ता A ने श्रोता को शुरू किया, जो उपयोगकर्ता B बन गया। क्या पता चला कि उपयोगकर्ता B के पास उस .ora फ़ाइल को लोड करने के लिए पर्याप्त पहुँच अनुमतियाँ नहीं थीं:
53051 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = -1 EACCES (Permission denied)
अंततः, यही ग्राहक के "ORA 02063" का कारण था।