2012-03-13 6 views
2

私は、どちらのサーバ(db1)でも少しでもエラーの情報でスクリプトがクラッシュし、別のサーバ(db2)ではなく両方でクラッシュする問題を解決しようとしています。私が見つけることができるすべての方法(1つを除く)で同一の環境です。perl dbi:odbcクラッシュする/奇妙なファイルを使用する

$ ./test 
DBD::ODBC::st execute failed: [DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1) at ./test line 24. 
-1 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1) 
HY000 

のTraceLevel 10私のために光を当てるしません:

use strict; 
use warnings; 

use DBI; 
use Data::Dumper; 

$ENV{LD_LIBRARY_PATH} = "/var/local/odbc"; 
$ENV{ODBCHOME}  = "/var/local/odbc"; 
$ENV{ODBCINI}   = "/etc/odbc.ini"; 

my $dbh = DBI->connect("dbi:ODBC:db", "foo", "bar") or die "$DBI::err\n$DBI::errstr\n$DBI::state\n"; 
$dbh->{RaiseError} = "0"; 
$dbh->{AutoCommit} = "1"; 
$dbh->{LongReadLen} = 1024; 

#$dbh->{TraceLevel} = 10; 

my $sth = $dbh->prepare("SELECT * FROM table WHERE x='y'") or die "$DBI::err\n$DBI::errstr\n$DBI::state\n"; 
$sth->execute or die "$DBI::err\n$DBI::errstr\n$DBI::state\n"; 

my $data = $sth->fetchall_hashref('x'); 
print Data::Dumper->Dump([$data]); 

そして、ここで出力(:死は$sth->executeにあるノート)は次のとおりです。ここで

は、スクリプト、test.plがあります

$ ./test 
    DBI::db=HASH(0x1f2cc8e0) trace level set to 0x0/10 (DBI @ 0x0/0) in DBI 1.52-ithread (pid 27494) 
    -> prepare for DBD::ODBC::db (DBI::db=HASH(0x1f2cc510)~0x1f2cc8e0 'SELECT * FROM table WHERE x='y'') thr#1effa010 
    dbih_setup_handle(DBI::st=HASH(0x1f2cca60)=>DBI::st=HASH(0x1f2ccb60), DBD::ODBC::st, 1f2cca70, Null!) 
    dbih_make_com(DBI::db=HASH(0x1f2cc8e0), 1f2d1e30, DBD::ODBC::st, 376, 0) thr#1effa010 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), Err, DBI::db=HASH(0x1f2cc8e0)) SCALAR(0x1f183620) (already defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), State, DBI::db=HASH(0x1f2cc8e0)) SCALAR(0x1f1836a0) (already defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), Errstr, DBI::db=HASH(0x1f2cc8e0)) SCALAR(0x1f183660) (already defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), TraceLevel, DBI::db=HASH(0x1f2cc8e0)) 10 (already defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), FetchHashKeyName, DBI::db=HASH(0x1f2cc8e0)) 'NAME' (already defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), HandleSetErr, DBI::db=HASH(0x1f2cc8e0)) undef (not defined) 
    dbih_setup_attrib(DBI::st=HASH(0x1f2ccb60), HandleError, DBI::db=HASH(0x1f2cc8e0)) undef (not defined) 
    initializing sth query timeout to 0 
    ignore named placeholders = 0 
    SQLPrepare returned 0 

    dbd_st_prepare'd sql f523212832, ExecDirect=0 
     SELECT * FROM table WHERE x='y' 
    <- prepare= DBI::st=HASH(0x1f2cca60) at ./test line 23 
    -> execute for DBD::ODBC::st (DBI::st=HASH(0x1f2cca60)~0x1f2ccb60) thr#1effa010 
    dbd_st_execute (outparams = 0)... 
    dbd_st_execute (for hstmt 523212832 before)... 
    dbd_st_execute (for hstmt 523212832 after, rc = -1)... 
