MySQL 判断数据库是否可用

本文将介绍 MySQL 中判断数据库服务是否工作正常的方式。

一、SELECT 1 判断

SELECT 1 成功返回,说明 MySQL 的进程还在,但并不能说明 MySQL 没问题。

可能存在这样一个情况:

并发查询数量超过 innodb_thread_concurrency 参数,此时查询表的请求将会被迫等待,但 SELECT 1 不会有问题。

二、查询判断

一般的做法是,在系统库(mysql 库)中创建一个表,放置一行数据,执行查询语句检查数据库是否可用。

1
select * from mysql.health_check;

可能存在这样一个情况:

binlog 所在的磁盘空间已满,此时所有的更新语句将被堵住,而查询语句可以正常执行,此时将无法判断出异常。

三、更新判断

可以通过增加一个时间字段,每次判断时更新它,通过是否更新成功判断数据库是否可用。

1
update mysql.health_check set t_modified = now();

在主从模式下,主库和从库都需要检测,我们可以在 health_check 表中存入多行数据,分别以每台 MySQL 服务器的唯一的 server_id 作为主键,分别对各台服务器执行对应的更新语句

四、内部统计

上面的判断方法存在一个问题,它们能否判断成功是不确定的,在一台反应已经很慢的服务器中,一个简单的查询、更新语句也有可能很快执行成功,这将导致应用程序出现误判。

可以通过 MySQL 的内部统计进行判断,它具有更高的可靠性,performance_schema 库的 file_summary_by_event_name 表里统计了每次 IO 请求的时间。

参考

  • MySQL 技术内幕
  • MySQL 实战 45 讲
  • MySQL 是怎样运行的:从根儿上理解 MySQL