MySQL INTO OUTFILE覆盖现有的文件?

我写了一个大的sql脚本来创build一个CSV文件。 我想每天晚上打一个cronjob来创build一个新的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检测文件是否存在,并在再次创build之前将其删除,但如果我可以直接在MySQL中执行,则会更简洁。

不,没有办法覆盖它。 从文档 :

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. 

更好的select是实际上添加一个时间戳。 磁盘空间在这个时代并不昂贵。

不可能。

只有一个可能的程序可以用dynamic语句。

 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; 

有点过时的问题,但希望这将有助于某人。

只需从mysql中退出到shell,并在尝试写入之前执行rm命令删除文件。 例如:

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

请享用!

3个步骤来做到这一点。 您的备份将在您睡觉的时候每晚执行(或不)

第1步:为您的SQL创build一个存储过程

 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步:创build一个脚本“/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每天执行脚本

 # mh dom mon dow user command 0 3 * * * root sh -x /home/backupCSV.sh 

第4步(选项):谢谢我;)

Interesting Posts