我在Perl中创建了一个ETL工具。 ETL工具正在与三个数据库服务器通信,例如dbserver1(OLTP服务器 - Windows Box),dbserver2(登台服务器 - linux Box),dbserver3(OLAP服务器,linux Box)。我的ETL脚本在dbserver 2上。
脚本从dbserver1读取数据并将其带入dbserver2以进行某些转换,执行转换然后将数据放入dbserver3。为实现此目的,脚本在dbserver2上创建一些OUTFILE数据。所以有两种类型的OUTFILE查询:
第二个查询工作正常,因为它在同一服务器上创建文件。但第一种类型的查询给出了以下错误:
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。
答案 0 :(得分: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
方法更快。