Question

Je suis en train de vider le contenu d'une table dans un fichier csv en utilisant une instruction SELECT INTO MySQL 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 des fichiers de cette base de données sont stockés dans.

Cependant, quand je change ma requête à:

SELECT column1, column2
INTO OUTFILE '/data/outfile.csv'
FIELDS TERMINATED BY ','
FROM table_name;

J'obtenir:

ERROR 1 (HY000): Can't create/write to file '/data/outfile.csv' (Errcode: 13)

Errcode 13 est une erreur d'autorisation, mais je reçois encore si je change la propriété des données / mysql: mysql et donner 777 autorisations. MySQL est en cours d'exécution en tant qu'utilisateur "mysql".

Bizarrement, je peux créer le fichier dans / tmp, mais pas dans un autre répertoire que je l'ai essayé, même avec des autorisations telles que définies mysql utilisateur doit être en mesure d'écrire dans le répertoire.

est MySQL 5.0.75 fonctionnant sur Ubuntu.

Était-ce utile?

La solution

Quelle version particulière d'Ubuntu est-ce et est-ce Ubuntu Server Edition?

Editions récentes Ubuntu Server (tels que 10,04) navire avec le profil de AppArmor et MySQL pourraient être en mode application par défaut. Vous pouvez vérifier cela en exécutant sudo aa-status comme ceci:

# sudo aa-status
5 profiles are loaded.
5 profiles are in enforce mode.
   /usr/lib/connman/scripts/dhclient-script
   /sbin/dhclient3
   /usr/sbin/tcpdump
   /usr/lib/NetworkManager/nm-dhcp-client.action
   /usr/sbin/mysqld
0 profiles are in complain mode.
1 processes have profiles defined.
1 processes are in enforce mode :
   /usr/sbin/mysqld (1089)
0 processes are in complain mode.

