웹마스터 팁
MyISAM --> InnoBD 이전시 문제점 및 고려사항(엔진 교체)
2013.07.24 23:20
맨날 눈팅만 하다가 이렇게 몇자 적어 봅니다.
우선
당연히 MYSQL 사용중입니다.
버전은
5.1.51 버전입니다.
오래전에 설치한 것이라서 MyISAM 을 사용하고 있었는데요.
아무래도 InnoDB로 갈아타기로 결정하고 이전 작업을 시작하였습니다.
이곳 팁 게시판에 여러 문서도 찾아보고 해봤지만 딱히 제가 만났던 오류를 해결하지 못하여
몇자 적습니다.
우선 ALTER 테이블네임 ENGINE=InnoDB 명령을 사용하여 테이블 변환하였습니다.
노가다를 피하기 위해서 PHP를 이용해서 자동으로 변경하였습니다.
대략적인 코드는
$default_dbname="여러분이 사용중인 DB 이름";
$result2 = mysql_query("SHOW TABLES FROM ".$default_dbname);
$i=0;
while($table_data2[$i] = mysql_fetch_row($result2)) {
echo $table_data2[$i][0]."<br>";
//XE 테이블 생성시 접두어 xe라 가정
if(preg_match("/xe_/i", $table_data2[$i][0]) && 1){
echo $table_data2[$i][0]."<br>";
$query = "ALTER TABLE ".$table_data2[$i][0]. " ENGINE=MyISAM";
$result3 = mysql_query($query, $link_id);
if($result3)
echo $result3."Innodb_변경완료<br>";
else
die(sql_error());
}//if
}//while
저런식으로 해서 확 자동으로 바뀌면 일단 성공하신거 축하 드립니다
근데 중간에 멈췄다.. 그럼 문제가 있는겁니다.
우선 저는 두가지 경우에 대해서 멈추었습니다.
최신 1.7.3.4를 처음 설치하신분들에게는 해당사항이 없으며
오래전부터 버전업 해오시던 분들이라면
xe_documents 에서 InnoDB 변환이 안되고 멈추는 현상이 있을수 있습니다.
저 같은 경우 그 이유는
xe_documents 에 title 라는 인덱스가 걸려 있었는데 이게 FULLTEXT 타입으로 되어 있었습니다.
InnoDB에서는 FULLTEXT 타입 인덱스를 지원하지 않더군요.
삭제를 해야 하나 말아야 하나 고민하다가
결론은 삭제를 했고 InnoDB로 테이블 변환에 성공하였습니다.
최신 1.7.3.4를 처음 설치하신분들이나 최근부터 쓰신분들은
아마도
xe_documents 에 title 라는 인덱스가 걸려있지 않을것이므로 변환에 아무런 이상이 없을듯 합니다.
(실제로 제가 완전히 새로 딱 1.7.3.4를 깔았더니 title라는 인덱스가 안 걸려 있었습니다. 아예 없더군요)
그리고 xe_counter_log 라는 녀석 변환시 걸려서 멈추었는데요.
이놈이 처음 설치되었을때부터 이제껏 방문한 사람들의 IP며 온갓 잡다한 기록을 가지고 있었습니다.
이게 용량이 좀 되더라구요.
my.cnf 에서 InnoDB 설정시
innodb_data_file_path = ibdata1:10M:autoextend
위와같은 문구가 있습니다.
innodb_data_file_path = ibdata1:10M:autoextend
innodb_data_file_path = ibdata1:10M:autoextend:max:1000M
이런식으로 MAX 값 제한을 걸었는데 이것보다 더큰 테이블 스페이스를 요구했다면서
오류를 내면서 뻣어 버리더라구요.
임시 방편이기도 하거니와
혹 다음에 내가 모르는 사이 용량이 엄청 커져서 뻣어 버릴까 겁나기도 하여서
max:1000M를 빼버리고
innodb_data_file_path = ibdata1:10M:autoextend
위와같이 설정하였더니 정상적으로 InnoDB 테이블로 변환되었습니다
xe_counter_log 테이블은 가급적 그냥 비우기 해서 데이터를 삭제 해주시는것이
홈페이지 속도 증가에도 도움이 될듯 합니다.
매번 접속시마다 저 테이블에서 데이터를 읽어 오면서 슬로우 쿼리를 유발한다는 분들이 많더라구요.
저같은 경우 테스트를 목적으로 일단 InnoDB 변환 성공후 데이터를 비워버렸습니다.
그럼 정리할께요.
innodb_data_file_path = ibdata1:10M:autoextend
1. 위와같이 설정하여 테이블 스페이스를 충분히 확보하여야 한다.
2. xe_documents 테이블에 혹시 title 라는 인덱스가 걸려 있다면 인덱스를 삭제한다.
(phpmyqdmin등으로 쉽게 삭제가 가능합니다.)
이상 MyISAM에서 InnoDB로 이전하면서 격은 삽질을 기록하여 보았습니다.
아참 그리고
참치k님 도움을 받아서....
files/config/db.config.php 파일을 열어서
$db_info->master_db = array('db_type' => 'mysql', 이렇게 되어 있는걸 아래와 같이
mysql_innodb로
고치셔야 추후 문제가 발생하지 않는다네요.
(댓글 참조하세요.)
$db_info->master_db = array('db_type' => 'mysql_innodb','db_port' => '3306','db_hostname' => 'localhost',
$db_info->slave_db = array(array('db_type' => 'mysql_innodb','db_port' => '3306','db_hostname' => 'localhost',
ps : 바꾸고 나니깐 속도가 좀 올라 오는것 같기도 하고 그렇네요.
총 물리 메모리 8기가 인데
DB 서버를 따로 안뽑아 놓다보니 InnoDB에 2G 할당한다고
아래와 같이 my.cnf 에서 설정잡았습니다.
설정과 관련하여 어떻게 바꾸면 더 좋을지 의견 남겨 주시면 감사하겠습니다.
default-storage-engine = innodb
# Uncomment the following if you are using InnoDB tables
innodb_data_home_dir = /usr/local/mysql/var/
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /usr/local/mysql/var/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
innodb_buffer_pool_size = 2G
innodb_additional_mem_pool_size = 16M
# Set .._log_file_size to 25 % of buffer pool size
innodb_log_file_size = 320M
innodb_log_buffer_size = 8M
innodb_flush_log_at_trx_commit = 1
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DSYNC
댓글 8
-
참치.k
2013.07.24 23:36
-
좋은아빠되기
2013.07.24 23:41
$db_info->master_db = array('db_type' => 'mysql','db_port' => '3306','db_hostname' => 'localhost',
위와같이 그냥 mysql 이라고만 나옵니다....
저걸 InnoDB로 바꾸시라는 건지요?
현재 바꾸지 않고도 정상적으로 글쓰기 등등 모든 기능이 정상 작동중입니다.
꼭 바꾸어야 하나요?
MyISAM 이라고 적혔다면 바로 InnoDB로 바꾸겠지만
mysql 이라고 애매하게 적혀 있네요...
아마도 제로보드xe에서 mysql 이면 MyISAM과 InnoDB를 자동으로 구분하는게 아닐지... 조심스럽게 짐작해 봅니다.
바꾸지 않고 문제가 발생할때까지 한번 버텨보고 싶어 지네요... 오기인가?? ㅎㅎㅎ
-
참치.k
2013.07.24 23:47
바꾸지 않으면 추후 새 테이블 생성할때 InnoDB 가 아닌 MyISAM 로 생성될겁니다 :)
쓰시다가 테이블 업데이트 하실때 MyISAM 로 바뀔수도 있구요. (제 경험상 그냥 쓰다가 MyISAM 로 바뀌는 경우도 있었구요)
문제가 발생하기전 백업은 꼭 해두십시요. 문제 터지고 백업 파일 찾으시면 곤란합니다 ㅎㅎㅎㅎㅎㅎ
-
좋은아빠되기
2013.07.24 23:53
그렇게 깊은 뜻이 있었군요.. 쫄아서 바로 바꿉니다.
$db_info->master_db = array('db_type' => 'InnoDB','db_port' => '3306','db_hostname' => 'localhost',
$db_info->slave_db = array(array('db_type' => 'InnoDB','db_port' => '3306','db_hostname' => 'localhost',
이렇게 바꾸면 된다는 거죠?
검사 부탁 드립니다. 꾸벅 ^___^;;
-
좋은아빠되기
2013.07.24 23:57
InnoDB로 바꾼는 순간 홈페이지가 뻣어 버리던데요.
다시 mysql로 수정해 두니깐 정상 작동합니다.
저는 InnoDB 엔진을 디폴트로 놓았기 때문에... MyISAM 테이블이 생성되지 않을 지도 모른다는... 희망을...
조심스럽게 가져 봅니다.
ps : 혹시 대소문자 구분하는지 싶어서
InnoDB 랑 innodb랑 두개 다 적어 봤는데. 여전히 뻤습니다.
mysql 이 맞는거 같기도 합니다... 혹시 참치 님 1.7.3.4 버전이시면 파일 직접 열어서 확인좀 부탁 드립니다.
-
참치.k
2013.07.24 23:59
$db_info->master_db = array('db_type' => 'mysql_innodb','db_port' => '3306','db_hostname' => 'localhost',
$db_info->slave_db = array(array('db_type' => 'mysql_innodb','db_port' => '3306','db_hostname' => 'localhost',
요렇게 수정하셔야 합니다~~
-
좋은아빠되기
2013.07.25 00:06
자문 자답하러 왔는데 답을 달아 놓으셨네요.
$db_info->master_db = array('db_type' => 'mysql_innodb'
이렇게 바꾸어야 하네요. ㅠ.ㅠ
1.7.3.4를 새로 이노디비로 해서 깔아서 파일 열어 봤더니 금방 확인이 되네요.
본문 내용은 수정해 두겠습니다.
가르침 감사합니다. ^______^;;
-
참치.k
2013.07.25 00:19
네, 말씀하신대로 바꾸시면 됩니다.
좋은 팁 감사드립니다.
이노디비로 바꿀때 db.config.php 파일에서 디비 타입을 mysql_innodb 로 수정해줘야 합니다 :)