Оператор MySQL Docker INFILE / INTO OUTFILE в системе MacOS

У меня есть Java-программа и контейнер MySQL Docker (изображение: mysql: 5.7.20). Мои MacO - High Sierra 10.13.4.

Коротко о проблеме

Использование Docker в MacOS (10.13.4.). Внутри docker-контейнера (image: mysql: 5.7.20) в основном запросы (выполняемые из Java-программы)

  • LOAD DATA INFILE ...
  • SELECT ... INTO OUTFILE ...

работают нормально, но иногда java-программа генерирует исключения:

  • SQLException: Невозможно создать / записать в файл «…» (код ошибки: 2 - такого файла или каталога нет)
  • SQLException: Невозможно получить статистику '…'. Код ошибки: 2 - Нет такого файла или каталога)
  • SQLException: Сервер MySQL работает с опцией --secure-file-priv, поэтому он не может выполнить этот оператор
  • SQLException: файл '…' не найден (код ошибки: 2 - нет такого файла или каталога)

между прочим. файл существует, и права доступа должны быть хорошими (см. более длинную версию)

Более длинная версия

Процесс выглядит следующим образом:

  • создается файл .csv
  • этот файл .csv копируется в каталог, который монтируется для контейнера docker
    • раздел томов docker-compose: - "./data/datahub/import:/var/lib/mysql-files/datahub/import"
  • затем MySQL читает этот файл .csv в таблицу:
    • LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';
  • , затем происходит что-то в этой базе данных
  • после этого MySQL записывает выходной файл .csv
    • SELECT TBL . SKU , TBL . удалено , TBL . data_source_values ​​INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ...

Этот проект имеет несколько тестов интеграции Java для этого процесса. Эти тесты в основном зеленые, но иногда они терпят неудачу с:

  • SQLException: Невозможно создать / записать в файл '…' (Код ошибки: 2 - нет такого файла или каталога)
  • SQLException: Невозможно получить статистику '…'. Код ошибки: 2 - Нет такого файла или каталога)
  • SQLException: Сервер MySQL работает с опцией --secure-file-priv, поэтому он не может выполнить это оператор
  • SQLException: файл '…' не найден (код ошибки: 2 - нет такого файла или каталога)

Файл для создания docker выглядит так:

version: '3'
  services:
    datahub_db:
      image: "mysql:5.7.20"
      restart: always
      environment:
        - MYSQL_ROOT_PASSWORD=${DATAHUB_DB_ROOT_PASSWORD}
        - MYSQL_DATABASE=${DATAHUB_DB_DATABASE}
      volumes:
        - "datahub_db:/var/lib/mysql"
        - "./data/datahub/import:/var/lib/mysql-files/datahub/import"
        - "./data/akeneo/import:/var/lib/mysql-files/akeneo/import"
      ports:
        - "${DATAHUB_DB_PORT}:3306"

...

volumes:
  datahub_db:

Журнал из этого контейнера базы данных Docker показывает следующее (но иногда это происходило, когда все тесты тоже зеленого цвета)

  • datahub_db_1 | 2018-06-01T10:04:33.937646Z 144 [Note] Aborted connection 144 to db: 'datahub_test' user: 'root' host: '172.18.0.1' (Got an error reading communication packets)

.csv файл внутри контейнера datahub, показывает следующее: fo ls -lha

root@e02e2074fb6b:/var/lib/mysql- 
files/datahub/import/test/products/kaw# ls -lha
total 4.0K
drwxr-xr-x 3 root root  96 Jun  1 09:36 .
drwxr-xr-x 3 root root  96 Jun  1 09:36 ..
-rw-r--r-- 1 root root 378 Jun  1 06:47 deactivated_product_merged_bub.csv

Я думаю, что нет никаких проблем, что этот файл принадлежит root, потому что в основном этот файл может быть прочитан MySQL. Когда я переключаюсь на пользователя mysql через su mysql внутри контейнера Docker, я получаю следующее:

$ ls -al
total 4
drwxr-xr-x 3 mysql mysql  96 Jun  1 09:36 .
drwxr-xr-x 3 mysql mysql  96 Jun  1 09:36 ..
-rw-r--r-- 1 mysql mysql 378 Jun  1 06:47 deactivated_product_merged_bub.csv

Теперь произошли некоторые странные вещи.

  • с пользователем root, я мог бы сделать cat deactivated_product_merged_bub.csv
  • с пользователем mysql, я не смог получить:

Вывод:

$ cat deactivated_product_merge_bub.csv
cat: deactivated_product_merge_bub.csv: No such file or directory

