Làm thế nào tôi nên giải quyết --secure-file-private trong MySQL?


357

Tôi đang học MySQL và đã thử sử dụng một LOAD DATAmệnh đề. Khi tôi sử dụng nó như dưới đây:

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

Tôi đã nhận được lỗi sau:

Máy chủ MySQL đang chạy với tùy chọn --secure-file-private để nó không thể thực thi câu lệnh này

Làm thế nào để tôi khắc phục lỗi này?

Tôi đã kiểm tra một câu hỏi khác trên cùng một thông báo lỗi , nhưng vẫn không thể tìm ra giải pháp.

Tôi đang sử dụng MySQL 5.6


đường dẫn chia sẻ tệp csv của bạn
Zafar Malik

1
Tất nhiên, bạn gặp phải lỗi này khi cố gắng sử dụng mysqldump --tab, như thể nó không đủ khó để lấy dữ liệu của bạn ra khỏi mysql.
William Entriken

1
Ngoài câu trả lời của vhu, tìm kiếm bên dưới cho câu trả lời của wolfsshield. bạn cần chuyển sang '/' để làm cho nó hoạt động (tôi đang sử dụng win10)
Rsc Rsc

4
sử dụng ĐỊA PHƯƠNG. LOAD DATA LOCAL INFILE ...
mpoletto

Câu trả lời:


473

Nó hoạt động như dự định. Máy chủ MySQL của bạn đã được bắt đầu với tùy chọn --secure-file-private , về cơ bản giới hạn từ các thư mục bạn có thể tải tệp bằng cách sử dụng LOAD DATA INFILE.

Bạn có thể sử dụng SHOW VARIABLES LIKE "secure_file_priv";để xem thư mục đã được cấu hình.

Bạn có hai lựa chọn:

  1. Di chuyển tệp của bạn vào thư mục được chỉ định bởi secure-file-priv.
  2. Vô hiệu hóa secure-file-priv. Điều này phải được loại bỏ khỏi khởi động và không thể được sửa đổi linh hoạt. Để thực hiện việc này, hãy kiểm tra các tham số khởi động MySQL của bạn (tùy thuộc vào nền tảng) và my.ini.

4
Theo mặc định, my.ini có thể được tìm thấy từ "C: \ ProgramData \ MySQL \ MySQL Server 5.6" khi chạy MySQL 5.6 trên máy chủ W2012. Bạn cũng có thể muốn kiểm tra các tham số khởi động dịch vụ (ví dụ: --defaults-file = "C: \ ProgramData \ MySQL \ MySQL Server 5.6 \ my.ini) vì chúng cũng có thể --secure-file-privtự liệt kê .
vhu

2
@Mohitbhasi, my-default.ini phải nằm trong thư mục "C: \ Program Files \ MySQL \ MySQL Server 5.6". Vị trí mà vhu đã đề cập đến là "C: \ ProgramData \ MySQL \ MySQL Server 5.6". Chỉ trong trường hợp bạn không nhận thấy.
NurShomik

67
Giá trị: NULL. FML.
William Entriken

11
Lưu ý rằng nếu sử dụng "select .. vào outfile", bạn phải chỉ định đường dẫn đầy đủ và đường dẫn đầy đủ phải khớp với kết quả củaSHOW VARIABLES LIKE "secure_file_priv";
TheSatinKnight 17/2/18

9
"kiểm tra các thông số" và "kiểm tra my.ini" không phải là một câu trả lời hay
Roland Seuhs

234

Tôi gặp vấn đề tương tự. Cuối cùng tôi đã giải quyết bằng cách sử dụng LOCALtùy chọn trong lệnh

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

Bạn có thể tìm thêm thông tin ở đây http://dev.mysql.com/doc/refman/5.7/en/load-data.html

Nếu LOCAL được chỉ định, tệp sẽ được chương trình khách đọc trên máy khách và gửi đến máy chủ. Tệp có thể được cung cấp dưới dạng tên đường dẫn đầy đủ để chỉ định vị trí chính xác của nó. Nếu được đặt dưới dạng tên đường dẫn tương đối, tên được hiểu tương đối với thư mục khởi động chương trình máy khách.


2
Điều này làm việc cho tôi và không ai khác. Tôi cố gắng: 1. upload file txt của tôi trong C:\ProgramData\MySQL\MySQL Server 5.7\Uploads, 2. vô hiệu hóa secure_file_privtrong my.inivà khởi động lại mysql 3. Cái này! Cảm ơn :)
Kamal Nayan

