MySQL8-中文参考-六十七-

70 阅读1小时+

MySQL8 中文参考(六十七)

原文:docs.oracle.com/javase/tutorial/reallybigindex.html

原文:dev.mysql.com/doc/refman/8.0/en/show-replicas.html

15.7.7.33 SHOW REPLICAS Statement

{SHOW REPLICAS}

显示当前在源服务器上注册的副本列表。从 MySQL 8.0.22 开始,使用SHOW REPLICAS代替从该版本开始弃用的SHOW SLAVE HOSTS。在 MySQL 8.0.22 之前的版本中,请使用SHOW SLAVE HOSTSSHOW REPLICAS需要REPLICATION SLAVE权限。

SHOW REPLICAS应在充当复制源的服务器上执行。该语句显示有关作为副本连接的服务器的信息,结果的每一行对应一个副本服务器,如下所示:

mysql> SHOW REPLICAS;
+------------+-----------+------+-----------+--------------------------------------+
| Server_id  | Host      | Port | Source_id | Replica_UUID                         |
+------------+-----------+------+-----------+--------------------------------------+
|         10 | iconnect2 | 3306 |         3 | 14cb6624-7f93-11e0-b2c0-c80aa9429562 |
|         21 | athena    | 3306 |         3 | 07af4990-f41f-11df-a566-7ac56fdaf645 |
+------------+-----------+------+-----------+--------------------------------------+
  • Server_id: 副本服务器的唯一服务器 ID,在副本服务器的选项文件中配置,或者使用--server-id=*value*在命令行上配置。

  • Host: 副本服务器的主机名,使用--report-host选项在副本上指定。这可能与在操作系统中配置的机器名称不同。

  • User: 在副本服务器上指定的副本用户名称,使用--report-user选项。只有在源服务器启动时使用--show-replica-auth-info--show-slave-auth-info选项时,语句输出才包括此列。

  • Password: 副本服务器密码,使用--report-password选项在副本上指定。只有在源服务器启动时使用--show-replica-auth-info--show-slave-auth-info选项时,语句输出才包括此列。

  • Port: 副本服务器正在侦听的源端口,使用--report-port选项在副本上指定。

    此列中的零表示未设置副本端口(--report-port)。

  • Source_id: 副本服务器正在复制的源服务器的唯一服务器 ID。这是在执行SHOW REPLICAS的服务器的服务器 ID,因此结果中的每一行都列出相同的值。

  • Replica_UUID: 此副本的全局唯一 ID,在副本上生成,并在副本的auto.cnf文件中找到。

原文:dev.mysql.com/doc/refman/8.0/en/show-slave-hosts.html

15.7.7.34 展示从机主机 | 展示副本语句

{SHOW SLAVE HOSTS | SHOW REPLICAS}

显示当前在源端注册的副本列表。从 MySQL 8.0.22 开始,展示从机主机已被弃用,应改用别名 展示副本。该语句的工作方式与以前相同,只是语句及其输出所使用的术语已更改。在使用时,两个版本的语句都会更新相同的状态变量。请参阅 展示副本 的文档以获取语句的描述。

原文:dev.mysql.com/doc/refman/8.0/en/show-replica-status.html

15.7.7.35 SHOW REPLICA STATUS Statement

SHOW {REPLICA | SLAVE} STATUS [FOR CHANNEL *channel*]

此语句提供有关复制线程的关键参数的状态信息。从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。在 MySQL 8.0.22 之前的版本中,请使用SHOW SLAVE STATUS。该语句需要REPLICATION CLIENT权限(或已弃用的SUPER权限)。

SHOW REPLICA STATUS是非阻塞的。与STOP REPLICA同时运行时,SHOW REPLICA STATUS会立即返回,而不会等待STOP REPLICA完成关闭复制 SQL(应用程序)线程或复制 I/O(接收器)线程(或两者)。这允许在监控和其他应用程序中使用SHOW REPLICA STATUS,其中从SHOW REPLICA STATUS获得即时响应比确保返回最新数据更重要。在 MySQL 8.0.22 中,SLAVE 关键字被 REPLICA 替换。

如果您使用mysql客户端发出此语句,可以使用\G语句终止符,而不是分号,以获得更易读的垂直布局:

mysql> SHOW REPLICA STATUS\G
*************************** 1\. row ***************************
             Replica_IO_State: Waiting for source to send event
                  Source_Host: 127.0.0.1
                  Source_User: root
                  Source_Port: 13000
                Connect_Retry: 1
              Source_Log_File: master-bin.000001
          Read_Source_Log_Pos: 927
               Relay_Log_File: slave-relay-bin.000002
                Relay_Log_Pos: 1145
        Relay_Source_Log_File: master-bin.000001
           Replica_IO_Running: Yes
          Replica_SQL_Running: Yes
              Replicate_Do_DB:
          Replicate_Ignore_DB:
           Replicate_Do_Table:
       Replicate_Ignore_Table:
      Replicate_Wild_Do_Table:
  Replicate_Wild_Ignore_Table:
                   Last_Errno: 0
                   Last_Error:
                 Skip_Counter: 0
          Exec_Source_Log_Pos: 927
              Relay_Log_Space: 1355
              Until_Condition: None
               Until_Log_File:
                Until_Log_Pos: 0
           Source_SSL_Allowed: No
           Source_SSL_CA_File:
           Source_SSL_CA_Path:
              Source_SSL_Cert:
            Source_SSL_Cipher:
               Source_SSL_Key:
        Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error:
               Last_SQL_Errno: 0
               Last_SQL_Error:
  Replicate_Ignore_Server_Ids:
             Source_Server_Id: 1
                  Source_UUID: 73f86016-978b-11ee-ade5-8d2a2a562feb
             Source_Info_File: mysql.slave_master_info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
    Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
           Source_Retry_Count: 10
                  Source_Bind:
      Last_IO_Error_Timestamp:
     Last_SQL_Error_Timestamp:
               Source_SSL_Crl:
           Source_SSL_Crlpath:
           Retrieved_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
            Executed_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
                Auto_Position: 1
         Replicate_Rewrite_DB:
                 Channel_Name:
           Source_TLS_Version:
       Source_public_key_path:
        Get_Source_public_key: 0
            Network_Namespace:

性能模式提供了暴露复制信息的表。这类似于从SHOW REPLICA STATUS语句中获取的信息,但以表格形式表示。有关详细信息,请参阅第 29.12.11 节,“性能模式复制表”。

从 MySQL 8.0.27 开始,您可以在CHANGE REPLICATION SOURCE TO语句上设置GTID_ONLY选项,以阻止复制通道在复制元数据存储库中持久化文件名和文件位置。使用此设置,源二进制日志文件和中继日志文件的文件位置将在内存中跟踪。SHOW REPLICA STATUS语句在正常使用中仍会显示文件位置。然而,由于文件位置在连接元数据存储库和应用程序元数据存储库中除了在少数情况下不会定期更新,如果服务器重新启动,它们可能会过时。

对于在服务器启动后具有GTID_ONLY设置的复制通道,源二进制日志文件的读取和应用文件位置(Read_Source_Log_PosExec_Source_Log_Pos)设置为零,并且文件名(Source_Log_FileRelay_Source_Log_File)设置为INVALID。中继日志文件名(Relay_Log_File)根据 relay_log_recovery 设置进行设置,可以是在服务器启动时创建的新文件,也可以是第一个中继日志文件。文件位置(Relay_Log_Pos)设置为位置 4,并且使用 GTID 自动跳过来跳过文件中已经应用的任何事务。

当接收器线程联系源并获取有效位置信息时,读取位置(Read_Source_Log_Pos)和文件名(Source_Log_File)将更新为正确的数据并变为有效。当应用程序线程应用来自源的事务,或跳过已执行的事务时,执行位置(Exec_Source_Log_Pos)和文件名(Relay_Source_Log_File)将更新为正确的数据并变为有效。中继日志文件位置(Relay_Log_Pos)也在那时更新。

