Як мені вирішити --secure-file-priv в MySQL?


357

Я вивчаю MySQL і намагаюся використовувати LOAD DATAпункт. Коли я використовував його як нижче:

LOAD DATA INFILE "text.txt" INTO table mytable;

Я отримав таку помилку:

Сервер MySQL працює з опцією --secure-file-priv, тому він не може виконати цю операцію

Як вирішити цю помилку?

Я перевірив ще одне запитання щодо того ж повідомлення про помилку , але все ще не можу знайти рішення.

Я використовую MySQL 5.6


поділіться своїм файлом csv
Zafar Malik,

1
Звичайно, ви отримуєте цю помилку при спробі використання mysqldump --tab, як ніби це не досить складно, щоб отримати власні дані з mysql.
Вільям Ентрікен

1
крім відповіді vhu, шукайте відповідь wolfsshield нижче. вам потрібно переключитися на «/» , щоб змусити його працювати (я використовую win10)
RSC Rsc

4
використовувати LOCAL. LOAD DATA LOCAL INFILE ...
mpoletto

Відповіді:


473

Це працює за призначенням. Ваш сервер MySQL був запущений з опцією --secure-file-priv, яка в основному обмежує, з яких каталогів ви можете завантажувати файли, використовуючи LOAD DATA INFILE.

Ви можете використовувати SHOW VARIABLES LIKE "secure_file_priv";для перегляду налаштованого каталогу.

У вас є два варіанти:

  1. Перемістіть свій файл у каталог, визначений користувачем secure-file-priv .
  2. Відключити secure-file-priv. Це потрібно видалити з запуску і не може бути змінено динамічно. Для цього перевірте параметри запуску MySQL (залежно від платформи) та my.ini.

4
За замовчуванням my.ini можна знайти у "C: \ ProgramData \ MySQL \ MySQL Server 5.6" при запуску MySQL 5.6 на сервері W2012. Ви також можете перевірити параметри запуску служби (наприклад, --defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini), оскільки вони також можуть перелічити --secure-file-privсебе.
vhu

2
@Mohitbhasi, my-default.ini має бути в папці "C: \ Program Files \ MySQL \ MySQL Server 5.6". Розташування vhu посилалося на "C: \ ProgramData \ MySQL \ MySQL Server 5.6". Про всяк випадок, коли ви цього не помітили.
НурШомік

67
Значення: NULL FML.
Вільям Ентрікен

11
Зауважте, що при використанні "select .. into outfile" ви повинні вказати повний шлях, а повний шлях повинен відповідати результатамSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight

9
"перевірити параметри" та "перевірити my.ini" - це не дуже гарна відповідь
Roland Seuhs

234

У мене було те саме питання. Нарешті я вирішив за допомогою LOCALпараметра в команді

LOAD DATA LOCAL INFILE "text.txt" INTO TABLE mytable;

Більше інформації можна знайти тут http://dev.mysql.com/doc/refman/5.7/uk/load-data.html

Якщо вказано LOCAL, файл читається клієнтською програмою на хості клієнта та надсилається серверу. Файлу можна вказати повне ім'я шляху, щоб вказати його точне місцезнаходження. Якщо вказано як відносне ім'я шляху, ім'я інтерпретується відносно каталогу, в якому запускалася клієнтська програма.


2
Це працювало для мене і ніхто інший. Я пробував: 1. завантажити файл в текстовому C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. відключивши secure_file_privв my.iniі перезавантаження MySQL 3. Це один! Дякую :)
Камал Наян

10
Я отримав це повідомлення про помилку для MariaDB: "ПОМИЛКА 1148 (42000): Використовувана команда заборонена для цієї версії MariaDB". Точна версія: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, для Linux (x86_64), використовуючи readline 5.2"
jciloa

11
Я отримав "Використовувана команда заборонена для цієї версії MySQL" для mysql версії 5.7.19.
Елісон S

2
@AlisonS Спробуйте додати --local-infileпрапор під час запуску mysql. stackoverflow.com/questions/10762239/…
Ілля Москвін

1
The used command is not allowed with this MySQL versionз MySQL 8.0
bitfishxyz

117

