0

我在 Perl 中创建了一个 ETL 工具。ETL 工具正在与之通信的三个数据库服务器,例如 dbserver1(OLTP 服务器 - Windows Box)、dbserver2(登台服务器 - linux Box)、dbserver3(OLAP 服务器、linux Box)。我的 ETL 脚本在 dbserver 2 上。

脚本从 dbserver1 读取数据并将其带入 dbserver2 进行一些转换,执行转换,然后将数据放入 dbserver3。为了实现这一点,脚本在 dbserver2 上创建了一些 OUTFILE 数据。所以有两种类型的 OUTFILE 查询:

  1. 在 dbserver1 上运行的 OUTFILE 查询在 dbserver2 上创建 .data 并
  2. 在 dbserver2 上运行的 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 机器?

我该如何解决这个问题?

仅供参考:文件格式是:dumpfile.yyy-mm-dd-hh:mm.data,我还为 dbserver2 上的 MySQL 设置了 AppArmor 设置,这适用于 dbserver2 上的 MySQL。

4

1 回答 1

1

问题是 dbserver1 上的 outfile 查询只能在本地写入,因此您需要一种不同的方法。
一种非常简单的方法是使用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 回答