저번에 mysqld프로세스 증가에 대해서 질문드렸던 솔비예요..
다름 아니라 원인은 밝혀냈는데 이유를 모르겠습니다.
우선 상황설명부터드리겠습니다.
1. 문제발생
mysqld프로세스 이상증가(회원이 거의 없어 동시접속자수가 늘어날
이유없음)
2. mysqladmin으로 프로세스상태 확인
+----+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
| 9 | root | localhost | hnarang | Query | 278 | Sending data | select id, replace(title, \김문주\, \김문주\) as title,name,reg_date ,(UNIX_TIMESTAMP(now())-UNIX_TI |
| 13 | root | localhost | hnarang | Query | 87 | Sending data | select id, replace(title, \김문주\, \김문주\) as title,
name,reg_date ,
count,mail, depth ,user_file |
| 18 | root | localhost | hnarang | Query | 0 | NULL | show processlist |
| 19 | hnarang | localhost | hnarang | Query | 30 | Locked | LOCK TABLES board WRITE |
+----+---------+-----------+---------+---------+------+--------------+------------------------------------------------------------------------------------------------------+
위와 같이 query가 60개이상이 발생
locked된 프로세스도 발생
이와 같이 지속적인 문제 발생하여
3. myisamchk체크
첫번째
myisamchk -er /usr/local/mysql/data/hnarang/board
- recovering (with sort) MyISAM-table \/usr/local/mysql/data/hnarang/board.MYI\
Data records: 291
- Fixing index 1
Found block with too small length at 29444; Skipped
Found link that points at 7318349401423872 (outside data file) at 85380
Found block with too small length at 99516; Skipped
Found block with too small length at 121224; Skipped
Found link that points at 3602894228300904244 (outside data file) at 154760
Found block that points outside data file at 168152
Found block that points outside data file at 169172
Found block that points outside data file at 171760
Found block that points outside data file at 172652
Found block that points outside data file at 185480
Found block that points outside data file at 188312
두번째 실시
정상 복구
4. 다시 위와 같은 문제 발생
발생장소 : 게시판
발생원인 : 검색부분이상
-검색시 검색안되고 계속 쿼리시간만 증가
-검색후 게시판 리스트보기 하면 볼 수없음, 하지만 mysql데몬 죽이고
처음시 게시판 리스트 보기 가능..
결국, 처음 문제발생전 즉, 검색을 사용하지않고 리스트 보기는 정상적이나
검색사용한후 데몬프로세스의 시간증가 발생시 리스트보기기능 불가능
즉, 위에서 문제발생후 리스트보기하면 테이블 locked발생
이상황에서 mysqld stop시 stop안됨
Killing mysqld with pid 21925
Wait for mysqld to exitc
.c
.c
.c
.c
.c
위와 같은 증상보임
다시 myisamchk시 이상없음, 에러없음
5. 문제 쿼리 직접실행
select id, replace(title, \김문주\, \김문주\) as title,
name,reg_date ,
(UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(reg_date))/3600,
count,mail, depth ,user_file,image,hits
from board
where title like \%김문주%\
order by pos
replace(title, \김문주\, \김문주\)이 문제 일으킴
원래 sql의도는 프로그램어가 coolbbs소스에서
글자색깔을 바꾸려고 했던 것을 그냥 빼고 이부분을 그냥 집어넣은채로
게시판 운영
이부분을 제거한 후 정상적인 검색가능했음
의문점
1. myisamchk체크 시 아래와 같은 내용이 무엇을 뜻하는지요
첫번째
myisamchk -er /usr/local/mysql/data/hnarang/board
- recovering (with sort) MyISAM-table \/usr/local/mysql/data/hnarang/board.MYI\
Data records: 291
- Fixing index 1
Found block with too small length at 29444; Skipped
Found link that points at 7318349401423872 (outside data file) at 85380
Found block with too small length at 99516; Skipped
Found block with too small length at 121224; Skipped
Found link that points at 3602894228300904244 (outside data file) at 154760
Found block that points outside data file at 168152
Found block that points outside data file at 169172
Found block that points outside data file at 171760
Found block that points outside data file at 172652
Found block that points outside data file at 185480
Found block that points outside data file at 188312
2. 문제가 생긴 mysql버젼은 3.23.32
문제생긴 데이타베이스를 백업받아 상위버젼 3.23.41(리눅스) 그리고 3.23.46(윈도우)
에서는 문제가 생기지 않음
같은 버젼(3.23.32)을 설치하여 동일한 명령을 내린 결과 동일한 문제 발생하였습니다.
물론 3.23.41(리눅스)에 문제있는 데이타베이스를 백업하여 설치한 결과 동일 명령결과에
이상없이 쿼리가 가능했습니다.
프로그램어는 예전에 검색이 되었다고 말은 하는데
제입장에서 보면
우선, 문제있는 테이블을 백업하여 동일한 mysql버젼을 설치한 후 복원후 쿼리시 동일문제
발생 그리고 상위버변에 문제있는 테이블 백업하여 복원후 동일 쿼리시 문제발생되지 않음
의 결과로 볼때는 처음부터 이쿼리가 3.23.32에서 되지 않았다고 볼 수밖에 없었습니다.
하지만, 원래 소스가 정진호씨의 책의 내용으로 만든것으로 보아 당시버젼이(책의 인스톨과정)
으로 보아 mysql-3.22.23b버젼 이었고, 여기서 테스트해서 나온 책이므로 mysql버젼상의
문제라고 보기도 어렵습니다..
또한, 쿼리방식도 물론 replace함수(용도 글자체 또는 색깔 변환) 쓰는 것이 이 게시판에서
필요없기는 하지만 틀리지는 않는 구문이므로 쿼리의 잘못이라고도 볼 수가 없는 상황입니다.
또한, 테이블이 깨진 상태에서 복구(myisamchk)는 하였으나, 새로운 동일한 버젼mysql을 설치
하여 백업테이블을 복원하여 동일한 문제 발생도 사실은 데이타 베이스 자체문제라고 보기도
어려운 상황이라 생각합니다..
굳이 제가 생각한 것은 문제있는 테이블을 백업하여 복원한 것도 결국은 문제있는 테이블이라고
생각할 수밖에 없습니다. 하지만, 이것도 문제있는 테이블백업파일을 상위버젼인 3.23.41(리눅스)
에서 문제가 발생하지 않기때문에 테이블에 이상이 있어서 안된다고 보기도 어려운 상황이죠
여러분의 많은 질타와 의견을 부탁드립니다.
감사합니다.
[참고 query문]
select id, replace(title, \김문주\, \김문주\) as title,
name,reg_date ,
(UNIX_TIMESTAMP(now())-UNIX_TIMESTAMP(reg_date))/3600,
count,mail, depth ,user_file,image,hits
from board
where title like \%김문주%\
order by pos
[문제있는 버젼의 정보]
./configure --prefix=/usr/local/mysql\
--localstatedir=/usr/local/mysql/data \
--with-charset=euc_kr
mysql Ver 11.12 Distrib 3.23.32, for pc-linux-gnu (i686)
Connection id: 422
Current database: hnarang
Current user: root@localhost
Current pager: stdout
Using outfile: \
Server version: 3.23.32-log
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: euc_kr
Server characterset: euc_kr
UNIX socket: /tmp/mysql.sock
Uptime: 3 hours 24 sec
Threads: 1 Questions: 2565 Slow queries: 0 Opens: 82 Flush tables: 1 Open tables: 64 Queries per second avg: 0.237
+--------------------------+----------+
| Variable_name | Value |
+--------------------------+----------+
| Aborted_clients | 0 |
| Aborted_connects | 1 |
| Bytes_received | 131656 |
| Bytes_sent | 41129015 |
| Connections | 424 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 0 |
| Created_tmp_files | 0 |
| Delayed_insert_threads | 0 |
| Delayed_writes | 0 |
| Delayed_errors | 0 |
| Flush_commands | 1 |
| Handler_delete | 1 |
| Handler_read_first | 95 |
| Handler_read_key | 572 |
| Handler_read_next | 353 |
| Handler_read_prev | 200 |
| Handler_read_rnd | 119172 |
| Handler_read_rnd_next | 176915 |
| Handler_update | 211 |
| Handler_write | 3 |
| Key_blocks_used | 63 |
| Key_read_requests | 1542 |
| Key_reads | 63 |
| Key_write_requests | 62 |
| Key_writes | 28 |
| Max_used_connections | 1 |
| Not_flushed_key_blocks | 0 |
| Not_flushed_delayed_rows | 0 |
| Open_tables | 64 |
| Open_files | 129 |
| Open_streams | 0 |
| Opened_tables | 82 |
| Questions | 2569 |
| Select_full_join | 0 |
| Select_full_range_join | 0 |
| Select_range | 4 |
| Select_range_check | 0 |
| Select_scan | 831 |
| Slave_running | OFF |
| Slave_open_temp_tables | 0 |
| Slow_launch_threads | 0 |
| Slow_queries | 0 |
| Sort_merge_passes | 0 |
| Sort_range | 4 |
| Sort_rows | 119172 |
| Sort_scan | 606 |
| Threads_cached | 0 |
| Threads_created | 423 |
| Threads_connected | 1 |
| Threads_running | 1 |
| Uptime | 10850 |
+--------------------------+----------+
[문제없는 버젼의 정보]
cd mysql-3.23.41
./configure --prefix=/usr/local/mysql --with-charset=euc_kr
/usr/local/mysql/bin/mysql Ver 11.15 Distrib 3.23.41, for pc-linux-gnu (i686)
Connection id: 7
Current database: hnarang
Current user: root@localhost
Current pager: stdout
Using outfile: \
Server version: 3.23.41
Protocol version: 10
Connection: Localhost via UNIX socket
Client characterset: euc_kr
Server characterset: euc_kr
UNIX socket: /tmp/mysql.sock
Uptime: 18 min 46 sec
Threads: 1 Questions: 464 Slow queries: 0 Opens: 34 Flush tables: 1 Open tables: 18 Queries per second avg: 0.412
+--------------------------+--------+
| Variable_name | Value |
+--------------------------+--------+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 244902 |
| Bytes_sent | 39951 |
| Connections | 26 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 0 |
| Created_tmp_files | 0 |
| Delayed_insert_threads | 0 |
| Delayed_writes | 0 |
| Delayed_errors | 0 |
| Flush_commands | 1 |
| Handler_delete | 0 |
| Handler_read_first | 42 |
| Handler_read_key | 23 |
| Handler_read_next | 0 |
| Handler_read_prev | 0 |
| Handler_read_rnd | 19 |
| Handler_read_rnd_next | 487 |
| Handler_update | 0 |
| Handler_write | 302 |
| Key_blocks_used | 9 |
| Key_read_requests | 483 |
| Key_reads | 1 |
| Key_write_requests | 306 |
| Key_writes | 306 |
| Max_used_connections | 1 |
| Not_flushed_key_blocks | 0 |
| Not_flushed_delayed_rows | 0 |
| Open_tables | 18 |
| Open_files | 36 |
| Open_streams | 0 |
| Opened_tables | 34 |
| Questions | 464 |
| Select_full_join | 0 |
| Select_full_range_join | 0 |
| Select_range | 0 |
| Select_range_check | 0 |
| Select_scan | 20 |
| Slave_running | OFF |
| Slave_open_temp_tables | 0 |
| Slow_launch_threads | 0 |
| Slow_queries | 0 |
| Sort_merge_passes | 0 |
| Sort_range | 0 |
| Sort_rows | 19 |
| Sort_scan | 13 |
| Table_locks_immediate | 397 |
| Table_locks_waited | 0 |
| Threads_cached | 0 |
| Threads_created | 25 |
| Threads_connected | 1 |
| Threads_running | 1 |
| Uptime | 1160 |
+--------------------------+--------+
54 rows in set (0.00 sec)
|