2011-11-04 64 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