MySQL判断

发布时间: 2023-11-21 12:35 阅读: 文章来源:1MUMB3931PS
概述

主备切换有两种场景,主动切换与被动切换。其中被动切换往往是因为主库出问题了,由 HA 系统发起的。如何判断主库是否出现问题呢?以下整理集中判断方法。

select 1

笔者刚接触连接池时(那个时候还是C3P0,DBCP等技术),测活机制就是使用select 1。但是成功返回只能说明这个库的进程还在,并不能说明主库没问题。

select 1失效情况

innodb_thread_concurrency 参数控制 InnoDB 的并发线程上限。以上实验,我把innodb_thread_concurrency 设置成 3,表示 InnoDB 只允许 3 个线程并行执行。前三个 session 中的 sleep(100),使得这三个语句都处于“执行”状态,以此来模拟慢查询。session D 里面,select 1 是能执行成功的,但是查询表 t 的语句会被堵住。也就是说这时候我们用 select 1 来检测实例是否正常,是检测不出问题的。

查表判断

为了能够检测 InnoDB 并发线程数过多导致的系统不可用情况,在系统库(mysql 库)里创建一个表,比如命名为 health_check,里面只放一行数据,然后定期执行:

mysql> select * from mysql.health_check;

问题:使用这个方法,我们可以检测出由于并发线程过多导致的数据库不可用的情况。但是,空间满了以后,无法判断。

insert插入判断insert into mysql.health_check(id, t_modified) values (1, now()) on duplicate key update t_modified=now();

问题:

双 M 结构,在备库 B 上执行的检测命令,也要发回给主库 A。但是,如果主库 A 和备库 B 都用相同的更新命令,就可能出现行冲突(主键冲突),也就是可能会导致主备同步停止。

insert+server idmysql> CREATE TABLE `health_check` ( `id` int(11) NOT NULL, `t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB;brbr/* 检测命令 */insert into mysql.health_check(id, t_modified) values (@@server_id, now()) on duplicate key update t_modified=now();白盒检测

MySQL 5.6 版本以后提供的 performance_schema 库,就在 file_summary_by_event_name 表里统计了每次 IO 请求的时间。单位: 纳秒

单次 IO 请求时间超过 200 毫秒属于异常,然后使用类似下面这条语句作为检测逻辑。

mysql> select event_name,MAX_TIMER_WAIT FROM performance_schema.file_summary_by_event_name where event_name in (‘wait/io/file/innodb/innodb_log_file‘,‘wait/io/file/sql/binlog‘) and MAX_TIMER_WAIT>200*1000000000;结语

一个简单的问题出发,如何判断数据库有问题,可以引出多种方案,而对每一种方案的理解又会涉及到对于数据库原理的深入理解。MySQL是一个经典的数据库,其中很多设计都值得我们好好深入理解。

引用: 林晓斌_MySQL实战45讲

•••展开全文