PDA

View Full Version : Installation iSeries Treiber unter SUSE Enterprise Server 9 (64 Bit)



Karl Prinz
24-02-05, 13:41
Problem:

auf dem unten genannten System wurden die von SUSE mitgelieferten RPMs installiert, weitere Konfigurationen und Systemänderungen erfolgten nicht. Der Test des ODBC-Treibers über unixODBC funktionierte mit dem Testtool isql einwandfrei. Der IBM-Treiber funktionierte auch mit dem Testtool nicht, was wohl daran liegt, daß die entsprechende Bibliothek keine 64 Bit-Bibliothek ist (s.u.).

Über PHP konnte die Datenbank nur direkt, nicht über den ODBC-Treiber abgefragt werden. Apache crashed hier mit einem segmentation fault.
Mögliche Gründe könnten sein:
- fehlende oder falsche Verweise auf die benötigten Bibliotheken oder Verweise auf die falschen (nicht 64 Bit Bibliotheken) in den RPM
- oder ein generelles Problem von SUSE Enterprise Server bei 64 Bit-Anwendungen



System:
IBM zSeries346 2 XEON 64 Bit Prozessoren
SUSE Enterprise SERVER 9 für 64 Bit Prozessoren
die neuesten Patches von SUSE sind installiert, das System ist auf dem neuesten Stand!

Installation der von SUSE gelieferten RPMs:

apache 1.3.29
apache-mod_php4 4.3.4

php4 4.3.4
php4-gd 4.3.4
php4-mysql 4.3.4
php4-unixODBC 4.3.4

MyODBC-unixODBC 3.51.06
unixODBC 2.2.8
unixODBC-gui-qt 2.2.8


Konfiguration von unixODBC

/usr/local/bin/odbcinst -j
unixODBC 2.2.10
DRIVERS............: /usr/local/etc/odbcinst.ini
SYSTEM DATA SOURCES: /usr/local/etc/odbc.ini
USER DATA SOURCES..: /root/.odbc.ini


/usr/local/etc/odbcinst.ini

[iSeries Access ODBC Driver]
Description = iSeries Access for Linux ODBC Driver
Driver = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Setup = /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
Threading = 1
FileUsage = 1

[MyODBC-unixODBC]
Description=MySQL ODBC 3.51 Driver DSN
Driver=/usr/lib64/unixODBC/libmyodbc3-3.51.06.so


/usr/local/etc/odbc.ini

[ibm]
Description = iSeries Access ODBC Driver
Driver = iSeries Access ODBC Driver
System = 192.168.0.1 # System ist der Datenbankserver!!
UserID = freshpr
Password = fresh1912
Naming=0
# DefaultLibraries = QGPL
DefaultLibraries = PMNTESTLIB,PMNDTA,SFBF,AWTLIB,AWTDTA
ConnectionType = 0
CommitMode = 0
ExtendedDynamic = 0
DefaultPkgLibrary = QGPL
DefaultPackage = A/DEFAULT(IBM),2,0,1,0,512
AllowDataCompression = 0
LibraryView = 0
AllowUnsupportedChar = 0
ForceTranslation = 0
Trace = 0

[myodbc]
Driver=MyODBC-unixODBC
Description = MySQL ODBC 3.51.06 Driver DSN
SERVER = localhost
PORT =
USER = < user >
Password = < password >
Database = oui
OPTION = 3
SOCKET =


Installation des neuesten IBM-Treibers 64 bit:

Preparing... ########################################### [100%]
1:iSeriesAccess ########################################### [100%]
post install processing for iSeriesAccess 1.8...1
iSeries Access ODBC Driver has been deleted (if it existed at all) because its usage count became zero
odbcinst: Driver installed. Usage count increased to 1.
Target directory is /usr/local/etc


Test der Treibers:

MySQL
/usr/bin/isql -v myodbc < user > < password > (funktioniert!)


IBM iSeries
/usr/bin/isql -v ibm freshpr fresh1912
[01000][unixODBC][Driver Manager]Can't open lib '/opt/ibm/iSeriesAccess/lib/libcwbodbc.so' : /opt/ibm/iSeriesAccess/lib/libcwbodbc.so: cannot open shared object file: No such file or directory
[ISQL]ERROR: Could not SQLConnect

mögliche Gründe:

dlopen: /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
[dltest] ERROR dlopen: /opt/ibm/iSeriesAccess/lib/libcwbodbc.so: cannot open shared object file: No such file or directory

Datei ist aber vorhanden, aber als 32 Bit-Version!
file /opt/ibm/iSeriesAccess/lib/libcwbodbc.so
/opt/ibm/iSeriesAccess/lib/libcwbodbc.so: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), stripped


Test der ODBC-Datenbankverbung über PHP und Apache über ein Script:

<?php
$hostname = "localhost";
$user = "< user >";
$password = "< password >";
$database = "oui";
$dsn = "myodbc";
$odbc_con = odbc_connect($dsn,$user,$password);

$query = "SELECT country,cname_E,cname_D FROM oui.clipping_country";
$result = odbc_exec($odbc_con,$query) or die("Select failed!");

while( odbc_fetch_row($result) )
{
$country = trim (odbc_result($result,'country'));
$cname_D = trim (odbc_result($result,'cname_D'));
$cname_E = trim (odbc_result($result,'cname_E'));

echo "<br> country = ".$country." cname_D = ".$cname_D." cname_E = ".$cname_D;
}
?>

Apache stürzt mit folgender Fehlermeldung ab:

[Thu Feb 24 14:11:26 2005] [notice] child pid 25222 exit signal Segmentation fault (11)


Die direkte Abfrage der Datenbank funktionierte einwandfrei mit:

<?php
$hostname = "localhost";
$user = "< user >";
$password = "< password >";
$database = "oui";
$dsn = "myodbc";

@mysql_connect($hostname,$user,$password) or die("<ul>Konnte Server <b>$hostname</b> als User <b>$user</b> nicht erreichen.</ul>\n");
mysql_select_db("$database") or die("Konnte Datenbank: <b>$database</b> nicht erreichen.");

$query = "SELECT country,cname_E,cname_D FROM oui.clipping_country";
$result = mysql_query("SELECT country,cname_E,cname_D FROM clipping_country");
while ($row = mysql_fetch_object($result))
{
echo "<br>country = ".$row->country." cname_D = ".$row->cname_D." cname_E = ".$row->cname_E;
}
?>