我正在运行一个包含数百万条更新语句的脚本,如下所示:
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
只需要几毫秒;更新
之间会有休眠
时间。 Time
为0
是您正在取得进展的线索。PROCESSLIST
中不一定会有任何关于它已经进行了多远的线索。- 您可以在循环中添加
SELECT SLEEP(1), $fid;
,其中 $fid(或其他)是最后一个UPDATEd
行 ID。这会使每 25 行的进度减慢 1 秒,因此也许您应该以 100 或 500 为一组进行。
关于mysql - 在 MariaDB 中监视具有许多更新的 SQL 脚本的进度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52628184/