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