### 5.1.19服务器关闭过程

[](<>)[](<>)

服务器关闭过程如下所示：

1.  关闭过程启动。

    这可以通过几种方式实现。例如，具有[`关闭`](privileges-provided.html#priv_shutdown)特权可以执行[**关闭**](mysqladmin.html)命令[**mysqladmin**](mysqladmin.html)可以在MySQL支持的任何平台上使用。也可以使用其他特定于操作系统的关闭启动方法：服务器在收到请求时在Unix上关闭`西格特姆`信号当服务管理器通知服务器在Windows上作为服务运行时，服务器将关闭。

2.  如果需要，服务器会创建一个关闭线程。

    根据关机的启动方式，服务器可能会创建一个线程来处理关机过程。如果客户端请求关闭，则会创建一个关闭线程。如果关机是由于收到`西格特姆`信号线程可以自行处理关机，也可以创建一个单独的线程来处理。如果服务器尝试创建关闭线程，但无法执行（例如，如果内存耗尽），则会发出错误日志中显示的诊断消息：

    ```
    Error: Can't create thread to kill server
    ```

3.  服务器停止接受新连接。

    为了防止在关机期间启动新活动，服务器通过关闭其通常侦听连接的网络接口的处理程序来停止接受新的客户端连接：TCP/IP端口、Unix套接字文件、Windows命名管道和Windows上的共享内存。

4.  服务器终止当前活动。

    对于与客户端连接关联的每个线程，服务器会断开与客户端的连接，并将该线程标记为已终止。当丝线注意到它们被如此标记时，它们就会死亡。空闲连接的线程很快就会消亡。当前正在处理语句的线程会定期检查它们的状态，并且需要更长的时间才能结束。有关线程终止的更多信息，请参阅[第13.7.8.4节，“终止声明”](kill.html)，特别是关于死亡的指示[`修理台`](repair-table.html)或[`优化表格`](optimize-table.html)手术`米萨姆`桌子。

    对于具有打开事务的线程，事务将回滚。如果一个线程正在更新一个非事务表，则需要执行一个操作，例如多行[`使现代化`](update.html)或[`插入`](insert.html)可能会使表部分更新，因为操作可能会在完成之前终止。

    如果服务器是复制源服务器，它会像对待其他客户端线程一样对待与当前连接的副本关联的线程。也就是说，每一个都被标记为已死亡，并在下次检查其状态时退出。

    如果服务器是副本服务器，则会在将客户端线程标记为已终止之前停止复制I/O和SQL线程（如果它们处于活动状态）。允许SQL线程完成其当前语句（以避免造成复制问题），然后停止。如果此时SQL线程处于事务的中间，则服务器等待当前复制事件组（如果有的话）已完成执行，或直到用户发出[`终止查询`](kill.html)或[`终止连接`](kill.html)陈述另见[第13.4.2.11节“停止从属语句”](stop-slave.html).由于非事务性语句不能回滚，为了保证崩溃安全复制，只能使用事务性表。

    笔记

    为了保证复制副本的崩溃安全，必须使用[`--中继日志恢复`](replication-options-replica.html#sysvar_relay_log_recovery)启用。

    另见[第17.2.4节，“中继日志和复制元数据存储库”](replica-logs.html)).

5.  服务器关闭或关闭存储引擎。

    在此阶段，服务器刷新表缓存并关闭所有打开的表。

    每个存储引擎执行其管理的表所需的任何操作。`InnoDB`将其缓冲池刷新到磁盘（除非[`innodb_快速关闭`](innodb-parameters.html#sysvar_innodb_fast_shutdown)是2），将当前LSN写入表空间，并终止其自身的内部线程。`米萨姆`刷新表的所有挂起索引写入。

6.  服务器退出。

[](<>)[](<>)

为了向管理流程提供信息，服务器返回以下列表中描述的退出代码之一。括号中的短语表示systemd针对使用systemd管理服务器的平台响应代码所采取的操作。

-   0=成功终止（未重新启动）

-   1=终止不成功（未重新启动）

-   2=终止不成功（重启完成）
