2011-11-04 60 views
0

我已經創建了Perl中的ETL工具。有三個數據庫服務器與ETL工具進行通信,例如dbserver1(OLTP服務器 - Windows Box),dbserver2(臨時服務器 - linux Box),dbserver3(OLAP服務器,linux Box)。我的ETL腳本位於dbserver 2上。MySQL的錯誤代碼2 Perl腳本

腳本從dbserver1中讀取數據並將其帶入dbserver2以執行某些轉換,然後執行轉換,然後將數據放入dbserver3中。爲了實現這個腳本,在dbserver2上創建了一些OUTFILE數據。所以有兩種類型OUTFILE查詢:運行於dbserver1

  1. OUTFILE查詢,創建。數據上dbserver2和
  2. 運行於dbserver2
  3. 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的盒子?

我怎樣才能解決這個問題?

僅供參考:文件formate是:dumpfile.yyy-mm-dd-hh:mm.data並且我還爲dbserver2上的MySQL設置了AppArmor設置,該設置適用於dbserver2上的MySQL。

回答

1

的問題是dbserver1 outfile中查詢只能在本地寫,所以你需要一個不同的方法。
一個非常簡單的方法是使用mysqldump(上dbserver2)連接到dbserver1和管道輸出到一個MySQL客戶端,它噴射到SQL dbserver2。

在另一方面,如果你想使用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

謝謝niczero。數據是巨大的,因爲它有大約2000萬條記錄,而且速度會更慢如果我使用上述方法,我猜...同時mysqldump將需要時間從dbserver1導入到dbserver2。在ETL工具操作之間使用mysqldump會很繁瑣。沒有任何問題。我會試試這個。 – srahul07

+0

還有一件事,dbserver2具有OUTFILE查詢,其數據ETL將使用INFILE寫入dbserver3。這是否會導致有關權限的任何問題,如OUTFILE的這個問題? – srahul07

+0

是的,完全一樣的問題。另一種方法是使用第一種技術在本地進行讀/寫,然後用腳本包裝,然後將文件傳輸到下一臺服務器。 – niczero