以下列表描述了SHOW REPLICA STATUS返回的字段。有关解释其含义的更多信息,请参见第 19.1.7.1 节,“检查复制状态”。

  • Replica_IO_State

    复制SHOW PROCESSLIST输出的State字段,用于复制 I/O(接收器)线程。这告诉您线程正在做什么:尝试连接到源,等待来自源的事件,重新连接到源等等。有关可能状态的列表,请参见第 10.14.5 节,“复制 I/O(接收器)线程状态” Thread States")。

  • Source_Host

    复制品连接到的源主机。

  • Source_User

    用于连接到源的帐户的用户名。

  • Source_Port

    用于连接到源的端口。

  • Connect_Retry

    连接重试之间的秒数(默认为 60)。可以使用CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)进行设置。

  • Source_Log_File

    当 I/O(接收器)线程当前正在读取的源二进制日志文件的名称。对于在服务器启动后具有GTID_ONLY设置的复制通道,此设置为INVALID。当复制品联系源时,它将被更新。

  • Read_Source_Log_Pos

    I/O(接收器)线程已读取的当前源二进制日志文件中的位置。对于具有GTID_ONLY设置的复制通道,在服务器启动后,此设置将设置为零。当副本联系源时,它将被更新。

  • Relay_Log_File

    SQL(应用程序)线程当前正在读取和执行的中继日志文件的名称。

  • Relay_Log_Pos

    SQL(应用程序)线程已读取和执行的当前中继日志文件中的位置。

  • Relay_Source_Log_File

    源二进制日志文件的名称,其中包含 SQL(应用程序)线程执行的最新事件。对于具有GTID_ONLY设置的复制通道,在服务器启动后,此设置将设置为INVALID。当执行或跳过事务时,它将被更新。

  • Replica_IO_Running

    复制 I/O(接收器)线程是否已启动并已成功连接到源。在内部,此线程的状态由以下三个值之一表示:

    • **MYSQL_REPLICA_NOT_RUN. ** 复制 I/O(接收器)线程未运行。对于此状态,Replica_IO_RunningNo

    • **MYSQL_REPLICA_RUN_NOT_CONNECT. ** 复制 I/O(接收器)线程正在运行,但未连接到复制源。对于此状态,Replica_IO_RunningConnecting

    • **MYSQL_REPLICA_RUN_CONNECT. ** 复制 I/O(接收器)线程正在运行,并且已连接到复制源。对于此状态,Replica_IO_RunningYes

  • Replica_SQL_Running

    复制 SQL(应用程序)线程是否已启动。

  • Replicate_Do_DB, Replicate_Ignore_DB

    使用--replicate-do-db--replicate-ignore-db选项或CHANGE REPLICATION FILTER语句指定的任何数据库的名称。如果使用了FOR CHANNEL子句,则显示特定通道的复制过滤器。否则,显示每个复制通道的复制过滤器。

  • Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table

    任何使用 --replicate-do-table--replicate-ignore-table--replicate-wild-do-table--replicate-wild-ignore-table 选项或 CHANGE REPLICATION FILTER 语句指定的表的名称。如果使用了 FOR CHANNEL 子句,则显示特定通道的复制过滤器。否则,显示每个复制通道的复制过滤器。

  • Last_ErrnoLast_Error

    这些列是 Last_SQL_ErrnoLast_SQL_Error 的别名。

    执行 RESET MASTERRESET REPLICA 会重置这些列中显示的值。

    注意

    当复制 SQL 线程收到错误时,首先报告错误,然后停止 SQL 线程。这意味着在 SHOW REPLICA STATUS 显示 Last_SQL_Errno 的值为非零时,Replica_SQL_Running 仍显示 Yes,存在一个很小的时间窗口。

  • Skip_Counter

    sql_slave_skip_counter 系统变量的当前值。参见 SET GLOBAL sql_slave_skip_counter Syntax。

  • Exec_Source_Log_Pos

    复制 SQL 线程已读取和执行的当前源二进制日志文件中的位置,标记下一个要处理的事务或事件的开始。对于具有 GTID_ONLY 设置的复制通道,此值在服务器启动后设置为零。当执行或跳过事务时,它将被更新。

    当从现有副本开始新建副本时,可以使用此值与 CHANGE REPLICATION SOURCE TO 语句的 SOURCE_LOG_POS 选项(从 MySQL 8.0.23 开始)或 CHANGE MASTER TO 语句的 MASTER_LOG_POS 选项(MySQL 8.0.23 之前)一起使用,以便新副本从此处读取。源二进制日志中的 (Relay_Source_Log_File, Exec_Source_Log_Pos) 给出的坐标对应于中继日志中的 (Relay_Log_File, Relay_Log_Pos) 给出的坐标。

    从已执行的中继日志中的事务序列中的不一致性可能导致此值成为“低水位标记”。换句话说,在该位置之前出现的事务已经提交,但在该位置之后的事务可能已经提交或未提交。如果需要纠正这些间隙,请使用START REPLICA UNTIL SQL_AFTER_MTS_GAPS。有关更多信息,请参��Section 19.5.1.34, “Replication and Transaction Inconsistencies”。

  • Relay_Log_Space

    所有现有中继日志文件的总合大小。

  • Until_ConditionUntil_Log_FileUntil_Log_Pos

    START REPLICA语句中UNTIL子句中指定的值。

    Until_Condition 有以下值:

    • 如果未指定UNTIL子句,则为None

    • Source 如果复制品正在读取直到源的二进制日志中的特定位置。

    • Relay 如果复制品正在读取直到其中继日志中的特定位置。

    • SQL_BEFORE_GTIDS 如果复制 SQL 线程正在处理事务,直到达到gtid_set中列出的第一个事务。

    • SQL_AFTER_GTIDS 如果复制线程正在处理直到gtid_set中的最后一个事务被两个线程都处理完。

    • SQL_AFTER_MTS_GAPS 如果多线程复制品的 SQL 线程正在运行,直到在中继日志中不再找到间隙为止。

    Until_Log_FileUntil_Log_Pos 指示定义复制 SQL 线程停止执行的坐标的日志文件名和位置。

    有关UNTIL子句的更多信息,请参见 Section 15.4.2.7, “START SLAVE Statement”。

  • Source_SSL_AllowedSource_SSL_CA_FileSource_SSL_CA_PathSource_SSL_CertSource_SSL_CipherSource_SSL_CRL_FileSource_SSL_CRL_PathSource_SSL_KeySource_SSL_Verify_Server_Cert

    这些字段显示了复制品用于连接到源的 SSL 参数(如果有)。

    Source_SSL_Allowed 有以下值:

    • 如果允许与源建立 SSL 连接,则为Yes

    • 如果不允许与源建立 SSL 连接,则为No

    • 如果允许 SSL 连接但复制品服务器未启用 SSL 支持,则为Ignored

    其他与 SSL 相关字段的值对应于CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)的SOURCE_SSL_*选项的值,或者CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的MASTER_SSL_*选项的值。请参见 Section 15.4.2.1, “CHANGE MASTER TO Statement”。

  • Seconds_Behind_Source

    该字段表示副本的“延迟”程度:

    • 当副本正在处理更新时,此字段显示副本上当前时间戳与源上记录的当前正在处理的事件的原始时间戳之间的差异。

    • 当副本当前没有处理任何事件时,此值为 0。

    本质上,该字段衡量了复制 SQL(应用程序)线程和复制 I/O(接收器)线程之间的时间差(以秒为单位)。如果源和副本之间的网络连接速度很快,复制接收线程与源之间非常接近,因此该字段很好地近似了复制应用程序线程相对于源的延迟。如果网络速度慢,这是一个很好的近似值;复制应用程序线程可能经常赶上读取速度慢的复制接收线程,因此Seconds_Behind_Source经常显示为 0,即使复制接收线程相对于源来说是延迟的。换句话说,此列仅适用于快速网络

    即使源和副本的时钟时间不相同,只要在副本接收线程启动时计算的差异保持不变,这种时间差计算也能正常工作。任何更改,包括 NTP 更新,都可能导致时钟偏差,从而使Seconds_Behind_Source的计算不太可靠。

    在 MySQL 8.0 中,如果复制应用程序线程未运行,或者应用程序线程已消耗完中继日志且复制接收线程未运行,则此字段为NULL(未定义或未知)。(在旧版本的 MySQL 中,如果复制应用程序线程或复制接收线程未运行或未连接到源,则此字段为NULL。)如果复制接收线程正在运行但中继日志已用尽,则Seconds_Behind_Source设置为 0。

    Seconds_Behind_Source的值基于事件中存储的时间戳,这些时间戳通过复制进行保留。这意味着如果源 M1 本身是 M0 的副本,那么来自 M1 二进制日志的任何事件,其来源于 M0 的二进制日志,都具有该事件的 M0 时间戳。这使得 MySQL 能够成功复制TIMESTAMP。然而,对于Seconds_Behind_Source的问题在于,如果 M1 还接收来自客户端的直接更新,那么Seconds_Behind_Source的值会随机波动,因为有时来自 M1 的最后一个事件源自 M0,有时是 M1 上的直接更新的结果。

    当使用多线程副本时,应注意此值基于Exec_Source_Log_Pos,因此可能不反映最近提交事务的位置。

  • Last_IO_ErrnoLast_IO_Error

    导致复制 I/O(接收器)线程停止的最近错误的错误编号和错误消息。错误编号为 0,消息为空字符串表示“无错误”。如果Last_IO_Error值不为空,则错误值也会出现在副本的错误日志中。

    I/O 错误信息包括一个时间戳,显示最近一次 I/O(接收器)线程错误发生的时间。这个时间戳使用格式*YYMMDD hh:mm:ss*,并显示在Last_IO_Error_Timestamp列中。

    发出RESET MASTERRESET REPLICA将重置这些列中显示的值。

  • Last_SQL_ErrnoLast_SQL_Error

    导致复制 SQL(应用程序)线程停止的最近错误的错误编号和错误消息。错误编号为 0,消息为空字符串表示“无错误”。如果Last_SQL_Error值不为空,则错误值也会出现在副本的错误日志中。

    如果副本是多线程的,则复制 SQL 线程是工作线程的协调员。在这种情况下,Last_SQL_Error字段显示的内容与性能模式replication_applier_status_by_coordinator表中的Last_Error_Message列显示的内容完全相同。该字段值被修改以暗示其他工作线程可能存在更多故障,这可以在显示每个工作线程状态的replication_applier_status_by_worker表中看到。如果该表不可用,则可以使用副本错误日志。日志或replication_applier_status_by_worker表还应用于了解由SHOW REPLICA STATUS或协调员表显示的故障的更多信息。

    SQL 错误信息包括一个时间戳,显示最近一次 SQL(应用程序)线程错误发生的时间。这个时间戳使用格式*YYMMDD hh:mm:ss*,并显示在Last_SQL_Error_Timestamp列中。

    发出RESET MASTERRESET REPLICA将重置这些列中显示的值。

    在 MySQL 8.0 中,Last_SQL_ErrnoLast_SQL_Error列中显示的所有错误代码和消息对应于服务器错误消息参考中列出的错误值。在以前的版本中,这并不总是正确的。(Bug #11760365,Bug #52768)

  • Replicate_Ignore_Server_Ids

    任何已经使用CHANGE REPLICATION SOURCE TO | CHANGE MASTER TO语句的IGNORE_SERVER_IDS选项指定的服务器 ID,以便复制品忽略来自这些服务器的事件。在循环或其他多源复制设置中,当其中一个服务器被移除时,会使用此选项。如果以这种方式设置了任何服务器 ID,则会显示一个逗号分隔的一个或多个数字的列表。如果没有设置任何服务器 ID,则该字段为空。

    注意

    slave_master_info表中的Ignored_server_ids值还显示要忽略的服务器 ID,但作为一个以空格分隔的列表,前面是要忽略的服务器 ID 总数。例如,如果发出包含IGNORE_SERVER_IDS = (2,6,9)选项的CHANGE REPLICATION SOURCE TO | CHANGE MASTER TO语句,告诉复制品忽略具有服务器 ID 2、6 或 9 的源,那么该信息显示如下:

     Replicate_Ignore_Server_Ids: 2, 6, 9
    
     Ignored_server_ids: 3, 2, 6, 9
    

    Replicate_Ignore_Server_Ids过滤是由 I/O(接收器)线程执行的,而不是由 SQL(应用程序)线程执行的,这意味着被过滤掉的事件不会被写入中继日志。这与服务器选项--replicate-do-table采取的过滤操作不同,后者适用于应用程序线程。

    注意

    从 MySQL 8.0 开始,如果在任何通道具有使用IGNORE_SERVER_IDS设置的现有服务器 ID 时发出SET GTID_MODE=ON,则会发出弃用警告。在启动基于 GTID 的复制之前,使用SHOW REPLICA STATUS检查并清除涉及服务器上的所有被忽略的服务器 ID 列表。您可以通过发出包含空列表的IGNORE_SERVER_IDS选项的CHANGE REPLICATION SOURCE TO | CHANGE MASTER TO语句来清除列表。

  • Source_Server_Id

    来自源的server_id值。

  • Source_UUID

    来自源的server_uuid值。

  • Source_Info_File

    master.info文件的位置,现在已经不推荐使用。从 MySQL 8.0 开始,默认情况下,表用于复制品的连接元数据存储库。

  • SQL_Delay

    复制品必须滞后源的秒数。

  • SQL_Remaining_Delay

    Replica_SQL_Running_StateWaiting until MASTER_DELAY seconds after source executed event时,此字段包含剩余的延迟秒数。在其他时间,此字段为NULL

  • Replica_SQL_Running_State

    SQL 线程的状态(类似于Replica_IO_State)。该值与通过SHOW PROCESSLIST显示的 SQL 线程的State值相同。第 10.14.6 节,“复制 SQL 线程状态”提供了可能状态的列表。

  • Source_Retry_Count

    复制品在连接丢失的情况下可以尝试重新连接到源的次数。可以使用CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)的SOURCE_RETRY_COUNT | MASTER_RETRY_COUNT选项或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的选项来设置此值,或者使用旧的--master-retry-count服务器选项(仍然支持向后兼容性)。

  • Source_Bind

    如果有的话,复制品绑定到的网络接口。这是使用CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的SOURCE_BIND | MASTER_BIND选项设置的。

  • Last_IO_Error_Timestamp

    以*YYMMDD hh:mm:ss*格式表示的时间戳,显示最近一次 I/O 错误发生的时间。

  • Last_SQL_Error_Timestamp

    以*YYMMDD hh:mm:ss*格式表示的时间戳,显示最近一次 SQL 错误发生的时间。

  • Retrieved_Gtid_Set

    对应于此复制品接收的所有事务的全局事务 ID 集合。如果不使用 GTID,则为空。有关更多信息,请参见 GTID Sets。

    这是存在或曾经存在于中继日志中的所有 GTID 的集合。每个 GTID 在接收到Gtid_log_event时立即添加。这可能导致部分传输的事务的 GTID 被包含在集合中。

    当所有中继日志因执行RESET REPLICACHANGE REPLICATION SOURCE TO | CHANGE MASTER TO,或由--relay-log-recovery选项的影响而丢失时,集合将被清除。当relay_log_purge = 1时,始终保留最新的中继日志,并且集合不会被清除。

  • Executed_Gtid_Set

    写入二进制日志的全局事务 ID 集。这与此服务器上全局 gtid_executed 系统变量的值相同,以及此服务器上 SHOW MASTER STATUS 输出中的 Executed_Gtid_Set 的值。如果未使用 GTID,则为空。查看 GTID 集获取更多信息。

  • Auto_Position

    如果通道使用 GTID 自动定位,则为 1,否则为 0。

  • Replicate_Rewrite_DB

    Replicate_Rewrite_DB 值显示指定的任何复制过滤规则。例如,如果设置了以下复制过滤规则:

    CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=((db1,db2), (db3,db4));
    

    Replicate_Rewrite_DB 值显示:

    Replicate_Rewrite_DB: (db1,db2),(db3,db4)
    

    有关更多信息,请参阅第 15.4.2.2 节,“CHANGE REPLICATION FILTER Statement”。

  • Channel_name

    正在显示的复制通道。始终存在一个默认的复制通道,可以添加更多复制通道。查看第 19.2.2 节,“复制通道”获取更多信息。

  • Master_TLS_Version

    源使用的 TLS 版本。有关 TLS 版本信息,请参阅第 8.3.2 节,“加密连接 TLS 协议和密码”。

  • Source_public_key_path

    文件路径名,其中包含源所需的用于 RSA 密钥对密码交换的副本端的公钥文件。文件必须采用 PEM 格式。此列适用于使用 sha256_passwordcaching_sha2_password 认证插件进行身份验证的副本。

    如果给定 Source_public_key_path 并指定有效的公钥文件,则优先于 Get_source_public_key

  • Get_source_public_key

    是否从源请求基于 RSA 密钥对的密码交换所需的公钥。此列适用于使用 caching_sha2_password 认证插件进行身份验证的副本。对于该插件,除非请求,否则源不会发送公钥。

    如果给定 Source_public_key_path 并指定有效的公钥文件,则优先于 Get_source_public_key

  • Network_Namespace

    网络命名空间名称;如果连接使用默认(全局)命名空间,则为空。有关网络命名空间的信息,请参阅第 7.1.14 节,“网络命名空间支持”。此列在 MySQL 8.0.22 中添加。

