简体   繁体   English

Perl脚本中的MySQL错误代码2

[英]MySQL Errorcode 2 in Perl script

I have created an ETL tool in Perl. 我在Perl中创建了一个ETL工具。 There are three database servers to which ETL tool is communicating, say dbserver1 (OLTP server - Windows Box), dbserver2 (staging server - linux Box), dbserver3 (OLAP Server, linux Box). ETL工具正在与三个数据库服务器进行通信,例如dbserver1(OLTP服务器-Windows Box),dbserver2(登台服务器-linux Box),dbserver3(OLAP服务器,linux Box)。 My ETL script is on dbserver 2. 我的ETL脚本在dbserver 2上。

The scripts reads the data from dbserver1 and bring it into the dbserver2 for some trnsformations, performs transformations and then put the data into the dbserver3. 脚本从dbserver1读取数据,并将其带入dbserver2进行某些转换,执行转换,然后将数据放入dbserver3。 For achieving this the script creates some OUTFILE data on dbserver2. 为了实现此目的,该脚本在dbserver2上创建了一些OUTFILE数据。 So there are two type of OUTFILE queries: 因此,有两种类型的OUTFILE查询:

  1. OUTFILE query which runs on the dbserver1, creates .data on dbserver2 and 在dbserver1上运行的OUTFILE查询,在dbserver2上创建.data并
  2. OUTFILE query which runs on the dbserver2 creates .data file on dbserver2. 在dbserver2上运行的OUTFILE查询在dbserver2上创建.data文件。

The second query works fine as it is creating a file on the same server. 第二个查询工作正常,因为它正在同一服务器上创建文件。 But first type of query gives me following error: 但是第一种查询给我以下错误:

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.

I guess this is related to some user permissions. 我想这与某些用户权限有关。 And if I am not wrong then, MySQL on dbserver2 is having permissions to read/write to the dbserver2, but MySQL on dbserver1 is not. 如果我没看错,那么dbserver2上的MySQL有权读取/写入dbserver2,但是dbserver1上的MySQL没有权限。

Can it be because of the dbserver1 is Windows and dbserver2 is Linux box? 可能是因为dbserver1是Windows,而dbserver2是Linux吗?

How can I resolve this? 我该如何解决?

FYI: The file formate is: dumpfile.yyy-mm-dd-hh:mm.data and I also have set the AppArmor settings for MySQL on dbserver2, which is for MySQL on dbserver2. 仅供参考:文件格式为:dumpfile.yyy-mm-dd-hh:mm.data,我还为dbserver2上的MySQL设置了AppArmor设置,而dbserver2上的MySQL设置了AppArmor设置。

The problem is the outfile query on dbserver1 can only write locally, so you need a different approach. 问题是dbserver1上的outfile查询只能在本地写入,因此您需要其他方法。
One very easy method is to use mysqldump (on dbserver2) to connect to dbserver1 and pipe the output to a mysql client which injects the SQL into dbserver2. 一种非常简单的方法是使用mysqldump (在dbserver2上)连接到dbserver1,并将输出通过管道传递到mysql客户端,该客户端将SQL注入dbserver2。

On the other hand, if you want to use DBI : 另一方面,如果要使用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});

For large transfers of data, the mysqldump approach is faster. 对于大型数据传输, mysqldump方法更快。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM