我正在运行一个包含数百万条更新语句的脚本,如下所示:
UPDATE data SET value = 0.9234 WHERE fId = 47616 AND modDate = '2018-09-24' AND valueDate = '2007-09-01' AND last_updated < '2018-10-01';
fid、moddate和valuedate是数据表复合主键的3个组件。
我最初是和 AUTOCOMMIT=1
但我想如果我开始 AUTOCOMMIT=0
把交易分成25块。
在自动提交模式下,我使用 SHOW PROCESSLIST
我会在输出中看到update语句,所以从fid外键,我可以看出脚本已经进展了多远。
然而,没有自动提交,看着它现在运行,我没有看到任何与 SHOW PROCESSLIST
,仅此而已:
610257 schema_owner_2 201.177.12.57:53673 mydb Sleep 0 NULL 0.000
611020 schema_owner_1 201.177.12.57:58904 mydb Query 0 init show processlist 0.000
这个 Sleep
状态让我怀疑系统上的其他用户正在阻止更新,但是如果我运行 SHOW OPEN TABLES
我不确定是否有问题:
MariaDB [mydb]> SHOW OPEN TABLES;
+----------+----------------+--------+-------------+
| Database | Table | In_use | Name_locked |
+----------+----------------+--------+-------------+
| mydb | data | 2 | 0 |
| mydb | forecast | 1 | 0 |
| mydb | modification | 0 | 0 |
| mydb | data3 | 0 | 0 |
+----------+----------------+--------+-------------+
我的剧本会永远等下去吗?我应该回到使用自动提交模式吗?有没有办法看看进展有多大?我想我可以检查数据的更新,但这将是艰苦的拼凑起来。
1条答案
按热度按时间jhdbpxl91#
通过实际检查数据来检查进度。
我猜你在做什么
COMMIT
?什么都看不到是合理的——每一个都是
UPDATE
只需要几毫秒;会有的Sleep
时间间隔UPDATEs
.Time
存在0
是你的线索,它正在进展。不一定会有任何线索
PROCESSLIST
它已经走了多远。你可以加上
SELECT SLEEP(1), $fid;
在循环中,$fid(或其他)是最后一个UPDATEd
行id。这会使进度每25行减慢1秒,所以可能您应该执行100或500个组。