昨天晚上因为连续重建一些大表(每张表数据量都过一亿),导致其中有一个备库(使用的是普通的sas盘)崩溃,情况如下:
可见是io问题,查看错误号105 ,对应的错误信息为:
OS error code 105: No buffer space available
原来是缓存不够用,查看缓存的情况:
该服务器上因为多实例部署故该数据库buffer_pool只分配了大概16G的内存,事物写入模式innodb_flush_log_at_trx_commit 设置为2,即写内核buffer具体刷盘取决于系统每秒的调度情况。
故初步判断因为系统每秒刷盘的速度比写入buffer的速度要慢久而久之导致buffer内存不足,而buffer和cache不一样无法进行swap,即最终mysql因为刷盘太慢导致buffer耗尽而崩溃。
关闭一些其他实例,然后重启该数据库,查看系统io情况:
果然磁盘使用率已经达到了饱和,sas盘性能太不给力的问题导致io使用率一直巨高。之后的一些表也不敢重建,等备库追上主库再说吧。
ps : 以上分析仅仅是个人见解,不一定正确仅供参考。