56

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

4

7 回答 7

62

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

file_name 不能是现有文件,这可以防止诸如 /etc/passwd 和数据库表之类的文件被破坏。

每晚使用不同的文件名可能是一个更好的主意,因为拥有多个备份意味着您可以从存在超过一天的问题中恢复。然后,您可以维护一个始终指向最新完整 csv 的符号链接。

于 2009-06-06T22:15:45.357 回答
9

为什么不在rm -f /home/sites/example.com/www/files/backup.csvcron运行的脚本中?

您可以从 mysql 内部运行它。\! 只需使用例如逃逸到外壳:

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

于 2009-06-06T22:00:36.447 回答
3

对于这样的工作,我会将其放入 bash 文件中,删除该文件

#!/bin/bash
rm /path/to/backup.csv
./backup_sql_query.sh  <<-- This contains the script to backup to CSV.

更好的选择是实际添加时间戳。在这个时代,磁盘空间并不昂贵。

于 2009-06-06T22:25:10.827 回答
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; 
于 2010-05-12T06:38:10.947 回答
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 ( ....

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

于 2015-09-23T16:30:29.480 回答
0

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

Mysql> \\! rm -f /home/sites/example.com/www/files/backup.csv
于 2011-10-18T03:29:13.893 回答
0

老问题..但是有一个选项 OVERWRITE ON 可以添加到语句中

SELECT * INTO OUTFILE '/home/sites/example.com/www/files/backup.csv'
  FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
  LINES TERMINATED BY '\n' OVERWRITE ON
...
于 2018-07-23T13:19:32.283 回答