MySQL INTO OUTFILE переопределить существующий файл? - PullRequest
50 голосов
/ 07 июня 2009

Я написал большой 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.

Ответы [ 7 ]

53 голосов
/ 07 июня 2009

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

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

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

8 голосов
/ 07 июня 2009

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

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

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

3 голосов
/ 12 мая 2010

Нет пути.

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

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; 
3 голосов
/ 07 июня 2009

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

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

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

2 голосов
/ 23 сентября 2015

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 для ежедневного выполнения скрипта

# m h dom mon dow user  command

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

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

0 голосов
/ 23 июля 2018

старый вопрос .. но есть опция OVERWRITE ON, которую вы можете добавить в утверждение

SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n' OVERWRITE ON
...
0 голосов
/ 18 октября 2011

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

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