5.1.16 服务器关闭过程

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

  • 关闭过程将启动。

这可以通过几种方式启动。例如,具有SHUTDOWN特权的用户可以执行mysqladmin shutdown命令。 mysqladmin可以在 MySQL 支持的任何平台上使用。其他特定于 os 的关闭启动方法也是可能的:服务器在 Unix 上收到SIGTERMsignal 时关闭。当服务 Management 器告知服务器时,在 Windows 上作为服务运行的服务器将关闭。

  • 如果需要,服务器将创建一个关闭线程。

根据启动关闭的方式,服务器可能会创建一个线程来处理关闭过程。如果 Client 端请求关闭,则会创建一个关闭线程。如果关闭是接收到SIGTERMsignal 的结果,则 signal 线程可能会自行处理关闭,也可能会创建一个单独的线程来执行此操作。如果服务器尝试创建关闭线程而不能(例如,如果内存已耗尽),它将发出一条诊断消息,该消息出现在错误日志中:

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

为了防止在关闭期间启动新的活动,服务器通过关闭通常侦听连接的网络接口的处理程序来停止接受新的 Client 端连接:TCP/IP 端口,Unix 套接字文件,Windows 命名管道和 Windows 上的共享内存。

  • 服务器终止当前活动。

对于与 Client 端连接关联的每个线程,服务器都会断开与 Client 端的连接,并将该线程标记为已终止。当线程注意到它们被标记时,它们就会死掉。空闲连接的线程很快消失。当前正在处理语句的线程会定期检查其状态,并花费更长的时间死掉。有关线程终止的其他信息,请参见第 13.7.6.4 节“ KILL 语句”,尤其是有关在MyISAMtable 上终止的REPAIR TABLEOPTIMIZE TABLE操作的说明。

对于具有开放事务的线程,该事务将回滚。如果线程正在更新非事务处理 table,则诸如多行UPDATEINSERT之类的操作可能会使 table 部分更新,因为该操作可以在完成之前终止。

如果服务器是主复制服务器,则它将与当前连接的从属服务器关联的线程与其他 Client 端线程一样对待。也就是说,每个标记都被标记为已杀死,并在下次检查其状态时退出。

如果服务器是从属复制服务器,则它将 I/O 和 SQL 线程(如果它们处于活动状态)停止,然后再将其标记为已终止。允许 SQL 线程完成其当前语句(以避免引起复制问题),然后停止。如果此时 SQL 线程处于事务中间,则服务器将 await 直到当前复制事件组(如果有)完成执行,或者直到用户发出KILL QUERYKILL CONNECTION语句为止。另请参见第 13.4.2.6 节“ STOP SLAVE 语句”。由于非事务性语句无法回滚,因此为了确保崩溃安全的复制,仅应使用事务 table。

Note

为了确保从站上的崩溃安全,必须在启用了--relay-log-recovery的情况下运行从站。

另请参见第 16.2.4 节“中继日志和复制应用程序元数据存储库”)。

  • 服务器关闭或关闭存储引擎。

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

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

  • 服务器退出。

为了向 Management 过程提供信息,服务器将返回以下列 table 中描述的退出代码之一。括号中的短语 table 示针对使用 systemdManagement 服务器的平台,systemd 响应代码采取的措施。

  • 0 =成功终止(未完成重新启动)

  • 1 =终止失败(未完成重新启动)

  • 2 =终止失败(重新启动完成)