MySQL INTO OUTFILE会覆盖现有文件吗?

时间:2009-06-06 21:50:25

标签: php mysql sql into-outfile

我写了一个用于创建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中执行它会更简洁。

7 个答案:

答案 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