mysql - 在 MariaDB 中监视具有许多更新的 SQL 脚本的进度

标签 mysql transactions mariadb database-table autocommit

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

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 个 block 中,它会加快速度。

在自动提交模式下,我使用了 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 只需要几毫秒; 更新之间会有休眠时间。
  • Time0 是您正在取得进展的线索。
  • PROCESSLIST 中不一定会有任何关于它已经进行了多远的线索。
  • 您可以在循环中添加 SELECT SLEEP(1), $fid;,其中 $fid(或其他)是最后一个 UPDATEd 行 ID。这会使每 25 行的进度减慢 1 秒,因此也许您应该以 100 或 500 为一组进行。

关于mysql - 在 MariaDB 中监视具有许多更新的 SQL 脚本的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628184/

相关文章:

mysql - 创建月份和年份列以加快时间戳查询

mysql - 多列索引与多索引

mysql - 尝试将 Coldfusion 9 连接到通过 MAMP(免费)安装的 MYSQL 数据源会引发错误

php - 用php向mysql插入不同的日期格式

mysql - Facebook 或 Twitter 是如何实现他们的订阅系统的

java - 带有延迟加载的 MVC

Azure:如何计算存储事务

java - JDBC 事务错误处理

c# - 如何显示自指表?

docker - 如何在 Docker 中使用 MariaDB?