Domanda

Sto cercando di scaricare il contenuto di una tabella in un file CSV utilizzando un'istruzione MySQL SELECT INTO OUTFILE. Se faccio:

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

outfile.csv verrà creato sul server nella stessa directory dei file di questo database sono memorizzati in.

Tuttavia, quando cambio la mia domanda a:

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

I ottenere:

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

Errcode 13 è un errore di autorizzazioni, ma ho capito anche se io cambio la proprietà dei dati / a mysql: mysql e dare 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 i permessi impostati in modo tale che mysql utente dovrebbe essere in grado di scrivere nella directory.

Questa è MySQL 5.0.75 in esecuzione su Ubuntu.

È stato utile?

Soluzione

Quali particolare versione di Ubuntu è questo ed è questo Ubuntu Server Edition?

recenti edizioni di Ubuntu Server (come ad esempio 10.04) vengono forniti con il profilo AppArmor e MySQL di potrebbero essere in modalità enforcing per impostazione predefinita. È possibile controllare questo eseguendo sudo aa-status in questo 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 è inclusa nella modalità esecutiva, allora è quello probabilmente negare la scrittura. Le voci sarebbero anche essere scritti in /var/log/messages quando i blocchi di AppArmor le scritture / accessi. Che cosa si può fare è modificare e aggiungere /etc/apparmor.d/usr.sbin.mysqld /data/ e /data/* in prossimità del fondo 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 poi fare AppArmor ricaricare i profili.

# sudo /etc/init.d/apparmor reload

ATTENZIONE: il cambiamento di cui sopra consentirà MySQL leggere e scrivere nella directory / dati. Ci auguriamo che hai già preso in considerazione le implicazioni di sicurezza di questo.

Altri suggerimenti

Ubuntu utilizza AppArmor e che è che cosa impedisce l'accesso / dati /. Fedora usa SELinux e che impedirebbe questo su una macchina RHEL / Fedora / CentOS.

Per modificare AppArmor per consentire l'accesso a MySQL / dati / fare il seguito:

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

aggiungere questa riga in qualsiasi lista di directory:

/data/ rw,

poi fare un:

sudo /etc/init.d/apparmor restart

Un'altra opzione è quella di disabilitare AppArmor per mysql del tutto, questa è la SCONSIGLIATO :

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

Non dimenticate di riavviare AppArmor:

sudo /etc/init.d/apparmor restart

So che hai detto che si è tentato già i permessi a 777, ma come ho un prova che per me è stato un problema di permessi sto postando quello che esattamente correre sperando che può aiutare. 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 è sempre stupido qui. Si cerca di creare file in / tmp / data / .... Che cosa si può fare è il seguente:

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

Quindi provare la query. Questo ha funzionato per me, dopo ore di debug del problema.

Questo problema è stato mi dà fastidio per lungo tempo. Ho notato che questa discussione non sottolineare la soluzione su RHEL / Fecora. Sto usando RHEL e non trovo i file di configurazione corrispondenti ai AppArmer su Ubuntu, ma ho risolto il mio problema rendendo ogni directory nella directory leggibile PATH 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 .sql E file sql

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

Se si crea una directory nella propria home directory / home / tom, è necessario farlo sia per / home e / home / tom.

Si può fare questo:

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

Alcune cose da provare:

  • è la variabile di sistema secure_file_priv set? Se lo è, tutti i file devono essere scritti a quella directory.
  • assicurarsi che il file non esiste -. MySQL creerà solo nuovi file, non quelli già esistenti sovrascrittura

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

  • Sistema operativo: Ubuntu 12.04
  • lampada installata
  • si supponga che il directory in cui salvare il file di output è: / var / www / csv /
  

Esegui seguente comando sul terminale e modificare questo file usando l'editor gedit aggiungere la directory di file di output.

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

  • ora file potrebbe essere aperto in editor di si prega di aggiungere la vostra directory ci

    / var / www / csv / * rw,

  • Allo stesso modo ho aggiunto nel mio file, come segue data immagine:

entrare descrizione dell'immagine qui

  

Esegui comando successivo ai servizi di riavvio:

sudo /etc/init.d/apparmor restart

  

Ad esempio eseguo seguente query in query builder phpMyAdmin per dati di output in file CSV

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

E 'fatto con successo e scrivere tutte le righe con le colonne selezionate in un file OUTPUT.CSV ...

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

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

Ho appena incontrato lo stesso problema. Il mio problema era la directory che stavo cercando di scaricare in non ha avuto il permesso di scrittura per il processo mysqld. Il dump sql iniziale sarebbe scrivere, ma la scrittura del csv / txt fallirebbe. Sembra che il piste di dump SQL come utente corrente e la conversione a csv / txt viene eseguito come l'utente che esegue mysqld. Così le esigenze di directory scrivono i permessi sia per gli utenti.

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

fornire il percorso completo della directory / dati che si sta tentando di scrivere.

fa Ubuntu uso SELinux? Controllare per vedere se è abilitata e far rispettare. /var/log/audit/audit.log può essere estremamente disponibili (se è lì che Ubuntu lo infila - che è la posizione RHEL / Fedora).

Ho avuto lo stesso problema su un CentOS 6.7 Nel mio caso tutti i permessi sono stati fissati ed ancora l'errore si è verificato. Il problema era che la SE Linux era in modalità "far rispettare".

Sono passato a "permissiva" usando il comando sudo setenforce 0

Poi tutto ha funzionato per me.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top