mysqladmin 을 통한 상태로깅

mysqladmin 을 이용하여 장애시 해당 상황을 로깅하자.

  • 지금 서버에 문제가 있다고 가정하자… 어떻게 모니터링을 할 것인가… os 에서는 iostat 혹은 vmstat등으로 cpu, memory, io 를 모니터링 하겠지만 MySQL에서는 show proceslist 를 치면서 계속 모니터링하기도 힘든일이다. 이러한 경우 mysqladmin을 이용해보자.

    mysqladmin processlist status extended-status -uroot -pxxx –sleep=10 –count=1000 –relative

MySQL 에 대한 정보를 10초에 한번씩 1000번 뽑아내라는 명령어이다. relative 는 sleep 과 extended-status 옵션과 함께 사용하면 앞의 status 결과를 바탕으로 현재값과의 차이를 나타낸다. MySQL에 문제가 발생하면, 해당 스크립트를 통해 로깅을 시작하고 해당 파일을 이용하면 장애상황 분석시 용이한 자료로 사용할 수 있다. 이는 다음과 같이 간단하게 쓸 수 있다.

/db/5.6/bin/mysqladmin proc stat ext -uroot -pxxx -i10 -c10000 -r



-- processlist : processlist 를 보여준다.
+----+------+-----------+----+---------+------+-------+------------------+
| Id | User | Host      | db | Command | Time | State | Info             |
+----+------+-----------+----+---------+------+-------+------------------+
| 39 | root | localhost |    | Query   | 0    | init  | show processlist |
+----+------+-----------+----+---------+------+-------+------------------+

-- status : 현재 MySQL 의 상태를 보여준다.
Uptime: 105298  Threads: 1  Questions: 208  Slow queries: 0  Opens: 98  Flush tables: 2  Open tables: 30  Queries per second avg: 0.001

-- extended-status : show global status 값을 보여준다.
+-----------------------------------------------+-------------+
| Variable_name                                 | Value       |
+-----------------------------------------------+-------------+
| Aborted_clients                               | 15          |
| Aborted_connects                              | 1           |
| Binlog_cache_disk_use                         | 0           |
| Binlog_cache_use                              | 0           |
| Binlog_stmt_cache_disk_use                    | 0           |
| Binlog_stmt_cache_use                         | 0           |
| Bytes_received                                | 14267       |
| Bytes_sent                                    | 260123      |
| Com_admin_commands                            | 0           |
| Com_assign_to_keycache                        | 0           |
.....

-- relative : 앞에서 뽑아낸 global status 의 값과 현재 값을 비교하여 뽑아낸다.
-- 두번째 등장하는 extended-status 의 값
+-----------------------------------------------+-------------+
| Variable_name                                 | Value       |
+-----------------------------------------------+-------------+
| Aborted_clients                               | 0           |
| Aborted_connects                              | 0           |
| Binlog_cache_disk_use                         | 0           |
| Binlog_cache_use                              | 0           |
| Binlog_stmt_cache_disk_use                    | 0           |
| Binlog_stmt_cache_use                         | 0           |
| Bytes_received                                | 61          |
| Bytes_sent                                    | 9734        |
| Com_admin_commands                            | 0           |
| Com_assign_to_keycache                        | 0           |
.....

추가적인 Tip

갑자기 생각난것이 있는데… show global status 시 0이나 의미 없는값 모두 보여주기에 너무 많은 값을 보여준다. 이는 아래의 명령어를 통해 제거할 수 있다. 물론 해당 포스트의 내용이 적어 갑자기 생각난것은 아니다…후후 show global status where value; 를 통하여 0이나 String 값을 제거해보자.

mysql> show global status;
+-----------------------------------------------+-------------+
| Variable_name                                 | Value       |
+-----------------------------------------------+-------------+
| Aborted_clients                               | 18          |
| Aborted_connects                              | 1           |
| Binlog_cache_disk_use                         | 0           |
| Binlog_cache_use                              | 0           |
.....
341 rows in set (0.00 sec)


-- 0 이나 integer 가 아닌값을 제거한다.
mysql> show global status where value;
+-----------------------------------+----------+
| Variable_name                     | Value    |
+-----------------------------------+----------+
| Aborted_clients                   | 20       |
| Aborted_connects                  | 1        |
| Bytes_received                    | 16952    |
| Bytes_sent                        | 420572   |
94 rows in set, 16 warnings (0.01 sec)

mysql> show warnings;
+---------+------+--------------------------------------------------+
| Level   | Code | Message                                          |
+---------+------+--------------------------------------------------+
| Warning | 1292 | Truncated incorrect INTEGER value: 'OFF'         |
| Warning | 1292 | Truncated incorrect INTEGER value: 'not started' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'not started' |
| Warning | 1292 | Truncated incorrect INTEGER value: 'ON'          |
| Warning | 1292 | Truncated incorrect INTEGER value: '0.000000'    |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: 'OFF'         |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
| Warning | 1292 | Truncated incorrect INTEGER value: 'NONE'        |
| Warning | 1292 | Truncated incorrect INTEGER value: ''            |
+---------+------+--------------------------------------------------+

-- warning은 위와 같은데... 무시할 수 있다. warning을 확인하니, show global status의 value 값을 integer value로 바꾸고 해당값이 0이면 찍어내지 않는것 같다.
-- show global status where value <> 0; 위와 같이 사용하는것이 더 괜찮은 방법일 수도 있겠다.