1. 数据库可用性监控
1.1 判断数据库是否可以通过网络连接
(1)mysqladmin -umonitor_user -p -h ping
或者 telnet ip db_port
;
(2)使用程序通过网络建立数据库连接,来进行预警。
1.2 确认数据库是否可读写
(1)写检查:检查数据库的read_only参数是否为off;
(2)写检查:建立监控表并对表中数据进行更新;
(3)读检查:执行简单的查询 select @@version。
1.3 监控数据库的连接数
show variables like 'max_connections'; #查看数据库的最大连接数;
show global status like 'Threads_connected'; #查看数据库当前的连接数;
可以通过 Threads_connected/max_connections>0.8 来进行报警
2. 数据库性能监控
2.1 计算 QPS(查询量/秒) 和 TPS(事务数/秒)
可以通过 show global status like ‘%xxx%’ 周期性获取变量数值来计算。
计算公式:
QPS = (Queries2-Queries1)/(Uptime_sice_flush_status2-Uptime_sice_flush_status1)
TPS = ((Com_insert2 + Com_update2 + Com_delete2)-(Com_insert1 + Com_update1 + Com_delete1))/(Uptime_sice_flush_status2-Uptime_sice_flush_status1)
2.2 如何监控数据库的并发请求数量
show global status like 'Threads_running'; #通常情况下并发处理的数量会远小于同一时间连接到数据库的线程数量,除非阻塞。
2.3 如何监控Innodb的阻塞
SELECT b.trx_mysql_thread_id AS '被阻塞的线程',b.trx_query AS '被阻塞SQL', c.trx_mysql_thread_id AS '阻塞线程',c.trx_query AS '阻塞SQL',(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started)) AS '阻塞时间'
FROM information_schema.innodb_lock_waits a
JOIN information_schema.innodb_trx b ON a.requesting_trx_id = b.trx_id
JOIN information_schema.innodb_trx c ON a.requesting_trx_id = c.trx_id
WHERE (UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started))>60 ; #(UNIX_TIMESTAMP()-UNIX_TIMESTAMP(c.trx_started))为阻塞时间(秒)
3. 主从复制监控
3.1 监控主从复制延迟
(1)使用多线程的程序同时对于主从服务器的状态来进行检查;
(2)在主上执行命令查看二进制日志的文件名和偏移量:show master status \G;
(3)在从上执行命令查看二进制日志的文件名和偏移量:show slave status \G;
通过对比二进制日志的名字和偏移量来判断主从复制是否延迟。
3.2 验证主从复制的数据是否一致
使用插件:
pt-table-checksum u=dba,p='password' --databases test --replicate test.checksums # 在数据库下创建一张表,写入不一致的数据。该命令使用在主库下,会自动发现主库下的所有从库信息。