如何判断一个数据库是不是出问题了?
select 1 判断
实际上,select 1成功返回,只能说这个库的进程还在,并不能说明主库没问题。
例如:innodb_thread_concurrency参数控制InnoDB的并发线程上限。一旦并发线程达到这个值,InnoDB在接收新请求的时候,就会进入等待状态,直到有线程退出。
通过innodb_thread_concurrency设置为64-128之间的值。
并发连接:show processlist的结果里,看到的几千个连接。
并发查询:当前正在执行的语句。
实际上,在线程进入锁等待以后,并发线程的计数会减1,也就是等待行锁(间隙锁)的线程不算在128以内。
查表判断
为了能够检测InnoDB并发线程过多导致额系统不可用的系统。一般的做法是,在系统库里创建一个表,比如命令为health check,里面只放一行数据,然后定期执行。
但是磁盘满的时候,会影响正常写数据,而不影响读数据。
更新判断
常见的作法是放一个timestamp字段,用来表示最后一次执行检测的时间。
可以在mysql.health_check表上存入多行数据,并采用server_id做主键,这样可以保证主、备各自的检测命令不会发生冲突。
外部检测天然有一个问题,就是随机性。外部检测都需要定时轮询,所以系统可能已经出问题了 ,但是却需要等到下一个检测发起执行语句的时候。
内部统计
MySQL5.6版本以后提供perfomance_schema库,就在file_summary_by_event_name表里统计了每次IO请求的时间。
每一次操作数据库,performance都需要额外地统计这些信息,所以存在性能损耗。建议只开启自己需要的统计项进行统计,然后根据时间判断耗时情况,如果大于指定秒数(200ms)则认为系统不可用。