有一天,开发同事在线上使用phpMyAdmin导入了一张表,结果过了几分钟,跑来跟我说CPU跑高了,不知道是否跟导入的表有关?
简单top -c查看之后,mysql进程确实跑高到100%了!
赶紧登入mysql,show full processlist查看。
mysql> show processlist;
+----------+-------+----------------+------+---------+---------+---------------+--------------------------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----------+-------+----------------+------+---------+---------+---------------+--------------------------------------------------+
| 27732781 | admin | 127.0.0.1:26884| test | Query | 336 | Opening tables| SHOW SESSION VARIABLES LIKE 'FOREIGN_KEY_CHECKS' |
| 27739775 | admin | localhost | NULL | Query | 0 | starting | show full processlist |
+----------+-------+----------------+------+---------+---------+---------------+--------------------------------------------------+
SHOW SESSION VARIABLES LIKE 'FOREIGN_KEY_CHECKS'一直处于Opening tables执行中,果断先kill掉。
排查
通过查看error log、slow log都没发现什么问题,最好只好查看binlog日志了,发现binlog中执行的记录跟开发提供的执行脚本并不一致,create table之后并没有insert记录。
来,提供下开发导入的脚本(简化后):
--
-- Table structure for table `user`
--
DROP TABLE IF EXISTS `user`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `user` (
`id` smallint(5) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(64) NOT NULL COMMENT '用户名',
`nickname` varchar(50) NOT NULL COMMENT '昵称/姓名'
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `user`
--
LOCK TABLES `user` WRITE;
/*!40000 ALTER TABLE `user` DISABLE KEYS */;
INSERT INTO `user` VALUES (1,'aaa','abul'),(2,'bbb','camille');
/*!40000 ALTER TABLE `user` ENABLE KEYS */;
UNLOCK TABLES;
然而从binlog中查看到的信息,create table user之后并没有看到insert记录,就一直处于show session variables like ''.如果此时想要drop table user都会报错,因为还没有unlock tables;
通过查资料,在mysql的BUG中(传送门)就有人提了,大致原因没看懂,原因就在于使用了phpMyAdmin,而该工具会频繁执行show variables,导入的时候lock tables会使mysql处于hang住。
Comments