ORA-06520: PL/SQL: Error loading external library – konfig extproc (DB: 19.25 RAC)

— jeżeli DLL chcemy mieć w niestandardowej lokalizacji np. tu: /opt/libdodatkowe, to:

vi /etc/ld.so.conf.d/libdodatkowe.conf
/opt/libdodatkowe
ldconfig

— konfig extproca

vi /u01/app/oracle/product/19.0.0.0/dbhome_1/hs/admin/extproc.ora
SET EXTPROC_DLLS=ANY
SET LD_LIBRARY_PATH=/opt/libdodatkowe:/u01/app/oracle/product/19.0.0.0/dbhome_1/lib:/lib64:/lib

działa


— dlaczego tak jak wyzej? bo standardowo nie mogło zadziałać za pierwszym razem 🙂
DEBUG:
nawiązujemy połączenie z DB i odwołujemy się do dll zeby wyskoczył błąd:

ORA-06520: PL/SQL: Error loading external library

— trzymamy sesje sqlplusa i szukamy procesu „/extproc”

for i in ps aux | grep "/extproc" | grep -v grep | awk '{print $2}'; do echo $i; cat /proc/$i/environ | tr '\0' '\n' | egrep "LD_LIBRARY_PATH|EXTPROC_DLLS"; done

— wyskoczy np.

101893
EXTPROC_DLLS=ANY
LD_LIBRARY_PATH=/opt/libdodatkowe:/u01/app/oracle/product/19.0.0.0/dbhome_1/lib:/lib64:/lib

— bieżemy PID z góry 101893 i lecimy z strace

strace -f -p 101893 -e trace=file

— w tej samej sesji sqlplusa ponawiamy próbę i w strace widzimy:

strace: Process 101893 attached
openat(AT_FDCWD, "/opt/libasseco/test.so", O_RDONLY|O_CLOEXEC) = 13
openat(AT_FDCWD, "/u01/app/oracle/product/19.0.0.0/dbhome_1/lib/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 13
openat(AT_FDCWD, "/lib64/tls/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/lib64/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib64/tls/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)
openat(AT_FDCWD, "/usr/lib64/libtest2.so", O_RDONLY|O_CLOEXEC) = -1 ENOENT (No such file or directory)

czyli widzimy, że pomimo wpisania w extproc.ora LD_LIBRARY_PATH, ścieżki do bibliotek i tak w „potomnych” szuka jedynie w ścieżkach systemowych i dlatego dodajemy jeszcze ścieżke z biblio do /etc/ld.so.conf.d, albo olewamy i wrzucamy / linkujemy biblio do katalogów wyżej