Impossible de sortir les données MySQL dans un fichier


13

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)

2
Vous devez accorder des droits d'accès à MySQL sur toute l'arborescence de répertoires. Accorder des droits sur inest inutile si MySQL ne peut pas y accéder dotanchoen. En d'autres termes, la boîte de dépôt de sécurité dans le coffre de banque peut être laissée grande ouverte, mais si la porte du coffre de banque est verrouillée, vous n'entrez pas dans la boîte. Votre gsutilisateur doit également disposer du FILEprivilège mysql pour exécuter réellement cette requête.

Le problème est que vous ne disposez peut-être pas de certaines autorisations? Les autorisations Mysql ne sont pas contrôlées par les autorisations de répertoire. Vous devez utiliser mysql -u <username> -p pour fonctionner en tant qu'utilisateur mysql spécifique. Pour donner à l'utilisateur l'accès à une base de données, jetez un œil à la subvention MySql. dev.mysql.com/doc/refman/5.1/en/grant.html

Merci, cet utilisateur dispose d' SELECTautorisations. Je parcours souvent la base de données en tant qu'utilisateur.
dotancohen

Merci, Marc, c'est ce dont j'avais peur. Je ne peux donc pas avoir de dossier "boîte de réception" dans lequel les autres utilisateurs peuvent écrire, sans les laisser lire / écrire dans mon répertoire personnel également?
dotancohen

2
Assurez-vous que l'utilisateur dispose des FILEprivilèges décrits dans les documents MySQL .
Mike Purcell

Réponses:


12

Selon la documentation MySQL sur SELECT ... IN 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 OUTFILEfichier / 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

Merci. J'ai mis à jour la question avec la sortie de SHOW GRANTS. Il semble que l'utilisateur de la base de données devrait disposer des autorisations appropriées.
dotancohen

L'utilisateur de la base de données ne dispose pas des autorisations appropriées. Le privilège FILE est uniquement accordé à un utilisateur avec GRANT ALL PRIVILEGES ON *.*, tout comme RELOADet SHUTDOWN. Il en est ainsi parce que ce sont des privilèges administratifs globaux. Le GRANT ALLprivilège dont vous disposez concerne gsuniquement la base de données.
RolandoMySQLDBA

1

Différentes distributions et différents systèmes d'exploitation ne traitent pas tous de la même manière les destinations des SORTIES.

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 /tmpré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 à travers sedou quelque chose avant de l'écrire dans le fichier.


1

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
Votre méthode est bonne à utiliser lorsque sur la CLI Bash. Cependant, la question de l'OP demande comment générer des données dans un fichier à partir de la CLI du client MySQL.
dotancohen

0

En ce qui concerne les deux méthodes de sortie des 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 y a un risque que les données soient gâchées en raison d'une mauvaise affectation de les données dans les 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 l' --xmloption dans mysqldumppermet 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.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.