如何允许 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
我编写了一个程序从套接字接收数据,将数据格式化为 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