MySQL中的Unix信号处理

来自泡泡学习笔记
跳到导航 跳到搜索

在Unix和类Unix系统上,进程可以接收由根系统帐户或拥有该进程的系统帐户发送给它的信号。可以使用kill命令发送信号。某些命令解释器将某些键序列与信号关联起来,例如Control+C发送SIGINT信号。本节描述了MySQL服务器和客户端程序如何响应信号。


服务器对信号的响应

mysqld对信号的响应如下:

  • SIGTERM导致服务器关闭。这就像执行SHUTDOWN语句一样,而无需连接到服务器(对于关闭操作,需要具有SHUTDOWN权限的帐户)。

  • SIGHUP导致服务器重新加载授权表并刷新表、日志、线程缓存和主机缓存。这些操作类似于各种形式的FLUSH语句。发送该信号可以在无需连接到服务器的情况下执行刷新操作,这需要一个具有足够权限执行这些操作的MySQL帐户。在MySQL 8.0.20之前,服务器还会将具有以下格式的状态报告写入错误日志:

      Status information:
    
      Current dir: /var/mysql/data/
      Running threads: 4  Stack size: 262144
      Current locks:
      lock: 0x7f742c02c0e0:
    
      lock: 0x2cee2a20:
      :
      lock: 0x207a080:
    
      Key caches:
      default
      Buffer_size:       8388608
      Block_size:           1024
      Division_limit:        100
      Age_limit:             300
      blocks used:             4
      not flushed:             0
      w_requests:              0
      writes:                  0
      r_requests:              8
      reads:                   4
    
      handler status:
      read_key:           13
      read_next:           4
      read_rnd             0
      read_first:         13
      write:               1
      delete               0
      update:              0
    
      Table status:
      Opened tables:        121
      Open tables:          114
      Open files:            18
      Open streams:           0
    
      Memory status:
      <malloc version="1">
      <heap nr="0">
      <sizes>
        <size from="17" to="32" total="32" count="1"/>
        <size from="33" to="48" total="96" count="2"/>
        <size from="33" to="33" total="33" count="1"/>
        <size from="97" to="97" total="6014" count="62"/>
        <size from="113" to="113" total="904" count="8"/>
        <size from="193" to="193" total="193" count="1"/>
        <size from="241" to="241" total="241" count="1"/>
        <size from="609" to="609" total="609" count="1"/>
        <size from="16369" to="16369" total="49107" count="3"/>
        <size from="24529" to="24529" total="98116" count="4"/>
        <size from="32689" to="32689" total="32689" count="1"/>
        <unsorted from="241" to="7505" total="7746" count="2"/>
      </sizes>
      <total type="fast" count="3" size="128"/>
      <total type="rest" count="84" size="195652"/>
      <system type="current" size="690774016"/>
      <system type="max" size="690774016"/>
      <aspace type="total" size="690774016"/>
      <aspace type="mprotect" size="690774016"/>
      </heap>
      :
      <total type="fast" count="85" size="5520"/>
      <total type="rest" count="116" size="316820"/>
      <total type="mmap" count="82" size="939954176"/>
      <system type="current" size="695717888"/>
      <system type="max" size="695717888"/>
      <aspace type="total" size="695717888"/>
      <aspace type="mprotect" size="695717888"/>
      </malloc>
    
      Events status:
      LLA = Last Locked At  LUA = Last Unlocked At
      WOC = Waiting On Condition  DL = Data Locked
    
      Event scheduler status:
      State      : INITIALIZED
      Thread id  : 0
      LLA        : n/a:0
      LUA        : n/a:0
      WOC        : NO
      Workers    : 0
      Executed   : 0
      Data locked: NO
    
      Event queue status:
      Element count   : 0
      Data locked     : NO
      Attempting lock : NO
      LLA             : init_queue:95
      LUA             : init_queue:103
      WOC             : NO
      Next activation : never
  • 从MySQL 8.0.19开始,SIGUSR1导致服务器刷新错误日志、一般查询日志和慢查询日志。SIGUSR1的一个用途是在无需连接到服务器的情况下实现日志轮换,这需要一个具有足够权限执行这些操作的MySQL帐户。

    服务器对SIGUSR1的响应是SIGHUP响应的子集,使SIGUSR1可以用作更“轻量级”的信号,刷新某些日志而不会产生其他SIGHUP效果,例如刷新线程和主机缓存以及向错误日志写入状态报告。

  • SIGINT通常被服务器忽略。使用–gdb选项启动服务器会安装一个用于调试目的的SIGINT中断处理程序。


客户端对信号的响应

MySQL客户端程序对信号的响应如下:

  • mysql客户端将SIGINT(通常是输入Control+C的结果)解释为中断当前语句(如果有的话)或取消任何部分输入行的指示。这种行为可以通过使用–sigint-ignore选项来忽略SIGINT信号来禁用。
  • 默认情况下,使用MySQL客户端库的客户端程序阻塞SIGPIPE信号。以下是可能的变化:
    • 客户端可以安装自己的SIGPIPE处理程序以覆盖默认行为。
    • 客户端可以在连接时通过将CLIENT_IGNORE_SIGPIPE选项指定给mysql_real_connect()来阻止安装SIGPIPE处理程序。