0

Perl で ETL ツールを作成しました。ETL ツールが通信する 3 つのデータベース サーバーがあります。たとえば、dbserver1 (OLTP サーバー - Windows ボックス)、dbserver2 (ステージング サーバー - Linux ボックス)、dbserver3 (OLAP サーバー、Linux ボックス) です。私の ETL スクリプトは dbserver 2 にあります。

スクリプトは、dbserver1 からデータを読み取り、いくつかの変換のために dbserver2 に取り込み、変換を実行してから、データを dbserver3 に入れます。これを実現するために、スクリプトは dbserver2 にいくつかの OUTFILE データを作成します。したがって、OUTFILE クエリには次の 2 つのタイプがあります。

  1. dbserver1 で実行される OUTFILE クエリは、dbserver2 に .data を作成し、
  2. dbserver2 で実行される OUTFILE クエリは、dbserver2 に .data ファイルを作成します。

2 番目のクエリは、同じサーバー上にファイルを作成しているため、正常に機能します。しかし、最初のタイプのクエリでは、次のエラーが発生します。

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 ボックスであるためでしょうか?

どうすればこれを解決できますか?

参考までに: ファイル形式は次のとおりです: dumpfile.yyy-mm-dd-hh:mm.data また、dbserver2 の MySQL の AppArmor 設定を dbserver2 の MySQL に設定しました。

4

1 に答える 1

1

問題は、dbserver1 の outfile クエリがローカルでのみ書き込むことができるため、別のアプローチが必要になることです。
非常に簡単な方法の 1 つは、mysqldump(dbserver2 で) を使用して dbserver1 に接続し、SQL を dbserver2 に注入する 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アプローチの方が高速です。

于 2011-11-04T16:09:47.967 に答える