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)
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;
Pour vous accorder le privilège FILE, procédez comme suit:
service mysql restart --skip-networking --skip-grant-tables
mysql <hit enter>
UPDATE mysql.user SET File_priv = 'Y' WHERE user='gs' AND Host='localhost';
exit
service mysql restart
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.
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
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.