04月22, 2020
收藏本站

使用phpMyAdmin导入mysql数据hang住?

有一天,开发同事在线上使用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