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


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

Скажем, например, я храню свой файл в "/главная/сайты/пример.com/www/файлы/резервное копирование.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 выдает мне ошибку, когда файл уже существует

Файл '/главная/сайты/пример.com/www/файлы/резервное копирование.csv' уже существует

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

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

Author: Cœur, 2009-06-07

7 answers

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

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

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

 49
Author: brian-brazil, 2009-06-06 22:15:45

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

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

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

 7
Author: Flavius Stef, 2017-06-26 22:08:36

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

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

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

 3
Author: user118659, 2009-06-06 22:25:10

Нет никакого способа.

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

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; 
 2
Author: mani, 2015-12-09 13:23:23

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 (опция): спасибо мне;)

 1
Author: Benjamin SAVIGNAC, 2015-09-23 16:30:29

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

Mysql> \\! rm -f /home/sites/example.com/www/files/backup.csv
 0
Author: WxWizard, 2018-06-21 15:27:19

Старый вопрос.. но есть опция ПЕРЕЗАПИСИ, которую вы можете добавить в инструкцию

SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n' OVERWRITE ON
...
 0
Author: da Bich, 2018-07-23 13:19:32