MySQL에서 --secure-file-priv를 어떻게 해결해야합니까?


357

MySQL을 배우고 LOAD DATA절을 사용해 보았습니다 . 아래처럼 사용했을 때 :

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

다음과 같은 오류가 발생했습니다.

MySQL 서버가 --secure-file-priv 옵션으로 실행 중이므로이 명령문을 실행할 수 없습니다.

이 오류를 어떻게 해결합니까?

동일한 오류 메시지 에서 다른 질문을 확인 했지만 여전히 해결책을 찾을 수 없습니다.

MySQL 5.6을 사용하고 있습니다


csv 파일의 공유 경로
— Zafar Malik

1
물론, mysqldump --tabmysql에서 자신의 데이터를 얻는 것이 어렵지 않은 것처럼 사용하려고 할 때이 오류가 발생 합니다.
— 윌리엄 Entriken

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는 W2012 서버에서 MySQL 5.6을 실행할 때 "C : \ ProgramData \ MySQL \ MySQL Server 5.6"에서 찾을 수 있습니다. 또한 서비스 시작 매개 변수 (예 : --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"입니다. 당신이 눈치 채지 못한 경우를 대비하여.
— NurShomik

67
값 : NULL FML.
— 윌리엄 Entriken

11
"select .. into outfile"을 사용하는 경우 전체 경로를 지정해야하며 전체 경로는SHOW VARIABLES LIKE "secure_file_priv";
— TheSatinKnight

9
"매개 변수 확인"및 "check my.ini"는 그리 좋은 대답이 아닙니다.
— Roland Seuhs

234

나는 같은 문제가 있었다. 마침내 LOCAL명령 의 옵션을 사용하여 해결 했습니다.

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

자세한 정보는 여기 http://dev.mysql.com/doc/refman/5.7/en/load-data.html에서 찾을 수 있습니다.

LOCAL이 지정되면 클라이언트 호스트의 클라이언트 프로그램이 파일을 읽고 서버로 보냅니다. 파일은 정확한 위치를 지정하기 위해 전체 경로 이름으로 제공 될 수 있습니다. 상대 경로 이름으로 제공된 경우 이름은 클라이언트 프로그램이 시작된 디렉토리를 기준으로 해석됩니다.


2
이것은 나를 위해 일했고 다른 사람에게는 효과가 없었습니다. 나는 시도 : 1. 내 txt 파일을 업로드 C:\ProgramData\MySQL\MySQL Server 5.7\Uploads하지 않도록 2. secure_file_priv에서 my.ini와 MySQL 3.이 일을 다시 시작! 감사합니다 :)
— Kamal Nayan

10
MariaDB에 대한이 오류 메시지가 나타납니다. "오류 1148 (42000) :이 MariaDB 버전에서는 사용 된 명령을 사용할 수 없습니다." 정확한 버전 : "리드 라인 5.2를 사용하는 Linux 용 mysql Ver 15.1 Distrib 10.1.22-MariaDB (x86_64)"
— jciloa

11
mysql 버전 5.7.19에 대해 "이 MySQL 버전에서는 사용 된 명령을 사용할 수 없습니다"라는 메시지가 나타납니다.
— Alison S

2
@AlisonS --local-infile실행할 때 플래그를 추가하십시오 mysql. stackoverflow.com/questions/10762239/…
— Illya Moskvin

1
The used command is not allowed with this MySQL versionMySQL 8.0에서
— bitfishxyz 8

117

Ubuntu 14 및 Mysql 5.5.53에서이 설정은 기본적으로 활성화 된 것으로 보입니다. 비활성화하려면 secure-file-priv = ""mysqld 구성 그룹 아래의 my.cnf 파일에 추가 해야합니다. 예 :-

[mysqld]
secure-file-priv = ""

1
이것은 나를 위해 일했다. 동일한 버전의 우분투와 MySQL
— Rodney

1
+1 나를 위해 일했다. 우분투를 사용하는 경우 mysql 서비스를 다시 시작하는 것을 잊지 마십시오 : sudo service mysql restart
— Emiliano Sangoi

