Tag Archives: mysql

[MySQL] 무한정 늘어나는 log-bin 파일 줄이기

MySQL에서 사용하는 log-bin이라는 옵션은 사용된 쿼리들이 로깅되는 파일이며 Innodb 혹은 Replication등에서 사용되곤 합니다.

하지만 이 파일의 문제는 무한정 늘어난다는 것입니다. relay-log-space-limit 같은 옵션이 있지만 이 옵션은 Replication에서 사용되는 relay-log-bin의 용량을 제한 하는 옵션이지 해결책이 되지 못합니다.

하지만 이 파일을 정리하는 방법이 있습니다. 우선 다음의 Query를 사용하는 것입니다.

PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)

INTERVAL에서는 원하시는 로깅 시점을 기록하시면 됩니다. 위의 경우에는 30일 이전의 로깅 정보를 삭제하게 됩니다.

차례차례 해보도록 하겠습니다.

1. 현재의 하드디스크 용량 상태를 확인합니다.

[root@Theeye db]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
/dev/sda3              15G  803M   13G   6% /home
/dev/sda2              97G   78G   15G  85% /usr/local/mysql/db

데이터베이스 공간이 85%나 사용되어 곧 꽉찰지도 모른다는 불안감에 휩싸이게 되었습니다.

2. log-bin 파일을 확인해 봅시다.

[root@Theeye db]# ls mysql-bin.*
mysql-bin.000001  mysql-bin.000002  mysql-bin.000003 ......  mysql-bin.000073

파일이 엄청나게 많이 있습니다.

3. 다음 명령어를 수행합니다.

mysql -e "PURGE MASTER LOGS BEFORE DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY)"

물론 mysql에 접속하셔서 위의 명령어를 입력하셔도 됩니다. Super권한을 가진 root계정으로 실행해 주세요.

4. log-bin 파일이 줄었나 확인해 봅시다.

[root@Theeye db]# ls mysql-bin.*
mysql-bin.000041  mysql-bin.000042  mysql-bin.000043 ......  mysql-bin.000073

41번 이전의 파일들이 모두 삭제 되었습니다. 41번 부터가 최근 30일 이내의 로그정보가 남아있는 모양이군요.

5. 하드디스크 용량 상태를 확인해 봅시다.

[root@Theeye db]# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
/dev/sda3              15G  803M   13G   6% /home
/dev/sda2              97G   40G   53G  43% /usr/local/mysql/db

확실히 용량이 많이 확보가 되었군요^^

주기적인 실행이 필요하실 경우에는 위의 명령어를 crontab에 등록하시면 됩니다. 일주일에 한번정도의 실행이 적당하겠네요.

[리눅스 프로그래밍] IPC + MySQL을 이용한 텍스트 기반 머드게임 만들기

이것 역시 학교 과제로 만들었던 프로젝트입니다. IPC(Inter-Process Communication)을 이용하여 다중 접속이 가능한 머드 게임을 만드는 것이었는데요. IPC는 SystemV시절부터 있어왔던 프로세스간 통신 방법입니다.

* 시나리오
서기 2080년 지구의 지상은 인간들의 무분별한 전쟁과 자원 채취로 인간이 살 수 없는 환경이 되어버렸다. 이에 인간들은 우주를 개척하려고 하였으나 아직 인간이 우주에서 살아가기에는 아직 기술적인 문제가 많고 또한 정치적인 문제까지 겹쳐 우주발전이 지연되고 있는 상황이다. 하지만 뛰어난 중력 컨트롤 과학 기술을 이용하여 인간이 살기 힘들 정도로 오염된 지상을 떠나 하늘에서 거주하기 시작하였다. 하늘에는 부유하는 도시가 생겨났고 개인 비행선은 최고의 이동수단이 되었다. 당신은 이제 자신의 비행선을 가지고 무역, 전쟁 또는 도적질을 할 수 있다. 하지만 조심해야 한다. 인간이 하늘로 올라가는 것을 신에 대한 모독이라 여기는 광신교 집단이 무차별적인 공격을 감행하고 있다는 소문이 있다. 또한 환경오염에 따른 괴생물체가 자주 출몰하곤 한다.
당신의 앞날에 행운을 빈다.

