我写了一个用于创建CSV文件的大型sql脚本。我想每晚打电话给一个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中执行它会更简洁。
答案 0 :(得分:52)
不,没有办法覆盖它。来自docs:
file_name不能是现有文件,除其他外,它会阻止/ etc / passwd和数据库表等文件被销毁。
每晚使用不同的文件名可能更好一点,因为拥有多个备份意味着您可以从已存在超过一天的问题中恢复。然后,您可以维护一个始终指向最新完整csv的符号链接。
答案 1 :(得分:8)
为什么脚本中的rm -f /home/sites/example.com/www/files/backup.csv
不是由cron运行的?
你可以从mysql里面运行它。用\!
逃到shell
例如:
Mysql> \! rm -f /home/sites/example.com/www/files/backup.csv
答案 2 :(得分:3)
对于这样的工作,我会把它放到一个bash文件中,删除文件
#!/bin/bash
rm /path/to/backup.csv
./backup_sql_query.sh <<-- This contains the script to backup to CSV.
更好的选择是实际添加时间戳。在这个时代,磁盘空间并不昂贵。
答案 3 :(得分:3)
没有办法。
只有一种可以使用动态声明的程序。
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;
答案 4 :(得分:2)
正确的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步(选择):谢谢;)
答案 5 :(得分:1)
旧问题..但是您可以将“覆盖”选项添加到语句中
SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\n' OVERWRITE ON
...
答案 6 :(得分:0)
只需从mysql中转义到shell并执行rm命令以在尝试编写之前删除该文件。例如:
Mysql> \\! rm -f /home/sites/example.com/www/files/backup.csv