2010-05-19 9 views
31

MySQL est génial! Je suis actuellement impliqué dans une migration de serveur majeure et auparavant, notre petite base de données était hébergée sur le même serveur que le client.
Donc, nous avions l'habitude de le faire:MySQL - SÉLECTIONNER * OUTFILE LOCAL?

Maintenant, nous avons déplacé la base de données à un serveur différent et SELECT * INTO OUTFILE .... ne fonctionne plus, compréhensible - raisons de sécurité je crois. Mais, intéressant LOAD DATA INFILE .... peut être changé en LOAD DATA LOCAL INFILE .... et bam, cela fonctionne.

Je ne me plains pas et je ne déteste pas non plus envers MySQL. L'alternative à cela ajouté 2 lignes de code supplémentaire et un appel système forment un script .sql. Tout ce que je voulais savoir, c'est pourquoi fonctionne LOAD DATA LOCAL INFILE et pourquoi n'y a-t-il pas une telle chose comme SELECT INTO OUTFILE LOCAL?

J'ai fait mes devoirs, je n'ai pas trouvé de réponse directe à mes questions ci-dessus. Je n'ai pas trouvé de requête de fonctionnalité @ MySQL non plus. Si quelqu'un peut éclaircir ça, ça a été génial!

MariaDB est-il capable de gérer ce problème?

+0

Il existe une alternative qui consiste à utiliser la commande de départ qui vous permet de vous connecter l'entrée et la sortie de MySQL à un fichier séparé du côté client, mais cela enregistre la session mysql entière, plutôt que de sortir le contenu de la requête select, et il n'y a pas d'options de formatage comme la sortie au format CSV. – CMCDragonkai

Répondre

43

A partir du manuel: The SELECT ... INTO OUTFILE instruction est principalement destiné à vous permettre de vider très rapidement une table dans un fichier texte sur la machine serveur. Si vous souhaitez créer le fichier résultant sur un hôte client autre que l'hôte du serveur, vous ne pouvez pas utiliser SELECT ... INTO OUTFILE. Dans ce cas, vous devriez plutôt utiliser une commande comme mysql -e "SELECT ..." > file_name pour générer le fichier sur l'hôte client «

http://dev.mysql.com/doc/refman/5.0/en/select.html

Un exemple:.

mysql -h my.db.com -u usrname--password=pass db_name -e 'SELECT foo FROM bar' > /tmp/myfile.txt 
2

Re: SELECT * INTO OUTFILE

Vérifiez si MySQL dispose des autorisations pour écrire un fichier dans le répertoire OUTFILE sur le serveur.

+0

Le fichier OUTFILE doit écrire sur le serveur du client, ce qui est différent du serveur sur lequel la base de données est hébergée. – ThinkCode

+3

Les documents MySQL (http://dev.mysql.com/doc/refman/5.0/en/select.html) définissent l'emplacement de OUTFILE. Il indique: "Le fichier est créé sur l'hôte du serveur, vous devez donc avoir le privilège FILE pour utiliser cette syntaxe nom_fichier ne peut pas être un fichier existant, ce qui empêche notamment les fichiers/etc/passwd et les tables de base de données détruit. " Donc, je voudrais vérifier si MySQL a les autorisations pour écrire un fichier dans le répertoire OUTFILE sur le serveur. Je ne sais pas pourquoi il n'y a pas de version "LOCAL OUTFILE". Si vous avez besoin d'exporter localement une option que beaucoup de gens utilisent est phpMyAdmin. – Snowcrash

+0

Vous venez de me sauver un message peu clair. – octopusgrabbus

5

Le chemin que vous attribuez à LOAD DATA INFILE correspond au système de fichiers de la machine sur laquelle le serveur est en cours d'exécution, et non à la machine à partir de laquelle vous vous connectez. LOAD DATA LOCAL INFILE est pour la machine du client, mais il faut que le serveur ait été démarré avec les bons paramètres, sinon ce n'est pas autorisé. Vous pouvez lire tout à ce sujet ici: http://dev.mysql.com/doc/refman/5.0/en/load-data-local.html

Comme pour SELECT INTO OUTFILE Je ne suis pas sûr pourquoi il n'y a pas une version locale, en plus d'être difficile à faire sur la connexion. Vous pouvez obtenir la même fonctionnalité via l'outil mysqldump, mais pas via l'envoi de SQL au serveur.

+1

CHARGER LES DONNÉES fonctionne correctement, mais si le fichier est déposé sur le serveur hébergeant la base de données, il n'est pas possible de vider le fichier sur le client qui se trouve sur un autre serveur. – ThinkCode

+1

L'option mysqldump et mysql -e swtich n'atteint pas le résultat escompté. mysqldump vide l'ensemble db/table et nous ne pouvons pas sauvegarder seulement quelques colonnes basées sur une condition. mysql -e swtich sauve le fichier au format .txt et la sortie du tuyau ne peut pas être atteint. – ThinkCode

5

Vous pouvez obtenir ce que vous voulez avec le console mysql avec l'option -s (--silent) passée.

C'est probablement une bonne idée de passer aussi l'option -r (--raw) pour que les caractères spéciaux ne soient pas échappés. ceci pour canaliser les requêtes comme si vous étiez wanti ng

mysql -u nom d'utilisateur le nom d'hôte -h -p -s -r -e « select concat ('this', » », 'fonctionne') »

EDIT: Aussi, si vous souhaitez supprimer la colonne nom de votre sortie, il suffit d'ajouter un autre -s (mysql -ss -r etc.)

2

L'utilisation de mysql CLI avec l'option -e comme Waverly360 suggère est un bon, mais cela pourrait sortir de la mémoire et être tué sur une grande résultats.(Le Havent trouve la raison derrière cela) Si tel est le cas, et vous avez besoin tous les dossiers, ma solution est: mysqldump + mysqldump2csv:

wget https://raw.githubusercontent.com/jamesmishra/mysqldump-to-csv/master/mysqldump_to_csv.py 
mysqldump -u username -p --host=hostname database table | python mysqldump_to_csv.py > table.csv