Для Ubuntu 14 та Mysql 5.5.53 ця настройка, здається, включена за замовчуванням. Щоб його відключити, потрібно додати secure-file-priv = ""до файлу my.cnf під конфігураційною групою mysqld. наприклад: -

[mysqld]
secure-file-priv = ""

1
Це працювало і для мене. Та ж версія Ubuntu та MySQL
Родні

1
+1 працював для мене. Якщо ви використовуєте Ubuntu, не забудьте перезапустити сервіс mysql: sudo service mysql restart
Emiliano Sangoi

1
Це те, що працює, якщо вам потрібно, щоб вказати на місце, яке ви вибрали для кожного оператора, де це можливо. Це працює з MySQL 5.7 на Windows Server так само, як ви пояснили. Якщо ви просто прокоментуєте такий рядок, як # secure-file-priv = ~тоді, він все ще має помилку, оскільки значення показує, NULLщо це робиться таким чином, вирішує проблему, коли ви хочете вибрати, в які каталоги ви можете експортувати на сервер, і т. Д.
Біткойн вбивчий маніяк

1
Працював для мене з MySQL 5.7 у Windows, тоді як інші рішення цього не зробили.
CGritton

Примітка: якщо це робиться в Docker, ви повинні перезапустити контейнер Docker.
користувач1717828

38

Я працюю над MySQL5.7.11 на Debian, команда, яка працювала на мене, щоб побачити каталог:

mysql> SELECT @@global.secure_file_priv;

З SHOW VARIABLES LIKE "secure_file_priv";я отримую, ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existщо також кидається в інших обставинах, і мені доведеться врешті-решт розібратися. SELECT @@global.secure_file_priv;Команда , хоча справила очікуваний результат.
Маджід Фуладпур

1
Це працювало для мене - Ubuntu Mysql 5.7.21: змінив вихідний файл у каталог
/var/lib/mysql-files/output.txt

2
Як ви редагуєте це тоді? Я спробував відредагувати це в /etc/mysql/my.cnf, і, здається, це не має ніякого ефекту - він залишається NULL
Slavik

24

Ось що для мене було відключено в Windows 7 secure-file-priv(Варіант №2 з відповіді vhu ):

  1. Зупиніть службу сервера MySQL, зайшовши services.msc.
  2. Перейти до C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDataбула прихованою папкою в моєму випадку).
  3. Відкрийте my.iniфайл у Блокноті.
  4. Шукати "secure-file-priv".
  5. Прокоментуйте рядок, додавши "#" на початку рядка. Для MySQL Server 5.7.16 і вище, коментування не працюватиме. Ви повинні встановити порожній рядок, як цей -secure-file-priv=""
  6. Збережіть файл.
  7. Запустіть службу сервера MySQL, зайшовши в систему services.msc.

16
За станом на MySQL Server 5.7.16, коментувати рядок не вийде, оскільки тоді він повернеться до типового режиму, що вимкне операції імпорту та експорту. Тепер вам потрібно встановити порожній рядок, якщо ви хочете дозволити ці операції з будь-якого каталогу.
dbc

1
Рамнат, будь ласка, відредагуй свою відповідь деталями @dbc для версії 5.7.x. Дякую.
Рафаель Гомес Франсіско

Додавання порожнього рядка для мене працює; будь ласка, змініть відповідь, щоб додати порожній рядок, як secure-file-priv = ""
Rajesh Goel

Для Windows переконайтеся, що використовуються
Олівер Олівер

22

Якщо файл локальний для вашої машини, використовуйте LOCAL у вашій команді

LOAD DATA LOCAL INFILE "text.txt" INTO table mytable;

14

@vhu

Я зробив, SHOW VARIABLES LIKE "secure_file_priv";і це повернулосяC:\ProgramData\MySQL\MySQL Server 8.0\Uploads\ так, коли я включив це, він все ще не працював.

Коли я перейшов до файлу my.ini безпосередньо, я виявив, що шлях відформатований трохи інакше: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Потім, коли я запустив це, це спрацювало. Єдина відмінність - напрямок косої риски.


Ваша відповідь спрацювала на мене, велике
спасибо

Так, так ... чому ця відповідь поки що нижче. я довго боровся, а потім дістав. я повернувся, щоб додати це як відповідь, але це настільки далеко, що я не бачив цього, перш ніж я витратив свій час.
Rsc Rsc

