MySQL-SELECT * dans OUTFILE LOCAL?

MySQL est génial! Je suis actuellement impliqué dans une importante migration de serveur 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 faire ceci: SELECT * INTO OUTFILE .... LOAD DATA INFILE ....

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

Je ne me plains pas et je n'exprime pas de dégoût envers MySQL. L'alternative à cela a ajouté 2 lignes de code supplémentaire et un appel système de forme a.le script sql. Tout ce que je voulais savoir, c'est pourquoi LOAD DATA LOCAL INFILE fonctionne et pourquoi n'y a-t-il pas de 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 pu trouver une requête de fonctionnalité @ MySQL non plus. Si quelqu'un peut clarifier ça, ça devait être génial!

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

34
demandé sur Up_One 2010-05-19 20:46:16

6 réponses

dans le manuel: The SELECT ... INTO OUTFILE instruction est destiné principalement pour vous permettre très rapidement de vidage d'une table dans un fichier texte sur le serveur de la machine. Si vous voulez créer le fichier résultant sur un autre hôte client que l'hôte serveur, vous ne pouvez pas utiliser SELECT ... INTO OUTFILE . Dans ce cas, vous devez plutôt utiliser une commande telle que 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
47
répondu jerrygarciuh 2013-05-08 07:54:28

vous pouvez réaliser ce que vous voulez avec la console mysql avec l'option-s (--silent) passée.

c'est probablement une bonne idée de passer aussi dans l'option-r (--raw) pour que les personnages spéciaux ne s'échappent pas. Vous pouvez utiliser ceci pour pipe des requêtes comme vous voulez.

mysql -u utilisateur -h hostname-p -s -i-r-e "select concat('ce',' ','marche')"

modifier: aussi, si vous voulez supprimer le nom de la colonne de votre sortie, il suffit d'ajouter un autre -s (mysql-ss-R etc.)

7
répondu Waverly360 2013-03-21 20:18:41

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

comme pour SELECT INTO OUTFILE Je ne sais pas pourquoi il n'y a pas un local version, en plus il est probablement difficile de faire sur la connexion. Vous pouvez obtenir la même fonctionnalité avec l'outil mysqldump , mais pas en envoyant SQL au serveur.

5
répondu Theo 2010-05-19 17:19:53

Re: SELECT * INTO OUTFILE

vérifiez si MySQL a les permissions d'écrire un fichier dans le répertoire OUTFILE sur le serveur.

2
répondu Snowcrash 2010-05-19 17:15:57

utilisant mysql CLI avec-E option comme Waverly360 suggère est une bonne, mais qui pourrait sortir de la mémoire et se faire tuer sur de grands résultats. (Nai pas trouver la raison derrière elle). Si c'est le cas, et que vous avez besoin de tous les enregistrements, 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
2
répondu Vajk Hermecz 2015-01-27 10:59:30

puisque je me retrouve plutôt régulièrement à la recherche de ce problème précis (dans l'espoir que j'ai manqué quelque chose auparavant...), J'ai finalement décidé de prendre le temps et d'écrire un petit gist pour exporter des requêtes MySQL comme les fichiers CSV , un peu comme https://stackoverflow.com/a/28168869 mais basé sur PHP et avec quelques options supplémentaires. C'était important pour mon cas d'utilisation, parce que j'ai besoin de pouvoir affiner les paramètres CSV (délimiteur, valeur nulle traitement) et les fichiers doivent être en fait valides CSV, de sorte qu'un simple CONCAT n'est pas suffisant car il ne génère pas de fichiers CSV valides si les valeurs contiennent des sauts de ligne ou le délimiteur CSV.

attention: nécessite L'installation de PHP sur le serveur! (Peut être vérifié via php -v )

"Installer 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

(télécharger le contenu du gist, vérifier la somme de contrôle et le rendre exécutable)

exemple d'Usage

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

génère fichier /tmp/result.csv avec 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.
0
répondu Hirnhamster 2018-05-16 11:33:06