For nylig rapporterede en kunde, der brugte vores SQL Server ODBC-driver til at forbinde Oracle til SQL Server, følgende fejl til os:
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
Denne "catchall"-fejl kan ske, hvis:
- Miljøet er ikke indstillet korrekt (f.eks. peger LD_LIBRARY_PATH ikke på unixODBC-biblioteksbibliotekerne, eller ODBCSYSINI peger ikke på til den mappe, der indeholder kopien af odbc.ini, hvor mål-ODBC DSN er defineret.)
- Et 64-bit DG4ODBC-bibliotek bruges sammen med 32-bit ODBC-biblioteker og omvendt.
- Det SID, der er angivet i din DG4ODBC-konfiguration, kører ikke på den vært, der er angivet i tnsnames.ora.
Men efter undersøgelsen gjaldt ingen af disse spørgsmål. Vi havde mistanke om, at årsagen var et Oracle-fejlkonfigurationsproblem, for selvom DG4ODBC-fejlretning var aktiveret, blev der ikke genereret nogen DG4ODBC-fejlretningsfiler, dvs. Oracle nåede ikke så langt som at indlæse DG4ODBC-biblioteket.
I sådanne tilfælde anmoder vi om kundens Oracle-konfigurationsfiler, så vi kan reproducere deres opsætning, da det kan være svært at få øje på en manglende eller forlagt parentes i en .ora-fil.
Vi var ikke i stand til at genskabe kundens fejl, de medfølgende konfigurationsfiler fungerede perfekt for os.
Næste trin var at bruge strace
at se "under motorhjelmen" på, hvilke konfigurationsfiler der blev indlæst, da Oracle-lytteren blev startet. For at gøre dette bad vi kunden om at:
- Start to shell-sessioner som Oracle-bruger.
- Stop Oracle-lytteren i skal 1.
- Start lytteren med denne kommando:
strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
- I skal 2, start SQL*PLus og kør en SQL-sætning mod DG4ODBC / SQL Server-databaselinket.
- Stop Oracle-lytteren i skal 2.
Strace-loggen, /tmp/easysoft.log, afslørede det underliggende problem. I starten var Oracle-lytteren i stand til at indlæse og læse 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
Kundens Oracle-opsætning var imidlertid:bruger A startede lytteren, som blev til bruger B. Det spor afslørede, var, at bruger B ikke havde tilstrækkelige adgangstilladelser til at indlæse denne .ora-fil:
53051 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = -1 EACCES (Permission denied)
I sidste ende var dette årsagen til kundens "ORA 02063".