txt tabla masiva exportar datos carga php mysql sql into-outfile

php - tabla - MySQL INTO OUTFILE anula el archivo existente?



mysql carga masiva (7)

He escrito una gran secuencia de comandos sql que crea un archivo CSV. Quiero llamar a un cronjob todas las noches para crear un nuevo archivo CSV y tenerlo disponible en el sitio web.

Digamos, por ejemplo, que guardo mi archivo en ''/home/sites/example.com/www/files/backup.csv''

y mi SQL es

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

MySQL me da un error cuando el archivo ya existe

El archivo ''/home/sites/example.com/www/files/backup.csv'' ya existe

¿Hay alguna manera de hacer que MySQL sobrescriba el archivo?

Podría hacer que PHP detectara si el archivo existe y elimínelo antes de volver a crearlo, pero sería más sucinto si lo hago directamente en MySQL.


¿Por qué no rm -f /home/sites/example.com/www/files/backup.csv en el script ejecutado por cron?

Puede ejecutar esto desde dentro de mysql. ¡Solo escapa al caparazón con /! Por ejemplo:

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


3 pasos para hacer esto bien. Su copia de seguridad se ejecutará todas las noches mientras duerme (o no)

PASO 1: crea un procedimiento almacenado para tu SQL

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

PASO 2: Cree una secuencia de comandos "/home/backupCSV.sh" para eliminar el archivo anterior y llamar al procedimiento almacenado

echo "$(date +"%Y-%m-%d %T") START MAINTENANCE SCRIPT " rm /home/sites/example.com/www/files/backup.csv echo "$(date +"%Y-%m-%d %T") SUCCESS >> Old file deleted" mysql --user=[user] --password=[password] [dataBaseName] --execute="CALL backupCSV();" echo "$(date +"%Y-%m-%d %T") SUCCESS >> New file created" echo "$(date +"%Y-%m-%d %T") END MAINTENANCE SCRIPT "

PASO 3: Actualiza Crontab para ejecutar el script todos los días

# m h dom mon dow user command 0 3 * * * root sh -x /home/backupCSV.sh

PASO 4 (opcional): gracias;)


No hay forma.

Solo un posible procedimiento puede con una declaración dinámica.

CREATE PROCEDURE export_dynamic(IN file_name char(64)) BEGIN set @myvar = concat(''SELECT * INTO OUTFILE '',"''",file_name,"''",'' FROM Table1'') ; PREPARE stmt1 FROM @myvar; EXECUTE stmt1; Deallocate prepare stmt1; END;


No, no hay forma de sobrescribirlo. De los docs :

file_name no puede ser un archivo existente, que, entre otras cosas, impide que se destruyan archivos como / etc / passwd y las tablas de la base de datos.

Puede ser una mejor idea usar un nombre de archivo diferente cada noche, ya que tener varias copias de seguridad significa que puede recuperarse de problemas que han existido por más de un día. Luego puede mantener un enlace simbólico que siempre apunte a la última csv completa.


Para un trabajo como este lo colocaría en un archivo bash, borre el archivo

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

La mejor opción es añadir una marca de tiempo. El espacio en disco no es costoso en este día y edad.


Simplemente escapa a un shell desde mysql y ejecuta un comando rm para eliminar el archivo antes de intentar escribirlo. Por ejemplo:

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


vieja pregunta ... pero hay una opción OVERWRITE ON que puede agregar a la declaración

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