2008-09-15 5 views
24

우리는 99 % INSERT 인 실시간 MySQL 데이터베이스를 초당 100 개씩 보유하고 있습니다. 매일 라이브 데이터베이스에 영향을주지 않고 쿼리를 실행할 수 있도록 데이터를 매일 보관해야합니다. 또한 아카이브가 완료되면 실제 데이터베이스를 지우고 싶습니다.라이브 MySQL 데이터베이스를 보관하는 가장 좋은 방법

가능한 경우 INSERT 잠금을 사용하지 않고이 작업을 수행하는 가장 좋은 방법은 무엇입니까? 우리는 INSERT DELAYED를 쿼리에 사용합니다.

답변

13

http://www.maatkit.org/는 MK-아카이브를

아카이브가 있거나 다른 테이블 및/또는 파일에 테이블에서 행을 제거합니다. 중요한 OLTP (온라인 트랜잭션 처리) 쿼리를 방해하지 않으면 서 매우 작은 조각으로 데이터를 효과적으로 "니블 (nibble)"하도록 설계되었습니다. 테이블에서 쿼리에서 쿼리까지의 위치를 ​​유지하는 비 백 트랙킹 쿼리 계획으로이 작업을 수행하므로 이후의 각 쿼리는 보관 가능한 행을 찾기가 거의 필요 없습니다.

또 다른 대안은 매일 새로운 데이터베이스 테이블을 만드는 것입니다. MyIsam에는 테이블 끝에 대한 INSERT가 일반적으로 어쨌든 차단되지 않기 때문에 이러한 장점이 있습니다. 병합 테이블 유형이 모두 다시 함께 있기 때문에 MyIsam에는 이러한 이점이 있습니다. 많은 웹 사이트가 httpd 트래픽을 이와 같은 테이블에 기록합니다.

Mysql 5.1에는 많은 부분에서 동일한 작업을 수행 할 수있는 파티션 테이블이 있습니다.

+0

mk-archiver는 내가 원하는 것을 정확하게 수행합니다. – DavidM

+2

Maatkit은 Percona Toolkit의 일부가되었습니다. - http://www.percona.com/doc/percona-toolkit/2.1/pt-archiver.html –

0

두 개의 미러 된 데이터베이스를 둘 수 있습니까? 하나를 쓰고, 두 번째를 아카이브로 유지하십시오. 24 시간마다 전환하십시오 (또는 귀하가 적절하다고 생각하는 경우). 아카이브였던 데이터베이스에 오늘의 모든 활동을 삽입하십시오. 그런 다음 두 데이터베이스가 일치해야합니다. 이것을 새로운 라이브 DB로 사용하십시오. 보관 된 데이터베이스를 가져 와서 원하는대로 수행하십시오. 당신은 백업/추출/읽기를 할 수 있습니다.

백업용으로 하나의 드라이브를 오프라인으로 가져 와서 다시 동기화 한 다음 다른 드라이브를 백업용으로 사용할 수있는 것과 같은 종류의 미러링 된 RAID가 있습니다.

1

MySQL 복제가 완벽하게 작동합니다.
마스터 -> 라이브 서버.
슬레이브 -> 동일한 네트워크에있는 다른 서버.

2

복제와 같은 사운드가이를위한 최상의 솔루션입니다. 초기 동기화 후 슬레이브는 Binary Log을 통해 업데이트를 가져 오므로 마스터 DB에 전혀 영향을 미치지 않습니다.

More on replication.

2

나는 MySQL의 파티션 테이블을 사용 나는 모든면에서 좋은 결과를 달성했습니다.

관련 문제