2009-04-30 4 views
1

Y 일 이전의 데이터에 대해 X 일마다 테이블 A에서 실행 기록 테이블 B로 데이터를 이동 한 다음 Z 일보다 오래된 기록 테이블 B에서 데이터를 제거하려고합니다.'Y'일보다 오래된 데이터를 MySQL의 아카이브/이력 테이블로 옮기는 방법은 무엇입니까?

이 작업을 수행하는 다양한 방법을 탐색합니다. 그래서 어떤 제안이라도 인정 될 것입니다. 칠일 Y - - 변수 X에 대한

예 육십일 Z - 365일

감사합니다

답변

3
CREATE PROCEDURE prc_clean_tables (Y INT, Z INT) 
BEGIN 
     BEGIN TRANSACTION; 

     DECLARE _now DATETIME; 
     SET _now := NOW(); 

     INSERT 
     INTO b 
     SELECT * 
     FROM a 
     WHERE timestamp < _now - INTERVAL Y DAY; 
     FOR UPDATE; 

     DELETE 
     FROM a 
     WHERE timestamp < _now - INTERVAL Y DAY; 

     DELETE 
     FROM b 
     WHERE timestamp < _now - INTERVAL Z DAY; 

     COMMIT; 
END 
+0

이 절차를 7 일마다 실행하는 방법이 있습니까? 아니면 스크립트를 실행하기 위해 CRON을 사용해야합니까? 다시 한 번 감사드립니다 –

+0

아니요, cron을 사용해야합니다. – Quassnoi

+0

이것은 멋진 해결책입니다. 고려해야 할 유사 항목 : 기록에 새로운 행을 추가하고 동시에 (예 : 방아쇠를 통해) 기본 테이블에 추가합니다. 이것은 두 개의 분리 된 세트 대신 항상 b의 서브 세트 인 효과를 가지며, 일부 컨텍스트에서는 장점이 있습니다. 따라서 정리는 두 개의 삭제 구문으로 축소됩니다. – yetanotherdave

0

물론 가장 간단한 방법은 역사에 온라인 테이블에서 행을 삽입하는 것 다음 테이블을 삭제하십시오. Quassnoi가 말했듯이 SPROC에서 그걸 마무리하면 완벽 할 것입니다.

더 좋은 방법은 partitioning을 이용하는 것입니다. 테이블을 날짜별로 분할 한 경우 관련 파티션을 삭제하면 DELETE 부분의 속도를 높일 수 있습니다. INSERT 부분은 삽입 된 모든 행이 하나의 파티션에서 나왔기 때문에 더 빠를 수도 있습니다 (파티션을 올바르게 작성한 경우).

스키마가 동일하다면 파티션을 한 테이블에서 다른 테이블로 상대적으로 즉각적으로 이동할 수있는 트릭이있을 수도 있습니다.

+0

감사합니다. –

1

이것은 간단합니다.

야간에 cron 작업을 실행하여 스크립트를 실행하고 싶습니다.

#crontab -e 

50 11 * * * $HOME/scripts/MyWeeklyArchive.sh 

스크립트 파일 자체도 매우 간단합니다. 우리는 mysqldump와 Now() 함수를 사용할 것이다.

#! /bin/bash 

/usr/bin/mysqldump -uUser -pPassword Current_DB Table --where='date < NOW() - INTERVAL 7 DAY' | /usr/bin/mysql -uUser -pPassword archive_DB 

그 라인을 cron 파일에 포함시킬 수는 있지만 확장 성을 위해 스크립트 파일로 만드는 것이 좋습니다.

+0

덕분에 많은 도움이되었습니다. CRON에 대해 매우 익숙합니다. –

+0

@Josh 구성에 따라 crontab 명령 앞에 내보내기 편집기 = vi 을 입력 할 수 있습니다. 기본 crontab 편집기보다 훨씬 쉬운 vi를 사용할 수 있습니다. – Eddie

1

MySQL 5.1을 사용하는 경우 cron 대신 이벤트 스케줄러를 사용할 수 있습니다. 필자는 사용하지 않았지만 비슷한 SQL Server를 사용했습니다.

관련 문제