【问题标题】:How to allow mysql(mariadb) to read files from /tmp - Fedora 30如何允许 mysql(mariadb) 从 /tmp 读取文件 - Fedora 30
【发布时间】:2019-06-18 17:31:35
【问题描述】:

我编写了一个程序,从套接字接收数据,将数据格式化为 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)严重竞争。

我发现/尝试过的唯一解决方案是使用 semanage 更改烫发。 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直接读取文件

【问题讨论】:

  • 文件的所有者是什么?文件权限一定是错误的。 mysql 用户必须对加载它的文件具有读取权限。
  • sudo chown mysql test_csv.csv 仍然没有运气。同样的错误
  • /tmp 权限呢?

标签: mysql mariadb fedora


【解决方案1】:

您的问题可能是由于现在大多数守护进程都有一个 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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我应该更清楚一点,文件和mysql服务器在同一台服务器上。
    猜你喜欢
    • 1970-01-01
    • 2015-09-19
    • 1970-01-01
    • 2018-09-12
    • 1970-01-01
    • 2019-08-03
    • 2022-09-23
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多