programing

LOAD DATA INFILE 오류 코드: 13

coolbiz 2023. 1. 27. 22:06
반응형

LOAD DATA INFILE 오류 코드: 13

리모트 MySQL에서 이 쿼리를 실행하려고 하면 MySQL 오류 코드 13이 나타납니다.

쿼리 -

LOAD DATA INFILE 
'/httpdocs/.../.../testFile.csv'
INTO TABLE table_temp
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\\r \\n'
(sku, qty);

코드: 「 」 。13 Can't get stat of '/httpdocs/.../.../testFile.csv' (Errcode: 2)

a. 데이터베이스 사용자 로그인에는 모든 인가 권한이 있습니다.

CREATE USER 'userName'@'%' IDENTIFIED BY '************';

GRANT ALL PRIVILEGES ON * . * TO 'userName'@'%' IDENTIFIED BY '************' WITH GRANT OPTION MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;

GRANT ALL PRIVILEGES ON `userName\_%` . * TO 'userName'@'%';

b. FTP 툴을 사용하여 파일 및 폴더 권한을 chmod 777(rwxrwxrwx)로 설정했습니다.

이 게시물이 오래된 것은 알지만, 검색 결과에는 여전히 이 게시물이 표시됩니다.온라인에서 이 문제에 대한 해결책을 찾을 수 없어서 스스로 해결했습니다.Ubuntu를 사용하는 경우 MySQL에서 파일을 볼 수 없도록 하는 "Apparmor"라는 프로그램이 있습니다.MySQL이 "tmp" 디렉토리에서 파일을 읽을 수 있도록 하려면 다음과 같이 하십시오.

sudo vim /etc/apparmor.d/usr.sbin.mysqld

