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.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.
더 좋은 방법은 실제로 타임스탬프를 추가하는 것입니다.오늘날 디스크 공간은 비싸지 않습니다.
말도 안 돼.
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
'programing' 카테고리의 다른 글
PHP 7 RC3: 누락된 MySQL PDO를 설치하는 방법 (0) | 2022.10.18 |
---|---|
MySQL 하위 쿼리에서 여러 열/필드 선택 (0) | 2022.10.18 |
Gson이 value=map 엔트리를 무시합니다. (0) | 2022.10.18 |
php 날짜를 mysql 형식으로 변환 (0) | 2022.10.18 |
java.sql.SQLException:jdbc:mysql://localhost:3306/dbname에 적합한 드라이버를 찾을 수 없습니다. (0) | 2022.10.18 |