原文:dev.mysql.com/doc/refman/8.0/en/show-slave-status.html

15.7.7.36 展示从属 | 复制状态语句

SHOW {SLAVE | REPLICA} STATUS [FOR CHANNEL *channel*]

该语句提供了关于从属线程的关键参数状态信息。从 MySQL 8.0.22 开始,SHOW SLAVE STATUS 已被弃用,应改用别名 SHOW REPLICA STATUS。该语句的工作方式与以前相同,只是语句及其输出所使用的术语已更改。使用两个版本的语句时,它们会更新相同的状态变量。请参阅 SHOW REPLICA STATUS 的文档以获取语句的描述。

原文:dev.mysql.com/doc/refman/8.0/en/show-status.html

15.7.7.37 显示状态语句

SHOW [GLOBAL | SESSION] STATUS
    [LIKE '*pattern*' | WHERE *expr*]

显示状态提供服务器状态信息(参见第 7.1.10 节,“服务器状态变量”)。此语句不需要任何特权,只需要连接到服务器的能力。

状态变量信息也可以从以下来源获得:

  • 性能模式表。参见第 29.12.15 节,“性能模式状态变量表”。

  • mysqladmin extended-status命令。参见第 6.5.2 节,“mysqladmin — 一个 MySQL 服务器管理程序”。

对于显示状态,如果存在LIKE子句,则指示要匹配的变量名称。可以给出WHERE子句以使用更一般的条件选择行,如第 28.8 节,“SHOW 语句的扩展”中所讨论的。

显示状态接受可选的GLOBALSESSION变量范围修饰符:

  • 使用GLOBAL修饰符,该语句显示全局状态值。全局状态变量可以表示服务器本身某个方面的状态(例如,Aborted_connects),或者 MySQL 所有连接的聚合状态(例如,Bytes_receivedBytes_sent)。如果变量没有全局值,则显示会话值。

  • 使用SESSION修饰符,该语句显示当前连接的状态变量值。如果变量没有会话值,则显示全局值。LOCALSESSION的同义词。

  • 如果没有修饰符,则默认为SESSION

每个状态变量的范围在第 7.1.10 节,“服务器状态变量”中列出。

每次调用显示状态语句都会使用内部临时表并增加全局Created_tmp_tables值。

此处显示了部分输出。名称和值的列表可能与您的服务器不同。每个变量的含义在第 7.1.10 节,“服务器状态变量”中给出。

mysql> SHOW STATUS;
+--------------------------+------------+
| Variable_name            | Value      |
+--------------------------+------------+
| Aborted_clients          | 0          |
| Aborted_connects         | 0          |
| Bytes_received           | 155372598  |
| Bytes_sent               | 1176560426 |
| Connections              | 30023      |
| Created_tmp_disk_tables  | 0          |
| Created_tmp_tables       | 8340       |
| Created_tmp_files        | 60         |
...
| Open_tables              | 1          |
| Open_files               | 2          |
| Open_streams             | 0          |
| Opened_tables            | 44600      |
| Questions                | 2026873    |
...
| Table_locks_immediate    | 1920382    |
| Table_locks_waited       | 0          |
| Threads_cached           | 0          |
| Threads_created          | 30022      |
| Threads_connected        | 1          |
| Threads_running          | 1          |
| Uptime                   | 80380      |
+--------------------------+------------+

使用LIKE子句,该语句仅显示那些名称与模式匹配的变量的行:

mysql> SHOW STATUS LIKE 'Key%';
+--------------------+----------+
| Variable_name      | Value    |
+--------------------+----------+
| Key_blocks_used    | 14955    |
| Key_read_requests  | 96854827 |
| Key_reads          | 162040   |
| Key_write_requests | 7589728  |
| Key_writes         | 3813196  |
+--------------------+----------+

原文:dev.mysql.com/doc/refman/8.0/en/show-table-status.html

15.7.7.38 SHOW TABLE STATUS 语句

SHOW TABLE STATUS
    [{FROM | IN} *db_name*]
    [LIKE '*pattern*' | WHERE *expr*]

SHOW TABLE STATUS 类似于 SHOW TABLES,但提供有关每个非TEMPORARY表的大量信息。您还可以使用 mysqlshow --status db_name 命令获取此列表。如果存在 LIKE 子句,则指示要匹配的表名。WHERE 子句可以用于使用更一般的条件选择行,如 第 28.8 节 “SHOW 语句的扩展” 中所讨论的。

此语句还显示有关视图的信息。

SHOW TABLE STATUS 输出包括以下列:

  • Name

    表的名称。

  • Engine

    表的存储引擎。请参阅 第十七章 InnoDB 存储引擎 和 第十八章 替代存储引擎

    对于分区表,Engine 显示所有分区使用的存储引擎的名称。

  • Version

    此列未使用。随着 MySQL 8.0 中 .frm 文件的移除,此列现在报告一个硬编码值 10,这是 MySQL 5.7 中使用的最后一个 .frm 文件版本。

  • Row_format

    行存储格式(FixedDynamicCompressedRedundantCompact)。对于 MyISAM 表,Dynamic 对应于 myisamchk -dvv 报告的 Packed

  • Rows

    行数。一些存储引擎,如MyISAM,存储确切的计数。对于其他存储引擎,如InnoDB,此值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,使用 SELECT COUNT(*) 来获取准确的计数。

    对于 INFORMATION_SCHEMA 表,Rows 值为 NULL

    对于 InnoDB 表,行数仅是 SQL 优化中使用的粗略估计。(如果 InnoDB 表被分区,这也是正确的。)

  • Avg_row_length

    平均行长度。

  • Data_length

    对于 MyISAMData_length 是数据文件的长度,以字节为单位。

    对于 InnoDBData_length 是为聚簇索引分配的空间的近似量,以字节为单位。具体来说,它是聚簇索引大小(以页为单位)乘以 InnoDB 页大小。

    有关其他存储引擎的信息,请参考本节末尾的注释。

  • Max_data_length

    对于MyISAMMax_data_length是数据文件的最大长度。这是可以存储在表中的数据字节数总数,考虑到使用的数据指针大小。

    对于InnoDB不适用。

    有关其他存储引擎的信息,请参考本节末尾的注释。

  • Index_length

    对于MyISAMIndex_length是索引文件的长度,以字节为单位。

    对于InnoDBIndex_length是非聚簇索引分配的大致空间量,以字节为单位。具体来说,它是非聚簇索引大小(以页为单位)的总和,乘以InnoDB页大小。

    有关其他存储引擎的信息,请参考本节末尾的注释。

  • Data_free

    已分配但未使用字节数。

    InnoDB表报告表所属表空间的可用空间。对于位于共享表空间中的表,这是共享表空间的可用空间。如果您使用多个表空间并且表有自己的表空间,则可用空间仅针对该表。可用空间指完全空闲的区段字节数减去安全边界。即使可用空间显示为 0,也可能可以插入行,只要不需要分配新的区段。

    对于 NDB Cluster,Data_free显示为磁盘上为磁盘数据表或片段分配但未使用的空间。(内存数据资源使用由Data_length列报告。)

    对于分区表,此值仅为估计值,可能不完全正确。在这种情况下获取此信息的更准确方法是查询INFORMATION_SCHEMA PARTITIONS表,如本例所示:

    SELECT SUM(DATA_FREE)
        FROM  INFORMATION_SCHEMA.PARTITIONS
        WHERE TABLE_SCHEMA = 'mydb'
        AND   TABLE_NAME   = 'mytable';
    

    有关更多信息,请参见第 28.3.21 节,“INFORMATION_SCHEMA PARTITIONS 表”。

  • Auto_increment

    下一个AUTO_INCREMENT值。

  • Create_time

    表创建时间。

  • Update_time

    数据文件上次更新时间。对于某些存储引擎,此值为NULL。例如,InnoDB在其系统表空间中存储多个表,数据文件时间戳不适用。即使每个InnoDB表在单独的.ibd文件中使用 file-per-table 模式,change buffering 也可以延迟对数据文件的写入,因此文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM,使用数据文件时间戳;但是在 Windows 上,时间戳不会被更新,因此该值不准确。

    Update_time显示了对未分区的InnoDB表执行的最后一次UPDATEINSERTDELETE的时间戳值。对于 MVCC,时间戳值反映了COMMIT时间,被视为最后更新时间。当服务器重新启动或表从InnoDB数据字典缓存中删除时,时间戳不会被持久化。

  • Check_time

    上次检查表的时间。并非所有存储引擎都更新此时间,此时值始终为NULL

    对于分区InnoDB表,Check_time始终为NULL

  • 校对规则

    表的默认校对规则。输出不明确列出表的默认字符集,但校对规则名称以字符集名称开头。

  • 校验和

    实时校验和值(如果有)。

  • Create_options

    CREATE TABLE一起使用的额外选项。

    对于分区表,Create_options显示partitioned

    在 MySQL 8.0.16 之前,对于在文件表空间中创建的表,Create_options显示指定的ENCRYPTION子句。从 MySQL 8.0.16 开始,如果表已加密或指定的加密与模式加密不同,则显示文件表空间的加密子句。对于在一般表空间中创建的表,不显示加密子句。要识别加密的文件表空间和一般表空间,请查询INNODB_TABLESPACESENCRYPTION列。

    在禁用严格模式创建表时,如果指定的行格式不受支持,则使用存储引擎的默认行格式。表的实际行格式在Row_format列中报告。Create_options显示了在CREATE TABLE语句中指定的行格式。

    当更改表的存储引擎时,不适用于新存储引擎的表选项将保留在表定义中,以便在必要时将表及其先前定义的选项还原为原始存储引擎。Create_options可能显示保留的选项。

  • 注释

    创建表时使用的注释(或 MySQL 无法访问表信息的原因)。

备注
  • 对于InnoDB表,SHOW TABLE STATUS除了表所保留的物理大小外,不提供准确的统计信息。行数仅是 SQL 优化中使用的粗略估计。

  • 对于NDB表,此语句的输出显示了Avg_row_lengthData_length列的适当值,但不考虑BLOB列。

  • 对于NDB表,Data_length仅包括存储在主内存中的数据;Max_data_lengthData_free列适用于磁盘数据。

  • 对于 NDB 集群磁盘数据表,Max_data_length显示为磁盘数据表或片段的磁盘部分分配的空间。(内存数据资源使用情况由Data_length列报告。)

  • 对于MEMORY表,Data_lengthMax_data_lengthIndex_length的值近似表示实际分配的内存量。分配算法会大量保留内存以减少分配操作的次数。

  • 对于视图,SHOW TABLE STATUS显示的大多数列都为 0 或NULL,除了Name表示视图名称,Create_time表示创建时间,Comment显示为VIEW

表信息也可以从INFORMATION_SCHEMA TABLES表中获取。请参见第 28.3.38 节,“INFORMATION_SCHEMA TABLES 表”。

原文:dev.mysql.com/doc/refman/8.0/en/show-tables.html

15.7.7.39 SHOW TABLES Statement

SHOW [EXTENDED] [FULL] TABLES
    [{FROM | IN} *db_name*]
    [LIKE '*pattern*' | WHERE *expr*]

SHOW TABLES列出给定数据库中的非TEMPORARY表。您也可以使用**mysqlshow *db_name***命令获取此列表。如果存在LIKE子句,则表示要匹配的表名。WHERE子句可以用于使用更一般的条件选择行,如第 28.8 节,“SHOW 语句的扩展”中所讨论的。

LIKE子句执行的匹配取决于lower_case_table_names系统变量的设置。

可选的EXTENDED修饰符会导致SHOW TABLES列出由失败的ALTER TABLE语句创建的隐藏表。这些临时表的名称以#sql开头,可以使用DROP TABLE进行删除。

这个语句还列出了数据库中的任何视图。可选的FULL修饰符会导致SHOW TABLES显示第二个输出列,其中表的值为BASE TABLE,视图的值为VIEWINFORMATION_SCHEMA表的值为SYSTEM VIEW

如果您对基表或视图没有权限,则它不会出现在SHOW TABLESmysqlshow db_name的输出中。

表信息也可以从INFORMATION_SCHEMATABLES表中获取。请参阅第 28.3.38 节,“INFORMATION_SCHEMA TABLES 表”。

原文:dev.mysql.com/doc/refman/8.0/en/show-triggers.html

15.7.7.40 SHOW TRIGGERS Statement

SHOW TRIGGERS
    [{FROM | IN} *db_name*]
    [LIKE '*pattern*' | WHERE *expr*]

