Ora64 kliens a jó öreg debian6.0.5-re

 ( NevemTeve | 2013. november 14., csütörtök - 12:37 )

Volt már nekem egy 10-es verzióm, Pro*C-vel meg Sql*Plus-sal, de lassan kellene haladni a 64-bit felé is.

Oracle-től leszedtem ezeket:

instantclient-*-linux.x64-11.2.0.4.0.zip;
*=basic,jdbc,odbc,precomp,sqlplus,tools

egyelőre ezek közül csak a basic-ba mentem bele, abból mindent, aminek tetszett a neve, telepítettem a meglévő /usr/local/OraHome_Current-be egy új lib64 mappába:

-rwxrwxr-x 1 root root    25420 Aug 24 19:30 adrci
-rw-rw-r-- 1 root root      439 Aug 24 19:30 BASIC_README
-rwxrwxr-x 1 root root    47860 Aug 24 19:30 genezi
lrwxrwxrwx 1 root root       17 Aug 24 19:30 libclntsh.so -> libclntsh.so.11.1
-rwxrwxr-x 1 root root 53865194 Aug 24 19:30 libclntsh.so.11.1
-r-xr-xr-x 1 root root  7996693 Aug 24 19:30 libnnz11.so
lrwxrwxrwx 1 root root       15 Aug 24 19:30 libocci.so -> libocci.so.11.1
-rwxrwxr-x 1 root root  1973074 Aug 24 19:30 libocci.so.11.1
-r-xr-xr-x 1 root root   164942 Aug 24 19:30 libocijdbc11.so
-r--r--r-- 1 root root  2091135 Aug 24 19:30 ojdbc5.jar
-r--r--r-- 1 root root  2739616 Aug 24 19:30 ojdbc6.jar
-rwxrwxr-x 1 root root   192365 Aug 24 19:30 uidrvci
-rw-rw-r-- 1 root root    66779 Aug 24 19:30 xstreams.jar

(A symlinkeket én csináltam.)

Ezek után dpkg-val telepítettem (na jó, letöltöttem a deb-et, és kézileg bemásoltam a fájlokat) a libaio1.amd64.deb és libaio-dev.amd64.deb csomagokat; bővítettem a /etc/ld.so.conf.s/local fájlt egy új sorral, futtatam a ldconfigot...

És máris tudok 64-bites programokat linkelni Oracle-val. Na jó, nem futnak, rendben, máris nézem azt is...

20131114.1336: Adtam még egy esélyt annak az elemnek is, amit a múltkor kihagytam, mert nem tetszett a neve (libociei.so), most megy. Pontosabban mondva, nem tesztett, hogy olyan bazi nagy, meg az hogy a libclnstsh.so nem is használja. (Legalábbis nem láttam, hogy hol hiányolja.)

20131114.1620: OCI-t használó programok mennek, Pro*C-sek nem.

#0  0x00007ffff74fb621 in sqlcfx ()
   from /usr/local/OraHome_Current/lib64/libclntsh.so.11.1
#1  0x00007ffff74f3584 in sqlcxt ()
   from /usr/local/OraHome_Current/lib64/libclntsh.so.11.1
#2  0x00000000004031e7 in OraReconnAt (db=0x4072ec "") at oraconn.pc:228
#3  0x0000000000402cd0 in OraConnV (uid=0x406f0a "scott/tiger@test-tcp.world", 
    db=0x4072ec "", ap=0x7fffffffd940) at oraconn.pc:195
#4  0x000000000040281d in OraConnX (uid=0x406f0a "scott/tiger@test-tcp.world", 
    db=0x4072ec "") at oraconn.pc:119
#5  0x0000000000402631 in OraConn (uid=0x406f0a "scott/tiger@test-tcp.world")
    at oraconn.pc:56
#6  0x00000000004014da in main (argc=1, argv=0x7fffffffde48) at seltest.pc:43

A napló kedvéért: 32-bites megy, továbbá egy AIX-os gépen ugyanaz a prg megy (32 és 64 bites is).

20131114.1825: Nyilván az új Pro*C-t kellene használnom. Kis szerencsével ettől működni kezd a 64-bites, és megszűnik működni a 32-bites.

20131114.1907: Talán kezdenek javulni a dolgok, főleg, hogy lett egy /etc/tnsnames.ora is.

További kérdés: vajon van olyan *instantclient* csomag, amiben oci.h is van?

20131114.1937: Hát az meg a *devel*rpm csomagban van benne, ez csak kézenfekvő, nem?!

20131114.2004: Akkor örömmel mondhatjuk, hogy már csak olyan apró verzió-eltérseket kell megfixálni, mint pl:

volt: extern void sqlglmt( void*, char*, size_t*, size_t* );
lett: extern void sqlglmt( void*, unsigned char*, size_t*, size_t* );.

Egy hisztisre beállított gcc-nek (-Werror) ennyi elég is ahhoz, hogy megálljon. (Ennek függvények a szebbik neve SQLErrorGetText)

20131115.0914: Ismét rászaladtam a gcc egyik kedves meglepetésére (vagyis a Pro*C szaladt rá (ez persze alátámasztja azt a korábbi gondolatomat, hogy a precompileres működés koncepcionálisan hibás):

#define offsetof(TYPE, MEMBER) __builtin_offsetof (TYPE, MEMBER)
A megoldás természetesen a saját stddef.h használata (és az include-sorrend átrendezése a $ORACLE_precomp/admin/pcscfg.cfg -ben)
Most már csak a LOB-oknál áll le a fordítás;)

