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