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 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:
$ 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. 😉
„Fehlerhafte Oracle Instantclient RPM provides unter Enterprise Linux“
Hä ? Denglish-Anfall ?
Hey Normy,
nein, nicht ganz. „RPM provides“ bezieht sich hier auf bestimmte Tags innerhalb eines Specfiles – siehe auch hier: [klick mich!].
Gruß,
Christian.