56

CSV ファイルを作成する大きな SQL スクリプトを作成しました。毎晩 cronjob を呼び出して新しい CSV ファイルを作成し、それを Web サイトで利用できるようにしたいと考えています。

たとえば、ファイルを「/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やデータベーステーブルなどのファイルが破棄されるのを防ぐことができます。

複数のバックアップがあるということは、1日以上存在する問題から回復できることを意味するため、毎晩異なるファイル名を使用することをお勧めします。次に、常に最新の完全な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

道はない。

動的ステートメントで手続きできるのは 1 つだけです。

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 "

STEP 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 内からシェルにエスケープし、ファイルを書き込もうとする前に rm コマンドを実行してファイルを削除するだけです。例えば:

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