위와 같이 나름 멋진 시나리오를 갖추고 멋진 방대한 규모의 설계서를 제출하였습니다. 하지만 역시나 시간상의 압박으로 제대로 구현하지 못하였습니다-_-; 기획의 20%정도만 완성…. 아무튼 결과적으로 A+받았으니 그것으로 만족해야 할것 같네요;;

사용자 삽입 이미지서버를 실행한 모습입니다.

사용자 삽입 이미지클라이언트를 실행하여 아이디와 비번을 입력하고 접속합니다. 계정 관리는 MySQL디비를 활용합니다.

사용자 삽입 이미지users명령어를 이용하여 접속한 사용자들의 리스트를 볼 수 있습니다.

사용자 삽입 이미지stat을 치면 현재 체력을 볼 수 있습니다.

사용자 삽입 이미지map을 치면 현재 위치와 향하고 있는 방향을 알 수 있습니다.

사용자 삽입 이미지특정 사용자에게 메시지를 전송할 수 있습니다.

사용자 삽입 이미지다른 사용자의 입장에서 본 화면입니다. 메시지가 도착했네요.

사용자 삽입 이미지모든 접속자에게 전체 메시지를 보냅니다.

사용자 삽입 이미지미리 구현된 맵을 이동해 다녀봅니다. 막힌 지역으로는 이동할 수가 없으며 다른 사용자를 만날 경우 메시지를 표시해 줍니다.

사용자 삽입 이미지접속을 끊었다가 재 접속하면 최종 로그아웃 했던 위치에서 다시 시작합니다. DB를 활용합니다.

기존적으로 맵의 구현은 다음과 같습니다. 0은 일반 지역 1은 구름이 있어 이동 불가능한 지역입니다.
[code]int Map =
{
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,1,0,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,1,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,1},
{1,0,0,1,1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,1,0,0,1},
{1,0,0,1,1,0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,1},
{1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,1,1,1,1,1,1,1,0,0,1},
{1,0,0,1,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,1},
{1,0,1,1,1,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,1,1,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,1},
{1,0,0,1,1,1,0,0,1,1,0,0,0,0,0,0,0,1,1,1,0,0,0,0,1},
{1,0,0,0,1,1,0,0,1,1,0,0,0,0,0,0,1,1,1,0,0,0,0,0,1},
{1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,1,1,1,1,0,0,0,0,1,1,1,0,0,0,0,1},
{1,0,1,1,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1,0,0,0,1},
{1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,0,0,1},
{1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1},
{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1}
};[/code]

MySQL 데이터 베이스 스키마는 다음과 같습니다. 다음의 테이블을 추가해 둔후에 common.h안의 DB서버 정보를 입력해 주시면 됩니다.

[code lang-sql]CREATE TABLE `USER` (                                 
 `USER_IDX` int(11) NOT NULL auto_increment,         
 `USER_ID` varchar(20) default NULL,                 
 `USER_PW` varchar(20) default NULL,                 
 `USER_NAME` varchar(20) default NULL,               
 `X` int(4) default NULL,                            
 `Y` int(4) default NULL,                            
 PRIMARY KEY  (`USER_IDX`)                           
)


CREATE TABLE `NPC` (                                  
 `NPC_IDX` int(11) NOT NULL auto_increment,          
 `NPC_NAME` varchar(20) default NULL,                
 `ATTACK_DMG` int(4) default NULL,                    // 공격 데미지
 `DEFENSE` int(4) default NULL,                       // 방어력
 `HEALTH` int(4) default NULL,                        // 체력 (공격받을시 데미지 계산 : 현재 체력 – (사용자 공격데미지[10 fix] – NPC방어력))
 PRIMARY KEY  (`NPC_IDX`)                            
)[/code]

컴파일의 경우에는 Makefile을 참고하시면 되며, MySQL 라이브러리 패스를 이곳에서 지정하시면 됩니다.

1364223203.zip