MySQL에서 데이터 infile로드에 대한 액세스가 거부되었습니다.


105

PHP에서 항상 MySQL 쿼리를 사용하지만 시도 할 때

LOAD DATA INFILE

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

# 1045-사용자 'user'@ 'localhost'에 대한 액세스가 거부되었습니다 (암호 사용 : YES).

이것이 무엇을 의미하는지 아는 사람이 있습니까?

답변:


197

이 문제도 만났습니다. LOCALSQL 문 에 추가 해야했습니다.

예를 들어 다음은 권한 문제를 제공합니다.

LOAD DATA INFILE '{$file}' INTO TABLE {$table}

LOCAL진술에 추가 하면 권한 문제가 사라질 것입니다. 이렇게 :

LOAD DATA LOCAL INFILE '{$file}' INTO TABLE {$table}

12
이것은 다른 일을합니다. 임시 디렉토리의 서버에 파일을 업로드합니다. 이것은 때때로 필요하지만 infile이 이미 MySQL 서버에 있으면 중복 작업을 수행하는 것입니다.
jeffcook2150

1
네 이것이 나를 위해 트릭을했습니다. ssh를 통해 데이터베이스 서버 포트를 전달하고 있었으며 LOCAL 부분이없는 원격 데이터베이스 서버에서 파일을 찾고 있었던 것 같습니다
mike

2
나를 위해 @jeremysawesome 이것은 다음 오류를 생성합니다. 오류 코드 : 1148 사용 된 명령은이 MySQL 버전에서 허용되지 않습니다. mysql 파일을 local-infile = 1로 수정하는 것과 같은이 문제에 대한 몇 가지 답변을 시도했지만 실패했습니다.
OrwellHindenberg 2015

6.2.5에 MySQL을의 업데이트 나를 위해이 문제를 해결
OrwellHindenberg

4
--local-infile옵션 과 함께 mysql을 호출해야 할 수도 있습니다 .
shabbychef

32

나는이 문제가 있었다. 나는 주변을 뒤져 보았지만 만족스러운 답을 찾지 못했습니다. 내 검색 결과를 아래에 요약합니다.

액세스 거부 오류는 다음을 의미 할 수 있습니다.

  • 'user'@ 'localhost'에는 FILE 권한 ( GRANT FILE on *.* to user@'localhost') 이 없습니다 . 또는,
  • 로드하려는 파일이 mysql 서버를 실행하는 머신에 존재하지 않습니다 (LOAD DATA INFILE을 사용하는 경우). 또는,
  • 로드하려는 파일이 로컬 시스템에 존재하지 않습니다 (LOAD DATA LOCAL INFILE을 사용하는 경우). 또는,
  • 로드하려는 파일이 전 세계에서 읽을 수 없습니다 (전 세계에서 읽을 수 있으려면 파일 모든 상위 디렉토리가 필요합니다 . chmod 755 디렉토리, chmod 744 file.dat)

+1 : 이것은 나를 위해 일했습니다. 로드하려는 파일은 세계에서 읽을 수 없습니다 (파일과 모든 부모 디렉터리가 세계에서 읽을 수 있어야합니다 : chmod 755 directory; and, chmod 744 file.dat) . 내 모든 디렉토리에 대한 사용 권한을 변경하지 않았
gavdotnet

1
사용자 Tatiana는 전체 서버에 대해서만 데이터베이스 당 FILE 권한을 부여 할 수 없다고 지적합니다. 부여 명령은 "GRANT FILE on . to user @ 'localhost'IDENTIFIED BY 'password');"입니다.
JAL

3
@JAL "Grant FILE ON *. * to user ..."를 의미한다고 생각합니다.-별표 문자가 제거되었을 수 있습니다.
Eugene M


19

다음 명령을 사용해보십시오.

load data local infile 'home/data.txt' into table customer;

작동합니다. 제 경우에는 효과가있었습니다.


3
ERROR 1148 (42000): The used command is not allowed with this MySQL version
Stewart

@Stewart, 위의 명령에서 'local'을 제거하십시오. 이후 mysql 버전은 전역 변수 'local_infile'변수가 'ON'(아래 참조)으로 설정된 경우이 플래그를 지원하지 않는 것 같습니다. 따라서 명령은 다음과 같습니다. mysql> 'home / data.txt'파일의 데이터를 customer 테이블에로드합니다. + --------------- + ------- + | 변수 _ 이름 | 가치 | + --------------- + ------- + | local_infile | ON | + --------------- + ------- +
Kamran Hyder

@KamranHyder 나에게 좋은 대답이있는 것 같네요. 전체 답변으로 추가하지 않으시겠습니까?
Stewart

10

