MySQL实战45讲Day28----如何判断数据库是否出问题

一、Select 1 判断:

 1、Select 1成功返回,只能说明这个库的进程还在,并不能说明主库没问题。

set global innodb_thread_concurrency=3;

CREATE TABLE `t` (
  `id` int(11) NOT NULL,
  `c` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

 insert into t values(1,1)


  设置innodb_thread_concurrency参数的目的是,控制InnoDB的并发线程上限。也就是说,一旦并发线程数达到这个值,InnoDB在接收到新请求的时候,就会进入等待状态,直到有线程退出。innodb_thread_concurrency设置成3,表示InnoDB只允许3个线程并行执行。
  把innodb_thread_concurrency设置成3,表示InnoDB只允许3个线程并行执行。而在上面的例子中,前三个session 中的sleep(100),使得这三个语句都处于“执行”状态,以此来模拟大查询。session D里面,select 1是能执行成功的,但是查询表t的语句会被堵住。也就是说,如果这时候用select 1来检测实例是否正常的话,是检测不出问题的。
  在InnoDB中,innodb_thread_concurrency这个参数的默认值是0,表示不限制并发线程数量。但是,不限制并发线程数肯定是不行的。因为,一个机器的CPU核数有限,线程全冲进来,上下文切换的成本就会太高。所以,通常情况下,建议把innodb_thread_concurrency设置为64~128之间的值。

 2、并发连接和并发查询:

 <1>、并发连接:

  在show processlist的结果里,看到的几千个连接,指的就是并发连接。

 <2>、并发查询:

  当前正在执行”的语句,指的是并发查询。

 <3>、设置innodb_thread_concurrency参数的原因:

  并发连接数达到几千个影响并不大,就是多占一些内存而已。而并发查询太高才是CPU杀手。

 <4>、在线程进入锁等待以后,并发线程的计数会减一的原因:

  就是说等行锁(也包括间隙锁)的线程是不算在innodb_thread_concurrency参数值里面的。MySQL这样设计是非常有意义的。因为,进入锁等待的线程已经不吃CPU了;更重要的是,必须这么设计,才能避免整个系统锁死

二、查表判断:

 1、判断方法:

  在系统库(mysql库)里创建一个表,比如命名为health_check,里面只放一行数据,然后定期执行:
mysql> select * from mysql.health_check;
使用这个方法,可以检测出由于并发线程过多导致的数据库不可用的情况。

 2、空间满了以后,这种方法变得不好使的原因:

  更新事务要写binlog,而一旦binlog所在磁盘的空间占用率达到100%,那么所有的更新语句和事务提交的commit语句就都会被堵住。但是,系统这时候还是可以正常读数据的。

三、更新判断:

 1、判断方法:

 <1>、方法一:

  放一个timestamp字段,用来表示最后一次执行检测的时间。这条更新语句类似于:
mysql> update mysql.health_check set t_modified=now();
节点可用性的检测都应该包含主库和备库。如果用更新来检测主库的话,那么备库也要进行更新检测。但是,备库的检测也是要写binlog的。由于一般会把数据库A和B的主备关系设计为双M结构,所以在备库B上执行的检测命令,也要发回给主库A。此时,如果主库A和备库B都用相同的更新命令,就可能出现行冲突,也就是可能会导致主备同步停止

 <2>、方法二:

  mysql.health_check表上存入多行数据,并用A、B的server_id做主键。

mysql> CREATE TABLE `health_check` (
  `id` int(11) NOT NULL,
  `t_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

/* 检测命令 */
insert into mysql.health_check(id, t_modified) values (@@server_id, now()) on duplicate key update t_modified=now();

 2、出现“判定慢”问题的原因:

  所有的检测逻辑都需要一个超时时间N。比如说执行一条update语句,超过N秒后还不返回,就认为系统不可用。
  但是当一个日志盘的IO利用率已经是100%的时候,整个系统响应非常慢,已经需要做主备切换了。但是IO利用率100%表示系统的IO是在工作的,每个请求都有机会获得IO资源,执行自己的任务。而检测使用的update命令,需要的资源很少,所以可能在拿到IO资源的时候就可以提交成功,并且在超时时间N秒未到达之前就返回给了检测系统。检测系统一看,update命令没有超时,于是就得到了“系统正常”的结论。也就是说,这时候在业务系统上正常的SQL语句已经执行得很慢了,但是DBA上去一看,HA系统还在正常工作,并且认为主库现在处于可用状态。

三、外部检测:

 1、外部检测包含:

  Select 1 判断、查表判断、更新判断。

 2、外部检测存在的问题:

  外部检测都需要定时轮询,所以系统可能已经出问题了,但是却需要等到下一个检测发起执行语句的时候,才有可能发现问题。而且,会可能第一次轮询还不能发现,这就会导致切换慢的问题。

四、内部统计:

 1、可以通过获取内部每一次IO请求的时间来判断数据库是否出问题:

  MySQL 5.6版本以后提供了performance_schema库,在file_summary_by_event_name表里统计了每次IO请求的时间。file_summary_by_event_name表里有很多行数据,先看event_name='wait/io/file/innodb/innodb_log_file’这一行。

performance_schema.file_summary_by_event_name的一行

这一行表示统计的是redo log的写入时间:

  • 第一列EVENT_NAME 表示统计的类型。

    接下来的三组数据,显示的是redo log操作的时间统计:

  • 第一组五列,是所有IO类型的统计。其中,COUNT_STAR是所有IO的总次数,接下来四列是具体的统计项, 单位是皮秒;前缀SUM、MIN、AVG、MAX,顾名思义指的就是总和、最小值、平均值和最大值。
  • 第二组六列,是读操作的统计。最后一列SUM_NUMBER_OF_BYTES_READ统计的是,总共从redo log里读了多少个字节。
  • 第三组六列,统计的是写操作。
  • 第四组数据,是对其他类型数据的统计。在redo log里,可以认为它们就是对fsync的统计。

 2、打开redo log的时间监控的方法:

mysql> update setup_instruments set ENABLED='YES', Timed='YES' where name like '%wait/io/file/innodb/innodb_log_file%';

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容