dbd_error: err_rc=-1 rc=0 s/d/e: 523212832/523051280/523050880 
dbd_error: SQL-HY000 (native 0): [DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
dbd_error: SQL-HY000 (native 0): [DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
dbd_error: err_rc=-1 rc=0 s/d/e: 0/523051280/523050880 
dbd_error: err_rc=-1 rc=0 s/d/e: 0/0/523050880 
st_execute/SQLExecute error -1 recorded: [DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1) 
    !! ERROR: -1 '[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1)' (err#0) 
    <- execute= undef at ./test line 24 
DBD::ODBC::st execute failed: [DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1) at ./test line 24. 
-1 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1) 
HY000 
    -> DESTROY for DBD::ODBC::st (DBI::st=HASH(0x1f2ccb60)~INNER) thr#1effa010 
    SQLFreeStmt called, returned 0. 
     ERROR: -1 '[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1)' (err#0) 
    <- DESTROY= undef 
    -> DESTROY for DBD::ODBC::db (DBI::db=HASH(0x1f2cc8e0)~INNER) thr#1effa010 
    DBD::ODBC Disconnected! 
     ERROR: -1 '[DataDirect][ODBC SQL Server Driver] (SQL-HY000) 
[DataDirect][ODBC SQL Server Driver] (SQL-HY000)(DBD: st_execute/SQLExecute err=-1)' (err#0) 
    <- DESTROY= undef 

l strace d両方のserv db1上のスクリプトがファイル/var/local/odbc/DDODBC.DATを開いて読み込もうとしたときに実行の終了に向かって唯一の違いが発生し、クラッシュが発生します。 db2の実行は何の処理も行わず、正常に処理を続けます。大量のファイルシステムのクロールとファイルの比較の後、私はodbc.iniの設定ファイルが両方のサーバで同じであり、/ var/local/odbcの構造と内容も同じであることを確認しました。ただし、DDODBC .DATはdb1に存在しますが、db2には存在しません。環境変数も同じです。

DDODBC.DATを別の場所に移動すると、スクリプトは正常に実行されます。ファイルは再作成され、使用され、スクリプトは作業を続行します(straceから表示されます)。元のDDODBC.DATを置き換えると、スクリプトが再びクラッシュします。ここでの明らかな結論は、ファイルが不良であること、悪いデータ、破損などであることです。新しい、成功にstracedb1上で動作する唯一の4本の 線でdb2上のものとは異なります。ファイルに使用されているDDODBC.DATとそれが作成されますが、どのようなものです

open("/var/local/odbc/DDODBC.DAT", O_RDONLY) = 4 
lseek(4, 0, SEEK_SET)     = 0 
read(4, ..., 1212) = 1212 
close(4)        = 0 

Googleは私にとって助けにはならなかった。レコードの

:私はあなたが私はDBD :: ODBCはDDODBC.DATファイルを使用していないという事実のために、名前から知っているように、あなたのドライバのプロバイダに話をする必要がありますね

$ perl --version 
This is perl, v5.8.8 built for x86_64-linux-thread-multi 
$ uname -srmo 
Linux 2.6.18-141.el5 x86_64 GNU/Linux 
$ odbcinst --version 
unixODBC 2.2.11 
$ perl -MDBD::ODBC -e 'print $DBD::ODBC::VERSION, "\n";' 
1.13 

答えて

0

DataDirectは、ホスト上でライセンスの競合が発生した場合、DDODBC.DATファイルが(通常)作成されていることを確認しました。私たちの場合、私たちのライセンスは最大16 CPUのサーバ用ですが、24 CPUを搭載したホストにドライバをインストールしました。ドライバはこれを認識し、DDODBC.DATを使ってそれを書き留め、最終的には評価モードに移行します。

1

それDataDirectを提案します。トレースはSQLExecuteエラーへの呼び出しを示し、エラーテキストなしで一般エラー(HY000)を返します。

+0

チップのおかげで。私は現在いくつかの共有ライブラリの違いを探っていますが、サポートのために私たちのプロバイダを見て次に確実に来るでしょう。 –

関連する問題