20131115.0943: Újabb include-sort a pcscfg.cfg-be, és az is fordul!

20131115.1111: Még arra ügyeljünk, hogy a régi precompilerrel előállított forrásokat semmiképp se használjuk 64-bites fordításhoz, ugyanis változott például a 'struct sqlexd' típus (sqlstm változó):

volt:
static struct sqlexd {
   unsigned int   sqlvsn;
   unsigned int   arrsiz;
lett:
static struct sqlexd {
   unsigned long  sqlvsn;
   unsigned int   arrsiz;

20131118.1700: Már a 32-bites verzió is az instanclient-11.2-ből van, úgyhogy nézzük, mit talál ki az új Sql*Plus, hogy ne kelljen elindulnia:

Error 6 initializing SQL*Plus
SP2-0667: Message file sp1.msb not found
SP2-0750: You may need to set ORACLE_HOME to your Oracle software directory

20111118.1722: Vaklárma volt, rossz helyre tettem az sqlplus lib*.so fájljait. Akkor most jöhet a yasql (illetve az alatta lévő DBD-Oracle-1.66) életre keltése.

20111118.1736: Neki meg build.mk kellene. Vajon honnan lesz olyanom?

20111118.1852: Asszem adok egy esélyt a teljes kliensnek. Az ugyan nem instant, de legalább lesz némi esélye, hogy egy komplett rendszer lesz egy kalap alkatrész helyett.

20131119.1016: Azt mondja a kliens, hogy:

/tmp/OraInstall2013-11-19_10-14-31AM/jdk/jre/bin/java:
symbol lookup error:
/tmp/OraInstall2013-11-19_10-14-31AM/jdk/jre/lib/amd64/libawt.so:
undefined symbol: JNU_GetEnv, version SUNWprivate_1.1

2013119.1105: Visszarettentem a full-kliens installtól, viszont rájöttem, mit kell tenni, hogy forduljon a DBD-Oracle:

cd $ORACLE_HOME
ln -s lib32/lib* .
cd /usr/local/src/DBD-Oracle-1.66
perl Makefile.PL
make
make install
cd $ORACLE_HOME
rm lib*

Vagyis attól, hogy az ORACLE_HOME-ban shared libeket lát, megbékül, és lemond a build.mk kereséséről... Persze lesz a keletkező Oracle.so-ban egy felesleges sor:

readelf -d Oracle.so | grep RPATH
Library rpath: [/local/usr/local/OraHome11

de ezt még elbírjuk valahogy... a ld.so úgyis megtalálja, amit kell, mégpedig a /etc/ld.so.conf.d/local.conf című file alapján:

# local.conf
/usr/local/OraHome_Current/lib32
/usr/local/OraHome_Current/lib64
/usr/local/lib
/usr/local/lib64
# /opt/firefox
/opt/jre32/lib/i386
/opt/jre64/lib/amd64

Off: Nem fogod elhinni, de ha a '/opt/firefox' sor nincs megjegyzésbe téve, akkor nem működik jól az rpm2cpio... ez már az emberi ésszel felfoghatón messze túl van.

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Elsősorban egy strace.amd.deb is kell (és abból lesz egy /usr/bin/strace64), mert a 32-bites nem szól, hogy nem tudja követni a 64-bites programot, csak hülyeségeket ír ki.

Rögtön látszik, hogy puszta szívjóságból rengeteg szemetet hasznos fájlt generál a ~/oradiag_$USER könyvtárba.

Másrészt látszik, hogy libnuma.so.1 kellene neki. (Persze ez a függőség nincs benne a shared lib fejrészében, mert még a ldd/ld.so tudomást szerezne erről.)

PS: Bocs, azt nem mondtam, hogy a hiba az OciEnvCreate-ból jött, a hibakódja -1 (az kb a 'baj van')

Illetve, más a hibakód strace-ból futtatva (65), mint önmagában. Továbba a strace jelzi hogy a timezone fájlokat próbálná megnyitni. Amik persze a régi verzióhoz tartoznak.

Már azon gondolkodom, hogy megpróbálom a nem-instant verzióval is. (Nem tesz semmit, mindössze 700 MB)

subscribe

Az utolsóhoz egy lehetőség (pl Makefile-ba a clean-hez):

find . -name '*.pc' | while read L; do
    rm $${L%.pc}.c 2>/dev/null;
done

A JNU_GetEnv az ugyanott elterülő libjava.so-ból kellene jöjjön. Talán.

$ nm -D libjava.so | grep JNU_GetEnv
0000000000013240 T JNU_GetEnv

Ha LD_PRELOAD-dal zsonglőrözünk egy kicsit, akkor valamivel értelmesebb hibaüzenetek kapunk:

libxcb.so.1: cannot open shared object file: No such file or directory

Viszont a php-5.4.16 első pöccre újrafordult az új Oracle-val:

checking for Oracle Database OCI8 support... yes
checking PHP version... 5.4.16, ok
checking for long int... yes
checking size of long int... 4
checking checking if we're on a 64-bit platform... no
checking Oracle ORACLE_HOME install directory... /usr/local/OraHome_Current
checking ORACLE_HOME library validity... lib32
checking Oracle library version compatibility... 11.1