mysql - 在 MariaDB 中使用许多 UPDATE 监视 SQL 脚本的进度
问题描述
我正在运行一个包含数百万条更新语句的脚本,如下所示:
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 个组成部分。
我最初用它来运行它,但我认为如果我将交易设置并包装成 25 个块,AUTOCOMMIT=1
它会加快速度。AUTOCOMMIT=0
在自动提交模式下,我使用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 |
+----------+----------------+--------+-------------+
我的脚本会永远等待吗?我应该回到使用自动提交模式吗?有什么方法可以查看它的进展情况吗?我想我可以检查数据以获取更新,但这会很费力。
解决方案
- 通过实际检查数据来检查进度。
- 我假设你在做什么
COMMIT
? - 什么都看不到是合理的——每个
UPDATE
都需要几毫秒;之间会有Sleep
时间UPDATEs
。 Time
存在0
是你在进步的线索。PROCESSLIST
它已经走了多远,不一定有任何线索。- 您可以
SELECT SLEEP(1), $fid;
在循环中添加,其中 $fid (或其他)是最后UPDATEd
一行 id。这会使每 25 行的进度减慢 1 秒,所以也许你应该做 100 或 500 组。