gpt4 book ai didi

Perl 脚本中的 MySQL 错误代码 2

转载 作者:太空宇宙 更新时间:2023-11-04 11:35:41 25 4
gpt4 key购买 nike

我已经用 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 box?

我该如何解决?

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

最佳答案

问题是 dbserver1 上的 outfile 查询只能写到本地,所以你需要一个不同的方法。
一种非常简单的方法是使用 mysqldump(在 dbserver2 上)连接到 dbserver1 并将输出通过管道传输到 mysql 客户端,后者将 SQL 注入(inject)到 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 方法更快。

关于Perl 脚本中的 MySQL 错误代码 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8011963/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com