J'essaie de vider le contenu d'une table dans un fichier csv en utilisant une instruction MySQL SELECT INTO OUTFILE. Si je fais:
SELECT column1, column2
INTO OUTFILE 'outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
outfile.csv sera créé sur le serveur dans le même répertoire dans lequel les fichiers de cette base de données sont stockés.
Cependant, lorsque je change ma requête en:
SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;
Je reçois:
ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)
Errcode 13 est une erreur d'autorisations, mais je l'obtiens même si je change la propriété de / data en mysql: mysql et lui donne des autorisations 777. MySQL fonctionne en tant qu'utilisateur "mysql".
Étrangement, je peux créer le fichier dans / tmp, mais pas dans un autre répertoire que j'ai essayé, même avec des autorisations définies de sorte que l'utilisateur mysql puisse écrire dans le répertoire.
Il s'agit de MySQL 5.0.75 fonctionnant sous Ubuntu.
la source
/tmp
.Réponses:
De quelle version particulière d'Ubuntu s'agit-il et s'agit-il d'Ubuntu Server Edition?
Les éditions récentes d'Ubuntu Server (telles que 10.04) fournies avec AppArmor et le profil de MySQL peuvent être en mode d'application par défaut. Vous pouvez vérifier cela en exécutant
sudo aa-status
comme suit:Si mysqld est inclus en mode enforce, alors c'est probablement celui qui refuse l'écriture. Les entrées seraient également écrites
/var/log/messages
lorsque AppArmor bloque les écritures / accès. Ce que vous pouvez faire est de modifier/etc/apparmor.d/usr.sbin.mysqld
et d'ajouter/data/
et/data/*
près du bas comme ceci:Et puis faites AppArmor recharger les profils.
AVERTISSEMENT: le changement ci-dessus permettra à MySQL de lire et d'écrire dans le répertoire / data. Nous espérons que vous avez déjà pris en compte les implications en matière de sécurité.
la source
/your/abs/folder/ r, /your/abs/folder/** rwk, }
n'oubliez pas d'inclure la virgule à la fin!Ubuntu utilise AppArmor et c'est ce qui vous empêche d'accéder à / data /. Fedora utilise selinux et cela empêcherait cela sur une machine RHEL / Fedora / CentOS.
Pour modifier AppArmor pour permettre à MySQL d'accéder à / data /, procédez comme suit:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
ajoutez cette ligne n'importe où dans la liste des répertoires:
/data/ rw,
puis faites un:
sudo /etc/init.d/apparmor restart
Une autre option consiste à désactiver complètement AppArmor pour mysql, ce n'est PAS RECOMMANDÉ :
sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/
N'oubliez pas de redémarrer apparmor:
sudo /etc/init.d/apparmor restart
la source
Je sais que vous avez dit que vous avez déjà essayé de définir les autorisations sur 777, mais comme j'ai la preuve que pour moi, c'était un problème d'autorisation, je poste ce que je lance exactement en espérant que cela puisse aider. Voici mon expérience:
la source
MySQL devient stupide ici. Il essaie de créer des fichiers sous / tmp / data / .... Donc ce que vous pouvez faire est ce qui suit:
Ensuite, essayez votre requête. Cela a fonctionné pour moi après des heures de débogage du problème.
la source
Ce problème me dérange depuis longtemps. J'ai remarqué que cette discussion ne précise pas la solution sur RHEL / Fecora. J'utilise RHEL et je ne trouve pas les fichiers de configuration correspondant à AppArmer sur Ubuntu, mais j'ai résolu mon problème en rendant TOUS les répertoires du répertoire PATH lisibles et accessibles par mysql. Par exemple, si vous créez un répertoire / tmp, les deux commandes suivantes permettent à SELECT INTO OUTFILE de sortir le fichier .sql ET .sql
Si vous créez un répertoire dans votre répertoire personnel / home / tom, vous devez le faire pour / home et / home / tom.
la source
chown mysql:mysql
résoudre mon problèmeTu peux le faire :
la source
Quelques choses à essayer:
secure_file_priv
variable système est-elle définie? Si tel est le cas, tous les fichiers doivent être écrits dans ce répertoire.la source
J'ai le même problème et j'ai résolu ce problème en suivant les étapes:
sudo gedit /etc/apparmor.d/usr.sbin.mysqld
maintenant le fichier serait ouvert dans l'éditeur, veuillez y ajouter votre répertoire
/ var / www / csv / * rw,
de même, j'ai ajouté dans mon fichier, comme suit l'image donnée:
sudo /etc/init.d/apparmor redémarrer
Il a réussi et a écrit toutes les lignes avec les colonnes sélectionnées dans le fichier OUTPUT.csv ...
la source
Dans mon cas, la solution était de rendre tous les répertoires du chemin d'accès lisibles et accessibles par
mysql
(chmod a+rx
). Le répertoire était toujours spécifié par son chemin relatif dans la ligne de commande.la source
Je viens de rencontrer ce même problème. Mon problème était que le répertoire dans lequel j'essayais de vider n'avait pas l'autorisation d'écriture pour le processus mysqld. Le vidage SQL initial écrirait mais l'écriture du fichier csv / txt échouerait. On dirait que le vidage sql s'exécute en tant qu'utilisateur actuel et la conversion en csv / txt est exécutée en tant qu'utilisateur qui exécute mysqld. Le répertoire a donc besoin d'autorisations d'écriture pour les deux utilisateurs.
la source
Vous devez fournir un chemin absolu, pas un chemin relatif.
Indiquez le chemin complet du répertoire / data dans lequel vous essayez d'écrire.
la source
touch /data/outfile.csv
su --shell=/bin/sh nameofaccount
Ubuntu utilise-t-il SELinux? Vérifiez s'il est activé et en vigueur. /var/log/audit/audit.log peut être utile (si c'est là que Ubuntu le colle - c'est l'emplacement RHEL / Fedora).
la source
J'ai eu le même problème sur un CentOs 6.7 Dans mon cas, toutes les autorisations ont été définies et l'erreur s'est toujours produite. Le problème était que le SE Linux était dans le mode "enforcing".
Je l'ai commuté sur "permissif" en utilisant la commande
sudo setenforce 0
Puis tout a fonctionné pour moi.
la source