服务器关闭过程如下所示:
- 关闭过程将启动。
这可以通过几种方式启动。例如,具有SHUTDOWN特权的用户可以执行mysqladmin shutdown命令。mysqladmin可以在MySQL支持的任何平台上使用。其他特定于操作系统的关闭启动方法也是可能的:服务器在收到SIGTERM
信号时在Unix上关闭 。当服务管理器通知服务器时,在Windows上作为服务运行的服务器将关闭。
- 如果需要,服务器将创建一个关闭线程。
根据启动关闭的方式,服务器可能会创建一个线程来处理关闭过程。如果客户端请求关闭,则会创建一个关闭线程。如果关闭是收到SIGTERM
信号的结果 ,则信号线程可能会自行处理关闭,也可能会创建一个单独的线程来执行关闭操作。如果服务器尝试创建关闭线程失败(例如,如果内存已耗尽),它将发出一条诊断消息,该消息出现在错误日志中:
Error: Can't create thread to kill server
- 服务器停止接受新连接。
为了防止在关闭期间启动新的活动,服务器通过关闭通常侦听其连接的网络接口的处理程序来停止接受新的客户端连接:TCP / IP端口,Unix套接字文件,Windows命名管道和Windows上的共享内存。
- 服务器终止当前活动。
对于与客户端连接关联的每个线程,服务器都会断开与客户端的连接,并将该线程标记为已终止。当线程注意到它们被标记时,它们就会死掉。空闲连接的线程很快消失。当前正在处理语句的线程会定期检查其状态,并花费更长的时间死掉。有关线程终止的更多信息,请参见第13.7.6.4节“ KILL语法”,尤其是有关在表上终止的REPAIR TABLE或OPTIMIZE TABLE操作的说明 MyISAM
。
对于具有开放事务的线程,该事务将回滚。如果线程正在更新非事务处理表,则诸如多行UPDATE或INSERT之类的操作可能会使表部分更新,因为该操作可以在完成之前终止。
如果服务器是主应答服务器,则它将与当前连接的从属服务器关联的线程与其他客户端线程一样对待。也就是说,每个标记都被标记为已杀死,并在下次检查其状态时退出。
如果服务器是从属应答服务器,则它将I / O和SQL线程(如果它们处于活动状态)停止,然后将其标记为已终止。允许SQL线程完成其当前语句(以避免引起应答问题),然后停止。如果此时SQL线程处于事务中间,则服务器将等待直到当前应答事件组(如果有)完成执行,或者直到用户发出KILL QUERY或KILL CONNECTION语句。
注意
为了保证从站的崩溃安全,必须在启用--relay-log-recovery的情况下运行从站。
另见第 16.2.4 节,“应答中继和状态日志”)。
- 服务器关闭或关闭存储引擎。
在此阶段,服务器刷新 table 缓存并关闭所有打开的表。
每个存储引擎都会执行其管理的表所需的任何操作。 InnoDB
将其缓冲池刷新到磁盘(除非innodb_fast_shutdown为 2),将当前 LSN 写入表空间,并终止其自己的内部线程。 MyISAM
刷新 table 的任何挂起索引写入。
- 服务器退出。
为了向管理进程提供信息,服务器返回以下列表中描述的退出代码之一。括号中的短语表示 systemd 响应 code 所采取的操作,对于使用 systemd 管理服务器的平台。
-
0 =成功终止(未完成重启)
-
1 =终止失败(未完成重启)
-
2 =终止失败(重启完成)