SHOW TRIGGERS列出了当前为数据库中的表定义的触发器(默认数据库,除非给出FROM子句)。此语句仅对具有TRIGGER权限的数据库和表返回结果。如果存在LIKE子句,则指示匹配哪些表名(而不是触发器名称)并导致语句显示这些表的触发器。可以使用WHERE子句来选择使用更一般条件选择行,如第 28.8 节,“SHOW 语句的扩展”中讨论的那样。

对于在第 27.3 节,“使用触发器”中定义的ins_sum触发器,SHOW TRIGGERS的输出如下所示:

mysql> SHOW TRIGGERS LIKE 'acc%'\G
*************************** 1\. row ***************************
             Trigger: ins_sum
               Event: INSERT
               Table: account
           Statement: SET @sum = @sum + NEW.amount
              Timing: BEFORE
             Created: 2018-08-08 10:10:12.61
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
                      NO_ZERO_IN_DATE,NO_ZERO_DATE,
                      ERROR_FOR_DIVISION_BY_ZERO,
                      NO_ENGINE_SUBSTITUTION
             Definer: me@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci

SHOW TRIGGERS输出具有以下列:

  • 触发器

    触发器的名称。

  • 事件

    触发事件。这是触发器激活的相关表上的操作类型。值为INSERT(插入了一行),DELETE(删除了一行)或UPDATE(修改了一行)。

  • 定义触发器的表。

  • 语句

    触发器主体;即触发器激活时执行的语句。

  • 时机

    触发器在触发事件之前还是之后激活。值为BEFOREAFTER

  • 创建���间

    触发器创建的日期和时间。这是一个TIMESTAMP(2)值(带有百分之一秒的小数部分)。

  • sql_mode

    触发器创建时生效的 SQL 模式,以及触发器执行的模式。有关允许的值,请参见第 7.1.11 节,“服务器 SQL 模式”。

  • 定义者

    创建触发器的用户的帐户,格式为'*user_name*'@'*host_name*'

  • character_set_client

    触发器创建时的character_set_client系统变量的会话值。

  • collation_connection

    触发器创建时的collation_connection系统变量的会话值。

  • 数据库排序规则

    触发器关联的数据库的排序规则。

触发器信息也可以从INFORMATION_SCHEMA TRIGGERS表中获取。请参阅第 28.3.45 节,“INFORMATION_SCHEMA TRIGGERS 表”。

原文:dev.mysql.com/doc/refman/8.0/en/show-variables.html

15.7.7.41 显示变量语句

SHOW [GLOBAL | SESSION] VARIABLES
    [LIKE '*pattern*' | WHERE *expr*]

SHOW VARIABLES显示 MySQL 系统变量的值(参见第 7.1.8 节,“服务器系统变量”)。此语句不需要任何特权。只需要连接到服务器的能力。

系统变量信息也可以从以下来源获取:

  • 性能模式表。参见第 29.12.14 节,“性能模式系统变量表”。

  • mysqladmin variables命令。参见第 6.5.2 节,“mysqladmin — MySQL 服务器管理程序”。

对于SHOW VARIABLES,如果存在LIKE子句,则指示匹配哪些变量名。可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节,“SHOW 语句的扩展”中讨论的。

SHOW VARIABLES接受可选的GLOBALSESSION变量范围修饰符:

  • 使用GLOBAL修饰符,该语句显示全局系统变量值。这些值用于初始化 MySQL 新连接的相应会话变量。如果变量没有全局值,则不显示任何值。

  • 使用SESSION修饰符,该语句显示当前连接中生效的系统变量值。如果变量没有会话值,则显示全局值。LOCALSESSION的同义词。

  • 如果没有修饰符,则默认为SESSION

每个系统变量的范围在第 7.1.8 节,“服务器系统变量”中列出。

SHOW VARIABLES受版本相关的显示宽度限制。对于值非常长且未完全显示的变量,可以使用SELECT作为解决方法。例如:

SELECT @@GLOBAL.innodb_data_file_path;

大多数系统变量可以在服务器启动时设置(只读变量如version_comment是例外)。许多可以通过SET语句在运行时更改。参见第 7.1.9 节,“使用系统变量”,以及第 15.7.6.1 节,“变量赋值的 SET 语法”。

这里显示了部分输出。名称和值的列表可能因您的服务器而异。第 7.1.8 节,“服务器系统变量”描述了每个变量的含义,第 7.1.1 节,“配置服务器”提供了有关调整它们的信息。

mysql> SHOW VARIABLES;
+--------------------------------------------+------------------------------+
| Variable_name                              | Value                        |
+--------------------------------------------+------------------------------+
| activate_all_roles_on_login                | OFF                          |
| auto_generate_certs                        | ON                           |
| auto_increment_increment                   | 1                            |
| auto_increment_offset                      | 1                            |
| autocommit                                 | ON                           |
| automatic_sp_privileges                    | ON                           |
| avoid_temporal_upgrade                     | OFF                          |
| back_log                                   | 151                          |
| basedir                                    | /usr/                        |
| big_tables                                 | OFF                          |
| bind_address                               | *                            |
| binlog_cache_size                          | 32768                        |
| binlog_checksum                            | CRC32                        |
| binlog_direct_non_transactional_updates    | OFF                          |
| binlog_error_action                        | ABORT_SERVER                 |
| binlog_expire_logs_seconds                 | 2592000                      |
| binlog_format                              | ROW                          |
| binlog_group_commit_sync_delay             | 0                            |
| binlog_group_commit_sync_no_delay_count    | 0                            |
| binlog_gtid_simple_recovery                | ON                           |
| binlog_max_flush_queue_time                | 0                            |
| binlog_order_commits                       | ON                           |
| binlog_row_image                           | FULL                         |
| binlog_row_metadata                        | MINIMAL                      |
| binlog_row_value_options                   |                              |
| binlog_rows_query_log_events               | OFF                          |
| binlog_stmt_cache_size                     | 32768                        |
| binlog_transaction_dependency_history_size | 25000                        |
| binlog_transaction_dependency_tracking     | COMMIT_ORDER                 |
| block_encryption_mode                      | aes-128-ecb                  |
| bulk_insert_buffer_size                    | 8388608                      |

...

| max_allowed_packet                         | 67108864                     |
| max_binlog_cache_size                      | 18446744073709547520         |
| max_binlog_size                            | 1073741824                   |
| max_binlog_stmt_cache_size                 | 18446744073709547520         |
| max_connect_errors                         | 100                          |
| max_connections                            | 151                          |
| max_delayed_threads                        | 20                           |
| max_digest_length                          | 1024                         |
| max_error_count                            | 1024                         |
| max_execution_time                         | 0                            |
| max_heap_table_size                        | 16777216                     |
| max_insert_delayed_threads                 | 20                           |
| max_join_size                              | 18446744073709551615         |

...

| thread_handling                            | one-thread-per-connection    |
| thread_stack                               | 286720                       |
| time_zone                                  | SYSTEM                       |
| timestamp                                  | 1530906638.765316            |
| tls_version                                | TLSv1.2,TLSv1.3              |
| tmp_table_size                             | 16777216                     |
| tmpdir                                     | /tmp                         |
| transaction_alloc_block_size               | 8192                         |
| transaction_allow_batching                 | OFF                          |
| transaction_isolation                      | REPEATABLE-READ              |
| transaction_prealloc_size                  | 4096                         |
| transaction_read_only                      | OFF                          |
| transaction_write_set_extraction           | XXHASH64                     |
| unique_checks                              | ON                           |
| updatable_views_with_limit                 | YES                          |
| version                                    | 8.0.36                       |
| version_comment                            | MySQL Community Server - GPL |
| version_compile_machine                    | x86_64                       |
| version_compile_os                         | Linux                        |
| version_compile_zlib                       | 1.2.11                       |
| wait_timeout                               | 28800                        |
| warning_count                              | 0                            |
| windowing_use_high_precision               | ON                           |
+--------------------------------------------+------------------------------+

使用LIKE子句,该语句仅显示那些名称与模式匹配的变量的行。要获取特定变量的行,请使用如下所示的LIKE子句:

SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';

要获取名称与模式匹配的变量列表,请在LIKE子句中使用%通配符:

SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';

通配符可以在要匹配的模式中的任何位置使用。严格来说,因为_是一个匹配任意单个字符的通配符,你应该将其转义为\_以确实匹配它。在实践中,这很少是必要的。

原文:dev.mysql.com/doc/refman/8.0/en/show-warnings.html

15.7.7.42 SHOW WARNINGS Statement

SHOW WARNINGS [LIMIT [*offset*,] *row_count*]
SHOW COUNT(*) WARNINGS

SHOW WARNINGS 是一个诊断性语句,显示关于当前会话中执行语句产生的条件(错误、警告和注释)的信息。警告会为诸如 INSERTUPDATELOAD DATA 等 DML 语句以及 CREATE TABLEALTER TABLE 等 DDL 语句生成。

LIMIT 子句与 SELECT 语句具有相同的语法。参见 Section 15.2.13, “SELECT Statement”。

SHOW WARNINGS 也用于在 EXPLAIN 之后,显示由 EXPLAIN 生成的扩展信息。参见 Section 10.8.3, “Extended EXPLAIN Output Format”。

SHOW WARNINGS 显示关于当前会话中最近一次非诊断性语句执行结果的条件信息。如果最近的语句在解析过程中出现错误,SHOW WARNINGS 将显示结果的条件,无论语句类型(诊断性或非诊断性)如何。

SHOW COUNT(*) WARNINGS 诊断性语句显示错误、警告和注释的总数。您还可以从 warning_count 系统变量中检索此数字:

SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;

这些语句的区别在于第一个是一个不清除消息列表的诊断性语句。第二个,因为是一个 SELECT 语句,被视为非诊断性语句并清除消息列表。

相关的诊断语句SHOW ERRORS仅显示错误条件(排除警告和注释),而SHOW COUNT(*) ERRORS语句显示错误的总数。请参阅 Section 15.7.7.17, “SHOW ERRORS Statement”。GET DIAGNOSTICS可用于检查各个条件的信息。请参阅 Section 15.6.7.3, “GET DIAGNOSTICS Statement”。

这里有一个简单的示例,显示了INSERT的数据转换警告。该示例假定严格的 SQL 模式已禁用。启用严格模式后,警告将变为错误,并终止INSERT

mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4));
Query OK, 0 rows affected (0.05 sec)

mysql> INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz');
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 3

mysql> SHOW WARNINGS\G
*************************** 1\. row ***************************
  Level: Warning
   Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2\. row ***************************
  Level: Warning
   Code: 1048
Message: Column 'a' cannot be null
*************************** 3\. row ***************************
  Level: Warning
   Code: 1264
Message: Out of range value for column 'a' at row 3 3 rows in set (0.00 sec)

max_error_count系统变量控制服务器存储信息的最大错误、警告和注释消息数量,因此也控制SHOW WARNINGS显示的消息数量。要更改服务器可以存储的消息数量,请更改max_error_count的值。

max_error_count仅控制存储的消息数量,而不是计数的数量。即使生成的消息数量超过max_error_countwarning_count的值也不受max_error_count的限制。以下示例演示了这一点。ALTER TABLE语句生成三条警告消息(示例中已禁用严格的 SQL 模式,以防止在单个转换问题后发生错误)。只有一条消息被存储和显示,因为max_error_count已设置为 1,但所有三条都被计数(如warning_count的值所示):

mysql> SHOW VARIABLES LIKE 'max_error_count';
+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_error_count | 1024  |
+-----------------+-------+
1 row in set (0.00 sec)

mysql> SET max_error_count=1, sql_mode = '';
Query OK, 0 rows affected (0.00 sec)

mysql> ALTER TABLE t1 MODIFY b CHAR;
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3  Duplicates: 0  Warnings: 3

mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level   | Code | Message                                |
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)

mysql> SELECT @@warning_count;
+-----------------+
| @@warning_count |
+-----------------+
|               3 |
+-----------------+
1 row in set (0.01 sec)

要禁用消息存储,请将max_error_count设置为 0。在这种情况下,warning_count仍然指示发生了多少警告,但消息不会被存储,也无法显示。

sql_notes系统变量控制注释消息是否会增加warning_count以及服务器是否会存储它们。默认情况下,sql_notes为 1,但如果设置为 0,则注释不会增加warning_count,服务器也不会存储它们:

mysql> SET sql_notes = 1;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message                            |
+-------+------+------------------------------------+
| Note  | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)

mysql> SET sql_notes = 0;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW WARNINGS;
Empty set (0.00 sec)

MySQL 服务器向每个客户端发送一个计数,指示由该客户端执行的最近语句导致的错误、警告和注释的总数。从 C API,可以通过调用mysql_warning_count()来获取此值。参见 mysql_warning_count()。

mysql客户端中,可以使用warningsnowarning命令或它们的快捷方式\W\w(参见第 6.5.1.2 节,“mysql 客户端命令”

Warning (Code 1365): Division by 0 mysql> \w Show warnings disabled.




# 15.7.8 其他管理语句


> 原文:[`dev.mysql.com/doc/refman/8.0/en/other-administrative-statements.html`](https://dev.mysql.com/doc/refman/8.0/en/other-administrative-statements.html)

15.7.8.1 二进制日志语句

15.7.8.2 缓存索引语句

15.7.8.3 刷新语句

15.7.8.4 终止语句

15.7.8.5 将索引加载到缓存语句

15.7.8.6 重置语句

15.7.8.7 持久重置语句

15.7.8.8 重新启动语句

15.7.8.9 关闭语句



> 原文:[`dev.mysql.com/doc/refman/8.0/en/binlog.html`](https://dev.mysql.com/doc/refman/8.0/en/binlog.html)


#### 15.7.8.1 BINLOG Statement

```sql
BINLOG '*str*'

BINLOG 是一个内部使用的语句。它由mysqlbinlog程序生成,作为二进制日志文件中某些事件的可打印表示。(参见 Section 6.6.9, “mysqlbinlog — Utility for Processing Binary Log Files”.)'*str*'值是一个 base 64 编码的字符串,服务器解码以确定相应事件指示的数据更改。

在应用mysqlbinlog输出时执行BINLOG语句,用户帐户需要BINLOG_ADMIN权限(或已弃用的SUPER权限),或者REPLICATION_APPLIER权限加上适当的权限来执行每个日志事件。

这个语句只能执行格式描述事件和行事件。

原文:dev.mysql.com/doc/refman/8.0/en/cache-index.html

15.7.8.2 缓存索引语句

CACHE INDEX {
      *tbl_index_list* [, *tbl_index_list*] ...
    | *tbl_name* PARTITION (*partition_list*)
  }
  IN *key_cache_name*

*tbl_index_list*:
  *tbl_name* [{INDEX|KEY} (*index_name*[, *index_name*] ...)]

*partition_list*: {
    *partition_name*[, *partition_name*] ...
  | ALL
}

缓存索引语句将表索引分配给特定的键缓存。它仅适用于MyISAM表,包括分区的MyISAM表。在索引被分配后,如果需要,它们可以通过加载索引到缓存进行预加载。

以下语句将表t1t2t3的索引分配给名为hot_cache的键缓存:

mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table   | Op                 | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status   | OK       |
| test.t2 | assign_to_keycache | status   | OK       |
| test.t3 | assign_to_keycache | status   | OK       |
+---------+--------------------+----------+----------+

缓存索引的语法允许您指定只有特定索引应该分配给缓存。然而,实现会将表的所有索引分配给缓存,因此除了表名外,没有理由指定其他内容。

缓存索引语句中引用的键缓存可以通过参数设置语句或服务器参数设置来创建其大小。例如:

SET GLOBAL keycache1.key_buffer_size=128*1024;

键缓存参数作为结构化系统变量的成员访问。参见第 7.1.9.5 节,“结构化系统变量”。

在分配索引之前,必须存在一个键缓存,否则会出错:

mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'

默认情况下,表索引分配给在服务器启动时创建的主(默认)键缓存。当键缓存被销毁时,分配给它的所有索引将重新分配给默认键缓存。

索引分配影响全局服务器:如果一个客户端将索引分配给给定的缓存,那么无论哪个客户端发出查询,该缓存都用于涉及该索引的所有查询。

缓存索引支持分区的MyISAM表。您可以将一个或多个索引分配给一个给定的键缓存的一个、几个或所有分区。例如,您可以执行以下操作:

CREATE TABLE pt (c1 INT, c2 VARCHAR(50), INDEX i(c1))
    ENGINE=MyISAM
    PARTITION BY HASH(c1)
    PARTITIONS 4;

SET GLOBAL kc_fast.key_buffer_size = 128 * 1024;
SET GLOBAL kc_slow.key_buffer_size = 128 * 1024;

CACHE INDEX pt PARTITION (p0) IN kc_fast;
CACHE INDEX pt PARTITION (p1, p3) IN kc_slow;

前一组语句执行以下操作:

  • 创建一个具有 4 个分区的分区表;这些分区自动命名为p0,...,p3;此表在列c1上有一个名为i的索引。

  • 创建名为kc_fastkc_slow的 2 个键缓存

  • 将分区p0的索引分配给kc_fast键缓存,将分区p1p3的索引分配给kc_slow键缓存;剩余分区(p2)的索引使用服务器的默认键缓存。

如果您希望将表pt中所有分区的索引分配给名为kc_all的单个键缓存,可以使用以下两个语句之一:

CACHE INDEX pt PARTITION (ALL) IN kc_all;

CACHE INDEX pt IN kc_all;

刚刚展示的两个语句是等效的,发出任何一个都会产生完全相同的效果。换句话说,如果您希望为分区表的所有分区分配索引到同一个键缓存中,PARTITION (ALL) 子句是可选的。

当为多个分区分配索引到一个键缓存时,这些分区不需要是连续的,也不需要按任何特定顺序列出它们的名称。未明确分配到键缓存的任何分区的索引将自动使用服务器默认的键缓存。

对于分区的MyISAM表也支持索引预加载。有关更多信息,请参见第 15.7.8.5 节,“LOAD INDEX INTO CACHE Statement”。

原文:dev.mysql.com/doc/refman/8.0/en/flush.html

15.7.8.3 FLUSH Statement

FLUSH [NO_WRITE_TO_BINLOG | LOCAL] {
    *flush_option* [, *flush_option*] ...
  | *tables_option*
}

*flush_option*: {
    BINARY LOGS
  | ENGINE LOGS
  | ERROR LOGS
  | GENERAL LOGS
  | HOSTS
  | LOGS
  | PRIVILEGES
  | OPTIMIZER_COSTS
  | RELAY LOGS [FOR CHANNEL *channel*]
  | SLOW LOGS
  | STATUS
  | USER_RESOURCES
}

*tables_option*: {
    *table_synonym*
  | *table_synonym* *tbl_name* [, *tbl_name*] ...
  | *table_synonym* WITH READ LOCK
  | *table_synonym* *tbl_name* [, *tbl_name*] ... WITH READ LOCK
  | *table_synonym* *tbl_name* [, *tbl_name*] ... FOR EXPORT
}

*table_synonym*: {
    TABLE
  | TABLES
}

FLUSH语句有几种变体形式,用于清除或重新加载各种内部缓存、刷新表或获取锁。每个FLUSH操作都需要其描述中指示的权限。

注意

在存储函数或触发器中不可能发出FLUSH语句。但是,您可以在存储过程中使用FLUSH,只要这些存储过程不是从存储函数或触发器中调用的。请参阅第 27.8 节,“存储程序的限制”。

默认情况下,服务器会将FLUSH语句写入二进制日志,以便它们复制到副本中。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL

注意

FLUSH LOGSFLUSH BINARY LOGSFLUSH TABLES WITH READ LOCK(带或不带表列表)、以及FLUSH TABLES *tbl_name* ... FOR EXPORT在任何情况下都不会写入二进制日志,因为如果复制到副本中会导致问题。

FLUSH语句会导致隐式提交。请参阅第 15.3.3 节,“导致隐式提交的语句”。

mysqladmin实用程序提供了一个命令行界面,用于执行一些刷新操作,使用命令如flush-hostsflush-logsflush-privilegesflush-statusflush-tables。请参阅第 6.5.2 节,“mysqladmin — MySQL 服务器管理程序”。

向服务器发送SIGHUPSIGUSR1信号会导致发生几种刷新操作,类似于各种形式的FLUSH语句。信号可以由root系统帐户或拥有服务器进程的系统帐户发送。这使得刷新操作可以在不连接到服务器的情况下执行,而这需要一个具有足够权限的 MySQL 帐户进行这些操作。请参阅第 6.10 节,“MySQL 中的 Unix 信号处理”。

重置语句类似于刷新。有关在复制中使用重置的信息,请参见第 15.7.8.6 节,“重置语句”。

以下列表描述了允许的刷新语句*flush_option值。有关允许的tables_option*值的描述,请参见刷新表语法。

  • 刷新二进制日志

    关闭并重新打开服务器正在写入的任何二进制日志文件。如果启用了二进制日志记录,则相对于上一个文件,二进制日志文件的序列号会增加一。

    此操作需要RELOAD权限。

  • 刷新引擎日志

    关闭并重新打开任何可刷新的已安装存储引擎的日志。这会导致InnoDB将其日志刷新到磁盘。

    此操作需要RELOAD权限。

  • 刷新错误日志

    关闭并重新打开服务器正在写入的任何错误日志文件。

    此操作需要RELOAD权限。

  • 刷新一般日志

    关闭并重新打开服务器正在写入的任何一般查询日志文件。

    此操作需要RELOAD权限。

    此操作对用于一般查询日志的表没有影响(参见第 7.4.1 节,“选择一般查询日志和慢查询日志输出目的地”)。

  • 刷新主机

    清空主机缓存和性能模式host_cache表,该表显示缓存内容,并解除任何被阻止的主机。

    此操作需要RELOAD权限。

    有关为什么可能建议或希望刷新主机缓存的信息,请参见第 7.1.12.3 节,“DNS 查找和主机缓存”。

    注意

    自 MySQL 8.0.23 起,刷新主机已弃用;预计将在未来的 MySQL 版本中删除。取而代之的是截断性能模式host_cache表:

    TRUNCATE TABLE performance_schema.host_cache;
    

    TRUNCATE TABLE 操作需要表的 DROP 权限,而不是 RELOAD 权限。您应该知道 TRUNCATE TABLE 语句不会被写入二进制日志。要从 FLUSH HOSTS 中获得相同的行为,请在语句中指定 NO_WRITE_TO_BINLOGLOCAL

  • FLUSH LOGS

    关闭并重新打开服务器正在写入的任何日志文件。

    此操作需要 RELOAD 权限。

    此操作的效果等同于这些操作的综合效果:

    FLUSH BINARY LOGS
    FLUSH ENGINE LOGS
    FLUSH ERROR LOGS
    FLUSH GENERAL LOGS
    FLUSH RELAY LOGS
    FLUSH SLOW LOGS
    
  • FLUSH OPTIMIZER_COSTS

    重新读取成本模型表,以便优化器开始使用其中存储的当前成本估算。

    此操作需要 FLUSH_OPTIMIZER_COSTSRELOAD 权限。

    对于任何未识别的成本模型表条目,服务器会向错误日志写入警告。有关这些表的信息,请参见 Section 10.9.5, “The Optimizer Cost Model”。此操作仅影响在刷新后开始的会话。现有会话继续使用它们开始时的成本估算。

  • FLUSH PRIVILEGES

    重新从 mysql 系统模式中的授权表中读取权限。作为此操作的一部分,服务器会读取包含动态权限分配的 global_grants 表,并注册在那里找到的任何未注册的权限。

    重新加载授权表是必要的,以便仅在直接对授权表进行更改时才能启用对 MySQL 权限和用户的更新;对于像 GRANTREVOKE 这样的帐户管理语句,它们会立即生效,不需要这样做。有关更多信息,请参见 Section 8.2.13, “When Privilege Changes Take Effect”。

    此操作需要 RELOAD 权限。

    如果在服务器启动时指定了 --skip-grant-tables 选项以禁用 MySQL 权限系统,则 FLUSH PRIVILEGES 提供了在运行时启用权限系统的方法。

    重置失败登录跟踪(或者如果服务器是使用 --skip-grant-tables 启动的,则启用它),并解锁任何临时锁定的帐户。参见 Section 8.2.15, “Password Management”。

    释放服务器缓存的内存,这是由GRANTCREATE USERCREATE SERVERINSTALL PLUGIN语句导致的。这些内存不会被相应的REVOKEDROP USERDROP SERVERUNINSTALL PLUGIN语句释放,因此对于执行许多导致缓存的语句实例的服务器,除非使用FLUSH PRIVILEGES释放,否则会增加缓存内存使用。

    清除caching_sha2_password认证插件使用的内存缓存。请参见 SHA-2 可插拔认证的缓存操作。

  • FLUSH RELAY LOGS [FOR CHANNEL *channel*]

    关闭并重新打开服务器正在写入的任何中继日志文件。如果启用了中继日志记录,则相对于上一个文件,中继日志文件的序列号将增加一。

    此操作需要RELOAD权限。

    FOR CHANNEL *channel*子句允许您指定操作应用于哪个复制通道。执行FLUSH RELAY LOGS FOR CHANNEL *channel*以刷新特定复制通道的中继日志。如果未命名通道且不存在额外的复制通道,则操作将应用于默认通道。如果未命名通道且存在多个复制通道,则操作将应用于所有复制通道。有关更多信息,请参见第 19.2.2 节,“复制通道”。

  • FLUSH SLOW LOGS

    关闭并重新打开服务器正在写入的任何慢查询日志文件。

    此操作需要RELOAD权限。

    此操作不会影响用于慢查询日志的表(请参见第 7.4.1 节,“选择一般查询日志和慢查询日志输出目的地”)。

  • FLUSH STATUS

    刷新状态指示器。

    此操作将当前线程的会话状态变量值添加到全局值中,并将会话值重置为零。一些全局变量也可能被重置为零。它还将键缓存(默认和命名)的计数器重置为零,并将 Max_used_connections 设置为当前打开连接数。在调试查询时,此信息可能会有用。请参阅 第 1.5 节,“如何报告错误或问题”。

    FLUSH STATUS 不受 read_onlysuper_read_only 的影响,并始终写入二进制日志。

    此操作需要 FLUSH_STATUSRELOAD 权限。

  • FLUSH USER_RESOURCES

    将所有每小时用户资源指标重置为零。

    此操作需要 FLUSH_USER_RESOURCESRELOAD 权限。

    重置资源指标使达到每小时连接、查询或更新限制的客户端可以立即恢复活动。 FLUSH USER_RESOURCES 不适用于由 max_user_connections 系统变量控制的最大同时连接数限制。请参阅 第 8.2.21 节,“设置帐户资源限制”。

FLUSH TABLES 语法

FLUSH TABLES 刷新表,并根据使用的变体获取锁。在 FLUSH 语句中使用的任何 TABLES 变体必须是唯一使用的选项。 FLUSH TABLEFLUSH TABLES 的同义词。

注意

这里描述的指示通过关闭表来刷新表的描述对于 InnoDB 有所不同,它会将表内容刷新到磁盘,但保持表处于打开状态。这仍然允许在表处于打开状态时复制表文件,只要其他活动不修改它们。

  • FLUSH TABLES

    关闭所有打开的表,强制关闭所有正在使用的表,并刷新准备好的语句缓存。

    此操作需要 FLUSH_TABLESRELOAD 权限。

    有关准备语句缓存的信息,请参阅 第 10.10.3 节,“准备语句和存储程序的缓存”。

    当存在活动的 LOCK TABLES ... READ 时,不允许执行 FLUSH TABLES。要刷新并锁定表,请使用 FLUSH TABLES *tbl_name* ... WITH READ LOCK

  • FLUSH TABLES *tbl_name* [, *tbl_name*] ...

    使用一个或多个逗号分隔的表名列表,此操作类似于不带名称的 FLUSH TABLES,只是服务器只刷新指定的表。如果指定的表不存在,不会发生错误。

    此操作需要 FLUSH_TABLESRELOAD 权限。

  • FLUSH TABLES WITH READ LOCK

    关闭所有打开的表并为所有数据库的所有表加锁以获取全局读锁。

    此操作需要 FLUSH_TABLESRELOAD 权限。

    如果您有像 Veritas 或 ZFS 这样可以在时间上进行快照的文件系统,这个操作是获取备份的非常方便的方法。使用 UNLOCK TABLES 来释放锁。

    FLUSH TABLES WITH READ LOCK 获取全局读锁而不是表锁,因此与表锁定和隐式提交相关的行为不受相同的影响:

    • UNLOCK TABLES 会隐式提交任何已激活的事务,只有当任何表当前已被 LOCK TABLES 锁定时才会发生提交。对于跟随 FLUSH TABLES WITH READ LOCKUNLOCK TABLES 不会发生提交,因为后者不会获取表锁。

    • 开始事务会导致使用 LOCK TABLES 获取的表锁被释放,就像执行了 UNLOCK TABLES 一样。开始事务不会释放使用 FLUSH TABLES WITH READ LOCK 获取的全局读锁。

    FLUSH TABLES WITH READ LOCK不会阻止服务器向日志表插入行(参见第 7.4.1 节,“选择通用查询日志和慢查询日志输出目的地”)。

  • FLUSH TABLES *tbl_name* [, *tbl_name*] ... WITH READ LOCK

    刷新并获取命名表的读锁。

    此操作需要FLUSH_TABLESRELOAD权限。因为它获取表锁,所以还需要每个表的LOCK TABLES权限。

    该操作首先为表获取排他性元数据锁,因此它会等待那些打开这些表的事务完成。然后,操作会从表缓存中刷新表,重新打开表,获取表锁(类似于LOCK TABLES ... READ),并将元数据锁从排他性降级为共享。在操作获取锁并降级元数据锁之后,其他会话可以读取但不能修改这些表。

    此操作仅适用于现有的基本(非TEMPORARY)表。如果名称指向基本表,则使用该表。如果它指向一个TEMPORARY表,则会被忽略。如果名称应用于视图,则会发生ER_WRONG_OBJECT错误。否则,会发生ER_NO_SUCH_TABLE错误。

    使用UNLOCK TABLES来释放锁,LOCK TABLES来释放锁并获取其他锁,或者使用START TRANSACTION来释放锁并开始一个新事务。

    这个FLUSH TABLES变体允许在单个操作中刷新和锁定表。它提供了一个解决方案,因为当存在活动的LOCK TABLES ... READ时,不允许执行FLUSH TABLES

    此操作不会执行隐式的UNLOCK TABLES,因此如果在存在任何活动的LOCK TABLES的情况下执行操作,或者在释放已获取的锁之前第二次使用它,都会导致错误。

    如果刷新的表是使用HANDLER打开的,则处理程序会被隐式刷新并丢失其位置。

  • FLUSH TABLES *tbl_name* [, *tbl_name*] ... FOR EXPORT

    这个FLUSH TABLES变体适用于InnoDB表。它确保对指定表的更改已刷新到磁盘,以便在服务器运行时可以进行二进制表副本的制作。

    此操作需要FLUSH_TABLESRELOAD权限。因为它在准备导出表时获取表上的锁,所以还需要每个表的LOCK TABLESSELECT权限。

    操作的工作方式如下:

    1. 它为命名表获取共享元数据锁。只要其他会话有活动事务修改了这些表或持有这些表的表锁,该操作就会阻塞。在获取锁之后,该操作会阻止试图更新表的事务,同时允许只读操作继续。

    2. 它检查表的所有存储引擎是否支持FOR EXPORT。如果有任何存储引擎不支持,将会发生ER_ILLEGAL_HA错误,操作将失败。

    3. 该操作通知每个表的存储引擎使表准备好导出。存储引擎必须确保任何待处理的更改都已写入磁盘。

    4. 该操作将会将会话置于锁表模式,以便在FOR EXPORT操作完成时不释放先前获取的元数据锁。

    此操作仅适用于现有的基本(非TEMPORARY)表。如果名称指的是基本表,则使用该表。如果指的是TEMPORARY表,则会被忽略。如果名称适用于视图,则会发生ER_WRONG_OBJECT错误。否则,会发生ER_NO_SUCH_TABLE错误。

    InnoDB支持对具有自己的.ibd文件文件的表进行FOR EXPORT(即启用了innodb_file_per_table设置的表)。InnoDB确保在FOR EXPORT操作通知时,任何更改都已刷新到磁盘。这允许在FOR EXPORT操作生效时制作表内容的二进制副本,因为.ibd文件是事务一致的,可以在服务器运行时复制。FOR EXPORT不适用于InnoDB系统表空间文件,也不适用于具有FULLTEXT索引的InnoDB表。

    FLUSH TABLES ...FOR EXPORT支持分区的InnoDB表。

    当收到FOR EXPORT通知时,InnoDB会将通常保存在内存中或在表空间文件之外的磁盘缓冲区中的某些类型数据写入磁盘。对于每个表,InnoDB还会在与表相同的数据库目录中生成一个名为*table_name*.cfg的文件。.cfg文件包含重新导入表空间文件所需的元数据,以便稍后重新导入到相同或不同的服务器中。

    FOR EXPORT操作完成时,InnoDB已经将所有脏页刷新到表数据文件中。在刷新之前,任何更改缓冲区条目都会被合并。此时,表被锁定并处于静止状态:表在磁盘上处于事务一致状态,您可以将.ibd表空间文件与相应的.cfg文件一起复制,以获得这些表的一致快照。

    要重新导入复制的表数据到 MySQL 实例的过程,请参见第 17.6.1.3 节,“导入 InnoDB 表”。

    在处理完表之后,请使用UNLOCK TABLES释放锁定,LOCK TABLES释放锁定并获取其他锁定,或者使用START TRANSACTION释放锁定并开始新事务。

    在会话中执行这些语句之一时,尝试使用FLUSH TABLES ... FOR EXPORT会产生错误:

    FLUSH TABLES ... WITH READ LOCK
    FLUSH TABLES ... FOR EXPORT
    LOCK TABLES ... READ
    LOCK TABLES ... WRITE
    

    在会话中有效时,尝试使用任何这些语句会产生错误:FLUSH TABLES ... FOR EXPORT

    FLUSH TABLES WITH READ LOCK
    FLUSH TABLES ... WITH READ LOCK
    FLUSH TABLES ... FOR EXPORT
    

原文:dev.mysql.com/doc/refman/8.0/en/kill.html

15.7.8.4 KILL Statement

KILL [CONNECTION | QUERY] *processlist_id*

每个连接到mysqld的运行在一个单独的线程中。您可以使用KILL *processlist_id*语句终止一个线程。

线程进程列表标识符可以从INFORMATION_SCHEMA PROCESSLIST表的ID列,SHOW PROCESSLIST输出的Id列以及性能模式threads表的PROCESSLIST_ID列中确定。当前线程的值由CONNECTION_ID()函数返回。

KILL允许使用可选的CONNECTIONQUERY修饰符:

  • KILL CONNECTION与没有修饰符的KILL相同:它终止与给定*processlist_id*相关联的连接,在终止连接正在执行的任何语句之后。

  • KILL QUERY终止连接当前正在执行的语句,但保持连接本身不变。

查看可终止的线程取决于PROCESS权限:

  • 没有PROCESS,您只能看到自己的线程。

  • 使用PROCESS,您可以看到所有线程。

终止线程和语句的能力取决于CONNECTION_ADMIN权限和已弃用的SUPER权限:

  • 没有CONNECTION_ADMINSUPER,您只能终止自己的线程和语句。

  • 使用CONNECTION_ADMINSUPER,您可以终止所有线程和语句,但要影响正在使用SYSTEM_USER权限执行的线程或语句,您自己的会话还必须具有SYSTEM_USER权限。

您还可以使用mysqladmin processlistmysqladmin kill命令来检查和终止线程。

当您使用KILL时,会为线程设置特定于线程的 kill 标志。在大多数情况下,线程可能需要一些时间才能终止,因为 kill 标志仅在特定间隔检查:

  • SELECT操作期间,对于ORDER BYGROUP BY循环,每次读取一块行后都会检查标志。如果设置了 kill 标志,则会中止语句。

  • 进行使表复制的ALTER TABLE操作会定期检查 kill 标志,以便从原始表中读取每几行复制的行。如果设置了 kill 标志,则会中止语句并删除临时表。

    KILL语句会立即返回而不等待确认,但 kill 标志检查会在相当短的时间内中止操作。中止操作以执行任何必要的清理也需要一些时间。

  • UPDATEDELETE操作期间,每次读取块和每次更新或删除行后都会检查 kill 标志。如果设置了 kill 标志,则会中止语句。如果您没有使用事务,则更改不会回滚。

  • GET_LOCK()会中止并返回NULL

  • 如果线程在表锁处理程序中(状态:Locked),则表锁会被快速中止。

  • 如果线程在写调用中等待空闲磁盘空间,则会用“磁盘已满”错误消息中止写操作。

  • EXPLAIN ANALYZE会中止并打印输出的第一行。这适用于 MySQL 8.0.20 及更高版本。

警告

MyISAM表上终止REPAIR TABLEOPTIMIZE TABLE操作会导致表损坏且无法使用。在您再次优化或修复它之前(无中断),对这样的表的任何读取或写入都会失败。

原文:dev.mysql.com/doc/refman/8.0/en/load-index.html

15.7.8.5 LOAD INDEX INTO CACHE Statement

LOAD INDEX INTO CACHE
  *tbl_index_list* [, *tbl_index_list*] ...

*tbl_index_list*:
  *tbl_name*
    [PARTITION (*partition_list*)]
    [{INDEX|KEY} (*index_name*[, *index_name*] ...)]
    [IGNORE LEAVES]

*partition_list*: {
    *partition_name*[, *partition_name*] ...
  | ALL
}

LOAD INDEX INTO CACHE语句将表索引预加载到由显式CACHE INDEX语句分配的关键缓存中,否则将预加载到默认关键缓存中。

LOAD INDEX INTO CACHE仅适用于MyISAM表,包括分区的MyISAM表。此外,可以为分区表的索引预加载一个、几个或所有分区。

IGNORE LEAVES修饰符仅导致预加载索引的非叶节点的块。

IGNORE LEAVES也支持分区MyISAM表。

以下语句预加载表t1t2的索引节点(索引块):

mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
+---------+--------------+----------+----------+
| Table   | Op           | Msg_type | Msg_text |
+---------+--------------+----------+----------+
| test.t1 | preload_keys | status   | OK       |
| test.t2 | preload_keys | status   | OK       |
+---------+--------------+----------+----------+

此语句从t1预加载所有索引块。它仅从t2预加载非叶节点的块。

LOAD INDEX INTO CACHE的语法允许您指定应预加载表中的哪些索引。但是,实现会将表的所有索引预加载到缓存中,因此除了表名之外,没有理由指定其他内容。

可以预加载分区MyISAM表的特定分区上的索引。例如,以下 2 个语句中,第一个预加载分区表pt的分区p0的索引,而第二个预加载相同表的分区p1p3的索引:

LOAD INDEX INTO CACHE pt PARTITION (p0);
LOAD INDEX INTO CACHE pt PARTITION (p1, p3);

要为表pt中的所有分区预加载索引,您可以使用以下两个语句中的任何一个:

LOAD INDEX INTO CACHE pt PARTITION (ALL);

LOAD INDEX INTO CACHE pt;

刚刚显示的两个语句是等效的,发出任何一个都具有完全相同的效果。换句话说,如果您希望为分区表的所有分区预加载索引,则PARTITION (ALL)子句是可选的。

当为多个分区预加载索引时,分区不需要连续,并且不需要按任何特定顺序列出它们的名称。

LOAD INDEX INTO CACHE ... IGNORE LEAVES 除非表中所有索引具有相同的块大小,否则会失败。要确定表的索引块大小,请使用myisamchk -dv并检查Blocksize列。

原文:dev.mysql.com/doc/refman/8.0/en/reset.html

15.7.8.6 RESET 语句

RESET *reset_option* [, *reset_option*] ...

*reset_option*: {
    MASTER
  | REPLICA
  | SLAVE
}

RESET 语句用于清除各种服务器操作的状态。您必须具有 RELOAD 权限才能执行 RESET

有关删除持久化全局系统变量的 RESET PERSIST 语句的信息,请参见 第 15.7.8.7 节,“RESET PERSIST Statement”。

RESET 作为 FLUSH 语句的更强版本。参见 第 15.7.8.3 节,“FLUSH Statement”。

RESET 语句会导致隐式提交。参见 第 15.3.3 节,“导致隐式提交的语句”。

以下列表描述了允许的 RESET 语句 reset_option 值:

  • RESET MASTER

    删除索引文件中列出的所有二进制日志,将二进制日志索引文件重置为空,并创建一个新的二进制日志文件。

  • RESET REPLICA

    使复制忘记其在源二进制日志中的复制位置。还通过删除任何现有的中继日志文件并开始一个新的中继日志来重置中继日志。从 MySQL 8.0.22 开始,请使用 RESET REPLICA 替代 RESET SLAVE

原文:dev.mysql.com/doc/refman/8.0/en/reset-persist.html

15.7.8.7 RESET PERSIST 语句

RESET PERSIST [[IF EXISTS] *system_var_name*]

RESET PERSIST从数据目录中的mysqld-auto.cnf选项文件中删除持久化的全局系统变量设置。移除持久化系统变量会导致该变量不再从mysqld-auto.cnf在服务器启动时初始化。有关持久化系统变量和mysqld-auto.cnf文件的更多信息,请参见第 7.1.9.3 节,“持久化系统变量”。

在 MySQL 8.0.32 之前,此语句不适用于变量名包含点字符(.)的变量,例如MyISAM多键缓存变量和组件注册的变量。(Bug #33417357)

执行RESET PERSIST所需的权限取决于要移除的系统变量类型:

  • 对于动态系统变量,此语句需要SYSTEM_VARIABLES_ADMIN权限(或已弃用的SUPER权限)。

  • 对于只读系统变量,此语句需要SYSTEM_VARIABLES_ADMINPERSIST_RO_VARIABLES_ADMIN权限。

参见第 7.1.9.1 节,“系统变量权限”。

根据变量名和IF EXISTS子句是否存在,RESET PERSIST语句有以下形式:

  • 要从mysqld-auto.cnf中移除所有持久化变量,请使用RESET PERSIST而不命名任何系统变量:

    RESET PERSIST;
    

    你必须拥有权限来移除mysqld-auto.cnf中包含的动态和只读系统变量,如果这两种变量都存在。

  • 要从mysqld-auto.cnf中移除特定的持久化变量,请在语句中命名它:

    RESET PERSIST *system_var_name*;
    

    这包括插件系统变量,即使插件当前未安装。如果变量不存在于文件中,则会发生错误。

  • 要从mysqld-auto.cnf中移除特定的持久化变量,但是如果该变量不存在于文件中,则产生警告而不是错误,请在先前的语法中添加一个IF EXISTS子句:

    RESET PERSIST IF EXISTS *system_var_name*;
    

RESET PERSIST不受persisted_globals_load系统变量值的影响。

RESET PERSIST会影响性能模式persisted_variables表的内容,因为表内容对应于mysqld-auto.cnf文件的内容。另一方面,因为RESET PERSIST不会改变变量值,所以在服务器重新启动之前,它不会对性能模式variables_info表的内容产生影响。

关于清除其他服务器操作状态的RESET语句变体的信息,请参阅第 15.7.8.6 节,“RESET Statement”。

原文:dev.mysql.com/doc/refman/8.0/en/restart.html

15.7.8.8 RESTART Statement

RESTART

此语句停止并重新启动 MySQL 服务器。它需要SHUTDOWN权限。

RESTART的一个用途是当无法或不方便在服务器主机上获得 MySQL 服务器的命令行访问以重新启动时。例如,可以在运行时使用SET PERSIST_ONLY对系统变量进行配置更改,这些变量只能在服务器启动时设置,但服务器仍然必须重新启动才能使这些更改生效。RESTART语句提供了一种在客户端会话中执行此操作的方法,而无需在服务器主机上需要命令行访问。

注意

执行RESTART语句后,客户端可以预期当前连接将丢失。如果启用了自动重新连接,则在服务器重新启动后重新建立连接。否则,必须手动重新建立连接。

成功执行RESTART操作需要mysqld在具有可用于检测为重新启动目的而执行的服务器关闭的监控进程的环境中运行:

  • 在存在监控进程的情况下,RESTART导致mysqld终止,以便监控进程可以确定应启动新的mysqld实例。

  • 如果没有监控进程存在,RESTART将失败并显示错误。

这些平台为RESTART语句提供了必要的监控支持:

  • Windows,在将mysqld作为 Windows 服务或独立运行时。(mysqld分叉,一个进程充当监视器,另一个进程充当服务器。)

  • 使用 systemd 或mysqld_safe管理mysqld的 Unix 和类 Unix 系统。

要配置监控环境,使mysqld启用RESTART语句:

  1. 在启动mysqld之前,将MYSQLD_PARENT_PID环境变量设置为启动mysqld的进程的进程 ID 的值。

  2. mysqld由于使用RESTART语句而执行关闭时,它会返回退出码 16。

  3. 当监控过程检测到退出码为 16 时,它会重新启动mysqld。否则,它会退出。

下面是在bash shell 中实现的最小示例:

#!/bin/bash

export MYSQLD_PARENT_PID=$$

export MYSQLD_RESTART_EXIT=16

while true ; do
  bin/mysqld *mysqld options here*
  if [ $? -ne $MYSQLD_RESTART_EXIT ]; then
    break
  fi
done

在 Windows 上,用于实现RESTART的分叉使得确定要附加到进行调试的服务器进程更加困难。为了缓解这个问题,使用--gdb启动服务器会抑制分叉,除了设置调试环境的其他操作。在非调试设置中,可以使用--no-monitor 仅用于抑制监控进程的分叉。对于使用--gdb--no-monitor启动的服务器,执行RESTART会导致服务器简单地退出而不重新启动。

Com_restart状态变量跟踪RESTART语句的数量。因为状态变量在每次服务器启动时初始化,并且不会跨重启持续存在,Com_restart通常值为零,但如果执行了RESTART语句但失败了,它可能是非零值。

原文:dev.mysql.com/doc/refman/8.0/en/shutdown.html

15.7.8.9 关闭语句

SHUTDOWN

此语句停止 MySQL 服务器。它需要SHUTDOWN 权限。

SHUTDOWN 提供了一个 SQL 级别的接口,可以使用 mysqladmin shutdown 命令或 mysql_shutdown() C API 函数来实现相同的功能。成功的 SHUTDOWN 序列包括检查权限、验证参数,并向客户端发送一个 OK 数据包。然后服务器关闭。

Com_shutdown 状态变量跟踪 SHUTDOWN 语句的数量。因为状态变量在每次服务器启动时初始化,并且在重新启动时不会保留,所以 Com_shutdown 通常值为零,但如果执行了但失败了 SHUTDOWN 语句,则可能为非零。

另一种停止服务器的方法是发送一个 SIGTERM 信号,可以由 root 或拥有服务器进程的帐户执行。SIGTERM 使得可以在不连接到服务器的情况下执行服务器关闭。参见 第 6.10 节,“MySQL 中的 Unix 信号处理”。

15.8 实用语句

原文:dev.mysql.com/doc/refman/8.0/en/sql-utility-statements.html

15.8.1 DESCRIBE 语句

15.8.2 EXPLAIN 语句

15.8.3 HELP 语句

15.8.4 USE 语句

15.8.1 描述语句

原文:dev.mysql.com/doc/refman/8.0/en/describe.html

DESCRIBEEXPLAIN 语句是同义词,用于获取关于表结构或查询执行计划的信息。更多信息,请参见 第 15.7.7.5 节,“显示列语句”,以及 第 15.8.2 节,“解释语句”。

15.8.2 EXPLAIN Statement

原文:dev.mysql.com/doc/refman/8.0/en/explain.html

{EXPLAIN | DESCRIBE | DESC}
    *tbl_name* [*col_name* | *wild*]

{EXPLAIN | DESCRIBE | DESC}
    [*explain_type*]
    {*explainable_stmt* | FOR CONNECTION *connection_id*}

{EXPLAIN | DESCRIBE | DESC} ANALYZE [FORMAT = TREE] *select_statement*

*explain_type*: {
    FORMAT = *format_name*
}

*format_name*: {
    TRADITIONAL
  | JSON
  | TREE
}

*explainable_stmt*: {
    SELECT statement
  | TABLE statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

DESCRIBEEXPLAIN 语句是同义词。在实践中,DESCRIBE 关键字更常用于获取有关表结构的信息,而 EXPLAIN 用于获取查询执行计划(即 MySQL 如何执行查询的解释)。

以下讨论使用 DESCRIBEEXPLAIN 关键字,但 MySQL 解析器将它们视为完全同义词。

  • 获取表结构信息

  • 获取执行计划信息

  • 使用 EXPLAIN ANALYZE 获取信息

获取表结构信息

DESCRIBE 提供了关于表中列的信息:

mysql> DESCRIBE City;
+------------+----------+------+-----+---------+----------------+
| Field      | Type     | Null | Key | Default | Extra          |
+------------+----------+------+-----+---------+----------------+
| Id         | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name       | char(35) | NO   |     |         |                |
| Country    | char(3)  | NO   | UNI |         |                |
| District   | char(20) | YES  | MUL |         |                |
| Population | int(11)  | NO   |     | 0       |                |
+------------+----------+------+-----+---------+----------------+

DESCRIBESHOW COLUMNS 的快捷方式。这些语句也显示视图的信息。SHOW COLUMNS 的描述提供了有关输出列的更多信息。请参阅 Section 15.7.7.5, “SHOW COLUMNS Statement”。

默认情况下,DESCRIBE 显示表中所有列的信息。col_name,如果提供,是表中列的名称。在这种情况下,语句仅显示指定列的信息。wild,如果提供,是一个模式字符串。它可以包含 SQL 的 %_ 通配符字符。在这种情况下,语句仅显示名称与字符串匹配的列的输出。除非字符串包含空格或其他特殊字符,否则无需将字符串括在引号内。

DESCRIBE 语句是为了与 Oracle 兼容而提供的。

SHOW CREATE TABLESHOW TABLE STATUSSHOW INDEX 语句也提供有关表的信息。请参阅 Section 15.7.7, “SHOW Statements”。

explain_format系统变量在 MySQL 8.0.32 中添加,对于用于获取有关表列信息的EXPLAIN输出没有影响。

获取执行计划信息

EXPLAIN语句提供有关 MySQL 如何执行语句的信息:

  • EXPLAIN适用于SELECTDELETEINSERTREPLACEUPDATE语句。在 MySQL 8.0.19 及更高版本中,它还适用于TABLE语句。

  • 当使用EXPLAIN解释可解释的语句时,MySQL 会显示有关语句执行计划的优化器信息。也就是说,MySQL 会解释它将如何处理该语句,包括有关表如何连接以及连接顺序的信息。有关使用EXPLAIN获取执行计划信息的信息,请参见 Section 10.8.2, “EXPLAIN Output Format”。

  • 当使用EXPLAINFOR CONNECTION *connection_id*而不是可解释的语句一起使用时,它会显示在指定连接中执行的语句的执行计划。请参见 Section 10.8.4, “Obtaining Execution Plan Information for a Named Connection”。

  • 对于可解释的语句,EXPLAIN生成额外的执行计划信息,可以使用SHOW WARNINGS显示。请参见 Section 10.8.3, “Extended EXPLAIN Output Format”。

  • EXPLAIN对于检查涉及分区表的查询很有用��请参见 Section 26.3.5, “Obtaining Information About Partitions”。

  • FORMAT选项可用于选择输出格式。TRADITIONAL以表格形式呈现输出。如果没有FORMAT选项,则默认为此格式。JSON格式以 JSON 格式显示信息。在 MySQL 8.0.16 及更高版本中,TREE提供类似树状的输出,比TRADITIONAL格式更精确地描述了查询处理的方式;它是唯一显示哈希连接使用情况的格式(请参见 Section 10.2.1.4, “Hash Join Optimization”),并且始终用于EXPLAIN ANALYZE

    截至 MySQL 8.0.32,EXPLAIN使用的默认输出格式(即,当没有FORMAT选项时)由explain_format系统变量的值确定。此变量的确切影响将在本节后面描述。

EXPLAIN需要执行解释语句所需的相同权限。此外,EXPLAIN还需要对任何解释的视图具有SHOW VIEW权限。如果指定的连接属于不同用户,则EXPLAIN ... FOR CONNECTION还需要PROCESS权限。

MySQL 8.0.32 中引入的explain_format系统变量确定在显示查询执行计划时EXPLAIN的输出格式。此变量可以采用与FORMAT选项一起使用的任何值,另外还添加了DEFAULT作为TRADITIONAL的同义词。以下示例使用world数据库中的country表,该表可以从 MySQL: Other Downloads 获取:

mysql> USE world; # Make world the current database
Database changed

检查explain_format的值,我们看到它具有默认值,因此EXPLAIN(没有FORMAT选项)因此使用传统的表格输出:

mysql> SELECT @@explain_format;
+------------------+
| @@explain_format |
+------------------+
| TRADITIONAL      |
+------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT Name FROM country WHERE Code Like 'A%';
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
| id | select_type | table   | partitions | type  | possible_keys | key     | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | country | NULL       | range | PRIMARY       | PRIMARY | 12      | NULL |   17 |   100.00 | Using where |
+----+-------------+---------+------------+-------+---------------+---------+---------+------+------+----------+-------------+
1 row in set, 1 warning (0.00 sec)

如果将explain_format的值设置为TREE,然后重新运行相同的EXPLAIN语句,输出将使用类似树状的格式:

mysql> SET @@explain_format=TREE;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@explain_format;
+------------------+
| @@explain_format |
+------------------+
| TREE             |
+------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN SELECT Name FROM country WHERE Code LIKE 'A%';
+--------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                      |
+--------------------------------------------------------------------------------------------------------------+
| -> Filter: (country.`Code` like 'A%')  (cost=3.67 rows=17)
 -> Index range scan on country using PRIMARY over ('A' <= Code <= 'A????????')  (cost=3.67 rows=17)  |
+--------------------------------------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

如前所述,FORMAT选项会覆盖此设置。使用FORMAT=JSON而不是FORMAT=TREE执行相同的EXPLAIN语句,可以看到这一点:

mysql> EXPLAIN FORMAT=JSON SELECT Name FROM country WHERE Code LIKE 'A%';
+------------------------------------------------------------------------------+
| EXPLAIN                                                                      |
+------------------------------------------------------------------------------+
| {
  "query_block": {
    "select_id": 1,
    "cost_info": {
      "query_cost": "3.67"
    },
    "table": {
      "table_name": "country",
      "access_type": "range",
      "possible_keys": [
        "PRIMARY"
      ],
      "key": "PRIMARY",
      "used_key_parts": [
        "Code"
      ],
      "key_length": "12",
      "rows_examined_per_scan": 17,
      "rows_produced_per_join": 17,
      "filtered": "100.00",
      "cost_info": {
        "read_cost": "1.97",
        "eval_cost": "1.70",
        "prefix_cost": "3.67",
        "data_read_per_join": "16K"
      },
      "used_columns": [
        "Code",
        "Name"
      ],
      "attached_condition": "(`world`.`country`.`Code` like 'A%')"
    }
  }
}                                                                              |
+------------------------------------------------------------------------------+
1 row in set, 1 warning (0.00 sec)

要将EXPLAIN的默认输出返回到表格格式,请将explain_format设置为TRADITIONAL。或者,您可以将其设置为DEFAULT,效果相同,如下所示:

mysql> SET @@explain_format=DEFAULT;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@explain_format;
+------------------+
| @@explain_format |
+------------------+
| TRADITIONAL      |
+------------------+
1 row in set (0.00 sec)

借助EXPLAIN,您可以看到应该在哪些表上添加索引,以便通过使用索引查找行来使语句执行更快。您还可以使用EXPLAIN来检查优化器是否以最佳顺序连接表。为了提示优化器使用与在SELECT语句中命名表的顺序相对应的连接顺序,可以在语句开头使用SELECT STRAIGHT_JOIN而不仅仅是SELECT。(参见 Section 15.2.13, “SELECT Statement”.)

优化器跟踪有时可能提供与 EXPLAIN 不同的信息。但是,优化器跟踪的格式和内容可能会在版本之间发生变化。有关详细信息,请参见 MySQL Internals: Tracing the Optimizer。

如果您发现索引没有被使用,而您认为它们应该被使用,请运行 ANALYZE TABLE 来更新表统计信息,例如键的基数,这可能会影响优化器的选择。请参阅 Section 15.7.3.1, “ANALYZE TABLE Statement”。

注意

MySQL Workbench 具有可视化解释功能,提供 EXPLAIN 输出的可视化表示。请参阅 教程:使用 Explain 改进查询性能。

使用 EXPLAIN ANALYZE 获取信息

MySQL 8.0.18 引入了 EXPLAIN ANALYZE,它运行一个语句并生成带有时间和额外基于迭代器的信息的 EXPLAIN 输出,展示优化器的期望与实际执行的匹配情况。对于每个迭代器,提供以下信息:

  • 预估执行成本

    (某些迭代器不受成本模型考虑,因此不包括在估计中。)

  • 预估返回的行数

  • 返回第一行所需的时间

  • 执行此迭代器所花费的时间(包括子迭代器,但不包括父迭代器),以毫秒表示。

    (当存在多个循环时,此数字显示每个循环的平均时间。)

  • 迭代器返回的行数

  • 循环次数

查询执行信息使用 TREE 输出格式显示,其中节点表示迭代器。EXPLAIN ANALYZE 总是使用 TREE 输出格式。在 MySQL 8.0.21 及更高版本中,可以选择使用 FORMAT=TREE 明确指定;不支持除 TREE 之外的其他格式。

EXPLAIN ANALYZE 可以与 SELECT 语句一起使用,也可以与多表 UPDATEDELETE 语句一起使用。从 MySQL 8.0.19 开始,还可以与 TABLE 语句一起使用。

从 MySQL 8.0.20 开始,您可以使用 KILL QUERYCTRL-C 终止此语句。

EXPLAIN ANALYZE 不能与 FOR CONNECTION 一起使用。

示例输出:

mysql> EXPLAIN ANALYZE SELECT * FROM t1 JOIN t2 ON (t1.c1 = t2.c2)\G
*************************** 1\. row ***************************
EXPLAIN: -> Inner hash join (t2.c2 = t1.c1)  (cost=4.70 rows=6)
(actual time=0.032..0.035 rows=6 loops=1)
 -> Table scan on t2  (cost=0.06 rows=6)
(actual time=0.003..0.005 rows=6 loops=1)
 -> Hash
 -> Table scan on t1  (cost=0.85 rows=6)
(actual time=0.018..0.022 rows=6 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE i > 8\G
*************************** 1\. row ***************************
EXPLAIN: -> Filter: (t3.i > 8)  (cost=1.75 rows=5)
(actual time=0.019..0.021 rows=6 loops=1)
 -> Table scan on t3  (cost=1.75 rows=15)
(actual time=0.017..0.019 rows=15 loops=1)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
*************************** 1\. row ***************************
EXPLAIN: -> Filter: (t3.pk > 17)  (cost=1.26 rows=5)
(actual time=0.013..0.016 rows=5 loops=1)
 -> Index range scan on t3 using PRIMARY  (cost=1.26 rows=5)
(actual time=0.012..0.014 rows=5 loops=1)

示例输出中使用的表是通过以下显示的语句创建的:

CREATE TABLE t1 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t2 (
    c1 INTEGER DEFAULT NULL,
    c2 INTEGER DEFAULT NULL
);

CREATE TABLE t3 (
    pk INTEGER NOT NULL PRIMARY KEY,
    i INTEGER DEFAULT NULL
);

输出中显示的 actual time 的值以毫秒表示。

截至 MySQL 8.0.32,explain_format系统变量对EXPLAIN ANALYZE有以下影响:

  • 如果此变量的值为TRADITIONALTREE(或同义词DEFAULT),EXPLAIN ANALYZE将使用TREE格式。这确保了该语句继续默认使用TREE格式,就像在引入explain_format之前一样。

  • 如果explain_format的值为JSON,则除非在语句中指定FORMAT=TREE,否则EXPLAIN ANALYZE会返回错误。这是因为EXPLAIN ANALYZE仅支持TREE输出格式。

我们在这里说明了第二点描述的行为,重复使用了前一个示例中的最后一个EXPLAIN ANALYZE语句:

mysql> SET @@explain_format=JSON;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@explain_format;
+------------------+
| @@explain_format |
+------------------+
| JSON             |
+------------------+
1 row in set (0.00 sec)

mysql> EXPLAIN ANALYZE SELECT * FROM t3 WHERE pk > 17\G
ERROR 1235 (42000): This version of MySQL doesn't yet support 'EXPLAIN ANALYZE with JSON format' 
mysql> EXPLAIN ANALYZE FORMAT=TRADITIONAL SELECT * FROM t3 WHERE pk > 17\G
ERROR 1235 (42000): This version of MySQL doesn't yet support 'EXPLAIN ANALYZE with TRADITIONAL format' 
mysql> EXPLAIN ANALYZE FORMAT=TREE SELECT * FROM t3 WHERE pk > 17\G
*************************** 1\. row ***************************
EXPLAIN: -> Filter: (t3.pk > 17)  (cost=1.26 rows=5)
(actual time=0.013..0.016 rows=5 loops=1)
 -> Index range scan on t3 using PRIMARY  (cost=1.26 rows=5)
(actual time=0.012..0.014 rows=5 loops=1)

使用FORMAT=TRADITIONALFORMAT=JSONEXPLAIN ANALYZE总是会引发错误,无论explain_format的值如何。

从 MySQL 8.0.33 开始,EXPLAIN ANALYZEEXPLAIN FORMAT=TREE输出中的数字将根据以下规则进行格式化:

  • 0.001-999999.5 范围内的数字以十进制数形式打印。

    小于 1000 的十进制数有三个有效数字;其余的有四、五或六个。

  • 超出 0.001-999999.5 范围的数字以工程格式打印。这些值的示例是1.23e+9934e-6

  • 不会打印尾随的零。例如,我们打印2.3而不是2.30,打印1.2e+6而不是1.20e+6

  • 小于1e-12的数字打印为0