MariaDB表有元数据锁,但没有阻塞线程

MariaDB表有元数据锁,但没有阻塞线程

我在 Debian 系统上安装了 MariaDB 15.1:

$ mariadb --version
mariadb  Ver 15.1 Distrib 10.4.14-MariaDB, for debian-linux-gnu (x86_64) using readline 5.2

脚本定期使用 向表中加载数据LOAD DATA LOCAL INFILE。在前一个 LOAD 作业完成之前,该脚本不会尝试新的 LOAD 作业。它运行良好,但最近在没有任何外部更改的情况下失败了(进程挂起且无结果)。

手动执行查询或仅在 mysqlclient 中运行插入都会产生相同的行为。

查看进程列表,我看到以下内容:

MariaDB [information_schema]> SHOW FULL PROCESSLIST;
+---------+-------------+-------------------------+--------------------+---------+-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------+----------+
| Id      | User        | Host                    | db                 | Command | Time  | State                           | Info                                                                                                                            | Progress |
+---------+-------------+-------------------------+--------------------+---------+-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------+----------+
|       2 | system user |                         | NULL               | Daemon  |  NULL | InnoDB purge worker             | NULL                                                                                                                            |    0.000 |
|       1 | system user |                         | NULL               | Daemon  |  NULL | InnoDB purge coordinator        | NULL                                                                                                                            |    0.000 |
|       3 | system user |                         | NULL               | Daemon  |  NULL | InnoDB purge worker             | NULL                                                                                                                            |    0.000 |
|       4 | system user |                         | NULL               | Daemon  |  NULL | InnoDB purge worker             | NULL                                                                                                                            |    0.000 |
|       5 | system user |                         | NULL               | Daemon  |  NULL | InnoDB shutdown handler         | NULL                                                                                                                            |    0.000 |
| 1129656 | root        | localhost               | information_schema | Query   |     0 | Init                            | SHOW FULL PROCESSLIST                                                                                                           |    0.000 |
| 1130651 | monday      | somehost:50688          | mydata             | Query   |   886 | Waiting for table metadata lock | LOAD DATA LOCAL INFILE 'measurements_2020_9_8.tmp' INTO TABLE apsdata FIELDS TERMINATED BY ','                                  |    0.000 |
| 1131149 | monday      | somehost:50800          | mydata             | Query   |   503 | Waiting for table metadata lock | insert into apsdata values(0,0,0,0,0,0,0)                                                                                       |    0.000 |

...
+---------+-------------+-------------------------+--------------------+---------+-------+---------------------------------+---------------------------------------------------------------------------------------------------------------------------------+----------+

数据库中不存在任何锁或等待information_schema

MariaDB [information_schema]> select * from INNODB_LOCK_WAITS;
Empty set (0.000 sec)

MariaDB [information_schema]> select * from INNODB_LOCKS;
Empty set (0.000 sec)

我尝试过UNLOCK TABLES,但没有成功。

为什么我的表被锁定了?没有阻塞查询,也没有可以移除的锁。如何移除元数据锁?

答案1

这个问题似乎暂时平息了并被放弃了。

过了一段时间,这个问题又出现了——我们发现这是由于 cron 中运行的 mysqlbackup 造成的。显然,默认情况下 MariaDB 会锁定表以进行备份。

相关内容