MySQL 锁定 INNODB 表

MySQL 锁定 INNODB 表

我的环境是 Windows 7 并且我正在使用 XAMPP。

我正在对 MySQL 进行一些性能测试,模拟一次添加 100 行。我使用带有 for 循环的简单 PHP 查询执行此操作。

然而,MySQL 似乎已经锁定,因为我无法再向表中添加任何内容。

我登录MySQL查看进程列表如下:

mysql> SHOW PROCESSLIST \G;
*************************** 1. row ***************************
     Id: 1
   User: root
   Host: localhost:49349
     db: NULL
Command: Sleep
   Time: 2
  State:
   Info: NULL
*************************** 2. row ***************************
     Id: 17
   User: root
   Host: localhost:49759
     db: NULL
Command: Query
   Time: 0
  State: NULL
   Info: SHOW PROCESSLIST
2 rows in set (0.00 sec)

我尝试了两件事:

A.KILL QUERY 17 我得到以下结果:

mysql> KILL QUERY 17; ERROR 1317 (70100): Query execution was interrupted

B. 然后我使用 XAMPP 控制器停止 mysql 然后重新启动它,但这不起作用,因为表似乎被永久锁定。

我也无法将数据添加到数据库中的其他 INNODB 表。MyISAM 表似乎没问题。

有没有办法可以强制 INNODB 重新启动或执行其他操作,例如所有查询和连接?

提前致谢。

编辑

事实证明,这个问题最初是由我使用 PHP PDO for MySQL 执行查询的方式引起的。我PDO::ATTR_AUTOCOMMIT = false在创建 MYSQL 连接时已经设置好了(出于某些原因,我无法更改),所以我必须专门运行$db_connection_handle->query('COMMIT;')以专门提交事务。所以看起来表被锁定了。

答案1

  • 检查您的日志。您可能会发现 ibdata 文件已满,无法扩展或未设置为自动扩展。
  • 检查show innodb status寻找活跃交易。例如:

 ---TRANSACTION 0 16662058, ACTIVE 20 sec, process no 22014, OS thread id 140277380307216
 2 lock struct(s), heap size 368, 30 row lock(s), undo log entries 30
 MySQL thread id 3662, query id 46913632 localhost user
 Trx read view will not see trx with id >= 0 16662059, sees < 0 16662059

相关内容