54 votes

MySQL INTO OUTFILE remplace-t-il un fichier existant?

J'ai écrit un gros script sql qui crée un fichier CSV. Je veux appeler une tâche cron chaque nuit pour créer un nouveau fichier CSV et qu'il est disponible sur le site web.

Disons, par exemple, je vais stocker mes fichiers dans " /home/sites/exemple.com/www/fichiers/sauvegarde.csv'

et my SQL est

SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n'
  FROM ( ....

MySQL me donne une erreur si le fichier existe déjà

Le fichier '/home/sites/exemple.com/www/fichiers/sauvegarde.csv " existe déjà

Est-il un moyen de faire de MySQL remplacer le fichier?

Je pourrais avoir PHP détecter si le fichier existe et de le supprimer avant de le créer à nouveau, mais il serait plus succincts, si je peux le faire directement dans MySQL.

60voto

user83591 Points 3857

Non, il n'y a aucun moyen de le remplacer. À partir de la docs:

nom de fichier ne peut pas être un fichier existant, qui, entre autres choses empêche de fichiers comme /etc/passwd et des tables de base de données de la destruction.

Il pourrait être une meilleure idée pour utiliser un nom différent chaque nuit, comme le fait d'avoir plusieurs sauvegardes signifie que vous pouvez récupérer à partir de problèmes qui ont existé pendant plus d'un jour. Vous pouvez ensuite conserver un lien symbolique qui pointe toujours à la dernière complète csv.

9voto

Flavius Stef Points 7400

Pourquoi ne pas rm -f /home/sites/example.com/www/files/backup.csv dans le script exécuté par cron?

Vous pouvez l'exécuter depuis mysql. Juste échapper à la coquille avec '!' Par exemple:

Mysql> \! rm -f /home/sites/example.com/www/files/backup.csv

3voto

user118659 Points 21

Pour un travail comme celui-ci, je le placerais dans un fichier bash, supprimerais le fichier.

 #!/bin/bash
rm /path/to/backup.csv
./backup_sql_query.sh  <<-- This contains the script to backup to CSV.
 

La meilleure option consiste à ajouter un horodatage. L'espace disque n'est pas cher de nos jours.

3voto

mani Points 21

Il n'y a pas moyen. Un seul possible, vous pouvez procéder avec une déclaration dynamique.

CREATE PROCEDURE export_dynamic (IN nom_fichier car (64)) BEGIN set @myvar = concat ('SELECT * INTO OUTFILE', "'", nom_fichier , "" "," FROM Table1 "); PRÉPAREZ stmt1 FROM @myvar; EXECUTE stmt1; Deallocate prepare stmt1; FIN;

Cordialement, Mani B Pace Automation
Chennai

0voto

WxWizard Points 31

C'est un peu une question périmée, mais j'espère que cela aidera quelqu'un.

Simplement échapper à un shell depuis mysql et exécuter une commande rm pour supprimer le fichier avant de tenter de l'écrire. Par exemple:

Mysql> \! rm -f /home/sites/example.com/www/files/backup.csv

Prendre plaisir!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X