Come posso aggirare MySQL Errcode 13 con SELECT INTO OUTFILE?

Sto provando a scaricare il contenuto di una tabella in un file CSV usando un’istruzione SELECT INTO OUTFILE di MySQL. Se lo faccio:

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

outfile.csv verrà creato sul server nella stessa directory in cui sono archiviati i file del database.

Tuttavia, quando cambio la mia richiesta a:

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

Ottengo:

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

Errcode 13 è un errore di authorization, ma lo ottengo anche se cambio la proprietà di / data a mysql: mysql e gli do 777 permessi. MySQL è in esecuzione come utente “mysql”.

    Stranamente posso creare il file in / tmp, non solo in qualsiasi altra directory che ho provato, anche con le autorizzazioni impostate in modo tale che l’utente mysql possa essere in grado di scrivere nella directory.

    Questo è MySQL 5.0.75 in esecuzione su Ubuntu.

    Quale versione particolare di Ubuntu è questa ed è questa Ubuntu Server Edition?

    Le recenti edizioni di Ubuntu Server (come 10.04) vengono fornite con AppArmor e il profilo di MySQL potrebbe essere in modalità di imposizione per impostazione predefinita. Puoi verificarlo eseguendo sudo aa-status modo:

     # 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. 

    Se mysqld è incluso in modalità enforce, allora è quello che probabilmente nega la scrittura. Le voci dovrebbero anche essere scritte in /var/log/messages quando AppArmor blocca le scritture / accessi. Quello che puoi fare è modificare /etc/apparmor.d/usr.sbin.mysqld e aggiungere /data/ and /data/* vicino alla fine in questo modo:

     ... /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,** } 

    E quindi fare in modo che AppArmor ricarichi i profili.

     # sudo /etc/init.d/apparmor reload 

    ATTENZIONE: la modifica sopra consentirà a MySQL di leggere e scrivere nella directory / data. Speriamo che tu abbia già considerato le implicazioni per la sicurezza di questo.

    Ubuntu usa AppArmor e questo è ciò che ti impedisce di accedere a / data /. Fedora usa selinux e questo lo impedirebbe su una macchina RHEL / Fedora / CentOS.

    Per modificare AppArmor per consentire a MySQL di accedere / dati / fare quanto segue:

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

    aggiungi questa linea ovunque nella lista delle directory:

    /data/ rw,

    quindi fai un:

    sudo /etc/init.d/apparmor restart

    Un’altra opzione è disabilitare AppArmor per mysql del tutto, questo NON è RACCOMANDATO :

    sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

    Non dimenticare di riavviare apparmor:

    sudo /etc/init.d/apparmor restart

    So che hai detto che hai già provato a impostare i permessi su 777, ma dato che ho una prova che per me era un problema con i permessi, sto pubblicando ciò che cerco esattamente di correre sperando che possa aiutarti. Ecco la mia esperienza:

     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 $ 

    MySQL sta diventando stupido qui. Prova a creare file in / tmp / data / …. Quindi quello che puoi fare è il seguente:

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

    Quindi prova la tua richiesta. Questo ha funzionato per me dopo ore di debugging del problema.

    Alcune cose da provare:

    • è impostata la variabile di sistema secure_file_priv ? Se lo è, tutti i file devono essere scritti in quella directory.
    • assicurati che il file non esista – MySQL creerà solo nuovi file, non sovrascriverà quelli esistenti.

    Questo problema mi ha infastidito per molto tempo. Ho notato che questa discussione non indica la soluzione su RHEL / Fecora. Sto usando RHEL e non trovo i file di configurazione corrispondenti ad AppArmer su Ubuntu, ma ho risolto il mio problema rendendo ogni directory nella PATH della directory leggibile e accessibile da mysql. Ad esempio, se si crea una directory / tmp, i seguenti due comandi rendono SELECT INTO OUTFILE in grado di emettere il file .sql AND .sql

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

    Se crei una directory nella tua directory home / home / tom, devi farlo per / home e / home / tom.

    Puoi farlo :

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

    Nel mio caso, la soluzione era rendere leggibile e accessibile ogni directory nel percorso della directory da mysql ( chmod a+rx ). La directory è stata ancora specificata dal relativo percorso nella riga di comando.

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

    Mi sono imbattuto in questo stesso problema. Il mio problema era che la directory in cui stavo tentando di eseguire il dump non aveva i permessi di scrittura per il processo mysqld. Il dump sql iniziale scriverà, ma la scrittura del file csv / txt fallirebbe. Sembra che il dump di SQL venga eseguito come utente corrente e la conversione in csv / txt venga eseguita come utente che esegue mysqld. Quindi la directory richiede i permessi di scrittura per entrambi gli utenti.

    Ho lo stesso problema e ho risolto questo problema seguendo i passaggi:

    • Sistema operativo: ubuntu 12.04
    • lampada installata
    • supponiamo che la directory in cui salvare il file di output sia: / var / www / csv /

    Esegui il seguente comando sul terminale e modifica questo file usando l’editor gedit per aggiungere la tua directory al file di output.

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

    • ora il file verrebbe aperto nell’editor per favore aggiungi la tua directory lì

      / var / www / csv / * rw,

    • allo stesso modo ho aggiunto nel mio file, come la seguente immagine data:

    inserisci la descrizione dell'immagine qui

    Esegui il comando successivo per riavviare i servizi:

    sudo /etc/init.d/apparmor restart

    Ad esempio, eseguo la seguente query nel generatore di query phpmyadmin per l’output dei dati nel file csv

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

    Ha completato e scritto tutte le righe con le colonne selezionate nel file OUTPUT.csv …

    È necessario fornire un percorso assoluto, non un percorso relativo.

    Fornire il percorso completo alla directory / data in cui si sta tentando di scrivere.

    Ubuntu usa SELinux? Controlla se è abilitato e imposto. /var/log/audit/audit.log potrebbe essere helpul (se è lì che Ubuntu lo attacca – questa è la posizione RHEL / Fedora).

    Ho avuto lo stesso problema su un CentOs 6.7 Nel mio caso sono state impostate tutte le autorizzazioni e ancora si è verificato l’errore. Il problema era che il SE Linux era nella modalità “imporre”.

    L’ho passato a “permissive” usando il comando sudo setenforce 0

    Poi tutto ha funzionato per me.