服务器关闭过程如下
关闭过程开始。
这可以通过多种方式启动。例如,具有
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 = 不成功终止(已重新启动)