1
해당되는 경우 명세서마다 선택한 위치를 가리켜 야하는 경우 작동합니다. 이것은 설명한 것처럼 Windows Server의 MySQL 5.7에서 작동합니다. 당신은 단순히 같은 라인 주석 경우 # secure-file-priv = ~다음을 여전히 같은 값을 보여줍니다 때문에 오류가 NULL당신이 서버, 등에 수출 할 수있는 디렉토리를 선택하려면이 방법은 문제를 해결 그 일
— 비트 코인 살인적인 미치광이

1
Windows의 MySQL 5.7에서 저에게 도움이되었지만 다른 솔루션은 그렇지 않았습니다.
— CGritton

NB : Docker 에서이 작업을 수행하는 경우 Docker 컨테이너를 다시 시작해야합니다.
— user1717828

38

Debian에서 MySQL5.7.11을 작업 중입니다. 디렉토리를 볼 수있는 명령은 다음과 같습니다.

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;명령은 예상 결과를 생성했습니다.
— Majid Fouladpour 2016 년

1
Ubuntu Mysql 5.7.21 : 출력 파일을 디렉토리 /var/lib/mysql-files/output.txt로 변경
— Shanemeister

2
그러면 어떻게 편집합니까? 나는 그것을 /etc/mysql/my.cnf에서 편집하려고했지만 아무런 효과가없는 것 같다 – NULL을 유지한다
— Slavik

24

Windows 7 secure-file-priv에서 vhu의 답변 에서 옵션 # 2 를 비활성화하는 데 도움이 된 것은 다음과 같습니다 .

  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
Ramnath, 5.7.x 버전의 @dbc detail으로 답을 편집하십시오. 감사.
— Rafael Gomes Francisco

빈 문자열을 추가하면 효과가 있습니다. secure-file-priv = ""와 같은 빈 문자열을 추가하려면 답변을 변경하십시오.
— Rajesh Goel

Windows의 경우 슬래시를 사용해야합니다
— Oliver Oliver

22

파일이 머신에 로컬 인 경우 명령에 LOCAL 을 사용하십시오.

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

14

v

나는 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> set global local_infile = 1;


  1. 파일의 전체 경로를 지정하십시오. 나의 경우에는:

mysql> "C : / ProgramData / MySQL / MySQL Server 8.0 / Uploads / file.txt"파일 데이터를 테이블 테스트로로드;


6

이 글은이 글을 작성할 당시에 522k 번 조회되었습니다 . 솔직히 MySQL이 과도하게 보호하는 불합리한 엄마가 된 것은 언제입니까? 보안에 많은 시간이 걸리는 시도입니다.

많은 검색과 많은 시도 후에 모든 것이 실패했습니다.
내 해결책 :

  1. 이전 상자에서 PhpMyAdmin 가져 오기를 통해 .csv 파일 가져 오기 (대형 인 경우 cmd 행에서)
  2. .sql 파일 생성
  3. .sql 파일 다운로드
  4. MySQL 작업대를 통해 .sql 파일 가져 오기

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에서 실행중인 경우 MySQL이 폴더에 쓸 수 있도록 Apparmor를 구성해야 할 수도 있습니다 (예 : 여기 내 구성).

이 행을 파일 /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"로 파일 경로를 두는 것이 저에게 효과적이었습니다.
— Anidhya Bhatnagar

3

mysql 8.0 버전의 경우 다음을 수행 할 수 있습니다.

  1. mysql.server 중지
  2. mysql.server start --secure-file-priv = ''

Mac High Sierra에서 나를 위해 일했습니다.


3

nodeJS를 실행 중이고 데이터가 다음 형식 (큰 따옴표 + 쉼표 및 \ n 줄 바꿈) 인 경우 NodeJS 가져 오기 스크립트를 작성했습니다.

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에서이 문제가 발생했습니다. "--MySQL의 secure-file-priv"이 문제를 해결하려면 다음을 수행하십시오.

  1. Windows 검색 (왼쪽 아래)에서 "powershell"을 입력했습니다.
  2. powershell을 마우스 오른쪽 버튼으로 클릭하고 관리자 권한으로 실행했습니다.
  3. 서버 bin 파일로 이동했습니다. (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

--secure_file_priv 시스템 변수를 할당하여 MYSQL을 다시 시작합니다.

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

이것은 우분투 18.04의 mysql-shell에서 작동했습니다. LTS mysql 5.7.29

당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.