Database
 sql >> Base de données >  >> RDS >> Database

Enquête sur une erreur ORA 02063 DG4ODBC

Récemment, un client qui utilisait notre pilote ODBC SQL Server pour connecter Oracle à SQL Server, nous a signalé l'erreur suivante :

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

Cette erreur "catchall" peut se produire si :

  • L'environnement n'est pas défini correctement (par exemple, LD_LIBRARY_PATH ne pointe pas vers les répertoires de la bibliothèque unixODBC, ou ODBCSYSINI ne pointe pas vers le répertoire contenant la copie de odbc.ini où le DSN ODBC cible est défini.)
  • Une bibliothèque DG4ODBC 64 bits est utilisée avec des bibliothèques ODBC 32 bits et vice versa.
  • Le SID spécifié dans votre configuration DG4ODBC ne s'exécute pas sur l'hôte spécifié dans tnsnames.ora.

Cependant, après enquête, aucune de ces questions ne s'appliquait. Nous soupçonnions que la cause était un problème de mauvaise configuration d'Oracle, car bien que le débogage DG4ODBC ait été activé, aucun fichier de débogage DG4ODBC n'était généré, c'est-à-dire qu'Oracle n'allait pas jusqu'à charger la bibliothèque DG4ODBC.

Dans de tels cas, nous demandons les fichiers de configuration Oracle du client afin de pouvoir reproduire leur configuration, car il peut être difficile de repérer une parenthèse manquante ou mal placée dans un fichier .ora.

Nous n'avons pas pu reproduire l'erreur du client, les fichiers de configuration fournis ont parfaitement fonctionné pour nous.

L'étape suivante consistait à utiliser strace pour regarder "sous le capot" quels fichiers de configuration étaient chargés au démarrage de l'écouteur Oracle. Pour ce faire, nous avons demandé au client :

  1. Démarrez deux sessions shell en tant qu'utilisateur Oracle.
  2. Dans le shell 1, arrêtez l'écouteur Oracle.
  3. Démarrez l'écouteur avec cette commande :
    strace -f -o /tmp/easysoft.log -s 512 lsnrctl start
  4. Dans le shell 2, démarrez SQL*PLus et exécutez une instruction SQL sur le lien de base de données DG4ODBC / SQL Server.
  5. Dans le shell 2, arrêtez l'écouteur Oracle.

Le journal strace, /tmp/easysoft.log, a exposé le problème sous-jacent. Initialement, l'écouteur Oracle pouvait charger et lire 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

Cependant, la configuration Oracle du client était :l'utilisateur A a démarré l'écouteur, qui est devenu l'utilisateur B. Ce que strace a révélé, c'est que l'utilisateur B n'avait pas les autorisations d'accès suffisantes pour charger ce fichier .ora :

53051 open("/u01/app/oracle/product/11.2.0/xe/network/admin/listener.ora", O_RDONLY) = -1
EACCES (Permission denied)

En fin de compte, c'était la cause du "ORA 02063" du client.