Наскоро клиент, който използваше нашия SQL Server ODBC драйвер за свързване на Oracle към SQL Server, ни съобщи следната грешка:
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 библиотеки и обратно.
- SID, посочен във вашата DG4ODBC конфигурация, не се изпълнява на хоста, посочен в tnsnames.ora.
При разследването обаче нито един от тези въпроси не се прилага. Подозирахме, че причината е проблем с неправилна конфигурация на Oracle, тъй като въпреки че отстраняването на грешки в DG4ODBC беше активирано, не се генерираха файлове за отстраняване на грешки в DG4ODBC, т.е. Oracle не стигаше до зареждането на библиотеката DG4ODBC.
В такива случаи ние изискваме конфигурационните файлове на Oracle на клиента, за да можем да възпроизведем тяхната настройка, тъй като може да е трудно да се забележи липсваща или неправилно поставена скоба във файл .ora.
Не успяхме да възпроизведем грешката на клиента, предоставените конфигурационни файлове работеха перфектно за нас.
Следващата стъпка беше да използвате strace
да погледнете "под капака" какви конфигурационни файлове се зареждат, когато се стартира слушателят на Oracle. За да направим това, помолихме клиента да:
- Стартирайте две сесии на обвивката като потребител на Oracle.
- В обвивка 1 спрете слушателя на Oracle.
- Стартирайте слушателя с тази команда:
strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
- В обвивка 2 стартирайте SQL*PLus и изпълнете SQL оператор срещу връзката към базата данни DG4ODBC/SQL Server.
- В обвивка 2 спрете слушателя на Oracle.
Дневникът на strace, /tmp/easysoft.log, разкри основния проблем. Първоначално слушателят на Oracle можеше да зареди и чете listener.ora:
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“ на клиента.