MySQL Errorcode 2 в скрипте Perl - PullRequest
       25

MySQL Errorcode 2 в скрипте Perl

0 голосов
/ 04 ноября 2011

Я создал инструмент ETL в Perl.Существует три сервера базы данных, с которыми взаимодействует инструмент ETL, например, dbserver1 (OLTP-сервер - Windows Box), dbserver2 (промежуточный сервер - linux Box), dbserver3 (OLAP-сервер, linux Box).Мой ETL-скрипт находится на dbserver 2.

Сценарии считывают данные из dbserver1 и переносят их в dbserver2 для некоторых trnsformation, выполняют преобразования и затем помещают данные в dbserver3.Для этого скрипт создает некоторые данные OUTFILE на dbserver2.Таким образом, существует два типа запросов OUTFILE:

  1. Запрос OUTFILE, который выполняется на dbserver1, создает .data на dbserver2, а
  2. Запрос OUTFILE, который выполняется на dbserver2, создает файл .data наdbserver2.

Второй запрос работает нормально, так как он создает файл на том же сервере.Но первый тип запроса дает мне следующую ошибку:

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.

Я полагаю, это связано с некоторыми правами пользователя.И если я не ошибаюсь, MySQL на dbserver2 имеет разрешения на чтение / запись на dbserver2, а MySQL на dbserver1 - нет.

Может ли это быть из-за того, что dbserver1 является Windows, а dbserver2 является Linux box?

Как мне решить эту проблему?

К вашему сведению: формат файла: dumpfile.yyy-mm-dd-hh: mm.data и я также установили параметры AppArmor для MySQL на dbserver2, который предназначен для MySQL на dbserver2.

1 Ответ

1 голос
/ 04 ноября 2011

Проблема в том, что запрос outfile на dbserver1 может писать только локально, поэтому вам нужен другой подход.
Один очень простой способ - использовать 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 быстрее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...