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:

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

Die Dateien liegt jedoch im Dateisystem vor:

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

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

1$ rpm -qp --provides oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm
2oracle-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:

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

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 rpm "forciert" 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:

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

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

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

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

1# yum localinstall perl-DBD-Oracle*.rpm oracle-instantclient*.rpm
2...
3Installed:
4  oracle-instantclient11.2-basic.x86_64 0:11.2.0.4.0-1
5  oracle-instantclient11.2-dummy.x86_64 0:1.0-1.el6
6  perl-DBD-Oracle.x86_64 0:1.74-1.el6
7
8Complete!

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

Übersetzungen: