Fehlerhafte Oracle Instantclient RPM provides unter Enterprise Linux

Wer Treiber und Bibliotheken installiert, die Zugriff auf eine Oracle-Datenbank benötigen (z.B. perl-DBD-Oracle), benötigt den Oracle Instantclient. Oracle bietet diesen nach erfolgter Registrierung zum kostenlosen Download an. Bedauerlicherweise wurde bei der Erstellung der RPM-Pakete vergessen, die provides-Tags korrekt zu setzen. Trotz installiertem Instantclient lässt sich beispielsweise perl-DBD-Oracle nicht installieren – angeblich aufgrund fehlender Dateien:

# yum install perl-DBD-Oracle
...
--> Finished Dependency Resolution
Error: Package: perl-DBD-Oracle-1.74-1.el6.x86_64
           Requires: libocci.so.11.1()(64bit)
Error: Package: perl-DBD-Oracle-1.74-1.el6.x86_64
           Requires: libclntsh.so.11.1()(64bit)
 You could try using --skip-broken to work around the problem

Die Dateien liegt jedoch im Dateisystem vor:

# rpm -ql oracle-instantclient11.2-basic|egrep "clntsh|occi"
/usr/lib/oracle/11.2/client64/lib/libclntsh.so.11.1
/usr/lib/oracle/11.2/client64/lib/libocci.so.11.1

Mithilfe des rpm-Kommandos kann angezeigt werden, welche Dateien das Paket „anbietet„:

$ rpm -qp --provides oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
oracle-instantclient11.2-basic = 11.2.0.4.0-1

Hier fehlen u.a. Einträge für die obrigen Programmbibliotheken. Das perl-DBD-Oracle RPM-Paket benötigt diese jedoch zwingend:

$ rpm -qp --requires perl-DBD-Oracle-1.74-1.el6.x86_64.rpm
...
libclntsh.so.11.1()(64bit)
libocci.so.11.1()(64bit)
...

YUM findet kein installiertes oder installierbares RPM-Paket, welches diese Dateien zur Verfügung stellt und bricht daher logischerweise mit einem Abhängigkeitsproblem ab.

Man kann natürlich die Abhängigkeitsprobleme des betroffenen Pakets umgehen und das Paket mit rpmforciert“ installieren – das ist aber keine schöne Lösung und generiert Warnungen innerhalb YUM.

Ein möglicher Workaround ist es, ein RPM-Paket zu erstellen, welches keine eigenen Dateien zur Verfügung stellt, aber vorgibt die benötigten Programmbibliotheken zu beinhalten. Hierzu ist es ratsam, eine direkte Abhängigkeit zum eigentlichen Oracle Instantclient-Paket zu definieren. YUM geht dann wie folgt vor:

  • YUM sucht nach einem Paket, welches libclntsh und libocci zur Verfügung stellt
  • YUM findet das Dummy-Paket und markiert es zur Installation
  • Das Dummy-Paket hängt vom Instantclient-Paket ab, welches daher auch zur Installation vorgesehen wird

Zur Erstellung des Dummy-Pakets müssen RPM-Entwicklungsprogramm installiert werden. An dieser Stelle verweise ich auf einen dedizierten Blog-Artikel, in dem ich detailliert hieraus eingehe.

Mein RPM Specfile kann auf GitHub heruntergeladen werden. Vor der Paketerstellung müssen noch zwei Dateien verschoben werden:

$ wget https://github.com/stdevel/oracle-instantclient11.2-dummy/archive/master.zip
$ unzip master.zip
$ mv oracle-instantclient11.2-dummy-master/*.spec ~/rpmbuild/SPECS/
$ mv oracle-instantclient11.2-dummy-master/foo.bar ~/rpmbuild/SOURCES/
$ rpmbuild -ba ~/rpmbuild/SPECS/*.spec

Das neu erstellte Paket gibt an, die benötigten Programmbibliotheken zur Verfügung zu stellen:

$ rpm -qp --provides oracle-instantclient11.2-dummy-1.0-1.el6.x86_64.rpm
...
libocci.so.11.1()(64bit)
libclntsh.so.11.1()(64bit)

Anschließend lässt sich auch perl-DBD-Oracle installieren:

# yum localinstall perl-DBD-Oracle*.rpm oracle-instantclient*.rpm
...
Installed:
  oracle-instantclient11.2-basic.x86_64 0:11.2.0.4.0-1
  oracle-instantclient11.2-dummy.x86_64 0:1.0-1.el6
  perl-DBD-Oracle.x86_64 0:1.74-1.el6

Complete!

Vielleicht wird dieser Fehler ja in späteren Versionen des Instantclients behoben – die aktuelle Version 12.1.0.2.0 hat diesen Fehler ebenfalls. 😉

2 Kommentare Schreibe einen Kommentar

Schreibe einen Kommentar