Question

MySQL est génial! Je suis actuellement impliqué dans une migration de serveur majeur et précédemment, notre petite base de données utilisée pour être hébergé sur le même serveur que le client.
Nous avons donc l'habitude de faire ceci: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

Maintenant, nous avons déplacé la base de données vers un autre serveur et SELECT * INTO OUTFILE .... ne fonctionne plus, compréhensible - des raisons de sécurité, je crois. Mais, fait 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 suis exprimais dégoût vers MySQL. L'alternative à ajouter que 2 lignes de code supplémentaire et un appel système forme un script .sql. Tout ce que je voulais savoir pourquoi fonctionne LOAD DATA LOCAL INFILE et pourquoi est-il pas une telle chose comme SELECT INTO OUTFILE LOCAL?

Je faisais mes devoirs, ne pouvait pas trouver une réponse directe à mes questions ci-dessus. Je ne pouvais pas trouver une demande de fonctionnalité soit @ MySQL. Si quelqu'un peut effacer ça, qui avait génial!

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

Était-ce utile?

La solution

Dans le manuel: instruction The SELECT ... INTO OUTFILE vise avant tout à vous laisser vider très rapidement une table dans un fichier texte sur la machine serveur. Si vous voulez créer le fichier sur une 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 / fr / select.html

Exemple Un:

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

Autres conseils

Vous pouvez obtenir ce que vous voulez avec la console de MySQL avec l'option -s (--silent) transmise.

Il est probablement une bonne idée de passer aussi dans l'option -r (--raw) de sorte que les caractères spéciaux ne sont pas échappés. Vous pouvez l'utiliser pour les requêtes de pipe comme vous veulent.

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

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

Le chemin que vous donnez à LOAD DATA INFILE est le système de fichiers sur la machine où le serveur est en cours d'exécution, pas la machine que vous connectez à partir. LOAD DATA LOCAL INFILE est pour la machine du client, mais il faut que le serveur a démarré avec les bons réglages, sinon ce n'est pas permis. Vous pouvez lire tout ici: http: // dev .mysql.com / doc / refman / 5.0 / fr / chargement-data-local.html

En ce qui concerne SELECT INTO OUTFILE Je ne sais pas pourquoi il n'y a pas une version locale, en plus d'être probablement ce difficile à faire sur la connexion. Vous pouvez obtenir les mêmes fonctionnalités grâce à l'outil mysqldump, mais pas par l'envoi de SQL au serveur.

En utilisant MySQL CLI avec l'option -e comme Waverly360 suggère est un bon, mais qui pourrait sortir de la mémoire et se faire tuer sur de grands résultats. (Havent trouver la raison derrière elle). 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

Re: SELECT * INTO OUTFILE

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

Depuis que je me trouve plutôt régulièrement ce regardant problème exact (dans l'espoir d'avoir manqué quelque chose avant ...), je me suis finalement décidé de prendre le temps et écrire un petit point essentiel aux requêtes MySQL à l'exportation sous forme de fichiers CSV , un peu comme https: //stackoverflow.com/a/28168869 mais basé sur PHP et avec deux autres options. Cela était important pour mon cas d'utilisation, parce que je dois être en mesure d'affiner les paramètres CSV (delimiter, gestion de la valeur NULL) et les fichiers doivent être réellement valides CSV, de sorte qu'un CONCAT de simple ne suffit pas, car il n » t générer des fichiers CSV valides si les valeurs contiennent des sauts de ligne ou le délimiteur CSV.

Attention: Nécessite PHP être installé sur le serveur (Peut être vérifié par php -v)

"Install" mysql2csv via

wget https://gist.githubusercontent.com/paslandau/37bf787eab1b84fc7ae679d1823cf401/raw/29a48bb0a43f6750858e1ddec054d3552f3cbc45/mysql2csv -O mysql2csv -q && (sha256sum mysql2csv | cmp <(echo "b109535b29733bd596ecc8608e008732e617e97906f119c66dd7cf6ab2865a65  mysql2csv") || (echo "ERROR comparing hash, Found:" ;sha256sum mysql2csv) ) && chmod +x mysql2csv

(le contenu de téléchargement de l'essence, la somme de contrôle de vérification et de le rendre exécutable)

Exemple d'utilisation

./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

génère un fichier /tmp/result.csv avec le contenu

foo,bar
1,2

Aide pour référence

./mysql2csv --help
Helper command to export data for an arbitrary mysql query into a CSV file.
Especially helpful if the use of "SELECT ... INTO OUTFILE" is not an option, e.g.
because the mysql server is running on a remote host.

Usage example:
./mysql2csv --file="/tmp/result.csv" --query='SELECT 1 as foo, 2 as bar;' --user="username" --password="password"

cat /tmp/result.csv

Options:
        -q,--query=name [required]
                The query string to extract data from mysql.
        -h,--host=name
                (Default: 127.0.0.1) The hostname of the mysql server.
        -D,--database=name
                The default database.
        -P,--port=name
                (Default: 3306) The port of the mysql server.
        -u,--user=name
                The username to connect to the mysql server.
        -p,--password=name
                The password to connect to the mysql server.
        -F,--file=name
                (Default: php://stdout) The filename to export the query result to ('php://stdout' prints to console).
        -L,--delimiter=name
                (Default: ,) The CSV delimiter.
        -C,--enclosure=name
                (Default: ") The CSV enclosure (that is used to enclose values that contain special characters).
        -E,--escape=name
                (Default: \) The CSV escape character.
        -N,--null=name
                (Default: \N) The value that is used to replace NULL values in the CSV file.
        -H,--header=name
                (Default: 1) If '0', the resulting CSV file does not contain headers.
        --help
                Prints the help for this command.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top