Не всі герої носять накидки.
JRK

8

У мене була така ж проблема з 'secure-file-priv'. Коментування у .ini-файлі не працювало, а також переміщення файлу в каталозі, визначеному 'secure-file-priv'.

Нарешті, як запропонував dbc, зробити "secure-file-priv" рівним порожнім рядком. Тож якщо хтось застряг після спроб відповідей вище, сподіваємось, це допоможе.


8

Те, що працювало для мене:

  1. Помістіть свій файл всередину папки, зазначеної в secure-file-priv.

Щоб знайти цей тип:

mysql> показує змінні типу "secure_file_priv";


  1. Перевірте, чи є у вас local_infile = 1.

Виконайте це, набравши:

mysql> показує змінні типу "local_infile";

Якщо ви отримаєте:

+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+

Потім встановіть його на одне введення:

mysql> встановити глобальний local_infile = 1;


  1. Вкажіть повний шлях для вашого файлу. У моєму випадку:

mysql> завантажувати дані в файл "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" у тест таблиці;


6

Під час публікації цю тему переглядали 522 тисячі разів. Чесно кажучи, коли MySQL став нашою захисною нерозумною мамою ? Яка тривала спроба безпеки - яка насправді служить лише для того, щоб нас сковувати!

Після багатьох пошуків і багатьох спроб все не вдалося.
Моє рішення:

  1. Імпортуйте файл .csv через імпорт PhpMyAdmin у старіший вікні (якщо великий - у рядку cmd)
  2. генерувати .sql файл
  3. завантажити .sql файл
  4. імпортувати .sql файл через робочий стіл MySQL

3

У мене з цим були всілякі проблеми. Я міняв my.cnf та всілякі шалені речі, які намагалися показати інші версії цієї проблеми.

Що для мене спрацювало:

Помилка, яку я отримував

The MySQL server is running with the --secure-file-priv option so it cannot execute this statement

Мені вдалося виправити це, відкривши /usr/local/mysql/support-files/mysql.server та змінивши наступний рядок:

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" -- $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

до

$bindir/mysqld_safe --datadir="$datadir" --pid-file="$mysqld_pid_file_path" --secure-file-priv="" $other_args >/dev/null &
  wait_for_pid created "$!" "$mysqld_pid_file_path"; return_value=$?

3

Якщо ви працюєте на Ubuntu, вам може знадобитися налаштувати Apparmor, щоб дозволити MySQL писати у вашу папку, наприклад, ось моя конфігурація:

Додайте цей рядок у файл /etc/apparmor.d/usr.sbin.mysqld:

/var/lib/mysql-files/* rw

Потім додайте ці 2 рядки конфігурації до розділів /etc/mysql/my.cnf:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Ось мій SQL:

select id from blahs into outfile '/var/lib/mysql-files/blahs';

Це працювало для мене. Удачі!


Так, для мене працювало вихідний шлях із файлом "/var/lib/mysql-files/filename.csv".
Анідха Бхатнагар

3

Для версії mysql 8.0 ви можете це зробити:

  1. зупинка mysql.server
  2. mysql.server start --secure-file-priv = ''

Це працювало для мене на Mac High Sierra


3

Я створив сценарій імпорту NodeJS, якщо ви працюєте з nodeJS, а ваші дані перебувають у такій формі (подвійна цитата + кома та \ n новий рядок)

INSERT INTO <your_table> VALUEs( **CSV LINE **)

Цей налаштований для роботи на http: // localhost: 5000 / import .

Я переходжу по рядку і створює рядок запиту

"city","city_ascii","lat","lng","country","iso2","iso3","id"
"Tokyo","Tokyo","35.6850","139.7514","Japan","JP","JPN","1392685764",
...

server.js

const express = require('express'),
   cors = require('cors'),
   bodyParser = require('body-parser'),
   cookieParser = require('cookie-parser'),
   session = require('express-session'),
   app = express(),
   port = process.env.PORT || 5000,
   pj = require('./config/config.json'),
   path = require('path');

app.use(bodyParser.json());
app.use(cookieParser());
app.use(cors());


app.use(
   bodyParser.urlencoded({
      extended: false,
   })
);

var Import = require('./routes/ImportRoutes.js');

app.use('/import', Import);
if (process.env.NODE_ENV === 'production') {
   // set static folder
   app.use(express.static('client/build'));

   app.get('*', (req, res) => {
      res.sendFile(path.resolve(__dirname, 'client', 'build', 'index.html'));
   });
}

app.listen(port, function () {
   console.log('Server is running on port: ' + port);
});

ImportRoutes.js

const express = require('express'),
   cors = require('cors'),
   fs = require('fs-extra'),
   byline = require('byline'),
   db = require('../database/db'),
   importcsv = express.Router();

importcsv.use(cors());

importcsv.get('/csv', (req, res) => {

   function processFile() {
      return new Promise((resolve) => {
         let first = true;
         var sql, sqls;
         var stream = byline(
            fs.createReadStream('../PATH/TO/YOUR!!!csv', {
               encoding: 'utf8',
            })
         );

         stream
            .on('data', function (line, err) {
               if (line !== undefined) {
                  sql = 'INSERT INTO <your_table> VALUES (' + line.toString() + ');';
                  if (first) console.log(sql);
                  first = false;
                  db.sequelize.query(sql);
               }
            })
            .on('finish', () => {
               resolve(sqls);
            });
      });
   }

   async function startStream() {
      console.log('started stream');
      const sqls = await processFile();
      res.end();
      console.log('ALL DONE');
   }

   startStream();
});

module.exports = importcsv;

db.js - це конфігураційний файл

const Sequelize = require('sequelize');
const db = {};
const sequelize = new Sequelize(
   config.global.db,
   config.global.user,
   config.global.password,
   {
      host: config.global.host,
      dialect: 'mysql',
      logging: console.log,
      freezeTableName: true,

      pool: {
         max: 5,
         min: 0,
         acquire: 30000,
         idle: 10000,
      },
   }
);

db.sequelize = sequelize;
db.Sequelize = Sequelize;

module.exports = db;

Відмова від відповідальності: Це не ідеальне рішення - я розміщую його лише для розробок, які знаходяться на часовій шкалі та мають багато даних для імпорту та стикаються з цією смішною проблемою. Я втратив багато часу на це, і сподіваюся, що пошкодую ще одного розробника, такий же втрачений час.


1

У мене була проблема у Windows 10. "--secure-file-priv в MySQL" Щоб вирішити це, я зробив наступне.

  1. У пошуку Windows (внизу зліва) я набрав "powerhell".
  2. Клацнув правою кнопкою миші на панелі повноважень і перейшов до адміністратора.
  3. Навігація до файлу бін сервера. (C: \ Program Files \ MySQL \ MySQL Server 5.6 \ bin);
  4. Введено ./mysqld
  5. Натисніть "увійти"

Сервер запустився, як очікувалося.


1

MySQL використовує цю системну змінну для контролю, куди можна імпортувати файли

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv | NULL  |
+------------------+-------+

Тому проблема полягає в тому, як змінити системні змінні, такі як secure_file_priv.

  1. закрити mysqld
  2. sudo mysqld_safe --secure_file_priv=""

тепер ви можете побачити так:

mysql> SHOW VARIABLES LIKE "secure_file_priv";
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| secure_file_priv |       |
+------------------+-------+

0

У macOS Catalina я дотримувався цих кроків secure_file_priv

1.Стоп служби MySQL

 sudo /usr/local/mysql/support-files/mysql.server stop

2.Запустіть MYSQL із призначенням системних змінних --secure_file_priv

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=YOUR_FILE_DIRECTORY

Примітка: додавання порожнього значення виправить проблему для мене, і MYSQL буде експортувати дані до каталогу / usr / local / mysql / data / YOUR_DB_TABLE / EXPORT_FILE

sudo /usr/local/mysql/support-files/mysql.server start --secure-file-priv=

Дякую


0

Не змінюючи жодного з файлів конфігурації ..

  1. шукайте значення secure_file_privвикористання команди, опублікованої @vhu : SHOW VARIABLES LIKE "secure_file_priv".
  2. визначте повний шлях для вашого запиту, наприклад: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

це працювало для мого в mysql-shell на ubuntu 18.04 LTS mysql 5.7.29

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.