Si mysqld est inclus dans l'application en mode, il est celui nier probablement l'écriture. Les inscriptions seraient également écrites en /var/log/messages lorsque des blocs AppArmor les ecritures / accès. Ce que vous pouvez faire est de modifier /etc/apparmor.d/usr.sbin.mysqld et /data/ add et /data/* près du fond comme ceci:

...  
/usr/sbin/mysqld  {  
    ...  
    /var/log/mysql/ r,  
    /var/log/mysql/* rw,  
    /var/run/mysqld/mysqld.pid w,  
    /var/run/mysqld/mysqld.sock w,  
    **/data/ r,  
    /data/* rw,**  
}

Et puis faire AppArmor reload les profils.

# sudo /etc/init.d/apparmor reload

AVERTISSEMENT: le changement ci-dessus permettra MySQL à lire et à écrire dans le répertoire de données /. Nous espérons que vous avez déjà examiné les implications de cette sécurité.

Autres conseils

Ubuntu utilise AppArmor et qui est ce qui est vous empêcher d'accéder à / data /. Fedora utilise SELinux et qui empêcherait cela sur une machine RHEL / Fedora / CentOS.

Pour modifier AppArmor pour permettre à MySQL d'accès / données / faire le suivi:

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

ajouter ce n'importe où la ligne dans la liste des répertoires:

/data/ rw,

puis faire:

sudo /etc/init.d/apparmor restart

Une autre option est de désactiver AppArmor pour mysql tout à fait, cela est DECONSEILLE :

sudo mv /etc/apparmor.d/usr.sbin.mysqld /etc/apparmor.d/disable/

Ne pas oublier de redémarrer AppArmor:

sudo /etc/init.d/apparmor restart

Je sais que vous avez dit que vous avez essayé déjà mise des autorisations à 777, mais comme je l'ai une preuve que ce fut pour moi une question de permission je poste ce que je exactement courir en espérant qu'il peut aider. Voici mon expérience:

tmp $ pwd
/Users/username/tmp
tmp $ mkdir bkptest
tmp $ mysqldump -u root -T bkptest bkptest
mysqldump: Got error: 1: Can't create/write to file '/Users/username/tmp/bkptest/people.txt' (Errcode: 13) when executing 'SELECT INTO OUTFILE'
tmp $ chmod a+rwx bkptest/
tmp $ mysqldump -u root -T bkptest bkptest
tmp $ ls bkptest/
people.sql  people.txt
tmp $ 

MySQL devient stupide ici. Il essaie de créer des fichiers sous / tmp / data / .... Donc ce que vous pouvez faire est le suivant:

mkdir /tmp/data
mount --bind /data /tmp/data

Ensuite, essayez votre requête. Cela a fonctionné pour moi après des heures de débogage la question.

Ce problème me préoccupe depuis longtemps. J'ai remarqué que cette discussion ne pointe pas la solution sur RHEL / Fecora. J'utilise RHEL et je ne trouve pas les fichiers de configuration correspondant à AppArmer sur Ubuntu, mais je résolu mon problème en faisant chaque répertoire dans le PATH lisible répertoire et accessible par MySQL. Par exemple, si vous créez un répertoire / tmp, les deux commandes suivantes font SELECT INTO OUTFILE capable de sortir le sql et le fichier sql

chown mysql:mysql /tmp
chmod a+rx /tmp

Si vous créez un répertoire dans votre répertoire / home / tom, vous devez le faire pour les deux / home et / home / tom.

Vous pouvez faire ceci:

mysql -u USERNAME --password=PASSWORD --database=DATABASE --execute='SELECT `FIELD`, `FIELD` FROM `TABLE` LIMIT 0, 10000 ' -X > file.xml

Quelques choses à essayer:

  • est le jeu de variable système secure_file_priv? Dans ce cas, tous les fichiers doivent être écrits dans ce répertoire.
  • assurez-vous que le fichier n'existe pas -. MySQL ne créer de nouveaux fichiers, et pas les Ecraser

J'ai même problème et je résolu ce problème en suivant les étapes:

  • Système d'exploitation: ubuntu 12.04
  • lampe installée
  • supposons que votre répertoire pour enregistrer le fichier de sortie est: / var / www / csv /
  

Exécuter la commande suivante sur le terminal et modifier ce fichier en utilisant l'éditeur de gedit pour ajouter votre répertoire pour le fichier de sortie.

sudo gedit /etc/apparmor.d/usr.sbin.mysqld

  • fichier sera ouvert dans l'éditeur s'il vous plaît ajouter votre répertoire il y a

    / var / www / csv / * rw,

  • De même, j'ai ajouté dans mon dossier, comme l'image suivante donnée:

  

Exécuter la commande suivante pour redémarrer les services:

sudo /etc/init.d/apparmor restart

  

Par exemple, j'exécuter la requête suivante dans le constructeur de requête phpmyadmin aux données de sortie dans un fichier csv

SELECT colName1, colName2,colName3
INTO OUTFILE '/var/www/csv/OUTFILE.csv'
FIELDS TERMINATED BY ','
FROM tableName;

Il fait avec succès et d'écrire toutes les lignes avec les colonnes sélectionnées dans le fichier output.csv ...

Dans mon cas, la solution était de faire tous les répertoires dans le chemin du répertoire lisible et accessible par mysql (chmod a+rx). Le répertoire est toujours spécifié par son chemin par rapport à la ligne de commande.

chmod a+rx /tmp
chmod a+rx /tmp/migration
etc.

Je viens de croiser ce même problème. Ma question était le répertoire que je cherchais à jeter dans ne pas l'autorisation d'écriture pour le processus mysqld. La décharge sql initiale serait écrire, mais l'écriture du csv / txt échouerait. On dirait que les pistes de vidage SQL en tant que l'utilisateur en cours et la conversion en csv / txt est exécuté en tant que l'utilisateur qui exécute mysqld. Ainsi, les besoins d'annuaire autorisations d'écriture pour les utilisateurs.

Vous devez fournir un chemin absolu, pas un chemin relatif.

Fournir le chemin complet vers le répertoire de données / que vous essayez d'écrire.

Ubuntu utilise-t-SELinux? Vérifiez si elle est activée et l'application. /var/log/audit/audit.log peut être helpul (si c'est où Ubuntu bâtons - c'est l'emplacement RHEL / Fedora).

J'ai eu le même problème sur un CentOS 6.7 Dans mon cas, toutes les autorisations ont été définies et toujours l'erreur survenue. Le problème est que le SE Linux était en mode « exécution ».

Je l'ai passé à "permissive" en utilisant la commande sudo setenforce 0

Alors tout a fonctionné pour moi.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top