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步(选项):谢谢我;)