我在 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 会锁定表以进行备份。