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
undlibocci
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. 😉