gpt4 book ai didi

java - MacOS 系统上的 MySQL Docker 容器 INFILE/INTO OUTFILE 语句

转载 作者:IT老高 更新时间:2023-10-28 12:38:02 26 4
gpt4 key购买 nike

我有一个 Java 程序和一个 mysql Docker 容器(图片:mysql:5.7.20)。
我的 MacO 是 High Sierra 10.13.4。

总之问题

在 MacOS (10.13.4.) 上使用 Docker。在 docker 容器内(图像:mysql:5.7.20)主要是查询(从 java 程序执行)

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

  • 工作正常,但有时java程序会抛出异常:
  • SQLException:无法创建/写入文件“...”(错误代码:2 - 没有这样的文件或目录)
  • SQLException: 无法获取“...”的统计信息 Errcode: 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. sku ,.已删除 ,.数据源值INTO OUTFILE 'output.csv' FIELDS TERMINATED BY '|' ENCLOSED BY '"' ESCAPED BY '"' FROM (SELECT ...

  • 这个项目有一些针对这个过程的 java 集成测试。这些测试大多是绿色的,但有时它们会失败:
  • SQLException:无法创建/写入文件“...”(错误代码:2 - 没有这样的文件或目录)
  • SQLException: 无法获取“...”的统计信息 Errcode: 2 - 没有这样的文件或目录)
  • SQLException: MySQL 服务器正在使用 --secure-file-priv 选项运行,因此它无法执行此语句
  • SQLException: 找不到文件“...”(错误代码:2 - 没有这样的文件或目录)

  • docker-compose 文件如下所示:
    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)

  • datahub 容器内的 .csv 文件显示以下内容,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@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 和已安装的卷一起使用。

    最佳答案

    在我看来,您可能在这里遇到了两个不同的问题,都与 MySQL 服务器的配置有关。

    The MySQL server is running with the --secure-file-priv option so it cannot execute this statement.



    此选项要求将任何文件加载或文件导出放置在文件系统中的指定存储位置。
    您可以在 MySQL 命令行客户端或 MySQL Workbench 中使用以下命令查找位置:
    mysql> show variables like 'secure-file-priv';

    其结果应确定可以加载和写出文件的位置。启用secure-file-priv 时,不应允许其他位置。

    (Got an error reading communication packets)



    这通常是由于加载或导出的数据超过 MySQL 变量 max-allowed-packet 引起的。

    您可以类似地从 MySQL 命令行客户端或 MySQL Workbench 使用以下命令找到 max-allowed-packet 的值:
    mysql> show variables like 'max-allowed-packet';

    这已在此问题中得到解决并得到很好的回答:
    https://dba.stackexchange.com/questions/19135/mysql-error-reading-communication-packets

    总之:
    在 [mysqld] 部分下的/etc/my.cnf 或 my.ini 中:
    [mysqld]
    max_allowed_packet=268435456

    在正在运行的 MySQL 实例中:
    SET GLOBAL max_allowed_packet = 268435456;

    (不需要重启服务。)

    顺便说一句,您使用的 MySQL 帐户必须已被授予"file"权限才能加载或导出。由于您使用的是 MySQL 根(管理)帐户,因此这不应该是一个因素,但我想我会将它包含给遇到此问题的任何人。

    我希望这有帮助。

    关于java - MacOS 系统上的 MySQL Docker 容器 INFILE/INTO OUTFILE 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50641841/

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