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で直接行うことができれば、より簡潔になります。
いいえ、上書きする方法はありません。 docs から:
file_nameを既存のファイルにすることはできません。これにより、特に/ etc/passwdやデータベーステーブルなどのファイルが破壊されなくなります。
複数のバックアップを作成すると、1日以上存在していた問題から回復できるため、毎晩異なるファイル名を使用することをお勧めします。その後、常に最新の完全な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.
ただし、実際にはタイムスタンプを追加することをお勧めします。ディスク容量は、この日も時代も高くありません。
道はない。
動的ステートメントで処理できるのは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つのステップ。バックアップは、寝ている間(または寝ていない間)毎晩実行されます
ステップ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(オプション):ありがとうございます;)
古い質問..しかし、ステートメントに追加できるオプション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
...
Mysql内からシェルにエスケープし、rmコマンドを実行してファイルを削除してから書き込みます。例えば:
Mysql> \\! rm -f /home/sites/example.com/www/files/backup.csv