10
Tôi đã nhận được thông báo lỗi này cho MariaDB: "ERROR 1148 (42000): Lệnh được sử dụng không được phép với phiên bản MariaDB này". Phiên bản chính xác: "mysql Ver 15.1 Distrib 10.1.22-MariaDB, dành cho Linux (x86_64) sử dụng readline 5.2"
jciloa

11
Tôi đã nhận được "Lệnh đã sử dụng không được phép với phiên bản MySQL này" cho phiên bản mysql 5.7.19.
Alison S

2
@AlisonS Hãy thử thêm --local-infilecờ khi chạy mysql. stackoverflow.com/questions/10762239/ cường
Illya Moskvin

1
The used command is not allowed with this MySQL versiontừ MySQL 8.0
bitfishxyz

117

Trên Ubuntu 14 và Mysql 5.5.53, cài đặt này dường như được bật theo mặc định. Để vô hiệu hóa nó, bạn cần thêm secure-file-priv = ""vào tập tin my.cnf của mình trong nhóm cấu hình mysqld. ví dụ:-

[mysqld]
secure-file-priv = ""

1
Cái này cũng có tác dụng với tôi. Cùng một phiên bản Ubuntu và MySQL
Rodney

1
+1 Làm việc cho tôi. Nếu bạn đang sử dụng Ubuntu, đừng quên khởi động lại dịch vụ mysql: sudo dịch vụ khởi động lại mysql
Emiliano Sangoi

1
Đây là những gì hoạt động nếu bạn cần nó để chỉ đến một vị trí mà bạn chọn cho mỗi tuyên bố khi áp dụng. Điều này hoạt động với MySQL 5.7 trên Windows Server giống như bạn đã giải thích. Nếu bạn chỉ đơn giản nhận xét dòng như vậy # secure-file-priv = ~thì nó vẫn có lỗi vì giá trị hiển thị khi NULLthực hiện theo cách này sẽ giải quyết vấn đề khi bạn muốn chọn thư mục nào bạn có thể xuất sang máy chủ, v.v.
Bitcoin Murderous Maniac

1
Làm việc với tôi với MySQL 5.7 trên Windows, trong khi các giải pháp khác thì không.
CGritton

NB: nếu làm điều này trong Docker, bạn phải khởi động lại bộ chứa Docker.
dùng1717828

38

Tôi đang làm việc trên MySQL5.7.11 trên Debian, lệnh làm việc cho tôi để xem thư mục là:

mysql> SELECT @@global.secure_file_priv;

Với SHOW VARIABLES LIKE "secure_file_priv";tôi nhận ERROR 1146 (42S02): Table 'performance_schema.session_variables' doesn't existđược cũng bị ném trong các trường hợp khác và cuối cùng tôi sẽ phải đối phó. Các SELECT @@global.secure_file_priv;lệnh mặc dù sản xuất các kết quả mong đợi.
Majid fouadpour

1
Điều này làm việc với tôi - Ubuntu Mysql 5.7,21: đã thay đổi tệp đầu ra thành thư mục /var/lib/mysql-files/output.txt
Shanemeister

2
Làm thế nào bạn chỉnh sửa nó sau đó? Tôi đã cố gắng chỉnh sửa nó trong /etc/mysql/my.cnf và nó dường như không có tác dụng - nó vẫn giữ nguyên NULL
Slasta

24