MySQL 사용자에게 FILE 권한이 부여되었는지 확인하십시오.

공유 웹 호스팅을 사용중인 경우 호스팅 제공 업체에서 차단할 가능성이 있습니다.


공유 웹 호스팅에서 : "LOAD DATA LOCAL INFILE"을 사용하는 것이 도움이됩니까?
피터

3

Lyon의 문자열은 저에게 아주 좋은 팁을주었습니다. Windows에서는 백 슬래시가 아닌 슬래시를 사용해야합니다. 이 코드는 나를 위해 작동합니다.

    File tempFile = File.createTempFile(tableName, ".csv");
    FileUtils.copyInputStreamToFile(data, tempFile);

    JdbcTemplate template = new JdbcTemplate(dataSource);
    String path = tempFile.getAbsolutePath().replace('\\', '/');
    int rows = template.update(MessageFormat
            .format("LOAD DATA LOCAL INFILE ''{0}'' INTO TABLE {1} FIELDS TERMINATED BY '',''",
                    path, tableName));
    logger.info("imported {} rows into {}", rows, tableName);

    tempFile.delete();

2

동일한 문제가 발생하여 다음 단계를 수행하여 해결했습니다.

  • load_infile 변수 활성화
  • 내 사용자 정의 mysql 사용자에게 그랜드 파일 권한
  • secure_file_priv 변수 비활성화 (내 파일은 웹 서버에 의해 myslq / var / lib / mysql-file의 보안 디렉토리가 아닌 / tmp 폴더에 업로드되었습니다)

이 세 번째 요점에 대해서는 다음을 참조 할 수 있습니다. https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_secure_file_priv를

BR,

기원 후


2

이것은 나에게도 일어 났고 Yamir가 그의 게시물에서 설명한 모든 단계를 따랐음에도 불구하고 작동하도록 만들 수 없었습니다.

파일은 777 권한으로 /tmp/test.csv에 있습니다. MySQL 사용자에게 파일 권한이 있고 MySQL 버전에서 LOCAL 옵션이 허용되지 않아서 멈췄습니다.

마지막으로 다음을 실행하여 문제를 해결할 수있었습니다.

sudo chown mysql:mysql /tmp/test.csv

2

명령 줄을 사용하는 경우 쉬운 것을 찾았습니다.

다음으로 로그인mysql -u[username] -p[password] --local-infile

그때 SET GLOBAL local_infile = 1;

데이터베이스 선택 use [db_name]

그리고 마지막으로 LOAD DATA LOCAL INFILE 'C:\\Users\\shant\\Downloads\\data-1573708892247.csv' INTO TABLE visitors_final_test FIELDS TERMINATED BY ','LINES TERMINATED BY '\r \n' IGNORE 1 LINES;


--local-inline을 추가하면 도움이되었습니다. 그러나 제 경우에는 local_infile 전역 변수가 이미 ON으로 설정되었습니다. 사용자는 수정하기 전에이 변수에 어떤 값을 적 었는지 먼저 파악하는 것이 좋습니다.
Eugene Maysyuk

RDS 사용자의 경우 => --local-infile을 추가하면 RDS에서 도움이 SET GLOBAL local_infile = 1;되었지만 RDS에서 작동하지 않는 것 같지만 어쨌든 --local-infile트릭 이 없었습니다
사실

0

MySQL 테이블을로드하는 것이 빠르고 고통스럽지 않다는 것을 발견했습니다 (python / Django 모델 관리자 스크립트를 사용했습니다).

1) 모든 열이 VARCHAR (n) NULL 인 테이블 만들기 예 :

mysql> CREATE TABLE cw_well2( api VARCHAR(10) NULL,api_county VARCHAR(3) NULL);


 2) csv에서 헤더 (첫 번째 줄)를 제거한 다음로드합니다 (로컬을 잊어 버린 경우 "# 1045-사용자 'user'@ 'localhost'에 대한 액세스가 거부되었습니다 (비밀번호 사용 : YES)").

mysql> LOAD DATA LOCAL INFILE "/home/magula6/cogswatch2/well2.csv" INTO TABLE cw_well2 FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'     -> ; Query OK, 119426 rows affected, 19962 warnings  (3.41 sec)


 3) 열 변경 :

mysql> ALTER TABLE cw_well2 CHANGE spud_date spud_date DATE;

mysql> ALTER TABLE cw_well2 CHANGE latitude latitude FLOAT;

voilà!


-5

제공 한 비밀번호 'user'@'localhost'가 올바르지 않음을 의미 할 수 있습니다 .


1
나는 그렇게 생각하지 않는다. 동일한 암호로 다른 쿼리를 수행 할 수 있습니다.
Brian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.