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.