파일에 들어가면 MySQL에서 사용할 수 있는 디렉토리가 많이 표시됩니다." " " 을 합니다./tmp/** rwk파일(어디에 두느냐가 중요한지는 잘 모르겠지만, 다음은 파일을 어디에 두느냐의 샘플입니다):

  /etc/mysql/*.pem r,

  /etc/mysql/conf.d/ r,

  /etc/mysql/conf.d/* r,

  /etc/mysql/*.cnf r,

  /usr/lib/mysql/plugin/ r,

  /usr/lib/mysql/plugin/*.so* mr,

  /usr/sbin/mysqld mr,

  /usr/share/mysql/** r,

  /var/log/mysql.log rw,

  /var/log/mysql.err rw,

  /var/lib/mysql/ r,

  /var/lib/mysql/** rwk,


  /tmp/** rwk,


  /var/log/mysql/ r,

  /var/log/mysql/* rw,

  /var/run/mysqld/mysqld.pid w,

  /var/run/mysqld/mysqld.sock w,

  /run/mysqld/mysqld.pid w,

  /run/mysqld/mysqld.sock w,

이제 Apparmor를 다시 로드하기만 하면 됩니다.

sudo /etc/init.d/apparmor reload

"vim"을 사용했지만, 사용법을 알고 있는 텍스트 에디터로 대체하십시오.

쿼리에 'LOCAL' 키워드를 추가하면 다음과 같이 됩니다.

LOAD DATA LOCAL INFILE 'file_name' INTO TABLE table_name

키워드의 상세한 것에 대하여는, 여기를 참조해 주세요.

이것은 통상 파일 액세스 권한의 문제이지만, 이미 b지점에서 대응하고 있는 것을 알 수 있습니다만, 만약을 위해 검토할 필요가 있습니다.또 다른 옵션은 LOAD DATA LOCAL INFILE을 사용하여 이러한 파일 액세스 권한의 많은 문제를 해결하는 것입니다.이 방법을 사용하려면 먼저 파일을 로컬로 복사해야 합니다(mysql 폴더에 복사하는 것이 가장 좋습니다).LOCAL이 지정되어 있는 경우, 파일은 클라이언트호스트상의 클라이언트 프로그램에 의해서 읽혀져 서버에 송신됩니다.

디렉토리 권한 부족

이 예의 오류는 Import하려는 파일이 MySql 서버가 실행 중인 사용자가 읽을 수 있는 디렉토리에 없기 때문에 발생합니다.이 작업을 수행하려면 이 디렉토리의 모든 부모 디렉토리를 MySql 사용자가 읽을 수 있어야 합니다.파일을 /tmp에 저장하는 것은 보통 모든 사용자가 읽을 수 있고 쓸 수 있기 때문에 작동합니다.에러 코드 번호는 13.출처

편집:

이 파일을 보관하고 있는 폴더뿐만 아니라 상위 디렉토리에 대해서도 권한이 필요합니다.

MySql 포럼의 이 게시물의 예시입니다.

파일이 /tmp/imports/site1/data에 포함되어 있는 경우.파일

다음 디렉토리에서 '기타'에 대해 (755개가 작동했을 것으로 생각됩니다) r+x가 필요합니다.

/tmp

/tmp/mp/mp/mp/module

주요 2가지 기능:

/tmp/mp/site1

/tmp/mp/site1/data.파일

파일 및 디렉토리는 전 세계에서 읽을 수 있어야 합니다.이 방법을 이미 시도해 보셨다면 죄송하지만, 다시 한 번 확인해 보시기 바랍니다.

섹션 에는 이름이 mysql인 있어요tmpdir

예를 들어 다음과 같습니다.

tmpdir = c:/temp (Windows) or tmpdir = /tmp (Linux)

★★★★★★★★★★★★★★★★★」LOAD DATA INFILE명령어는 이 위치에서만 읽기 및 쓰기를 수행할 수 있습니다.

하면 "파일을 저장하세요"LOAD DATA INFILE이데올로기 때문에

다른 솔루션

다음 명령으로 데이터를 가져올 수도 있습니다.

load data local infile

이 경우 파일을 tmpdir로 이동할 필요가 없습니다.파일의 절대 경로를 지정할 수 있지만 이 명령을 실행하려면 플래그 값을 1개 변경해야 합니다.그 깃발은

--local-infile

mysql에 액세스하면서 명령 프롬프트에 의해 값을 변경할 수 있습니다.

mysql -u username -p --local-infile=1

건배.

Ubuntu 12.04를 사용하여 테이블을 만들고 다음 중 하나를 수행합니다.

local을 사용하면 다음 오류가 발생합니다(mysql 5.5).

> LOAD DATA LOCAL INFILE "file.csv" INTO table inverter FIELDS TERMINATED BY ',';
ERROR 1148 (42000): The used command is not allowed with this MySQL version

보안상의 이유로 LOAD DATA INFILE 명령어는 기본적으로 비활성화되어 있습니다.여기서 다시 활성화하면 동작합니다.https://stackoverflow.com/a/16286112/445131

mysqlimport를 사용하여 csv 파일을 Import할 수 있습니다.

mysqlimport -u root -p --fields-terminated-by=',' --local dbname tablename.csv

csv-file은 확장자 앞에 테이블과 같은 이름을 붙여야 합니다.

오류 13은 권한 문제일 뿐입니다.저도 같은 문제로 mysql 테이블에 데이터를 로드하지 못하고 스스로 문제를 해결했습니다.

해결책은 다음과 같습니다.

디폴트로는

--local-infile은 값 0으로 설정되어 있습니다.

LOAD DATA LOCAL INFILE을 사용하려면 LOAD DATA LOCAL INFILE을 활성화해야 합니다.

mySQL을 다음과 같이 시작합니다.

mysql - u username -p --local-infile

이것에 의해, 기동시에 LOCAL INFILE가 유효하게 되어, 사용중에 문제가 발생하지 않게 됩니다.

Fedora/RHEL/Cent를 사용하는 경우OO 일시적으로 SELinux를 비활성화할 수 있습니다.

setenforce 0

데이터를 로드한 후 다시 활성화합니다.

setenforce 1

Ubuntu 사용자용

Ubuntu 15.10에서 mysql 5.6.28을 실행하고 있는데 같은 문제가 발생했습니다.my.cnf tmpdir = /tmp local-infile=1에서 필요한 플래그를 모두 다시 시작했는데도 여전히 lOAD DATA INFILE 오류 코드: 13이 표시됩니다.

Nelson이 "apparmor"라고 언급한 것처럼 권한에 대한 mysql을 후원하는 것처럼 저는 이 빠르고 쉬운 튜토리얼 덕분에 해결책을 찾았습니다.

는 tmp dir가 "tmp dir"라고합니다./tmp:

/etc/apparmor.d/local/usr.sbin.mysqld에 새 tmpdir 항목을 추가합니다.

sudo nano /etc/apparmor.d/local/usr.sbin.mysqld

* 추가

/tmp/ r,
/mnt/foo/tmp/** rw,

AppArmor 다시 로드

sudo service apparmor reload

MySQL 재시작

sudo service mysql restart

그게 소수의 우분투족에게 도움이 되길 바란다.

이 문제를 해결하는 데 많은 어려움이 있었습니다.다음 두 가지 방법이 있습니다.

  • 파일 " "/etc/mysql/my.cnflocal-infile =1이후 두 곳에서[mysql]LOCAL INFILE sql ( LOCAL INFILE sql ) 。

  • sudo gedit /etc/apparmor.d/usr.sbin.mysqld하면 apparmor의 특수 쓸 수 ./var/www/행을 추가합니다.

/name of your directory/ r,

/name of your directory/* rw,

이름은 the음음 음음음음 음음음음 the the be be be 。/var/www/toto/(파일이 있는 디렉토리를 사용할 수 있습니다).

load data infile '/root/source/in.txt' into table employee;>코드: 13 == > 러 13: 13

load data infile '/tmp/in.txt' into table employee; > works == >

CentOS 릴리즈 6.6 (최종) - 5.5.32 MySQL Community Server (GPL)

리눅스 파일 권한과 관련된 것

Mac에서 XAMPP를 사용하는 경우 다음과 같이 처리했습니다.

다음과 같이 CSV/TXT 파일을 /Applications/XAMPP/xamppfiles/htdocs/로 이동

LOAD DATA LOCAL INFILE '/Applications/XAMPP/xamppfiles/htdocs/file.csv' INTO TABLE `tablename` FIELDS TERMINATED BY ',' LINES TERMINATED BY ';'

저도 지난 며칠 동안 이 문제에 대해 고민해 왔고, 답을 찾기 위해 스택 오버플로우에도 눈을 돌렸습니다.

그러나 MySQL에 데이터를 Import하는 가장 간단한 방법은 실제로 자체 데이터 Import 마법사 도구를 사용하는 것이라고 말하는 사람은 없는 것 같습니다.

테이블을 마우스 오른쪽 버튼으로 클릭하면 테이블이 나타납니다.

테이블을 오른쪽 클릭하기만 하면 테이블이 나타납니다.

위의 답변 중 어느 것도 도움이 되지 않았으므로, 막히면 이것을 사용해 주세요. :)

저는 같은 문제를 겪고 위의 해결책을 적용했습니다.

우선 나의 시험 환경은 다음과 같다.

  • Ubuntu 14.04.3 64비트
  • mysql Ver 14.14 Distributed 5.5.47(readline 6.3을 사용한debian-linux-gnu(x86_64)용) ('sudo apt-get install ...' 명령어만으로 설치)

제 테스트 결과는

i) AppArmor 솔루션은 /tmp 케이스에서만 작동합니다.

ii) 다음 솔루션은 AppArmor 솔루션 없이 작동합니다.Avnish Mehta의 답변에 감사하고 싶습니다.

$ mysql -u root -p --in-file=1
...
mysql> LOAD DATA LOCAL INFILE '/home/hongsoog/study/mysql/member.dat'
    -> INTO TABLE member_table;

중요한 세 가지 포인트는

  • --in-file=1 옵션을 사용하여 mysql 클라이언트 시작
  • 로드 데이터 파일 대신 로드 데이터 로컬 파일 사용
  • 모든 경로 요소가 /에서 데이터 파일 경로에 대한 월드 읽기 권한을 가지고 있는지 확인합니다.예를 들어, INFILE이 '/home/hongsoog/study/mysql/memer.dat'을 대상으로 하는 경우 다음 하위 경로는 월드 판독 가능 또는 mysql 그룹 판독 가능해야 합니다.

    • /홈
    • /home/hongsook
    • /home/hongsoog/study/facebook
    • /home/hongsoog/study/member.data

mysql 클라이언트를 "--in-file=1" 옵션 없이 시작하고

로컬 파일 데이터 로드...
, you will get

ERROR 1148(42000):사용된 명령이 이 MySQL 버전에서 허용되지 않습니다.


요약하면 mysql client 명령의 "--in-file=1" 옵션과 "LOAD DATA LOCAL INFILE..." 옵션이 함께 있어야 합니다.

누구에게나 도움이 되길 바랍니다.

또는 하여 cPanel을 .CSV using LOAD DATA[ ]([])(「」)Use LOCAL keyword공유 서버 환경에서는 이 방법이 도움이 되었습니다.

구:

LOAD DATA INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

File '/home/root12/Downloads/task1.csv' not found (Errcode: 13 - Permission denied)

새로운 기능:

LOAD DATA LOCAL INFILE '/home/root12/Downloads/task1.csv' INTO TABLE test.task FIELDS TERMINATED BY ',' ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;

Query OK, 500 rows affected, 284 warnings (1.24 sec)
Query OK, 5000 rows affected, 2846 warnings (1.24 sec)
  1. variable " checkout checkout 。local_infile 있다
 SHOW VARIABLES LIKE 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+

않은 경우는, 「」를 재기동합니다.mysqld 라이선스:

sudo ./mysqld_safe --local-infile
  1. 을 csv로 합니다./tmp수.mysqls가 읽을수 있습니다.

  2. db로 Import

mysql> LOAD DATA INFILE '/tmp/a.csv'  INTO TABLE table_a  FIELDS TERMINATED BY ','  ENCLOSED BY '"' LINES TERMINATED BY '\n' IGNORE 1 ROWS;
Query OK, 18 rows affected (0.17 sec)
Records: 18  Deleted: 0  Skipped: 0  Warnings: 0

알아요, 이건 오래된 스레드지만 여전히 LOAD DATA INFILE에 문제가 있는 사람들이 많아요!

훌륭한 답변이 몇 개 있습니다만, 저는 그 중 어느 것도 효과가 없었습니다.

MariaDB는 mariadb/server docker 컨테이너를 사용하여 실행 중이며 Ubuntu에서 실행되지만 문제점은 없었습니다.apparmor

문제는 단순하게 종료되었습니다.파일은 /root/data.csv에 있고, 물론 mysql 사용자는 액세스할 수 없습니다.

한편, LOAD DATA LOCAL INFILE을 대안으로 추천하고 있지만, "LOCAL"을 사용하면 원격 단말기에서 파일이 로드되고 그 처리가 달라지기 때문에 표준 "LOAD DATA INFILE"만큼 성능이 좋지 않습니다.

리모트 서버 또는 노트북/데스크탑에서 직접 파일을 로드할 필요가 없는 한, 최고의 퍼포먼스를 얻으려면 , 항상 「LOAD DATA INFILE」를 사용해 주세요.이는 물론 보안상의 이유로 비활성화되어 있기 때문에 OS에 따라 서버의 설정 파일 "/etc/my.cnf" 또는 "/etc/my.cnf.d/server.cnf"를 통해 "LOCAL_INFILE"을 허용해야 합니다.

마지막으로 컨테이너에는 "/data"로 정의된 "secure_file_priv" 파라미터가 있습니다.

b510bf09bc5c [testdb]> SHOW GLOBAL VARIABLES LIKE '%SECURE_FILE_%';
+------------------+--------+
| Variable_name    | Value  |
+------------------+--------+
| secure_file_priv | /data/ |
+------------------+--------+

즉, "/data" 폴더에서 데이터 파일을 로드하는 경우에만 LOAD DATA INFILE이 작동합니다!이 점에 주의하여 올바른 폴더를 사용하십시오.

이게 도움이 됐으면 좋겠네요.

건배.

CentOS 7+ 최소 보안 솔루션: (Red Hat에서도 사용 가능)

chcon -Rv --type=mysqld_db_t /YOUR/PATH/

설명:

좋은 사용법을 적용했다는 것을 알고 있습니다.secure-file-priv=/YOUR/PATH/my.cnf사용하기 위해서load data infilesql 문은 다음과 같습니다.

ERROR 13 (HY000): Can't get stat of '/YOUR/PATH/FILE.EXT' (Errcode: 13 "Permission denied")

SELinux가 원인입니다.Enforcing모드, 모드 변경은 안전하지 않습니다.Permissive또는 SELinux 를 비활성화합니다.
요컨대,

chcon파일 또는 파일의 SELinux 보안 컨텍스트를 'chown' 또는 'chmod'를 사용하여 파일의 소유권 또는 표준 파일 권한을 변경하는 방법과 유사한 방법으로 변경합니다.

셀리눅스Enforcing모드가 방지하다mysqldsecure-display-type 디렉토리에 액세스하지 않음default_t따라서 경로의 secure-display-type을 변경해야 합니다.mysqld_db_t현재 secure-context-type을 표시하려면 다음 명령을 사용합니다.

ls --directory --scontext /YOUR/PATH/

솔루션을 리셋/언실행 해제하려면 다음 명령을 적용합니다.

restorecon -Rv /YOUR/PATH/

공유한 솔루션은 다음 링크에서 참조할 수 있습니다.

https://wiki.centos.org/HowTos/SELinux
https://mariadb.com/kb/en/selinux/
https://linux.die.net/man/8/mysqld_selinux

  1. db_name에 대한 모든 권한을 부여합니다.* 'db_user'@'localhost'에게;
  2. .*의 파일을 'password'로 식별되는 'db_user'@'localhost'에 부여한다.
  3. 플래시 특권
  4. SET GLOBAL local_infile = 1;
  5. MYSQL "secure-file-priv" 설정 변수는 빈 행이어야 합니다!!!

언급URL : https://stackoverflow.com/questions/4215231/load-data-infile-error-code-13

반응형