![在 MySQL 服务器执行任务时,有没有安全的方法可以关闭它?](https://linux22.com/image/749663/%E5%9C%A8%20MySQL%20%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1%E6%97%B6%EF%BC%8C%E6%9C%89%E6%B2%A1%E6%9C%89%E5%AE%89%E5%85%A8%E7%9A%84%E6%96%B9%E6%B3%95%E5%8F%AF%E4%BB%A5%E5%85%B3%E9%97%AD%E5%AE%83%EF%BC%9F.png)
尽管我在这段时间内没有进行任何查询,但 MySQL 数据库服务器现在正在执行一些任务大约 12 小时。
CPU 没有做出任何显著的活动,但硬盘的使用率一直处于 100%。所以我猜服务器可能正在做一些构建索引的工作,因为它发生在我插入大约 3.5G 的数据之后。
现在,我想关闭我的数据库服务器,但我担心这是否会损坏数据库。有没有安全的方法关闭服务器?还是我必须等到任务完成?
我正在添加更多细节以便澄清并解释新的进展。
在问题发生之前,我正在导入大小约为 5.5G 的转储文件。 (我正在从 python 脚本执行命令。)
但是花费的时间太长了,所以我在导入完成之前停止了 python 进程。之后,mysql 服务器执行 IO 任务已经超过 12 个小时了,现在还在执行。
在 powerload79 的建议下,我确实进行了查询
SHOW FULL PROCESSLIST;
+----+-----------------+-----------------+--------+---------+--------+------------------------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------------+--------+---------+--------+------------------------+-----------------------+
| 4 | event_scheduler | localhost | NULL | Daemon | 148754 | Waiting on empty queue | NULL |
| 28 | root | localhost:29209 | bitmex | Sleep | 57594 | | NULL |
| 30 | root | localhost:51361 | bitmex | Query | 0 | starting | SHOW FULL PROCESSLIST |
+----+-----------------+-----------------+--------+---------+--------+------------------------+-----------------------+
3 rows in set (0.00 sec)
似乎没有进程正在执行 IO 任务。所以我尝试停止服务器。
但服务器并没有停止,而是进入了停止挂起状态。停止挂起状态已经过去了一个多小时。挂起状态下的硬盘中仍有很多活动。而且服务器处于离线状态,我无法再从客户端连接到服务器。
这是我尝试停止服务器时生成的错误日志:
2020-03-15T03:15:00.384460Z 0 [System] [MY-013105] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Normal shutdown.
2020-03-15T03:15:02.386568Z 0 [Warning] [MY-010909] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Forcing close of thread 28 user: 'root'.
2020-03-15T03:15:02.387218Z 0 [Warning] [MY-010909] [Server] C:\Program Files\MySQL\MySQL Server 8.0\bin\mysqld.exe: Forcing close of thread 30 user: 'root'.
答案1
MySQL 中没有内置这样的自动化任务,因此您绝对需要弄清楚它在做什么。很可能有人设置了每 12 小时进行一次备份。您应该能够在系统进程列表中和 MySQL 中使用 MySQL 看到正在运行的进程SHOW FULL PROCESSLIST
。
硬杀 MySQL应该是安全的,前提是你只使用 InnoDB 引擎,你没有在 MySQL 配置中禁用任何安全功能,磁盘上启用了写入缓存刷新,并且你确信磁盘没有就这些缓存刷新向你撒谎。这本质上与模拟突然断电没有什么不同,现代文件系统和数据库的实现对此具有相当强的鲁棒性除非硬件在撒谎(是的,这种情况确实会发生,尤其是老款的消费级 SSD)。
即使堆栈中的所有内容都是真实的,也有一个警告 - MySQL 在非正常关闭后启动需要完全重放 InnoDB 事务日志以确保数据处于一致状态。根据事务日志的大小和磁盘的速度,这可能需要很长时间。
答案2
我回答了我的问题,以解释我如何处理这个问题。这不是解决方案,因为我必须删除一个表,但我可以保存其他表。
我查看了电脑的进程列表。有两个 mysqld 进程。我把它们都杀了。服务器终于停止了。
当我尝试重新启动 mysql 服务器时,mysql 出现以下错误日志:
2020-03-15T10:28:02.224966Z 1 [错误] [MY-012179] [InnoDB] 找不到与表空间 ID 关联的任何文件:21
2020-03-15T10:28:02.225782Z 1 [错误] [MY-012964] [InnoDB] 使用 --innodb-directories 查找表空间文件。如果失败,请使用 --innodb-force-recovery=1 忽略此问题并永久丢失对丢失表空间的所有更改
我使用选项 innodb-force-recovery=1 重新评级。服务器启动了,我可以连接到它。登录到客户端后,我删除了导致一切混乱的表。