Как разрешить mysql (mariadb) читать файлы из / tmp - Fedora 30 - PullRequest
1 голос
/ 18 июня 2019

Я написал программу, которая получает данные из сокета, форматирует данные в формат 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")

FromНасколько я понимаю, 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 читать файл напрямую

Ответы [ 2 ]

1 голос
/ 18 июня 2019

Ваша проблема, вероятно, вызвана тем фактом, что в настоящее время большинство демонов имеют приватную 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
0 голосов
/ 18 июня 2019

Возможно, вы захотите использовать LOAD DATA LOCAL INFILE, если файл находится на компьютере, подключенном к базе данных, а не на самом сервере, так как LOAD DATA INFILE будет выглядеть в файловой системе сервера mysql.

...