2009-06-06 2 views
44

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

Скажем, например, я храню файл в '' /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.

ответ

47

Нет, нет никакого способа, чтобы перезаписать его. Из docs:

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

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

+0

ура, думал, что я не смогу. хорошо. Его не совсем резервная копия - это больше доступная для пользователя резервная копия. Резервные копии выполняются отдельно. Тем не менее, пища для размышлений. –

+0

Вы проверили инструмент linux * logrotate *? – Konerak

7

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

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

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

+0

да, я могу это сделать, но в MySQL это было бы более оперативно, потому что циклы через многие базы данных и создают 100-е файлы. Похоже, мне, возможно, придется это делать на PHP. –

+1

Я прошел этот точно такой же процесс, пытаясь найти способ, и было заключено, что вы не можете, как отмечают документы, для обеспечения безопасности. –

+1

Я пробовал это .. но ответ MySQL был: «rm: не удается удалить« /tmp/my-report-2013-10.csv »: операция не разрешена» .. права доступа к файлам - 666. любые мысли? – lucasvscn

3

Для работы, как это, я бы поместить его в файл Баш, удалите файл

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

Лучшим вариантом является на самом деле добавить метку времени, хотя. Дисковое пространство в этот день и возраст не дорого.

+0

не дорого, просто неудобно обновлять HTML-ссылку на новый файл каждый день. Возможно, да, но, вероятно, больше работы, чем нужно. Благодарю. –

+0

просто 'ln'' backup.csv' до последней и самой большой версии, как только это было сделано - создайте новую версию, rm backup.csv, ln newversion backup.csv - ta-da, все готово. –

+0

Мне нравится идея ln -s. hmm –

2

Невозможно.

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

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; 
1

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

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

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

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

+1

Пробовал это и получил «rm: can not remove» /tmp/blah.User.csv: операция не разрешена » –

1

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 

STEP 4 (optionnal): thanks me;)

Смежные вопросы