MySQL в OUTFILE переопределяет существующий файл?
Я написал сценарий big sql, который создает CSV-файл. Я хочу каждый вечер звонить в cronjob, чтобы создать новый CSV-файл и иметь его на веб-сайте.
скажем, например, я храню свой файл в ' /home/sites / example.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 дает мне ошибку, когда файл уже существует
File ' / home / sites / example.com / www / файлы / резервное копирование.csv " уже существует
есть ли способ заставить MySQL перезаписать файл?
Я мог бы PHP обнаружить, существует ли файл и удалить его, прежде чем создавать его снова, но он был бы более кратким, если бы я мог сделать это непосредственно в MySQL.
7 ответов
нет, его невозможно перезаписать. От docs:
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;
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 (optionnal): спасибо мне;)
просто перейдите в оболочку из mysql и выполните команду rm, чтобы удалить файл, прежде чем пытаться его написать. Например:
Mysql> \! rm -f /home/sites/example.com/www/files/backup.csv
старый вопрос.. но есть опция перезаписи, которую вы можете добавить в оператор
SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' OVERWRITE ON
...