web-dev-qa-db-ja.com

MySQL INTO OUTFILEは既存のファイルを上書きしますか?

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で直接行うことができれば、より簡潔になります。

51
Derek Organ

いいえ、上書きする方法はありません。 docs から:

file_nameを既存のファイルにすることはできません。これにより、特に/ etc/passwdやデータベーステーブルなどのファイルが破壊されなくなります。

複数のバックアップを作成すると、1日以上存在していた問題から回復できるため、毎晩異なるファイル名を使用することをお勧めします。その後、常に最新の完全なcsvを指すシンボリックリンクを維持できます。

54
brian-brazil

スクリプトのrm -f /home/sites/example.com/www/files/backup.csvがcronで実行されたのはなぜですか?

これはmysql内から実行できます。 \!を使用してシェルにエスケープするだけです。例:

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

8
Flavius Stef

このようなジョブの場合、bashファイルに配置し、ファイルを削除します

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

ただし、実際にはタイムスタンプを追加することをお勧めします。ディスク容量は、この日も時代も高くありません。

3
user118659

道はない。

動的ステートメントで処理できるのは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; 
3
mani

これを正しく行うための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(オプション):ありがとうございます;)

2

古い質問..しかし、ステートメントに追加できるオプション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
...
0
da Bich

Mysql内からシェルにエスケープし、rmコマンドを実行してファイルを削除してから書き込みます。例えば:

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