Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  The Server Shutdown Process

7.1.19 服务器关闭过程

服务器关闭过程如下所示:

  1. 关闭过程被初始化。

    这可以通过多种方式进行初始化。例如,具有 SHUTDOWN 权限的用户可以执行 mysqladmin shutdown 命令。mysqladmin 可以在 MySQL 支持的任何平台上使用。此外,还有其他操作系统特定的关闭初始化方法:在 Unix 上,当服务器收到 SIGTERM 信号时,它将关闭。在 Windows 上,服务器作为服务运行时,当服务管理器告诉它关闭时,它将关闭。

  2. 服务器创建关闭线程,如果必要。

    取决于关闭是如何初始化的,服务器可能会创建一个线程来处理关闭过程。如果关闭是由客户端请求的,服务器将创建一个关闭线程。如果关闭是由于收到 SIGTERM 信号,信号线程可能会自己处理关闭,或者创建一个单独的线程来处理。如果服务器尝试创建关闭线程但无法创建(例如,如果内存耗尽),它将在错误日志中发出诊断消息:

    Error: Can't create thread to kill server
  3. 服务器停止接受新连接。

    为了防止新的活动在关闭期间被初始化,服务器停止接受新的客户端连接,方法是关闭网络接口的处理程序,以便监听连接:TCP/IP 端口、Unix 套接字文件、Windows 命名管道和共享内存。

  4. 服务器终止当前活动。

    对于每个与客户端连接关联的线程,服务器断开与客户端的连接,并将线程标记为已杀死。线程在注意到自己被标记时死亡。空闲连接的线程快速死亡。当前正在处理语句的线程周期性地检查自己的状态,并需要更长时间来死亡。有关线程终止的更多信息,请参见 第 15.7.8.4 节,“KILL 语句”,特别是关于杀死 REPAIR TABLEOPTIMIZE TABLE 操作的说明。

    对于具有打开事务的线程,事务将被回滚。如果线程正在更新非事务表,例如多行 UPDATEINSERT 操作,可能会在操作完成之前终止,导致表部分更新。

    如果服务器是复制源服务器,它将对当前连接的副本服务器线程进行处理,就像其他客户端线程一样。每个线程都将被标记为已杀死,并在下次检查状态时死亡。

    如果服务器是副本服务器,它将停止复制 I/O 和 SQL 线程(如果它们处于活动状态),然后标记客户端线程为已杀死。SQL 线程将被允许完成当前语句(以避免引起复制问题),然后停止。如果 SQL 线程在此时处于事务中,服务器将等待当前复制事件组(如果有)完成执行,或者等待用户发出 KILL QUERYKILL CONNECTION 语句。见 第 15.4.2.8 节,“STOP REPLICA 语句”。由于非事务表语句不能回滚,因此为了保证崩溃安全的复制,应该只使用事务表。

    Note

    要保证副本上的崩溃安全,必须在副本上运行 --relay-log-recovery 选项。

    第 19.2.4 节,“中继日志和复制元数据存储库”

  5. 服务器关闭或关闭存储引擎。

    在这个阶段,服务器刷新表缓存并关闭所有打开的表。

    每个存储引擎执行它管理的表所需的任何操作。InnoDB 将其缓冲池刷新到磁盘(除非 innodb_fast_shutdown 为 2),将当前 LSN 写入表空间,并终止其自己的内部线程。MyISAM 刷新表的任何挂起的索引写入。

  6. 服务器退出。

为了向管理进程提供信息,服务器返回以下列表中描述的退出代码。括号中的短语表示 systemd 对该代码的响应,适用于使用 systemd 管理服务器的平台。

  • 0 = 成功终止(不重启)

  • 1 = 不成功终止(不重启)

  • 2 = 不成功终止(重启)