Я сделал stat deactivated_product_merged_bub.csv в качестве пользователя MySQL, и внезапно я смог сделать cat для этого файла (как вы видите, я chmod 777 для этого файла, чтобы заставить cat работать - но это не так » т работы).

  • stat как root

Вывод:

root@e02e2074fb6b:/var/lib/mysql-files/datahub/import/test/products/kaw# stat 
deactivated_product_merged_bub.csv 
  File: 'deactivated_product_merged_bub.csv'
  Size: 378         Blocks: 8          IO Block: 4194304 regular file
Device: 4fh/79d Inode: 4112125     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2018-06-01 09:23:38.000000000 +0000
Modify: 2018-06-01 06:47:44.000000000 +0000
Change: 2018-06-01 09:04:53.000000000 +0000
  Birth: -
  • stat как пользователь mysql

Вывод :

$ stat deactivated_product_merged_bub.csv
  File: 'deactivated_product_merged_bub.csv'
  Size: 378         Blocks: 8          IO Block: 4194304 regular file
Device: 4fh/79d Inode: 4112125     Links: 1
Access: (0777/-rwxrwxrwx)  Uid: (  999/   mysql)   Gid: (  999/   mysql)
Access: 2018-06-01 09:32:25.000000000 +0000
Modify: 2018-06-01 06:47:44.000000000 +0000
Change: 2018-06-01 09:04:53.000000000 +0000
  Birth: -

Вопрос

Кто-нибудь знает, что здесь произошло, или есть подсказка для того, что я могу искать, чтобы копать глубже?

Мой есть предположение, что это связано с использованием Docker с MacO и подключенным томом.

25
задан SAVe 11 July 2019 в 06:37
поделиться

2 ответа

Я думаю, что у Вас есть проблема с разрешением совместно использовать папки между контейнерами докера и хостом. Необходимо отобразить пользователей контейнеров с пользователями хоста установкой UID в .env файле.

UID=501 # run echo $UID to get current user id
version: '3'
  services:
    datahub_db:
      image: "mysql:5.7.20"
      user: $UID
      restart: always
      environment:
        - MYSQL_ROOT_PASSWORD=${DATAHUB_DB_ROOT_PASSWORD}
        - MYSQL_DATABASE=${DATAHUB_DB_DATABASE}
      volumes:
        - "datahub_db:/var/lib/mysql"
        - "./data/datahub/import:/var/lib/mysql-files/datahub/import"
        - "./data/akeneo/import:/var/lib/mysql-files/akeneo/import"
      ports:
        - "${DATAHUB_DB_PORT}:3306"

...

volumes:
  datahub_db:

0
ответ дан 28 November 2019 в 05:57
поделиться

Мне подобным столкновением с двумя отдельными проблемами здесь, оба связанные с конфигурацией сервера MySQL кажется.

сервер MySQL работает с - secure-file-priv опция, таким образом, это не может выполнить этот оператор.

Эта опция требует, чтобы любая загрузка файла или экспорт файла были помещены в указанное место хранения в файловой системе. Можно найти местоположение с помощью следующей команды или от клиента командной строки MySQL или от MySQL Workbench:

mysql> show variables like 'secure-file-priv';

результат это должно определить местоположение, где файлы могут быть загружены и выписаны к. Никакое другое местоположение не должно быть позволено, когда secure-file-priv включен.

(Получил ошибку при чтении коммуникационных пакетов)

Это часто вызывается загружаемыми данными или экспортируется, который превышает переменную MySQL max-allowed-packet.

можно так же найти значение для max-allowed-packet использованием следующей команды или от клиента командной строки MySQL или от MySQL Workbench:

mysql> show variables like 'max-allowed-packet';

к Этому обратились и хорошо ответили в этом вопросе: https://dba.stackexchange.com/questions/19135/mysql-error-reading-communication-packets

В суммировании: В/etc/my.cnf или my.ini под [mysqld] раздел:

[mysqld]
max_allowed_packet=268435456

‬In рабочий экземпляр MySQL:

SET GLOBAL max_allowed_packet = 268435456;

(Никакой перезапуск сервиса не требуется.)

Как в стороне, учетной записи MySQL, которую Вы используете, должно быть, дали разрешение 'ФАЙЛА', чтобы загрузить или экспортировать. Так как Вы используете корень MySQL (административная) учетная запись, это не должно быть фактором, но я думал, что буду включать его для любого, кто сталкивается с этим.

я надеюсь, что это помогает.

1
ответ дан 28 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: