监视 SQL 脚本在 MariaDB 中的许多更新的进度

Monitoring progress of a SQL script with many UPDATEs in MariaDB

我正在 运行 编写一个包含数百万个更新语句的脚本,如下所示:

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 是数据 table 的复合主键的 3 个组件。

我最初 运行 使用 AUTOCOMMIT=1,但我认为如果我设置 AUTOCOMMIT=0 并将 t运行 动作包装成 25 个块,它会加快速度。

在自动提交模式下,我使用了 SHOW PROCESSLIST 并且我会在输出中看到 UPDATE 语句,因此从 fId 外键,我可以知道脚本进行了多远。

但是没有自动提交,现在正在看 运行ning,我还没有看到 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 将花费很少的毫秒; UPDATEs.
  • 之间会有 Sleep 时间
  • Time0 是你的线索,它正在进步。
  • PROCESSLIST 中不一定会有任何线索表明它已经走了多远。
  • 您可以在循环中添加 SELECT SLEEP(1), $fid;,其中 $fid(或其他)是最后一个 UPDATEd 行 ID。这会使每 25 行的进度减慢 1 秒,因此也许您应该以 100 或 500 为一组进行分组。