如何允许 mysql(mariadb) 从 /tmp 读取文件 - Fedora 30

How to allow mysql(mariadb) to read files from /tmp - Fedora 30

我编写了一个程序从套接字接收数据,将数据格式化为 CSV 格式,然后将数据转储到文件; '/tmp/test_csv.csv'.

接下来,我在mysql中执行以下命令:

LOAD DATA INFILE '/tmp/test_csv.csv'
INTO TABLE flow_data
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n';

此语句输出以下错误:

Can't get stat of '/tmp/test_csv.csv' (Errcode: 2 "No such file or directory")

据我了解,mysql 无法从 /tmp 读取数据,这很合理。

我正在寻找的解决方案是给予 mysql 从 /tmp 读取的权限,同时保留其无法在那里写入的能力(后者是可选的)。

我需要将 csv 文件转储到 /tmp(或任何其他 RAMdisk 样式目录),因为它的大小,因此将文件转储到 mysql 数据库目录不是一个有效的解决方案。如果我正在处理的数据量没有存储在内存中,那么我的硬盘将被严重争用(文件和 mysql)。

我唯一的解决方案 found/tried 涉及使用 semanage 更改 perms。 但是,我没有运气。

我还看到有一个变通方法,就是使用关键字 LOCAL。但是,我不确定此解决方案对性能的影响,更愿意让 mysql 直接读取文件 - 或者至少测试一下它是否重要。

OS:软呢帽 30

mysql -V
mysql  Ver 15.1 Distrib 10.3.12-MariaDB, for Linux (x86_64)

*编辑 文件 (/tmp/test_csv.csv) 和 sql 服务器都在同一台机器上。我知道 'LOAD DATA LOCAl INFILE' 也可以,但我正在尝试让 mysql 直接读取文件

如果文件在连接到数据库的机器上而不是在服务器本身上,您可能想要使用 LOAD DATA LOCAL INFILE,因为 LOAD DATA INFILE 将在 mysql 服务器的文件系统上查找。

您的问题可能是由于现在大多数守护进程都有一个 private TMPFS(包括 mysqld)。为了允许 mysql 访问 /tmp,您需要像这样更改其守护程序配置:

export SYSTEMD_EDITOR=vim #Change the editor to the one you prefer
sudo -E systemctl edit --full mysqld.service
# Search for "PrivateTmp" and change it to "false", then save the file
sudo systemctl daemon-reload
sudo systemctl restart mysqld.service