Impossibile emettere dati MySQL su file


13

Sto cercando di inviare i dati da una tabella MySQL a un file ma ricevo errori di autorizzazione:

$ pwd
/home/dotancohen
$ mkdir in
$ chmod 777 in/
$ mysql -ugs -p
mysql> USE someDatabase;
mysql> SELECT * FROM data INTO OUTFILE '/home/dotancohen/in/data.csv';
ERROR 1045 (28000): Access denied for user 'gs'@'localhost' (using password: YES)
mysql>

Se la directory in questione è impostata su 777, perché l'utente MySQL non può scrivere il file? È interessante notare che non riesco nemmeno a scrivere in / tmp /.

EDIT: sembra che l'utente DB abbia le autorizzazioni MySQL appropriate:

mysql> show grants;
+----------------------------------------------------------------------------------+
| Grants for gs@localhost                                                          |
+----------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'gs'@'localhost' IDENTIFIED BY PASSWORD 'somePassword'     | 
| GRANT ALL PRIVILEGES ON `gs\_%`.* TO 'gs'@'localhost'                            | 
+----------------------------------------------------------------------------------+
2 rows in set (0.01 sec)

2
Devi concedere i diritti di accesso a MySQL sull'intero albero delle directory. Concedere diritti su inè inutile se MySQL non può accedervi dotanchoen. In altre parole, la cassetta del deposito di sicurezza nel caveau della banca può essere lasciata aperta, ma se la porta del caveau della banca è chiusa, non si entra nella scatola. Il tuo gsutente deve anche avere il FILEprivilegio mysql per eseguire effettivamente quella query.

Il problema è che potresti non avere permessi selezionati? Le autorizzazioni Mysql non sono controllate dalle autorizzazioni della directory. È necessario utilizzare mysql -u <nomeutente> -p per essere eseguito come utente mysql specifico. Per consentire agli utenti l'accesso a un db, dai un'occhiata a MySql grant. dev.mysql.com/doc/refman/5.1/en/grant.html

Grazie, questo utente ha i SELECTpermessi. Naviga spesso nel database come questo utente.
dotancohen,

Grazie, Marc, questo è ciò di cui avevo paura. Quindi non posso avere una cartella "inbox" su cui gli altri utenti possono scrivere, senza lasciarli leggere / scrivere anche sulla mia home directory?
dotancohen,

2
Assicurarsi che l'utente abbia il FILEprivilegio come descritto dai documenti MySQL .
Mike Purcell,

Risposte:


12

Secondo la documentazione MySQL su SELECT ... INTO OUTFILE

Qualsiasi file creato da INTO OUTFILE o INTO DUMPFILE è scrivibile da tutti gli utenti sull'host del server. La ragione di ciò è che il server MySQL non è in grado di creare un file di proprietà di chiunque non sia l'utente nel cui account è in esecuzione. (Non dovresti mai eseguire mysqld come root per questo e altri motivi.) Il file deve quindi essere scrivibile dal mondo in modo da poterne manipolare il contenuto.

Dovresti produrre SELECT INTO OUTFILEin / var / lib / mysql come segue

SELECT * FROM data INTO OUTFILE 'data.csv';

Ovviamente, devi assicurarti di avere l'autorizzazione FILE su gs @ localhost.

Esistono due modi per ottenere questa autorizzazione

METODO # 1

GRANT FILE ON *.* TO 'gs'@'localhost';

METODO # 2

UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
FLUSH PRIVILEGES;

AGGIORNAMENTO 2012-05-01 07:09 EDT

Per concederti il ​​privilegio FILE, procedi come segue:

  • PASSO 01) service mysql restart --skip-networking --skip-grant-tables
  • PASSO 02) mysql <hit enter>
  • PASSO 03) UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND host='localhost';
  • PASSO 04) exit
  • PASSO 05) service mysql restart

Grazie. Ho aggiornato la domanda con l'output di SHOW GRANTS. Sembra che l'utente del DB dovrebbe avere le autorizzazioni appropriate.
dotancohen,

L'utente DB non dispone delle autorizzazioni appropriate. Il privilegio FILE viene concesso solo a un utente con GRANT ALL PRIVILEGES ON *.*, proprio come RELOADe SHUTDOWN. Questo perché quelli sono privilegi amministrativi globali. Il GRANT ALLprivilegio che hai è solo per il gsdatabase.
RolandoMySQLDBA

1

Distribuzioni e sistemi operativi diversi non tutti gestiscono allo stesso modo le destinazioni per OUTFILE.

Ad esempio, quando si esegue un demone mysqld su Linux, che utilizza un socket, OUTFILE a volte viene scritto nella /tmpdirectory. Non è un grosso problema, è solo l'utilizzo dell'approccio OUTFILE ha delle carenze, vale a dire gestire le autorizzazioni e trovare dove è andato il file.

Poiché lo scopo di questa domanda non è specificamente "Come utilizzare un OUTFILE", ma stai solo cercando di acquisire alcuni dati MySQL in un file, ecco un'alternativa che non richiede di cercare con le autorizzazioni FILE, ecc. .

$ (echo 'SELECT * FROM data' | mysql -ugs -p[password])> /home/dotancohen/in/data.csv

L'output di questo è delimitato da tabulazioni per impostazione predefinita. Per le virgole, basta inserirlo sedo qualcosa del genere prima di scriverlo nel file.


1

Ho trascorso ore a cercare di capire i suggerimenti su questa pagina e su molte altre pagine di StackOverflow.

Non importa come ho cambiato le autorizzazioni in MySql, non sono riuscito a far funzionare nulla.

Sono tornato alle autorizzazioni con cui ho iniziato.

In definitiva, ciò che ha funzionato per me è stato più semplice dei suggerimenti degli altri:

echo "select id, emailAddress FROM contacts" | mysql --user=myusername --password mydatabasename > /home/my_output_file.tsv


1
Il metodo è utile quando si utilizza l'interfaccia della riga di comando di Bash. Tuttavia, la domanda nell'OP chiede come inviare i dati in un file dalla CLI del client MySQL.
dotancohen,

0

Per quanto riguarda i due metodi per la trasmissione dei dati al CSV (che dovrebbe essere effettivamente TSV) di cui sopra, ho scoperto che se ci sono valori vuoti nelle voci che stai esportando, c'è il rischio che i dati possano essere incasinati a causa di un'allocazione errata di i dati alle colonne corrispondenti.

Con preoccupazione per l'integrità dei dati per il recupero, ho trovato questo sito Web:

https://www.eversql.com/exporting-mysql-schema-structure-to-xml-using-mysql-clients/

Ha menzionato che l' --xmlopzione mysqldumpconsente di esportare i dati in formato XML che potrebbero essere analizzati da uno script personalizzato in qualsiasi formato necessario, incluso TSV.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.