web-dev-qa-db-fra.com

Impossible de sortir les données MySQL dans un fichier

J'essaie de sortir les données d'une table MySQL dans un fichier mais j'obtiens des erreurs d'autorisation:

$ 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>

Si le répertoire en question est modifié en 777, alors pourquoi l'utilisateur MySQL ne peut-il pas écrire le fichier? Chose intéressante, je ne peux pas non plus écrire dans/tmp /.

EDIT: Il semble que l'utilisateur de la base de données dispose des autorisations MySQL appropriées:

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)
13
dotancohen

Selon la documentation MySQL sur SELECT ... INTO OUTFILE

Tout fichier créé par INTO OUTFILE ou INTO DUMPFILE est accessible en écriture par tous les utilisateurs sur l'hôte du serveur. La raison en est que le serveur MySQL ne peut pas créer un fichier appartenant à une personne autre que l'utilisateur sous le compte duquel il s'exécute. (Vous ne devez jamais exécuter mysqld en tant que root pour cela et pour d'autres raisons.) Le fichier doit donc être accessible en écriture pour que vous puissiez manipuler son contenu.

Vous devez sortir le SELECT INTO OUTFILE vers/var/lib/mysql comme suit

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

Bien sûr, vous devez vous assurer que vous avez l'autorisation FILE sur gs @ localhost.

Il existe deux façons d'obtenir cette autorisation

MÉTHODE # 1

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

MÉTHODE # 2

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

MISE À JOUR 2012-05-01 07:09 EDT

Pour vous accorder le privilège FILE, procédez comme suit:

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

Différentes distributions et OS ne gèrent pas tous les destinations pour OUTFILEs de la même manière.

Par exemple, lors de l'exécution d'un démon mysqld sur Linux, qui utilise un socket, le OUTFILE est parfois écrit dans le /tmp répertoire. Ce n'est pas grave, c'est juste que l'utilisation de l'approche OUTFILE a des défauts, à savoir le traitement des autorisations et la recherche de l'emplacement du fichier.

Étant donné que le but de cette question n'est pas spécifiquement "Comment utiliser un OUTFILE", mais que vous cherchez simplement à capturer des données MySQL dans un fichier, voici une alternative qui ne vous oblige pas à tourner autour avec les autorisations FILE, etc. .

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

La sortie de ceci est délimitée par des tabulations par défaut. Pour les virgules, il suffit de le passer par sed ou quelque chose avant de l'écrire dans le fichier.

1
AaronDanielson

J'ai passé des heures à essayer de comprendre les suggestions de cette page et de nombreuses autres pages de StackOverflow.

Peu importe comment j'ai changé les autorisations dans MySql, je n'ai rien pu faire fonctionner.

Je suis revenu aux autorisations avec lesquelles j'avais commencé.

En fin de compte, ce qui a fonctionné pour moi était plus simple que les suggestions des autres:

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

1
Ryan

En ce qui concerne les deux méthodes de sortie de données vers CSV (qui devraient être TSV) mentionnées ci-dessus, j'ai constaté que s'il y a des valeurs vides dans les entrées que vous exportez, il existe un risque que les données soient gâchées en raison d'une mauvaise affectation des données aux colonnes correspondantes.

Avec un souci d'intégrité des données pour la récupération, j'ai trouvé ce site Web:

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

Il a mentionné que --xml option dans mysqldump permet d'exporter les données au format XML qui pourrait ensuite être analysé par un script personnalisé dans n'importe quel format nécessaire, y compris TSV.

0
Nguyen H Chan