mysqladmin utility로 간단하게 모니터링하기

운영환경의 MySQL 서버들은 보통 prometheus 와 grafana 등을 통해 구축된 모니터링 시스템으로 모니터링 및 로깅을 하고 있습니다.
그러나 외부 프로젝트 등으로 이러한 모니터링 시스템을 활용할 수 없는 경우에는 어떻게 해야할까요?
OS 상태는 iostat, vmstat 등으로 로깅할 수 있겠고 MySQL은 show global status 와 show processlist 등을 로깅하는 프로그램을 짤 수 있겠죠?
이 방법보다 더 간단한 방법이 있는데 바로 mysqladmin utility 입니다.

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

  -c, --count=#       Number of iterations to make. This works with -i
                      (--sleep) only.
  -r, --relative      Show difference between current and previous values when
                      used with -i. Currently only works with extended-status.
  status                Gives a short status message from the server
  extended-status       Gives an extended status message from the server  

MySQL 서버에 대한 정보를 10초에 한번씩 1000번 뽑아내라는 명령어 입니다.
relative 옵션은 sleep 과 extended-status 옵션과 함께 사용할 때 이전의 status 결과를 바탕으로 현재값과의 차이를 나타냅니다.

$ mysqladmin processlist status extended-status -uroot -pxxxx -S /home/db/mysql/tmp/mysql.sock --sleep=10 --count=100 --relative

### processlist
mysqladmin: [Warning] Using a password on the command line interface can be insecure.
+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
| Id     | User  | Host               | db | Command     | Time   | State                                                         | Info             |
+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
| 440551 | repl  | 10.161.78.43:51888 |    | Binlog Dump | 186032 | Master has sent all binlog to slave; waiting for more updates |                  |
| 542415 | admin | localhost          |    | Query       | 0      | starting                                                      | show processlist |
+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
Uptime: 977900  Threads: 2  Questions: 34882248  Slow queries: 38  Opens: 1001  Flush tables: 10  Open tables: 10  Queries per second avg: 35.670

### global status
+-----------------------------------------------+--------------------------------------------------+
| Variable_name                                 | Value                                            |
+-----------------------------------------------+--------------------------------------------------+
| Aborted_clients                               | 13                                               |
| Aborted_connects                              | 12                                               |
| Binlog_cache_disk_use                         | 1089                                             |
| Binlog_cache_use                              | 12306                                            |
| Binlog_stmt_cache_disk_use                    | 0                                                |
| Binlog_stmt_cache_use                         | 588                                              |
| Bytes_received                                | 12048278946                                      |
| Bytes_sent                                    | 29560239107                                      |
| Com_admin_commands                            | 40934                                            |
| Com_assign_to_keycache                        | 0                                                |
| Com_alter_db                                  | 0                                                |
| Com_alter_db_upgrade                          | 0                                                |
| Com_alter_event                               | 0                                                |
| Com_alter_function                            | 0                                                |
| Com_alter_instance                            | 0                                                |
| Com_alter_procedure                           | 0                                                |
| Com_alter_server                              | 0                                                |
.
.
.
.
### 10초 후 processlist

+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
| Id     | User  | Host               | db | Command     | Time   | State                                                         | Info             |
+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
| 440551 | repl  | 10.161.78.43:51888 |    | Binlog Dump | 186052 | Master has sent all binlog to slave; waiting for more updates |                  |
| 542415 | admin | localhost          |    | Query       | 0      | starting                                                      | show processlist |
+--------+-------+--------------------+----+-------------+--------+---------------------------------------------------------------+------------------+
Uptime: 977920  Threads: 2  Questions: 34882303  Slow queries: 38  Opens: 1002  Flush tables: 10  Open tables: 11  Queries per second avg: 35.669

### 10초 후 global status , 앞의 결과와 diff 값만 출력 

+-----------------------------------------------+--------------------------------------------------+
| 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                                | 5008                                             |
| Bytes_sent                                    | 66755                                            |
| Com_admin_commands                            | 2                                                |
| Com_assign_to_keycache                        | 0                                                |
| Com_alter_db                                  | 0                                                |
| Com_alter_db_upgrade                          | 0                                                |
| Com_alter_event                               | 0                                                |
| Com_alter_function                            | 0                                                |
| Com_alter_instance                            | 0                                                |
| Com_alter_procedure                           | 0                                                |
| Com_alter_server                              | 0                                                |
| Com_alter_table                               | 0                                                |
| Com_alter_tablespace                          | 0                                                |
| Com_alter_user                                | 0                                                |

이런 식으로 간단하게 MySQL 서버 상황을 로깅할 수 있습니다.
만약 MySQL innodb_buffer_pool size를 늘린 후 효과가 있는지, disk에서 읽어오던 데이터가 적어졌는지 확인하고 싶다면 아래와 같이 모니터링을 하면 간단하게 확인할 수 있습니다.

$ mysqladmin -r -i 1 -c 60 extended-status | egrep "Innodb_buffer_pool_read_requests|Innodb_buffer_pool_reads"

| Innodb_buffer_pool_read_requests | 99937722883 |
| Innodb_buffer_pool_reads         | 599056712   |
| Innodb_buffer_pool_read_requests | 293642      |
| Innodb_buffer_pool_reads         | 1           |
| Innodb_buffer_pool_read_requests | 296248      |
| Innodb_buffer_pool_reads         | 0           |
| Innodb_buffer_pool_read_requests | 294409      |
| Innodb_buffer_pool_reads         | 0           |
| Innodb_buffer_pool_read_requests | 296394      |
| Innodb_buffer_pool_reads         | 6           |
| Innodb_buffer_pool_read_requests | 303379      |
| Innodb_buffer_pool_reads         | 0           |
  • Innodb_buffer_pool_read_requests : innodb_buffer_pool 에서 읽어올 때
  • Innodb_buffer_pool_reads : disk에서 읽어올 때