Подтвердить что ты не робот

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

Я написал большой sql script, который создает файл 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.

4b9b3361

Ответ 1

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

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

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

Ответ 2

Почему не rm -f /home/sites/example.com/www/files/backup.csv в script, запущенном cron?

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

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

Ответ 3

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

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

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

Ответ 4

Нет способа.

Только одна возможная процедура с динамической инструкцией.

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; 

Ответ 5

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

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

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

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

Ответ 6

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. Создайте script "/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, чтобы выполнить script каждый день

# m h dom mon dow user  command

 0   3  * * *   root    sh -x /home/backupCSV.sh

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