programing

MySQL INTO OUTFILE이 기존 파일을 덮어쓰시겠습니까?

luckcodes 2022. 10. 18. 22:07

MySQL INTO OUTFILE이 기존 파일을 덮어쓰시겠습니까?

CSV 파일을 작성하는 큰 sql 스크립트를 작성했습니다.매일 밤 cronjob을 호출하여 새로운 CSV 파일을 생성하여 웹사이트에서 사용할 수 있도록 하고 싶습니다.

예를 들어 파일을 '/home/http/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/http/example.com/www/files/backup.csv'' 파일이 이미 있습니다.

MySQL이 파일을 덮어쓰게 하는 방법이 있나요?

PHP가 파일의 존재를 검출해 삭제한 후 다시 작성할 수 있지만 MySQL에서 직접 할 수 있다면 더 간단할 것입니다.

아니요, 덮어쓸 방법이 없어요.문서에서:

file_name은 기존 파일일 수 없습니다.이것은 특히 /etc/passwd 및 데이터베이스 테이블 등의 파일이 파괴되는 것을 방지합니다.

백업을 여러 개 하면 하루 이상 지속된 문제를 복구할 수 있으므로 매일 밤 다른 파일 이름을 사용하는 것이 좋습니다.그러면 항상 최신 전체 csv를 가리키는 심볼 링크를 유지할 수 있습니다.

그거 좋지rm -f /home/sites/example.com/www/files/backup.csvcron이 실행한 스크립트에서요?

이것은 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.

더 좋은 방법은 실제로 타임스탬프를 추가하는 것입니다.오늘날 디스크 공간은 비싸지 않습니다.

말도 안 돼.

dynamic 문을 사용하여 처리할 수 있는 것은 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 (옵션) : 감사합니다;)

mysql 내에서 셸로 이스케이프하여 rm 명령어를 실행하여 파일을 삭제한 후 쓰기를 시도합니다.예를 들어 다음과 같습니다.

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

오래된 질문..그러나 문에 추가할 수 있는 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
...

언급URL : https://stackoverflow.com/questions/960627/mysql-into-outfile-override-existing-file