私は、どちらのサーバ(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を置き換えると、スクリプトが再びクラッシュします。ここでの明らかな結論は、ファイルが不良であること、悪いデータ、破損などであることです。新しい、成功にstrace
、db1
上で動作する唯一の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
チップのおかげで。私は現在いくつかの共有ライブラリの違いを探っていますが、サポートのために私たちのプロバイダを見て次に確実に来るでしょう。 –