MySQL / 10. Импорт и экспорт данных

Определение местоположения файла данных

Задача
Вы не уверены в том, как указать в предложении LOAD DATA местоположение файла данных, особенно если он находится в другом каталоге.

Решение
Надо запомнить правила, которыми MySQL руководствуется при поиске файлов.

Обсуждение
Сервер MySQL, приступая к выполнению предложения LOAD DATA, обычно предполагает, что файл с данными находится на том же хосте. Однако при таком подходе могут возникнуть определенные трудности:

• Если вы обращаетесь к серверу MySQL с клиента на удаленном хосте и не имеете возможности передать файл данных на серверный хост (например, у вас нет учетной записи для входа туда).

• Даже если у вас есть учетная запись, позволяющая зайти на серверный хост, учетная запись MySQL должна иметь привилегию FILE, а сам загружаемый файл должен либо иметь доступ на чтение для всех, либо располагаться в каталоге данных текущей базы данных. Большинство пользователей MySQL не имеют привилегии FILE (так как она позволяет выполнять опасные действия), кроме того вы вряд ли захотите открывать свой файл на чтение для всех (по соображениям безопасности), или же каталог данных может оказаться для вас недоступным.

К счастью, если вы работаете с MySQL версии 3.22.15 и выше, то можете загружать локальные файлы, расположенные на клиентском хосте, используя предложение LOAD DATA LOCAL вместо LOAD DATA. Единственная привилегия, необходимая для импорта локального файла – это доступ к нему на чтение.

Если ключевое слово LOCAL отсутствует, то MySQL ищет файл данных на серверном хосте по следующим правилам:

• Абсолютное путевое имя полностью определяет положение файла в файловой системе. MySQL читает файл из указанного места.

• Относительное путевое имя интерпретируется двумя способами, в зависимости от того, состоит оно из одного компонента или из нескольких.

Имя из одного компонента, например mytbl.txt, MySQL ищет в каталоге текущей базы данных. В случае многокомпонентных имен, таких как xyz/mytbl.txt, MySQL ищет файл в соответствующем подкаталоге каталога данных data. (Предполагается, что файл mytbl.txt находится в каталоге xyz.)

Каталоги баз данных располагаются непосредственно в каталоге данных (data), поэтому следующие предложения эквиваленты – в предположении, что текущей базой данных является cookbook:

mysql> LOAD DATA INFILE 'mytbl.txt' INTO TABLE mytbl;
mysql> LOAD DATA INFILE 'cookbook/mytbl.txt' INTO TABLE mytbl;

Если присутствует ключевое слово LOCAL, то MySQL ищет файл на клиентском хосте, интерпретируя имя по тем же правилам, что и командный интерпретатор:• Абсолютное путевое имя полностью определяет положение файла относительно корня файловой системы.

• Относительное путевое имя интерпретируется относительно текущего каталога.

Если файл расположен на клиентском хосте, но вы забыли указать, что он локальный, то вы получите сообщение об ошибке.

mysql> LOAD DATA 'mytbl.txt' INTO TABLE mytbl;

ERROR 1045: Access denied for user: 'cbuser@localhost' (Using password: YES)

Такое сообщение Access denied может сбивать с толку: ведь то, что вы смогли установить соединение с сервером и дать команду LOAD DATA, означает, что у вас есть доступ к MySQL. На самом деле такое сообщение об ошибке говорит о том, что сервер MySQL пытался открыть на своем хосте файл mytbl.txt и не смог этого сделать.

Утилита mysqlimport при поиске файлов придерживается тех же правил, что и LOAD DATA. По умолчанию она предполагает, что файл данных расположен на серверном хосте. Чтобы открыть локальный файл, используйте опцию --local (или -L) в командной строке. Если база данных не указана явно, то LOAD DATA предполагает, что таблица находится в текущей базе данных. Утилита mysqlimport всегда требует указания базы данных:

% mysqlimport --local cookbook mytbl.txt

Если вы загружаете данные при помощи LOAD DATA в базу данных, отличную от текущей, то можете добавить имя базы к имени таблицы. В следующем предложении указано, что таблица mytbl находится в базе данных other_db:

mysql> LOAD DATA LOCAL 'mytbl.txt' INTO TABLE other_db.mytbl;

Команда LOAD DATA не предполагает связи между именами файла данных и таблицы, в которую эти данные загружаются. Утилита mysqlimport устанавливает однозначное соответствие между именем файла и именем таблицы.

А именно, она использует последний компонент имени файла в качестве имени таблицы. Например, файлы mytbl.txt, mytbl.dat, /tmp/mytbl.txt, /u/paul/data/mytbl.csv и D:\projects\mytbl.txt будут рассматриваться этой утилитой как источники данных для таблицы mytbl.

Статьи по MySQL на эту тему:

Диагностическая утилита для LOAD DATA
Извлечение и перестановка столбцов файлов данных
Импорт XML в MySQL
Импорт файлов в формате CSV
Использование временных таблиц для преобразования дат

Вернуться в раздел: MySQL / 10. Импорт и экспорт данных