MySQL INTO OUTFILE переопределяет существующий файл?

Я написал большой sql-скрипт, который создает CSV-файл. Я хочу каждый день называть cronjob, чтобы создать новый CSV-файл и получить его на веб-сайте.

Скажем, например, я храню свой файл в '/home/sites/example.com/www/files/backup.csv'

и мой SQL

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

MySQL дает мне ошибку, когда файл уже существует

Файл '/home/sites/example.com/www/files/backup.csv' уже существует

Есть ли способ заставить MySQL перезаписать файл?

Я мог бы PHP обнаружить, если файл существует и удалить его, прежде чем создавать его снова, но было бы более кратким, если я могу сделать это непосредственно в MySQL.

Нет, нет возможности перезаписать его. Из документов :

file_name не может быть существующим файлом, который, среди прочего, предотвращает уничтожение файлов, таких как / etc / passwd и таблицы базы данных.

Возможно, было бы лучше использовать различное имя файла каждую ночь, так как наличие нескольких резервных копий означает, что вы можете оправиться от проблем, которые существовали более одного дня. Затем вы можете сохранить символическую ссылку, которая всегда указывает на последнюю полную версию csv.

Почему не rm -f /home/sites/example.com/www/files/backup.csv в скрипте, выполняемом cron?

Вы можете запустить это изнутри mysql. Просто бегите к оболочке с помощью \! Например:

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

Для такой работы я бы поместил ее в файл bash, удалив файл

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

Лучший вариант – фактически добавить временную метку. Дисковое пространство в этот день и возраст не дорого.

Выхода нет.

Только одна возможная процедура может быть выполнена с помощью динамического оператора.

 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; 

Вид датированного вопроса, но, надеюсь, это поможет кому-то.

Просто выйдите из командной оболочки из mysql и выполните команду rm, чтобы удалить файл, прежде чем пытаться его написать. Например:

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

Наслаждайтесь!

3 шага, чтобы сделать это правильно. Ваша резервная копия будет выполняться каждую ночь, пока вы спите (или нет)

ШАГ 1. Создайте хранимую процедуру для вашего 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 ( .... 

ШАГ 2. Создайте сценарий «/home/backupCSV.sh», чтобы удалить старый файл и вызвать хранимую процедуру.

 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 " 

ШАГ 3: обновить Crontab для ежедневного выполнения сценария

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

ШАГ 4 (optionnal): спасибо мне;)