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

时间:2019-06-18 17:31:35

标签: mysql mariadb fedora

我编写了一个程序,该程序从套接字接收数据,将数据格式化为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)引起激烈争用。

我发现/尝试过的唯一解决方案是通过管理更改烫发。 https://stackoverflow.com/a/3971632/1449160 但是,我没有运气。

我也看到了使用关键字LOCAL的解决方法。但是,我不确定此解决方案对性能的影响,宁愿让mysql直接读取文件-或至少进行测试以查看它是否重要。

操作系统:Fedora 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直接读取文件

2 个答案:

答案 0 :(得分:1)

您的问题可能是由于当今大多数守护程序具有私有 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

答案 1 :(得分:0)

如果文件位于连接到数据库的计算机上,而不是位于服务器本身,则可能要使用LOAD DATA LOCAL INFILE,因为LOAD DATA INFILE会在mysql服务器的文件系统上显示。