복붙노트

[SQL] 어떻게 SELECT INTO OUTFILE와 MySQL을 errcode를 13 주위를받을 수 있나요?

SQL

어떻게 SELECT INTO OUTFILE와 MySQL을 errcode를 13 주위를받을 수 있나요?

나는 MySQL은 SELECT INTO OUTFILE 문을 사용하여 csv 파일에 테이블의 내용을 덤프하려합니다. 만약 내가한다면:

SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

outfile.csv이 데이터베이스의 파일에 저장되어있는 같은 디렉토리 서버에서 생성됩니다.

그러나, 나는 내 쿼리를 변경할 때 :

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

나는 얻다:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

errcode를 13 사용 권한 오류입니다,하지만 난 그게 심지어 MySQL의에 / 데이터의 I 변화 소유권 경우 얻을 : MySQL과 그것에게 777 권한을 부여. MySQL은 사용자 "MySQL의"로 실행됩니다.

이상하게도 나는 권한을 사용자 MySQL의 디렉토리에 쓸 수 있어야한다는 등의 설정도 함께, 그냥 내가 해봤 다른 디렉토리에서 / tmp에 파일을 만들 수 있습니다.

이 우분투에서 MySQL 5.0.75 실행 중입니다.

해결법

  1. ==============================

    1.우분투의 특정 버전이 있으며이 우분투 서버 버전은 무엇입니까?

    우분투의 특정 버전이 있으며이 우분투 서버 버전은 무엇입니까?

    최근 우분투 서버 에디션은 AppArmor의와 MySQL의 프로파일 (예 : 10.04)을 선박은 기본적으로 적용 모드 수 있습니다. 당신과 같이 sudo는 AA-상태를 실행하여이를 확인할 수 있습니다 :

    # sudo aa-status
    5 profiles are loaded.
    5 profiles are in enforce mode.
       /usr/lib/connman/scripts/dhclient-script
       /sbin/dhclient3
       /usr/sbin/tcpdump
       /usr/lib/NetworkManager/nm-dhcp-client.action
       /usr/sbin/mysqld
    0 profiles are in complain mode.
    1 processes have profiles defined.
    1 processes are in enforce mode :
       /usr/sbin/mysqld (1089)
    0 processes are in complain mode.
    

    mysqld에이 모드를 강제에 포함되어있는 경우, 그것은 아마 쓰기를 거부 하나입니다. AppArmor의 차단 쓰기가 / 액세스 할 때 항목은 / var에 / 로그 / 메시지에 기록 될 것입니다. 당신이 할 수있는 것은 편집 /etc/apparmor.d/usr.sbin.mysqld하고 추가 / 데이터 /와 / 데이터 / *과 같이 아래쪽 :

    ...  
    /usr/sbin/mysqld  {  
        ...  
        /var/log/mysql/ r,  
        /var/log/mysql/* rw,  
        /var/run/mysqld/mysqld.pid w,  
        /var/run/mysqld/mysqld.sock w,  
        **/data/ r,  
        /data/* rw,**  
    }
    

    그리고 AppArmor의이 프로파일을 다시로드합니다.

    # sudo /etc/init.d/apparmor reload
    

    경고 : 위의 변경 MySQL을가 / 데이터 디렉토리에 읽기 및 쓰기 할 수 있습니다. 우리는 이미이의 보안 문제를 고려했습니다 바랍니다.

  2. ==============================

    2.우분투는 AppArmor의를 사용하고는 뭐죠가 / / 데이터에 액세스 할 수없는 것입니다. 페도라 SELinux를 사용하고는 RHEL / 페도라 / CentOS는 컴퓨터에서이 문제를 방지한다.

    우분투는 AppArmor의를 사용하고는 뭐죠가 / / 데이터에 액세스 할 수없는 것입니다. 페도라 SELinux를 사용하고는 RHEL / 페도라 / CentOS는 컴퓨터에서이 문제를 방지한다.

    액세스 / 데이터에 MySQL을 할 수 있도록 AppArmor의를 수정하려면 / 추적을 수행

    sudo는 gedit를 /etc/apparmor.d/usr.sbin.mysqld

    디렉토리 목록에서이 라인 어느 곳을 추가합니다 :

    / 데이터 / RW,

    다음을 수행하십시오

    sudo는 /etc/init.d/apparmor 다시 시작

    또 다른 옵션은 모두 MySQL을 사용 안함 AppArmor의이다,이 방법은 사용하지 않는 것이 좋습니다 :

    sudo는 MV /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

    다시 시작 AppArmor의하는 것을 잊지 마세요 :

    sudo는 /etc/init.d/apparmor 다시 시작

  3. ==============================

    3.난 당신이 777에 이미 권한 설정을 시도했다 알지만, 나를 위해 그것을 내가 정확히 도울 수있는 희망 실행 무엇을 게시하도록하겠습니다 권한 문제라고 증거를 가지고있다. 여기 내 경험이 있습니다 :

    난 당신이 777에 이미 권한 설정을 시도했다 알지만, 나를 위해 그것을 내가 정확히 도울 수있는 희망 실행 무엇을 게시하도록하겠습니다 권한 문제라고 증거를 가지고있다. 여기 내 경험이 있습니다 :

    tmp $ pwd
    /Users/username/tmp
    tmp $ mkdir bkptest
    tmp $ mysqldump -u root -T bkptest bkptest
    mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
    tmp $ chmod a+rwx bkptest/
    tmp $ mysqldump -u root -T bkptest bkptest
    tmp $ ls bkptest/
    people.sql  people.txt
    tmp $ 
    
  4. ==============================

    4.MySQL은 여기 바보지고 있습니다. 그것은 파일을 만들려고 아래에 / tmp를 / 데이터 / ... 그래서 당신이 할 수있는 것은 다음이다 :

    MySQL은 여기 바보지고 있습니다. 그것은 파일을 만들려고 아래에 / tmp를 / 데이터 / ... 그래서 당신이 할 수있는 것은 다음이다 :

    mkdir /tmp/data
    mount --bind /data /tmp/data
    

    그런 다음 쿼리를 시도합니다. 이 문제를 디버깅 시간 후 날 위해 일했습니다.

  5. ==============================

    5.이 문제는 오랫동안 나를 괴롭 히고있다. 나는이 토론 RHEL / Fecora에 솔루션을 지적하지 않는 것으로 나타났습니다. 나는 RHEL을 사용하고 난 우분투에 AppArmer에 해당하는 구성 파일을 찾을 수없는,하지만 난 MySQL이 매주 디렉토리 경로 읽을 수있는 디렉토리에 접근을하여 내 문제를 해결했다. 당신은 / tmp 디렉토리를 만들 경우, 예를 들어, 다음 두 명령은 .SQL 및 .SQL 파일 출력 SELECT INTO OUTFILE을 할 수 있도록

    이 문제는 오랫동안 나를 괴롭 히고있다. 나는이 토론 RHEL / Fecora에 솔루션을 지적하지 않는 것으로 나타났습니다. 나는 RHEL을 사용하고 난 우분투에 AppArmer에 해당하는 구성 파일을 찾을 수없는,하지만 난 MySQL이 매주 디렉토리 경로 읽을 수있는 디렉토리에 접근을하여 내 문제를 해결했다. 당신은 / tmp 디렉토리를 만들 경우, 예를 들어, 다음 두 명령은 .SQL 및 .SQL 파일 출력 SELECT INTO OUTFILE을 할 수 있도록

    chown mysql:mysql /tmp
    chmod a+rx /tmp
    

    당신이 당신의 홈 디렉토리 / 홈 / 톰에 디렉토리를 작성하는 경우, 당신은 모두 / home과 / 가정 / 톰이 작업을 수행해야합니다.

  6. ==============================

    6.이 작업을 수행 할 수 있습니다 :

    이 작업을 수행 할 수 있습니다 :

    mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml
    
  7. ==============================

    7.어떤 것들은 시도 :

    어떤 것들은 시도 :

  8. ==============================

    8.나는 같은 문제가 나는 단계를 수행하여이 문제를 해결 :

    나는 같은 문제가 나는 단계를 수행하여이 문제를 해결 :

    sudo는 gedit를 /etc/apparmor.d/usr.sbin.mysqld

    sudo는 /etc/init.d/apparmor 다시 시작

    SELECT colName1, colName2,colName3
    INTO OUTFILE '/var/www/csv/OUTFILE.csv'
    FIELDS TERMINATED BY ','
    FROM tableName;
    

    그것은 성공적으로 수행하고 OUTPUT.csv 파일로 선택한 열이있는 모든 행을 쓰기 ...

  9. ==============================

    9.내 경우에는,이 솔루션은 디렉토리 경로에있는 모든 디렉토리를 읽을 수와 MySQL에 의해 액세스 할 수 있도록 (chmod를 A + RX)이었다. 디렉토리는 여전히 명령 줄에서의 상대 경로로 지정되었습니다.

    내 경우에는,이 솔루션은 디렉토리 경로에있는 모든 디렉토리를 읽을 수와 MySQL에 의해 액세스 할 수 있도록 (chmod를 A + RX)이었다. 디렉토리는 여전히 명령 줄에서의 상대 경로로 지정되었습니다.

    chmod a+rx /tmp
    chmod a+rx /tmp/migration
    etc.
    
  10. ==============================

    10.난 그냥이 같은 문제 다 퉜다. 내 문제는 내가 mysqld를 공정에 대한 쓰기 권한이 없었로 덤프려고하는 디렉토리이다. 초기 SQL 덤프 쓰는 것입니다하지만 CSV의 쓰기 / TXT 파일은 실패합니다. 현재 사용자 및 변환과 같은 SQL 덤프 실행처럼 보인다는 CSV / TXT mysqld를 실행중인 사용자로 실행합니다. 그래서 디렉토리의 요구는 두 사용자에 대한 권한을 써주세요.

    난 그냥이 같은 문제 다 퉜다. 내 문제는 내가 mysqld를 공정에 대한 쓰기 권한이 없었로 덤프려고하는 디렉토리이다. 초기 SQL 덤프 쓰는 것입니다하지만 CSV의 쓰기 / TXT 파일은 실패합니다. 현재 사용자 및 변환과 같은 SQL 덤프 실행처럼 보인다는 CSV / TXT mysqld를 실행중인 사용자로 실행합니다. 그래서 디렉토리의 요구는 두 사용자에 대한 권한을 써주세요.

  11. ==============================

    11.당신은 상대 경로가 아닌 절대 경로를 제공해야합니다.

    당신은 상대 경로가 아닌 절대 경로를 제공해야합니다.

    당신이 쓰기하려고하는 / 데이터 디렉토리의 전체 경로를 제공합니다.

  12. ==============================

    12.합니까 우분투는 SELinux를 사용합니까? 이 활성화되고 시행 것 있는지 확인하십시오. /var/log/audit/audit.log는 helpul을 할 수있다 (우분투는 스틱이의 경우 - RHEL / 페도라 위치).

    합니까 우분투는 SELinux를 사용합니까? 이 활성화되고 시행 것 있는지 확인하십시오. /var/log/audit/audit.log는 helpul을 할 수있다 (우분투는 스틱이의 경우 - RHEL / 페도라 위치).

  13. ==============================

    13.나는 가상 코어 6.7에서 같은 문제가 있었다 내 경우에는 모든 권한을 설정하고 여전히 오류가 발생했습니다. 문제는 SE 리눅스는 "시행"모드에 있던 것이 었습니다.

    나는 가상 코어 6.7에서 같은 문제가 있었다 내 경우에는 모든 권한을 설정하고 여전히 오류가 발생했습니다. 문제는 SE 리눅스는 "시행"모드에 있던 것이 었습니다.

    나는 명령 sudo를 위해 setenforce 0을 사용하여 "허용"으로 전환

    그런 다음 모든 날 위해 일했습니다.

  14. from https://stackoverflow.com/questions/2783313/how-can-i-get-around-mysql-errcode-13-with-select-into-outfile by cc-by-sa and MIT license