我的环境是 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