mysql 복구

데이터베이스 운영 테크닉 

데이터베이스를 운영하다 보면, 파일이 깨져 데이터베이스에 접속할 수 없거나 운영하는 게시판에 다음과 같은 에러 메시지가 뜨면서 게시물을 볼 수 없는 경우가 있다. MySQL 서버가 불의의 사고로 비정상적으로 종료되거나 쓰기 작업을 제대로 끝내지 못하면 이러한 증상이 발생할 수 있다: 

 ERROR 1016: Can't open file: 'XXXX.MYD'. (errno: 145) 


이러한 사고를 대처하기 위해 가장 좋은 방법은 미연에 백업을 수시로 해 두고 데이터베이스 에러 체크를 통해 깨진 파일을 빠르게 복구해 두는 것이다. 미리 백업해 놓으면 깨진 파일들을 날려도 백업 파일로 복구할 수 있지만, 예상하지 못한 사고는 항상 발생하는 법. 이럴 경우 깨진 파일을 다시 복구하는 방법에 대해 알아 보자. 해당 데이터베이스로는 리눅스에서 많이 사용되는 MySQL을 토대로 한다. 

MyISAM 테이블(".MYI", ".MYD")을 체크하거나 복구하기 위해서는 myisamchk 명령어를 이용해야 하고 ISAM 테이블(".ISM", ".ISD")에 같은 일을 하려면 isamchk 명령어를 이용해야 한다. 

MyISAM에 대해 
  
MyISAM는 현재 MySQL에서 보편적으로 쓰이는 테이블 형식이다. 인덱스 파일은 ".MYI"에 저장되고 데이터 정보는 ".MYD"에 저장 된다. ISAM 데이블 형식은 현재는 잘 쓰이지 않고 앞으로 MySQL에서 사라질 것이다. ISAM 테이블을 다음과 같이 MyISAM으로 변환할 수 있다. 

ALTER TABLE tbl_name TYPE = MyISAM; 

ISAM 테이블은 인덱스가 ".ISM"에 저장되고 데이터는 ".ISD"에 저장된다. 이 밖에 Merge, Heap, InnoDB 등의 다른 테이블이 있고 이전에는 지원하지 않던 트랜젝션은 BDB와 InnoDB 테이블이 지원한다. 또한 InnoDB는 외래 키(Foreign Key)를 지원한다. 
  

복구 방법 

먼저 루트 권한으로 로그인하고 복구 작업을 하기 전에 다음과 같이 명령하여 MySQL 데몬을 죽인다: 

 mysqladmin -uroot -p shutdown 


해당 MySQL 데이터베이스 폴더로 이동해 문제가 있는지 일단 테이블을 체크한다: 

 kuls:/var/.../test# myisamchk weather.MYI 


문제가 있는 테이블은 복구 명령어를 사용해 복구한다: 

 kuls:/var/.../test# myisamchk -r weather.MYI 


복구를 성공적으로 마쳤다면 MySQL 데몬을 재실행한다: 

 kuls: safe_mysql& 


그림 14. MySQL 데몬을 재실행하는 화면 

복구하기 전에 만약의 사고를 대비해 데이터베이스 파일을 모두 다른 백업 폴더로 복사하고 복구 명령을 실행하기 바란다. 에러 검사에서 에러가 발견되지 않았지만 이상이 있을 경우 "-e(--extend-check)" 옵션을 주어 다시 체크해 본다. -e 옵션을 주면 시간은 더 걸리지만 자세히 검사하게 되므로 미처 발견되지 못한 에러를 발견할 수 있다. 

myisamchk, isamchk과는 별도로 mysqlcheck이라는 명령어도 있다. 이 명령어는 MyISAM 테이블에서만 사용할 수 있고 myisamchk와의 차이점으로는 MySQL 서버를 종료하지 않고도 에러 체크와 복구 작업을 할 수 있다는 점이다. 확장 검사 옵션은 "-e(--extend)"이고 복구 옵션은 "-r(--repair)"이다. 

옵션 
 설명 
  
-r(--recover) 
 복구를 할 때 기본으로 주어야 할 옵션 
  
-q(--quick) 
 속도는 빠르지만, 완벽한 복구가 안될 수도 있다. 
  
-f(--force) 
 데이터 손실이 일어나도 강제로 복구. 
  
-B(--backup) 
 변경하는 파일을 "filename-time.BAK"명으로 백업시키고 복구하는 명령. 
  

표 4. myisamchk의 복구 옵션 

MySQL DB 백업 및 복구 방법 

간단하게 데이터베이스를 백업하고 복구하는 방법을 살펴 보겠다. 먼저 백업을 위한 명령은 다음과 같다: 

 $ mysqldump -u계정 -p 백업할_DB_명 > 백업_파일명 

 예) mysqldump -ucorory -p corory > corory_db 


위와 같이 명령하고 이어 묻는 패스워드를 입력하면 원하는 DB을 백업할 수 있다. 

마찬가지로 일단 mysql -u계정 -p 명령으로 MySQL에 접속하고 다음과 같이 명령할 수 있는데, 여기에서 database 대신 "--all-databases"를 입력하면 전체 DB가 백업된다: 

 $ mysqldump -옵션 database 백업할_DB명 > 백업_파일명 


옵션 
 설명 
  
-q(--quick) 
 mysql_use_result()를 사용해 덤프(dump)를 신속하게 한다. 
  
--add-drop-table 
 각 create statement 앞에 드롭(drop) 테이블 절을 추가한다. 
  
--add-locks 
 MySQL에 삽입하는 속도를 빠르게 하기 위해 덤프하기 전에 LOCK 테이블을 추가하고 덤프한 다음 UNLOCK 테이블을 추가한다. 
  
-e(--extended-insert) 
 다중 insert 구문을 사용해 보다 빠르게 弔沌?수 있도록 한다. 
  
--opt 
 -q, --add-drop-table, --add-locks, -e --lock-tables을 모두 사용한다. 
  

표 5. mysqldump의 옵션 

보통 "--opt"을 옵션으로 주어 덤프하면 다른 필요한 옵션들이 자동 첨가되므로 사용를 권장한다. 

백업과 마찬가지로 다음과 같이 명령하면 복구도 간단히 할 수 있다: 

 $ mysql -u계정 -p 복구할_DB_명 < 백업_파일명


2007.02.09

http://blog.naver.com/pascal09/90000028651