最近有台MySQL,在运行一段时间后,res和virt内存都会去到很高,res会占到物理内存的90%,最终导致业务异常
期间做过的尝试:
- 用tcpcopy来把生产环境的流量导到测试服,但MySQL内存并无异常
- 将innodbfilepertable=1修改为innodbfilepertable=0,运行1天后,内存飙升还是比较厉害
上面的措施都没有用。
下面这个,不确定有没有试过,也记录下吧
mysqldump -q,就是把数据尽快写到磁盘,而不是存在内存
最后是同事看监控,发现在凌晨,MySQL备份后,内存才飙升,我们最后定位到MySQL内存异常的原因是以下2个:
- xxx_db下表太多:近2W了,一个区服就一个表来寸配置
- 由于表太多,下面的指令把整个库的表结构导出来的时候,估计会把整个结构先写入内存,但理论上,这个表结构不会大
mysqldump -d $1 > $1_db_struc.sql
解决办法:
- 不导整个库的结构,一个表一个表地导(这个也是目前的做法),或者直接就不导结构,因为都是一样的
- 减少表数量,我们后来把它改为了这种方式,单个表存所有区服的信息