7.1.19 服务器关闭过程
服务器关闭过程如下:
-
关闭过程开始。
这可以通过多种方式开始。例如,拥有
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 Statement”,特别是关于被杀死的
REPAIR TABLE
或OPTIMIZE TABLE
操作的说明,特别是关于MyISAM表的。对于线程具有打开事务的线程,事务将回滚。如果线程正在更新非事务表,操作如多行
UPDATE
或INSERT
可能会留下表部分更新,因为操作可能在完成前终止。如果服务器是复制源服务器,它将对当前连接的复制线程进行处理。也就是说,每个线程都将被标记为死亡,并在下次检查状态时退出。
如果服务器是一个副本服务器,它将在标记客户端线程为死亡前,停止复制I/O和SQL线程,如果它们是活动的。SQL线程允许完成当前语句(避免复制问题),然后停止。如果SQL线程在这个点上正在执行事务,那么服务器将等待当前复制事件组(如果有)完成执行,或者直到用户发出
KILL QUERY
或KILL CONNECTION
语句。请参阅第15.4.2.5节,“STOP REPLICA Statement”。由于非事务语句不能回滚,因此为了确保崩溃安全的复制,只有事务表可以使用。Note为了在副本上确保崩溃安全,您必须将副本运行在
--relay-log-recovery
启用的状态下。请参阅第19.2.4节,“Relay Log and Replication Metadata Repositories”。
-
服务器关闭或关闭存储引擎。
在这个阶段,服务器将flush表缓存并关闭所有打开的表。
每个存储引擎执行它管理的表所需的操作。
InnoDB
将其缓冲池flush到磁盘(除非innodb_fast_shutdown
为2),将当前LSN写入表空间,并终止其内部线程。MyISAM
将flush任何pending索引写入的表。 -
服务器退出。
为了提供信息给管理进程,服务器将返回以下列表中的一个退出代码。括号中的短语表示在使用systemd管理服务器的平台上,systemd将采取的操作。
-
0 = 成功终止(无重启)
-
1 = 不成功终止(无重启)
-
2 = 不成功终止(重启)