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?
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
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.)
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.
Re: SELECT * INTO OUTFILE
vérifiez si MySQL a les permissions d'écrire un fichier dans le répertoire OUTFILE sur le serveur.
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
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.