2011-11-04 4 views
0

Perl에서 ETL 도구를 만들었습니다. dbserver1 (OLTP 서버 - Windows Box), dbserver2 (스테이징 서버 - linux Box), dbserver3 (OLAP Server, linux Box)와 같이 ETL 도구가 통신하는 세 개의 데이터베이스 서버가 있습니다. 내 ETL 스크립트는 dbserver 2에 있습니다.Perl 스크립트의 MySQL 오류 코드 2

스크립트는 dbserver1에서 데이터를 읽고 일부 trnsformations에 대해 dbserver2로 가져 와서 변환을 수행 한 다음 데이터를 dbserver3에 저장합니다. 이를 달성하기 위해 스크립트는 dbserver2에 몇 가지 OUTFILE 데이터를 작성합니다. 그래서 OUTFILE 쿼리의 두 가지 유형이 다음과 같습니다 dbserver1에서 실행

  1. OUTFILE 쿼리, dbserver2에 .DATA를 생성하고 dbserver2에서 실행
  2. OUTFILE 쿼리 dbserver2에 .DATA 파일을 만듭니다.

두 번째 쿼리는 동일한 서버에 파일을 만들 때 제대로 작동합니다. 그러나 쿼리의 첫 번째 유형은 나에게 다음과 같은 오류를 제공합니다 :

DBD::mysql::st execute failed: Can't create/write to file '\home\dbserver2\dumpfile.2011-11-04-03:02.data' (Errcode: 2) at stagingtransform.pl line 223, <> line 8. 

나는이 일부 사용자 권한에 관련 같아요. 그리고 내가 잘못하지 않았다면, dbserver2의 MySQL은 dbserver2를 읽고 쓸 수있는 권한을 가지고 있지만 dbserver1의 MySQL은 그렇지 않습니다.

dbserver1이 Windows이고 dbserver2가 Linux 상자 일 수 있습니까?

어떻게 해결할 수 있습니까?

FYI : 파일 형식은 dumpfile.yyy-mm-dd-hh : mm.data이며 dbserver2의 MySQL 용 dbserver2에서 MySQL의 AppArmor 설정도 지정했습니다.

답변

1

dbserver1의 outfile 쿼리는 로컬로만 쓸 수 있으므로 다른 방법이 필요합니다.
아주 쉬운 방법 중 하나는 012ser(dbserver2)을 사용하여 dbserver1에 연결하고 dbserver2에 SQL을 주입하는 mysql 클라이언트로 출력을 파이프하는 것입니다. 한편

, 당신은 DBI를 사용하려면 : 대량의 데이터 전송을 위해

my $source_sql = q{SELECT ...}; 
my $target_sql = q{INSERT ... VALUES (?, ?, ...)}; 
my $source = $source_dbh->prepare($source_sql); 
my $target = $target_dbh->prepare($target_sql); 
$source->execute; 
my $qty = $target->execute_array({ArrayTupleFetch => $source}); 

mysqldump 접근 방식은 빠르다.

+0

감사합니다. 데이터가 약 20 수백만의 레코드를 가지고 있으며 실제로 느린 것입니다 위의 접근 방식을 사용하는 경우, 나는 추측 ... 또한 mysqldump는 dbserver1에서 dbserver2로 가져올 시간이 소요될 것입니다. 그리고 ETL 도구 작업 사이에 mysqldump를 가지는 것은 지루할 것입니다. 문제 없습니다. 나는 이것을 시도 할 것이다. – srahul07

+0

한 가지 더 dbserver2에는 INFILE을 사용하여 ETL이 dbserver3에 쓸 OUTFILE 쿼리가 있습니다. 이것은 OUTFILE과 같은 사용 권한과 관련하여 문제가 있습니까? – srahul07

+0

네, 정확히 같은 문제입니다. 또 다른 방법은 첫 번째 기법을 사용하여 로컬에서 읽고 쓰기를하는 것이지만 다음 스크립트를 사용하여 파일을 다음 서버로 전송합니다. – niczero