web-dev-qa-db-fra.com

MySQL - SELECTIONNER * 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 autre serveur et SELECT * INTO OUTFILE .... ne fonctionne plus, ce qui est compréhensible - pour des raisons de sécurité, je crois . Mais, curieusement, LOAD DATA INFILE .... peut être remplacé par LOAD DATA LOCAL INFILE .... et bam, cela fonctionne.

Je ne me plains pas et n’exprime pas mon dégoût envers MySQL. L’alternative à celle ajoutée à 2 lignes de code supplémentaire et un appel système forme un script .SQL. Tout ce que je voulais savoir, c'est pourquoi LOAD DATA LOCAL INFILE fonctionne et pourquoi n'existe-t-il rien de tel que SELECT INTO OUTFILE LOCAL?

J'ai fait mes devoirs, je n'ai pas pu trouver de réponse directe à mes questions ci-dessus. Je ne trouvais pas non plus de demande de fonctionnalité @ MySQL. Si quelqu'un peut éclaircir cela, ce serait génial! 

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

37
ThinkCode

Dans le manuel, l'instruction The SELECT ... INTO OUTFILE est principalement destinée à vous permettre de transférer très rapidement un tableau dans un fichier texte sur le serveur. Si vous souhaitez créer le fichier résultant sur un hôte client autre que l'hôte serveur, vous ne pouvez pas utiliser SELECT ... INTO OUTFILE. Dans ce cas, vous devriez 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
51
jerrygarciuh

Vous pouvez réaliser ce que vous voulez avec la console mysql avec l’option -s (--silent) transmise.

C'est probablement une bonne idée de passer également l'option -r (--raw) afin que les caractères spéciaux ne soient pas échappés. Vous pouvez utiliser ceci pour diriger les requêtes comme vous le souhaitez.

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

EDIT: De plus, si vous voulez supprimer le nom de la colonne de votre sortie, ajoutez simplement un autre -s (mysql -ss -r etc.)

7
Waverly360

Le chemin que vous donnez à LOAD DATA INFILE concerne le système de fichiers de la machine sur laquelle le serveur est en cours d'exécution, pas celui à partir duquel vous vous connectez. LOAD DATA LOCAL INFILE est destiné à la machine du client, mais il nécessite que le serveur ait été démarré avec les bons paramètres, sinon ce n'est pas autorisé. Vous pouvez en savoir plus à ce sujet ici: http://dev.mysql.com/doc/refman/5.0/fr/load-data-local.html

En ce qui concerne SELECT INTO OUTFILE, je ne sais pas pourquoi il n’existe pas de version locale, en outre, il est probablement difficile de le faire par la connexion. Vous pouvez obtenir les mêmes fonctionnalités via l'outil mysqldump, mais pas en envoyant du code SQL au serveur.

5
Theo

Re: SELECT * IN OUT OUT 

Vérifiez si MySQL est autorisé à écrire un fichier dans le répertoire OUTFILE du serveur.

2
Snowcrash

L’utilisation de mysql CLI avec l’option -e, comme le suggère Waverly360, en est un bon, mais cela risque de ne plus avoir suffisamment de mémoire et d’être tué lors de gros résultats. (N'ont pas trouvé la raison derrière cela) . Si c'est le cas et que vous avez besoin de tous les enregistrements, ma solution est la suivante: 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
Vajk Hermecz

Comme je me trouve assez régulièrement à la recherche de ce problème précis (dans l'espoir d'avoir manqué quelque chose avant ...), j'ai finalement décidé de prendre le temps de rédiger un petit Gist pour exporter les requêtes MySQL sous forme de fichiers CSV } , un peu comme https://stackoverflow.com/a/28168869 mais sur la base de PHP et avec quelques options supplémentaires. C’était important pour mon cas d’utilisation, car je devais être en mesure d’affiner les paramètres CSV (délimiteur, traitement de la valeur NULL) ET les fichiers devaient être réellement des CSV valides, de sorte qu’une simple CONCAT ne soit pas suffisante car elle ne le permet pas. t générer des 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'utilisation

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

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

foo,bar
1,2

help for reference

./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
Hirnhamster