Đây là những gì làm việc cho tôi trong Windows 7 để vô hiệu hóa secure-file-priv(Tùy chọn # 2 từ câu trả lời của vhu ):

  1. Dừng dịch vụ máy chủ MySQL bằng cách đi vào services.msc.
  2. Đi đến C:\ProgramData\MySQL\MySQL Server 5.6( ProgramDatalà một thư mục ẩn trong trường hợp của tôi).
  3. Mở my.initệp trong Notepad.
  4. Tìm kiếm 'an toàn-tập tin-private'.
  5. Nhận xét dòng ra bằng cách thêm '#' ở đầu dòng. Đối với MySQL Server 5.7.16 trở lên, việc bình luận sẽ không hoạt động. Bạn phải đặt nó thành một chuỗi trống như thế này -secure-file-priv=""
  6. Lưu các tập tin.
  7. Bắt đầu dịch vụ máy chủ MySQL bằng cách đi vào services.msc.

16
Kể từ MySQL Server 5.7.16, việc nhận xét dòng sẽ không hoạt động, bởi vì sau đó nó sẽ trở lại mặc định, điều này vô hiệu hóa các hoạt động nhập và xuất. Bây giờ bạn cần đặt nó thành một chuỗi trống nếu bạn muốn cho phép các hoạt động này từ bất kỳ thư mục nào.
dbc

1
Ramnath, xin vui lòng, chỉnh sửa câu trả lời của bạn với chi tiết @dbc cho phiên bản 5.7.x. Cảm ơn.
Rafael Gomes Francisco

Thêm một chuỗi trống hoạt động cho tôi; vui lòng thay đổi câu trả lời để thêm một chuỗi trống như safe-file-private = ""
Rajesh Goel

Đối với Windows, đảm bảo sử dụng dấu gạch chéo về phía trước
Oliver Oliver

22

Nếu tệp là cục bộ cho máy của bạn, hãy sử dụng LỘC trong lệnh của bạn

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

14

@vhu

Tôi đã làm SHOW VARIABLES LIKE "secure_file_priv";và nó trở lại C:\ProgramData\MySQL\MySQL Server 8.0\Uploads\vì vậy khi tôi cắm nó vào, nó vẫn không hoạt động.

Khi tôi truy cập tệp my.ini trực tiếp, tôi phát hiện ra rằng đường dẫn được định dạng hơi khác một chút: C:/ProgramData/MySQL/MySQL Server 8.0/Uploads

Sau đó, khi tôi chạy nó với nó, nó hoạt động. Sự khác biệt duy nhất là hướng của dấu gạch chéo.


câu trả lời của bạn đã làm việc cho tôi, rất nhiều
benaou mouad

Có có có ... tại sao câu trả lời này cho đến nay bên dưới. Tôi vật lộn trong thời gian dài và sau đó có được nó. tôi đã quay lại để thêm câu này vào câu trả lời nhưng đến giờ tôi đã không thấy nó trước khi tôi lãng phí thời gian.
Rsc Rsc

Không phải tất cả các anh hùng mặc áo choàng.
JRK

8

Tôi gặp vấn đề tương tự với 'tệp bảo mật-private'. Nhận xét trong tệp .ini không hoạt động và cũng không di chuyển tệp trong thư mục được chỉ định bởi 'safe-file-private'.

Cuối cùng, như dbc đã đề xuất, làm cho 'tệp bảo mật-private' bằng với một chuỗi rỗng hoạt động. Vì vậy, nếu bất cứ ai bị mắc kẹt sau khi thử câu trả lời ở trên, hy vọng làm điều này sẽ giúp.


8

Điều làm việc cho tôi:

  1. Đặt tệp của bạn bên trong thư mục được chỉ định trong secure-file-priv.

Để tìm loại đó:

mysql hiển thị các biến như "safe_file_priv";


  1. Kiểm tra nếu bạn có local_infile = 1.

Thực hiện gõ đó:

mysql hiển thị các biến như "local_infile";

Nếu bạn nhận được:

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

Sau đó đặt nó thành một lần gõ:

mysql đặt toàn cục local_infile = 1;


  1. Chỉ định đường dẫn đầy đủ cho tệp của bạn. Trong trường hợp của tôi:

mysql tải dữ liệu không ổn định "C: / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt" vào kiểm tra bảng;


6

Chủ đề này đã được xem 522k lần tại thời điểm đăng bài này. Thành thật khi nào MySQL trở thành người mẹ bảo vệ quá mức vô lý của chúng tôi ? Thật là một nỗ lực tốn thời gian cho an ninh - điều thực sự chỉ phục vụ để trói buộc chúng ta!

Sau nhiều lần tìm kiếm và nhiều lần thử, mọi thứ đều thất bại.
Giải pháp của tôi:

  1. Nhập tệp .csv qua nhập PhpMyAdmin trên hộp cũ hơn (nếu lớn làm ở dòng cmd)
  2. tạo tập tin .sql
  3. tải tập tin .sql
  4. nhập tệp .sql qua bàn làm việc của MySQL

3

Tôi đã có tất cả các loại vấn đề với điều này. Tôi đã thay đổi my.cnf và tất cả những thứ điên rồ mà các phiên bản khác của vấn đề này đã cố gắng thể hiện.

Điều gì làm việc cho tôi:

Lỗi tôi đã nhận được

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

Tôi đã có thể sửa nó bằng cách mở /usr/local/mysql/support-files/mysql.server và thay đổi dòng sau:

$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=$?

đến

$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

Nếu bạn đang chạy trên Ubuntu, bạn cũng có thể cần định cấu hình Apparmor để cho phép MySQL ghi vào thư mục của bạn, ví dụ: đây là cấu hình của tôi:

Thêm dòng này vào tệp /etc/apparmor.d/usr.sbin.mysqld:

/var/lib/mysql-files/* rw

Sau đó thêm 2 dòng cấu hình này vào các phần /etc/mysql/my.cnf:

[client]
loose-local-infile = 1

[mysqld]
secure-file-priv = ""

Đây là SQL của tôi:

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

Nó làm việc cho tôi. Chúc may mắn!


Có, đặt đường dẫn outfile với "/var/lib/mysql-files/filename.csv" đã làm việc cho tôi.
Anidhya Bhatnagar

3

Đối với phiên bản mysql 8.0, bạn có thể làm điều này:

  1. dừng máy chủ
  2. mysql.server bắt đầu --secure-file-private = ''

Nó hoạt động với tôi trên Mac High Sierra


3

Tôi đã tạo tập lệnh nhập NodeJS nếu bạn đang chạy nodeJS và dữ liệu của bạn ở dạng sau (trích dẫn kép + dấu phẩy và \ n dòng mới)

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

Cái này được cấu hình để chạy trên http: // localhost: 5000 / import .

Tôi đi từng dòng một và tạo chuỗi truy vấn

"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 là tệp cấu hình

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;

Tuyên bố miễn trừ trách nhiệm: Đây không phải là một giải pháp hoàn hảo - Tôi chỉ đăng nó cho các nhà phát triển theo dòng thời gian và có nhiều dữ liệu để nhập và đang gặp phải vấn đề vô lý này. Tôi đã mất rất nhiều thời gian cho việc này và tôi hy vọng sẽ dành một dev khác cùng thời gian đã mất.


1

Tôi gặp vấn đề này trên windows 10. "--secure-file-private trong MySQL" Để giải quyết vấn đề này tôi đã làm như sau.

  1. Trong cửa sổ tìm kiếm (phía dưới bên trái) tôi đã gõ "powershell".
  2. Nhấp chuột phải vào powershell và chạy với tư cách quản trị viên.
  3. Điều hướng đến tập tin bin máy chủ. (C: \ Tệp chương trình \ MySQL \ MySQL Server 5.6 \ bin);
  4. Đã gõ ./mysqld
  5. Nhấn Enter"

Các máy chủ khởi động như mong đợi.


1

MySQL sử dụng biến hệ thống này để kiểm soát nơi bạn có thể nhập tệp của mình

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

Vì vậy, vấn đề là làm thế nào để thay đổi các biến hệ thống như secure_file_priv.

  1. tắt mysqld
  2. sudo mysqld_safe --secure_file_priv=""

bây giờ bạn có thể thấy như thế này:

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

0

Tại macOS Catalina, tôi đã làm theo các bước này để thiết lập secure_file_priv

1. Dịch vụ MySQL đỉnh cao

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

2. Khởi động lại việc gán MYSQL --secure_file_priv các biến hệ thống

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

Lưu ý: Việc thêm giá trị trống sẽ khắc phục sự cố cho tôi và MYSQL sẽ xuất dữ liệu sang thư mục / usr / local / mysql / data / YOU_DB_TABLE / Billing_FILE

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

Cảm ơn


0

Không thay đổi bất kỳ tập tin cấu hình nào ..

  1. tìm giá trị của secure_file_privviệc sử dụng lệnh được đăng bởi @vhu:SHOW VARIABLES LIKE "secure_file_priv" .
  2. xác định đường dẫn đầy đủ cho truy vấn của bạn, chẳng hạn như: select * from table into outfile 'secure_file_priv_PATH/OUTPUT-FILE' ... rest of your query

cái này hoạt động với lớp vỏ mysql của tôi trên Ubuntu 18.04 LTS mysql 5.7,29

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.