본문 바로가기

MySQL/MySQL Error Note

MYSQL_BIN_LOG::purge_logs was called with file

-- MySQL Error Note

MYSQL_BIN_LOG::purge_logs was called with file ./mysql -bin.001640 not listed in the index.

 

일반적으로 MySQL을 쓰다보면 Replication이라는 기술을 많이 쓰게 됩니다.

 

Oracle의 RAC와 간단히 비교를 하면

 

 

 

요런 그림? 이라고 해야하나요 ㅎㅎ

 

RAC(Real Application Cluster)는 여러대의 Database 서버들이 하나의 공유 스토리지에 SGA를 개별적으로 쓰며 사용하는 시스템이라 쓰기의 부하 분산기 가능한 시스템입니다. 더 간단히 말하면 여러 서버에서 써도 같은 공간에 저장이 되죵ㅎ

 

반면 MySQLReplication이라는 개념은 읽기 부하 분산입니다.

그림에서의 최상위 한개의 서버가 Master라고 하면 아래는 Slave라고 봅시다. 일반적인 명칭도 그렇구요

이와같은 방식은 Master 서버에 insert update delete를 하면 아래의 Slave에 그대로 적용이 됩니다.

이때 RAC와의 가장 큰 차이점이 있는데요. MasterSlave는 각각의 스토리지를 가지고 동작을 합니다.

비교적 장애도 많고 데이터의 차이를 보이는 때도 생기게 됩니다. Slave에 DML을 하다고 해서 master에 반영이 되는 것도 아니구요 ㅎ.. 쓰기 분산이 안되기때문에 insert update delete가 많으면 Master의 성능이 좋아야 합니다.

읽기가 많다면 당연히 Slave의 성능이 좋아야 하구요 ㅎ

 

간단하게 Replication에 대해서 알아보았습니다. 추후에 MHAMMM 등에 대해 Admin쪽에 자세히 올리도록 할게요 ㅎ

 

이렇게 Replication을 하기 위해서는 Master에는 mysql-bin.xxxxxx <-라는 binary log가 쌓여야하고

slave는 설정을 통해 Master에 있는 binary log를 가지고 와서 HOSTNAME-relay-bin.xxxxxx <-라는 파일을 만듭니다.

이 파일은 slave가 master와 통신을 하는 한 세션당 생기며 master와의 통신이 끊겼다가 붙으면 또 다음 번호로 생기게 됩니다. 그래서 자주 끊었다가 붙었다가 하게 되면 파일이 자꾸 생성이 되겠죠 ㅎ 그리고 특정 용량이상이 되고 master에 반영이 되었다면 삭제도 됩니다. 용량차지를 하면 안되니까요.

 

Slave는 자동으로 삭제가 되는데 master는??

삭제가 되지 않습니다. DBA나 엔지니어들이 삭제를 해주어야 합니다.

그냥 파일을 삭제하면 안되고 MySQL안에 들어가서 명령어로 삭제하는 것을 권장하는데요.

 

purge master logs to 'mysql-bin.xxxxxx'; 를 해주면 해당 숫자 이전의 파일들을 모두 지웁니다.

예를 들어서 purge master logs to 'mysql-bin.001025'; 라고 하면

data폴더에 mysql-bin.00001025 이전 파일들을 다 지워 라고 말을 하는 거죠.

파일의 기본크기는 1G정도구요. transaction에 따라 용량이 조금씩 다릅니다.

복구할때에도 유용한 파일이기때문에 따로 백업을 받아서 저장하는 것이 좀 더 좋을 수 있습니다.

 

mysql-bin.xxxxxx라는 파일의 정보는 mysql-bin.index라는 파일에도 저장이 되어 있어서 현재 어디까지의 mysql-bin.이 있는지 볼 수 있고 만약 파일이 없다면 에러가 날 가능성이 있겠죠 ㅎ

 

제가 타이틀로 잡은

 

MYSQL_BIN_LOG::purge_logs was called with file ./mysql -bin.001640 not listed in the index.

 

이 에러는 삭제를 하려고 했는데 해당 인덱스에 정보가 없다고 합니다.

cat으로 ./mysql-bin.index를 열어보면

./mysql-bin.001641
./mysql-bin.001642
./mysql-bin.001643
....

이런식으로 각각의 목차가 나오는데 이 에러의 경우에는 없다고 나오니

사용자가 입력을 잘못하거나 파일 삭제 혹은 index파일 수정을 했다고 볼 수 있습니다.

 

이상 끗!ㅎㅎ

'MySQL > MySQL Error Note' 카테고리의 다른 글

outside valid range for the datatype INTEGER  (0) 2015.11.05