При подготовке набора инструкций по созданию экземпляра MySQL 8 (8.0.21) Windows 10 мы обнаружили ошибку с командой LOAD и переменной —secure-file_priv, установленной в файле my.ini. После предоставления глобального разрешения FILE ранее подготовленному пользователю andreyex:
GRANT FILE ON *.* TO 'andreyex'@'localhost';
Любая попытка выполнить следующую команду не удалась:
LOAD DATA INFILE 'C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\avenger.csv' INTO TABLE avenger FIELDS TERMINATED BY ', ' ENCLOSED BY ', ' ESCAPED BY '\ \' LINES TERMINATED BY '\r\n';
и выведите это сообщение об ошибке:
ERROR: 1290: The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
Следующее охватывает мое исследование, чтобы попытаться исправить эту ошибку, не удаляя специальный каталог для безопасной загрузки файлов. Хотя MySQL 5.7 содержит запрос переменной server-file-priv, в документе «Переменные системного сервера MySQL» нет ничего о том, как устранить неполадки при установке переменной server-file-priv. Так или иначе, мы думаем, что следует упомянуть, как разрешить эту ошибку, не отключая переменную server-file-privy.
Проверили и исправили все права доступа Windows 10 для совместного использования и чтения-записи в указанном каталоге secure-file-priv. В настройках Windows 10 разрешено глобальное совместное использование, а также права на чтение и запись, но команде LOAD не удалось загрузить содержимое файла из авторизованного каталога Uploads.
Привилегия FILE в MySQL — это глобальная привилегия для чтения и записи файлов на локальном сервере. Установка MySQL 8 в Windows 10 устанавливает следующий каталог в качестве цели для загрузки файлов в файл my.ini:
# Secure File Priv. secure-file-priv="C:/ProgramData/MySQL/MySQL Server 8.0/Uploads"
Вы можете найти настройку в файле C:\ProgramData\MySQL\MySQL Server 8.0\my.ini. Вы можете найти это значение, не обращаясь к файлу my.ini, запросив данные:
show variables like 'secure_file_priv';
Новая установка должна вернуться:
+------------------+------------------------------------------------+ | Variable_name | Value | +------------------+------------------------------------------------+ | secure_file_priv | C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ | +------------------+------------------------------------------------+ 1 row in set (0.2253 sec)
Вы можете найти файл my.ini в каталоге C:\ProgramData\MySQL\MySQL Server 8.0 стандартной файловой системы Windows 10.
К сожалению, при правильной настройке всех этих параметров переменная secure-file-priv блокирует чтение файлов из указанного безопасного каталога. Оказалось, что нам, возможно, придется удалить настройку secure-file-priv из файла my.ini и перезагрузить сервер. Затем мы обнаружили свою ошибку в команде SQL LOAD.
Единственный способ работы команды LOAD требовал следующих шагов:
C:\ProgramData\MySQL\MySQL Server 8.0\Uploads
LOAD DATA INFILE 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\avenger.csv' INTO TABLE avenger FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '\\' LINES TERMINATED BY '\r\n';
Команда LOAD сработала и поместила содержимое файла CSV в avengerтаблицу, как показано в результатах запроса ниже:
+------------+--------------+------------+-------------------+ | avenger_id | first_name | last_name | character_name | +------------+--------------+------------+-------------------+ | 1 | 'AndreyEx' | 'Delphi' | 'Delphi' | | 2 | 'MasterMen' | 'Dolgov' | 'Titan' | | 3 | 'Alex' | 'Smirnov' | 'Shrek' | +------------+--------------+------------+-------------------+ 3 rows in set (0.0005 sec)
Однако вот как вы заставляете это работать. Естественно, вы можете указать переменную secure-file-privs в другом месте по вашему выбору.
Мы также должны отметить, что MySQL достаточно умен, чтобы заменить прямую косую черту на обратную косую черту в ОС Windows. Это означает, что вы также можете использовать следующий оператор SQL LOAD:
LOAD DATA INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/avenger.csv' INTO TABLE avenger FIELDS TERMINATED BY ',' ENCLOSED BY '"' ESCAPED BY '/' LINES TERMINATED BY '\r\n';
Как всегда, мы надеемся, что это поможет тем, кто ищет решение.