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