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)
mysql
linux
permissions
dotancohen
la source
la source
in
est inutile si MySQL ne peut pas y accéderdotanchoen
. 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. Votregs
utilisateur doit également disposer duFILE
privilège mysql pour exécuter réellement cette requête.SELECT
autorisations. Je parcours souvent la base de données en tant qu'utilisateur.FILE
privilèges décrits dans les documents MySQL .Réponses:
Selon la documentation MySQL sur SELECT ... IN OUTFILE
Vous devez sortir le
SELECT INTO OUTFILE
fichier / var / lib / mysql comme suitBien 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
MÉTHODE # 2
MISE À JOUR 2012-05-01 07:09 EDT
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
la source
SHOW GRANTS
. Il semble que l'utilisateur de la base de données devrait disposer des autorisations appropriées.GRANT ALL PRIVILEGES ON *.*
, tout commeRELOAD
etSHUTDOWN
. Il en est ainsi parce que ce sont des privilèges administratifs globaux. LeGRANT ALL
privilège dont vous disposez concernegs
uniquement la base de données.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
/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. .
La sortie de ceci est délimitée par des tabulations par défaut. Pour les virgules, il suffit de le passer à travers
sed
ou quelque chose avant de l'écrire dans le fichier.la source
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
la source
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'
--xml
option dansmysqldump
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.la source