首页 > 解决方案 > 在 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 |
+----------+----------------+--------+-------------+

我的脚本会永远等待吗?我应该回到使用自动提交模式吗?有什么方法可以查看它的进展情况吗?我想我可以检查数据以获取更新,但这会很费力。

标签: mysqltransactionsmariadbdatabase-tableautocommit

解决方案


  • 通过实际检查数据来检查进度。
  • 我假设你在做什么COMMIT
  • 什么都看不到是合理的——每个UPDATE都需要几毫秒;之间会有Sleep时间UPDATEs
  • Time存在0是你在进步的线索。
  • PROCESSLIST它已经走了多远,不一定有任何线索。
  • 您可以SELECT SLEEP(1), $fid;在循环中添加,其中 $fid (或其他)是最后UPDATEd一行 id。这会使每 25 行的进度减慢 1 秒,所以也许你应该做 100 或 500 组。

推荐阅读