настройка LOCAL_INFILE в конфигурационном файле MySQL 8 - PullRequest
0 голосов
/ 13 апреля 2020

Я изучаю MySQL документацию учебник . Пока это действительно здорово, но я столкнулся с проблемой. Шаг, где поясняется, как загрузить исходные данные таблицы из файла, не работает.

Ниже приведены шаги, которые я предпринял, в том числе глубокое погружение в документацию и попытка многих ответов на похожие вопросы (связанные), но все безрезультатно.

  1. Я погуглил ошибку и обнаружил в документации, что загрузка локальных данных представляет собой угрозу безопасности, поэтому ее необходимо включить. Я попытался этот ответ и этот ответ , который должен был использовать следующее при входе в систему MySQL:
# neither of these worked:
mysql -u [username] -p --local-infile
mysql -u [username] -p --local-infile=1
mysql --local-infile -u [username] -p 

Возможно, когда я вхожу в систему с этой опцией я просто устанавливаю ее на стороне клиента, а не на сервере? Я действительно не знаю разницу.

Затем я еще немного покопался в документации и прочитал о переменной local_infile. В документах даже есть раздел под названием Включение или отключение локальной загрузки данных , в котором говорится о системной переменной с именем local_infile, но не говорится о том, как ее включить или отключить.

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

mysqld --verbose --help

Это напечатало огромное количество текста, но я нашел строку, которая гласила:

Default options are read from the following files in the given order: C:\Windows\my.ini C:\Windows\my.cnf C:\my.ini C:\my.cnf C:\Program Files\MySQL\MySQL Server 8.0\my.ini C:\Program Files\MySQL\MySQL Server 8.0\my.cnf

Я подумал, что могу найти свою переменную local_infile в один из этих файлов .ini или .cnf и измените его на 1 или True или что-то еще ... Однако, ни один из этих файлов не существует ни в одном из этих мест.

Используя этот ответ или, более конкретно, комментарии к ответу, я нашел этот файл: mysql.conf.sample, в котором есть несколько переменных, но не local_infile, и не множество других были перечислены в распечатке с mysqld --verbose --help. К этому файлу я добавил строки
[mysqld]
local_infile=1

Не повезло.

SET GLOBAL local_infile='ON', а затем SHOW GLOBAL VARIABLES LIKE local_infile` приводит к:
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

До этого было OFF. Но угадайте, что я все еще не могу загрузить две строки в базу данных из текстового файла. Shocker.

Я нашел сообщение в блоге , в котором говорится, что файлы конфигурации могут находиться в каталоге %PROGRAMDATA%/MySQL/MySQL Server 8.0 как my.ini. Конечно же, вот где это было. Я добавил local-infile=1 в [mysql] и [mysqld]. Это все еще не работало, поэтому я попробовал local-infile и local-infile=ON (я видел, как все они использовались в различных принятых ответах). Ни один из них не работал.

Так что, как правило, документация абсолютно отстой, и я потерян. Но, по крайней мере, я провел тщательную проверку документов, поэтому педантичность SO удовлетворена, и я могу задать свой вопрос:

Как включить загрузку локальных данных по умолчанию?

1 Ответ

0 голосов
/ 02 мая 2020

Это на windows. У меня была такая же проблема. Не удается найти способ включить эту опцию local_infile. Решение заключается в использовании командных файлов для запуска mysqld. Я использую автономную систему apache / mysql, которая запускается из любой папки, в которую вы извлекаете zip.

Ключи:

  1. Чтобы иметь неблокирующую партию для запуска mysqld. Сначала установите переменные окружения как хотите, но особенно обратите внимание, что в этом пакете лучше добавить каталог mysql bin в переменную окружения% path%.

call ". \ .. \ .. \ set_roots .bat "

Затем запустите mysqld как параллельный процесс. Снова используйте команду "call":

start call "MYSQL" mysqld --defaults-file =% my_ini% --port =% mysql_port% --standalone --console --log-timestamps = SYSTEM --explicit_defaults_for_timestamp --verbose

Используйте таймер для ожидания, чтобы mysqld был готов принимать запросы

timeout / t 5

Теперь, когда mysqld запущен, мы можем выполнить mysql команды в конце исходного пакета.

Пример:

mysql -u root -p% rootpw% -e "SET GLOBAL local_infile = ' ON '; "

Примечание: не оставляйте пробелов между -p и реальным паролем, и он не запрашивает ввод

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