Загадочная ошибка MySQL останавливает загрузку локальных файлов в таблицы: «запрос файла отклонен из-за ограничений доступа» (ошибка 2068) - PullRequest
1 голос
/ 01 августа 2020

Я новый MySQL пользователь, пытающийся следовать вводному руководству из Oracle.

Мне не удалось загрузить данные в таблицу из текстового файла ( этот шаг руководства ).

Когда я запускаю эту строку (где <path> - это путь к файлу):

LOAD DATA LOCAL INFILE "<path>/blob.txt" INTO TABLE blob;

, я получаю сообщение об ошибке:

ERROR 2068 (HY000): LOAD DATA LOCAL INFILE file request rejected due to restrictions on access.

Я пробовал:

  • Поместив blob.txt в каталог /usr/local/mysql-8.0.21-macos10.15-x86_64/data и используя полный путь. Я использовал этот каталог, потому что переменная datadir равна /usr/local/mysql/data.
  • Размещение blob.txt в вышеупомянутом каталоге и использование только имени файла вместо полного пути.
  • Использование, а не с использованием LOCAL
  • Настройка secure-file-priv='' путем создания ~/.my.cn как описано здесь .
  • Настройка local-infile=1.
  • Предоставление FILE разрешение.
  • На основании одного комментария crypti c к другому вопросу , я попытался изменить права доступа к файлам. Я chmod 777 отредактировал файл и его родительский каталог. Но, возможно, это нужно изменить для всех родительских каталогов в дереве, что делает это недопустимым решением?

Вот где это становится очень странным:

LOAD DATA LOCAL INFILE "blerga blerga blerga bloo" INTO TABLE blob;

возвращает точно такую ​​же ошибку . То есть, похоже, неважно, какой путь я туда выбрал. Даже не имеет значения, реальный ли это путь к реальному файлу.

После нескольких часов возни я смог найти одну вещь, которая сработала: размещение файлов внутри папки, содержащей таблицы моей базы данных:

/usr/local/mysql-8.0.21-macos10.15-x86_64/data/dining/blob.txt

(Dining - это имя базы данных.) Затем загрузка данных работает нормально.

Итак Я остаюсь с вопросом:

  1. Действительно ли это «правильный» способ сделать это? Безопасно ли возиться внутри этого каталога?
  2. Я предполагаю, что вся эта проблема возникла из-за проблем с правами доступа к файлам. Это правильно? Я этого не совсем понимаю. Это что-то вроде: серверу нужен доступ к файлам на стороне клиента (оба находятся на моем компьютере)?
  3. Есть ли «правильный» способ сделать возможной загрузку файлов из других мест в моем компьютер в стол? И если да, то есть ли плохие последствия для безопасности, если сделать это «в реальной жизни» - с реальными серверами и клиентами? на inte rnet, за исключением того одинокого комментария, приведенного выше. На веб-сайте Oracle есть краткий список кода ошибки, но я не нашел ни одного комментария github об этом коде ошибки.

1 Ответ

1 голос
/ 01 августа 2020
  1. Действительно ли это «правильный» способ сделать это? Безопасно ли возиться внутри этого каталога?

Нет. Вы не должны go использовать какую-либо внутреннюю структуру данных и возиться с файлами и каталогами. Обычный пользователь все равно не может этого сделать, может только пользователь «root».

Я предполагаю, что вся эта проблема возникла из-за проблемы с правами доступа к файлам. Это правильно? Я этого не совсем понимаю. Это что-то вроде: серверу нужен доступ к файлам на стороне клиента (оба находятся на моем компьютере)?

Да, это так. Имейте в виду, что сервер MySQL работает под собственной учетной записью пользователя и не может получить доступ ко всем файлам на хосте. Обычно это не проблема, поскольку сервер работает только внутри назначенного ему каталога данных.

Есть ли «правильный» способ сделать возможным загружать файлы из любого места на моем компьютере в таблицу? И если да, то есть ли плохие последствия для безопасности при выполнении этого «в реальной жизни» - с реальными серверами и клиентами?

Используется ключевое слово LOCAL чтобы указать, откуда файл читается, с точки зрения серверов или с точки зрения клиента / хоста. Обычно вы используете ключевое слово LOCAL, чтобы получить файл с хоста (и точки зрения), на котором работает клиент mysql.

Поэтому вы должны / должны использовать ключевое слово LOCAL в своем запросе. Вам не нужно разрешение FILE, потому что вы используете ключевое слово LOCAL. См. Документацию LOAD DATA:

Использование LOCAL немного медленнее, чем предоставление серверу доступа к файлам напрямую, потому что содержимое файла должно быть отправлено через соединение с помощью клиент к серверу. С другой стороны, вам не нужна привилегия FILE для загрузки локальных файлов.

Это также означает, что вам не нужно изменять настройку secure-file-priv.

Поскольку вы используете LOCAL INFILE, вам необходимо включить настройку local-infile. Однако, если этот параметр отключен, вы получите другое сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...