MacOS 系统上的 MySQL Docker Container INFILE/INTO OUTFILE 语句
我有一个Java程序和一个mysql Docker容器(图片:mysql:5.7.20)。我的 MacOs 是 High Sierra 10.13.4。
简而言之,问题
在 MacOS 上使用 Docker (10.13.4.)。在 docker 容器(图片:mysql:5.7.20)中,主要是查询(从 java 程序执行)
LOAD DATA INFILE ...
SELECT ... INTO OUTFILE ...
工作正常,但有时 java 程序会引发异常:
- SQLException:无法创建/写入文件“...”。(错误代码:2 - 没有此类文件或目录)
- SQLException:无法获取“...”的统计信息错误代码: 2 - 没有这样的文件或目录)
- SQLException:MySQL服务器使用--secure-file-priv选项运行,因此它无法执行此语句
- SQLException: File '...'未找到(错误代码:2 - 无此类文件或目录)
顺便说一句。文件存在并且权限应该没问题(请参阅更长的版本)
加长版
该过程如下:
- 创建.csv文件
- 此.csv文件被复制到一个目录中,该目录是为 docker 容器挂载的
- docker-compose volumes 部分:
- "./data/datahub/import:/var/lib/mysql-files/datahub/import"
- docker-compose volumes 部分:
- 然后MySQL将此.csv文件读入表中:
LOAD DATA INFILE '.csv-file' REPLACE INTO TABLE 'my-table';
- 然后该数据库上的一些东西发生了
- 之后,MySQL写入.csv输出文件
-
SELECT
tblskutbldeletedtbldata_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: File '...'未找到(错误代码: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)
数据集线器容器内的.csv文件如下所示: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读取。当我通过 Docker 容器内部更改为用户时,我得到以下内容:mysql
su mysql
$ 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
现在发生了一些奇怪的事情。
- 与根用户,我可以做一个
cat deactivated_product_merged_bub.csv
- 与mysql用户我不能得到:
输出:
$ cat deactivated_product_merge_bub.csv
cat: deactivated_product_merge_bub.csv: No such file or directory
我做了一个MySQL用户,突然间我可以在该文件上做一个(正如你所看到的,我到那个文件来获得工作 - 但它不起作用)。stat deactivated_product_merged_bub.csv
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和挂载的卷一起使用。