MySQL8-中文参考-六十六-

55 阅读51分钟

MySQL8 中文参考(六十六)

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

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

15.7.7.1 SHOW BINARY LOGS Statement

SHOW BINARY LOGS
SHOW MASTER LOGS

列出服务器上的二进制日志文件。此语句用作 Section 15.4.1.1, “PURGE BINARY LOGS Statement”中描述的过程的一部分,该过程显示了如何确定哪些日志可以被清除。SHOW BINARY LOGS 需要REPLICATION CLIENT权限(或已弃用的SUPER权限)。

加密的二进制日志文件具有一个 512 字节的文件头,其中存储了加密和解密文件所需的信息。这些信息包含在SHOW BINARY LOGS显示的文件大小中。Encrypted列显示二进制日志文件是否已加密。如果为服务器设置了binlog_encryption=ON,则二进制日志加密处于活动状态。如果在服务器运行时激活或停用二进制日志加密,则现有的二进制日志文件不会被加密或解密。

mysql> SHOW BINARY LOGS;
+---------------+-----------+-----------+
| Log_name      | File_size | Encrypted |
+---------------+-----------+-----------+
| binlog.000015 |    724935 |       Yes |
| binlog.000016 |    733481 |       Yes |
+---------------+-----------+-----------+

SHOW MASTER LOGS 等同于 SHOW BINARY LOGS

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

15.7.7.2 SHOW BINLOG EVENTS Statement

SHOW BINLOG EVENTS
   [IN '*log_name*']
   [FROM *pos*]
   [LIMIT [*offset*,] *row_count*]

显示二进制日志中的事件。如果不指定 '*log_name*',则显示第一个二进制日志。SHOW BINLOG EVENTS 需要 REPLICATION SLAVE 权限。

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

注意

发出不带 LIMIT 子句的 SHOW BINLOG EVENTS 可能会启动一个非常耗时和资源消耗的过程,因为服务器会将二进制日志的完整内容(包括服务器执行的修改数据的所有语句)返回给客户端。作为 SHOW BINLOG EVENTS 的替代方案,可以使用 mysqlbinlog 实用程序将二进制日志保存到文本文件以供以后检查和分析。请参见 Section 6.6.9, “mysqlbinlog — Utility for Processing Binary Log Files”。

SHOW BINLOG EVENTS 显示二进制日志中每个事件的以下字段:

  • Log_name

    正在列出的文件的名称。

  • Pos

    事件发生的位置。

  • Event_type

    描述事件类型的标识符。

  • Server_id

    事件发生的服务器的服务器 ID。

  • End_log_pos

    下一个事件开始的位置,等于 Pos 加上事件的大小。

  • Info

    有关事件类型的更详细信息。此信息的格式取决于事件类型。

对于压缩的事务负载,Transaction_payload_event 首先作为单个单元打印,然后解压缩并打印其中的每个事件。

与用户和系统变量设置相关的一些事件不包含在 SHOW BINLOG EVENTS 的输出中。要完整覆盖二进制日志中的事件,请使用 mysqlbinlog

SHOW BINLOG EVENTS 无法与中继日志文件一起使用。您可以使用 SHOW RELAYLOG EVENTS 来实现此目的。

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

15.7.7.3 SHOW CHARACTER SET Statement

SHOW {CHARACTER SET | CHARSET}
    [LIKE '*pattern*' | WHERE *expr*]

SHOW CHARACTER SET语句显示所有可用的字符集。如果有LIKE子句,则表示要匹配的字符集名称。可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节“SHOW 语句的扩展”中所讨论的那样。例如:

mysql> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | cp1252 West European        | latin1_swedish_ci |      1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |
| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |
| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |
+---------+-----------------------------+-------------------+--------+

SHOW CHARACTER SET输出具有以下列:

  • Charset

    字符集名称。

  • Description

    字符集的描述。

  • Default collation

    字符集的默认排序规则。

  • Maxlen

    存储一个字符所需的最大字节数。

filename字符集仅供内部使用;因此,SHOW CHARACTER SET不会显示它。

字符集信息也可以从INFORMATION_SCHEMA CHARACTER_SETS表中获取。

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

15.7.7.4 SHOW COLLATION Statement

SHOW COLLATION
    [LIKE '*pattern*' | WHERE *expr*]

此语句列出了服务器支持的排序规则。默认情况下,SHOW COLLATION 的输出包括所有可用的排序规则。如果存在 LIKE 子句,则指示要匹配的排序规则名称。可以使用 WHERE 子句来选择使用更一般条件的行,如 第 28.8 节,“SHOW 语句的扩展” 中讨论的那样。例如:

mysql> SHOW COLLATION WHERE Charset = 'latin1';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         | Yes      |       1 |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       1 |
| latin1_danish_ci  | latin1  | 15 |         | Yes      |       1 |
| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
| latin1_bin        | latin1  | 47 |         | Yes      |       1 |
| latin1_general_ci | latin1  | 48 |         | Yes      |       1 |
| latin1_general_cs | latin1  | 49 |         | Yes      |       1 |
| latin1_spanish_ci | latin1  | 94 |         | Yes      |       1 |
+-------------------+---------+----+---------+----------+---------+

SHOW COLLATION 的输出包括以下列:

  • Collation

    排序规则名称。

  • Charset

    与排序规则关联的字符集的名称。

  • Id

    排序规则 ID。

  • Default

    排序规则是否是其字符集的默认值。

  • Compiled

    字符集是否编译到服务器中。

  • Sortlen

    这与在字符集中表达的字符串所需的排序所需的内存量有关。

要查看每个字符集的默认排序规则,请使用以下语句。Default是一个保留字,因此要将其用作标识符,必须将其引用为:

mysql> SHOW COLLATION WHERE `Default` = 'Yes';
+---------------------+----------+----+---------+----------+---------+
| Collation           | Charset  | Id | Default | Compiled | Sortlen |
+---------------------+----------+----+---------+----------+---------+
| big5_chinese_ci     | big5     |  1 | Yes     | Yes      |       1 |
| dec8_swedish_ci     | dec8     |  3 | Yes     | Yes      |       1 |
| cp850_general_ci    | cp850    |  4 | Yes     | Yes      |       1 |
| hp8_english_ci      | hp8      |  6 | Yes     | Yes      |       1 |
| koi8r_general_ci    | koi8r    |  7 | Yes     | Yes      |       1 |
| latin1_swedish_ci   | latin1   |  8 | Yes     | Yes      |       1 |
...

排序规则信息也可以从 INFORMATION_SCHEMACOLLATIONS 表中获取。请参见 第 28.3.6 节,“INFORMATION_SCHEMA COLLATIONS 表”。

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

15.7.7.5 显示列语句

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

显示列显示给定表中列的信息。它也适用于视图。显示列仅显示您具有某些权限的列的信息。

mysql> SHOW COLUMNS FROM City;
+-------------+----------+------+-----+---------+----------------+
| Field       | Type     | Null | Key | Default | Extra          |
+-------------+----------+------+-----+---------+----------------+
| ID          | int(11)  | NO   | PRI | NULL    | auto_increment |
| Name        | char(35) | NO   |     |         |                |
| CountryCode | char(3)  | NO   | MUL |         |                |
| District    | char(20) | NO   |     |         |                |
| Population  | int(11)  | NO   |     | 0       |                |
+-------------+----------+------+-----+---------+----------------+

*tbl_name* FROM *db_name*语法的替代方案是*db_name.tbl_name*。这两个语句是等效的:

SHOW COLUMNS FROM mytable FROM mydb;
SHOW COLUMNS FROM mydb.mytable;

可选的EXTENDED关键字导致输出包括关于 MySQL 内部使用但用户无法访问的隐藏列的信息。

可选的FULL关键字导致输出包括列排序规则和注释,以及您对每列的权限。

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

数据类型可能与您根据CREATE TABLE语句期望的不同,因为 MySQL 有时在创建或更改表时会更改数据类型。发生这种情况的条件在第 15.1.20.7 节“静默列规范更改”中有描述。

显示列为每个表列显示以下数值:

  • Field

    列的名称。

  • Type

    列数据类型。

  • Collation

    非二进制字符串列的排序规则,或其他列的NULL值。仅当使用FULL关键字时才显示此值。

  • Null

    列的可空性。如果列中可以存储NULL值,则该值为YES,否则为NO

  • Key

    列是否被索引:

    • 如果Key为空,则该列要么未被索引,要么仅作为多列非唯一索引中的次要列被索引。

    • 如果KeyPRI,则该列是PRIMARY KEY或是多列PRIMARY KEY中的一列。

    • 如果KeyUNI,则该列是UNIQUE索引的第一列。(UNIQUE索引允许多个NULL值,但您可以通过检查Null字段来确定该列是否允许NULL。)

    • 如果KeyMUL,则该列是非唯一索引的第一列,在该索引中允许列中出现给定值的多个实例。

    如果多个Key值适用于表的某一列,则Key按照PRIUNIMUL的顺序显示具有最高优先级的值。

    如果UNIQUE索引不能包含NULL值且表中没有PRIMARY KEY,则UNIQUE索引可能显示为PRI。如果几列形成复合UNIQUE索引,则UNIQUE索引可能显示为MUL;尽管列的组合是唯一的,但每列仍然可以包含给定值的多个出现。

  • 默认

    列的默认值。如果列具有显式默认值为NULL,或者列定义中不包含DEFAULT子句,则为NULL

  • 额外

    有关给定列的任何其他可用信息。在以下情况下,该值不为空:

    • 对于具有AUTO_INCREMENT属性的列,显示auto_increment

    • 对于具有ON UPDATE CURRENT_TIMESTAMP属性的TIMESTAMPDATETIME列,显示on update CURRENT_TIMESTAMP

    • 用于生成列的VIRTUAL GENERATEDSTORED GENERATED

    • 对于具有表达式默认值的列,使用DEFAULT_GENERATED

  • 权限

    您对该列的权限。仅当使用FULL关键字时才显示此值。

  • 注释

    列定义中包含的任何注释。仅当使用FULL关键字时才显示此值。

表列信息也可以从INFORMATION_SCHEMACOLUMNS表中获取。请参阅第 28.3.8 节,“The INFORMATION_SCHEMA COLUMNS Table”。有关隐藏列的扩展信息仅可使用SHOW EXTENDED COLUMNS获得;无法从COLUMNS表中获取。

您可以使用**mysqlshow db_name *tbl_name***命令列出表的列。

DESCRIBE语句提供类似于SHOW COLUMNS的信息。请参阅第 15.8.1 节,“DESCRIBE Statement”。

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

在 MySQL 8.0.30 及更高版本中,默认情况下,SHOW COLUMNS 包括表的生成的不可见主键。您可以通过设置 show_gipk_in_create_table_and_information_schema = OFF 来使此信息在语句输出中被抑制。更多信息,请参见 Section 15.1.20.11, “Generated Invisible Primary Keys”。

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

15.7.7.6 显示创建数据库语句

SHOW CREATE {DATABASE | SCHEMA} [IF NOT EXISTS] *db_name*

显示创建指定数据库的CREATE DATABASE语句。如果SHOW语句包含IF NOT EXISTS子句,则输出也包含此子句。SHOW CREATE SCHEMASHOW CREATE DATABASE的同义词。

mysql> SHOW CREATE DATABASE test\G
*************************** 1\. row ***************************
       Database: test
Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4
                 COLLATE utf8mb4_0900_ai_ci */ /*!80014 DEFAULT ENCRYPTION='N' */ 
mysql> SHOW CREATE SCHEMA test\G
*************************** 1\. row ***************************
       Database: test
Create Database: CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8mb4
                 COLLATE utf8mb4_0900_ai_ci */ /*!80014 DEFAULT ENCRYPTION='N' */

SHOW CREATE DATABASE根据sql_quote_show_create选项的值引用表名和列名。参见第 7.1.8 节,“服务器系统变量”。

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

15.7.7.7 显示创建事件语句

SHOW CREATE EVENT *event_name*

此语句显示重新创建给定事件所需的CREATE EVENT语句。它需要显示事件的数据库的EVENT权限。例如(使用在第 15.7.7.18 节,“显示事件语句”中定义并修改的相同事件e_daily):

mysql> SHOW CREATE EVENT myschema.e_daily\G
*************************** 1\. row ***************************
               Event: e_daily
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
                      NO_ZERO_IN_DATE,NO_ZERO_DATE,
                      ERROR_FOR_DIVISION_BY_ZERO,
                      NO_ENGINE_SUBSTITUTION
           time_zone: SYSTEM
        Create Event: CREATE DEFINER=`jon`@`ghidora` EVENT `e_daily`
                        ON SCHEDULE EVERY 1 DAY
                        STARTS CURRENT_TIMESTAMP + INTERVAL 6 HOUR
                        ON COMPLETION NOT PRESERVE
                        ENABLE
                        COMMENT 'Saves total number of sessions then
                                clears the table each day'
                        DO BEGIN
                          INSERT INTO site_activity.totals (time, total)
                            SELECT CURRENT_TIMESTAMP, COUNT(*)
                              FROM site_activity.sessions;
                          DELETE FROM site_activity.sessions;
                        END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci

character_set_client是事件创建时character_set_client系统变量的会话值。collation_connection是事件创建时collation_connection系统变量的会话值。数据库排序规则是事件关联的数据库的排序规则。

输出反映了事件的当前状态(ENABLE)而不是创建时的状态。

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

15.7.7.8 SHOW CREATE FUNCTION Statement

SHOW CREATE FUNCTION *func_name*

这个语句类似于SHOW CREATE PROCEDURE,但用于存储函数。请参阅第 15.7.7.9 节,“SHOW CREATE PROCEDURE Statement”。

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

15.7.7.9 显示创建存储过程语句

SHOW CREATE PROCEDURE *proc_name*

此语句是 MySQL 的扩展。它返回一个确切的字符串,可用于重新创建指定的存储过程。类似的语句,显示创建函数,显示有关存储函数的信息(参见第 15.7.7.8 节,“显示创建函数语句”)。

要使用任一语句,您必须是例程DEFINER的命名用户,具有SHOW_ROUTINE权限,在全局级别具有SELECT权限,或者在包括例程的范围内被授予CREATE ROUTINEALTER ROUTINEEXECUTE权限。如果您只具有CREATE ROUTINEALTER ROUTINEEXECUTE权限,则Create ProcedureCreate Function字段显示的值为NULL

mysql> SHOW CREATE PROCEDURE test.citycount\G
*************************** 1\. row ***************************
           Procedure: citycount
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
                      NO_ZERO_IN_DATE,NO_ZERO_DATE,
                      ERROR_FOR_DIVISION_BY_ZERO,
                      NO_ENGINE_SUBSTITUTION
    Create Procedure: CREATE DEFINER=`me`@`localhost`
                      PROCEDURE `citycount`(IN country CHAR(3), OUT cities INT)
                      BEGIN
                        SELECT COUNT(*) INTO cities FROM world.city
                        WHERE CountryCode = country;
                      END
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci 
mysql> SHOW CREATE FUNCTION test.hello\G
*************************** 1\. row ***************************
            Function: hello
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
                      NO_ZERO_IN_DATE,NO_ZERO_DATE,
                      ERROR_FOR_DIVISION_BY_ZERO,
                      NO_ENGINE_SUBSTITUTION
     Create Function: CREATE DEFINER=`me`@`localhost`
                      FUNCTION `hello`(s CHAR(20))
                      RETURNS char(50) CHARSET utf8mb4
                      DETERMINISTIC
                      RETURN CONCAT('Hello, ',s,'!')
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci

character_set_client是创建例程时的character_set_client系统变量的会话值。collation_connection是创建例程时的collation_connection系统变量的会话值。数据库排序规则是与例程关联的数据库的排序规则。

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

15.7.7.10 SHOW CREATE TABLE Statement

SHOW CREATE TABLE *tbl_name*

显示创建指定表的 CREATE TABLE 语句。要使用此语句,您必须对该表具有某些权限。此语句也适用于视图。

mysql> SHOW CREATE TABLE t\G
*************************** 1\. row ***************************
       Table: t
Create Table: CREATE TABLE `t` (
  `id` int NOT NULL AUTO_INCREMENT,
  `s` char(60) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

从 MySQL 8.0.16 开始,MySQL 实现了 CHECK 约束,并且 SHOW CREATE TABLE 显示它们。所有 CHECK 约束都显示为表约束。也就是说,最初作为列定义的 CHECK 约束显示为一个独立的子句,而不是列定义的一部分。例如:

mysql> CREATE TABLE t1 (
         i1 INT CHECK (i1 <> 0),      -- column constraint
         i2 INT,
         CHECK (i2 > i1),             -- table constraint
         CHECK (i2 <> 0) NOT ENFORCED -- table constraint, not enforced
       );

mysql> SHOW CREATE TABLE t1\G
*************************** 1\. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `i1` int DEFAULT NULL,
  `i2` int DEFAULT NULL,
  CONSTRAINT `t1_chk_1` CHECK ((`i1` <> 0)),
  CONSTRAINT `t1_chk_2` CHECK ((`i2` > `i1`)),
  CONSTRAINT `t1_chk_3` CHECK ((`i2` <> 0)) /*!80016 NOT ENFORCED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci

SHOW CREATE TABLE 根据 sql_quote_show_create 选项的值引用表和列名。请参见 Section 7.1.8, “Server System Variables”。

当更改表的存储引擎时,不适用于新存储引擎的表选项将保留在表定义中,以便在必要时将具有先前定义选项的表还原到原始存储引擎。例如,当从 InnoDB 更改存储引擎为 MyISAM 时,特定于 InnoDB 的选项,如 ROW_FORMAT=COMPACT,将被保留,如下所示:

mysql> CREATE TABLE t1 (c1 INT PRIMARY KEY) ROW_FORMAT=COMPACT ENGINE=InnoDB;
mysql> ALTER TABLE t1 ENGINE=MyISAM;
mysql> SHOW CREATE TABLE t1\G
*************************** 1\. row ***************************
       Table: t1
Create Table: CREATE TABLE `t1` (
  `c1` int NOT NULL,
  PRIMARY KEY (`c1`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT

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

在 MySQL 8.0.30 及更高版本中,默认情况下,SHOW CREATE TABLE 包括表的生成的隐式主键的定义,如果表有这样的主键。您可以通过设置 show_gipk_in_create_table_and_information_schema = OFF 来使此信息在语句输出中被抑制。更多信息,请参见 Section 15.1.20.11, “Generated Invisible Primary Keys”。

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

15.7.7.11 显示 CREATE TRIGGER 语句

SHOW CREATE TRIGGER *trigger_name*

此语句显示创建指定触发器的CREATE TRIGGER语句。此语句需要与触发器关联的表的TRIGGER权限。

mysql> SHOW CREATE TRIGGER ins_sum\G
*************************** 1\. row ***************************
               Trigger: ins_sum
              sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
                        NO_ZERO_IN_DATE,NO_ZERO_DATE,
                        ERROR_FOR_DIVISION_BY_ZERO,
                        NO_ENGINE_SUBSTITUTION
SQL Original Statement: CREATE DEFINER=`me`@`localhost` TRIGGER `ins_sum`
                        BEFORE INSERT ON `account`
                        FOR EACH ROW SET @sum = @sum + NEW.amount
  character_set_client: utf8mb4
  collation_connection: utf8mb4_0900_ai_ci
    Database Collation: utf8mb4_0900_ai_ci
               Created: 2018-08-08 10:10:12.61

显示 CREATE TRIGGER输出包含以下列:

  • 触发器:触发器名称。

  • sql_mode:触发器执行时有效的 SQL 模式。

  • SQL 原始语句:定义触发器的CREATE TRIGGER语句。

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

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

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

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

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

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

15.7.7.12 显示创建用户语句

SHOW CREATE USER *user*

此语句显示创建指定用户的CREATE USER语句。如果用户不存在,则会出现错误。该语句需要对mysql系统模式的SELECT权限,除了查看当前用户的信息。对于当前用户,在IDENTIFIED AS子句中显示密码哈希值需要对mysql.user系统表的SELECT权限;否则,哈希值显示为<secret>

要命名账户,请使用第 8.2.4 节“指定账户名称”中描述的格式。如果省略账户名的主机名部分,则默认为'%'。还可以指定CURRENT_USERCURRENT_USER()来引用与当前会话关联的账户。

SHOW CREATE USER的输出中,IDENTIFIED WITH子句中显示的密码哈希值可能包含不可打印字符,对终端显示和其他环境产生不良影响。启用print_identified_with_as_hex系统变量(自 MySQL 8.0.17 起可用)会导致SHOW CREATE USER将这些哈希值显示为十六进制字符串,而不是常规字符串文字。即使启用此变量,不包含不可打印字符的哈希值仍会显示为常规字符串文字。

mysql> CREATE USER 'u1'@'localhost' IDENTIFIED BY 'secret';
mysql> SET print_identified_with_as_hex = ON;
mysql> SHOW CREATE USER 'u1'@'localhost'\G
*************************** 1\. row ***************************
CREATE USER for u1@localhost: CREATE USER `u1`@`localhost`
IDENTIFIED WITH 'caching_sha2_password'
AS 0x244124303035240C7745603626313D613C4C10633E0A104B1E14135A544A7871567245614F4872344643546336546F624F6C7861326932752F45622F4F473273597557627139
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
PASSWORD HISTORY DEFAULT PASSWORD REUSE INTERVAL DEFAULT
PASSWORD REQUIRE CURRENT DEFAULT

要显示授予账户的权限,请使用SHOW GRANTS语句。参见第 15.7.7.21 节“SHOW GRANTS Statement”。

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

15.7.7.13 显示创建视图语句

SHOW CREATE VIEW *view_name*

此语句显示创建命名视图的CREATE VIEW语句。

mysql> SHOW CREATE VIEW v\G
*************************** 1\. row ***************************
                View: v
         Create View: CREATE ALGORITHM=UNDEFINED
                      DEFINER=`bob`@`localhost`
                      SQL SECURITY DEFINER VIEW
                      `v` AS select 1 AS `a`,2 AS `b`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci

character_set_client 是视图创建时character_set_client系统变量的会话值。collation_connection 是视图创建时collation_connection系统变量的会话值。

使用SHOW CREATE VIEW需要SHOW VIEW权限,并且需要针对特定视图的SELECT权限。

视图信息也可以从INFORMATION_SCHEMA VIEWS表中获取。参见 Section 28.3.48, “INFORMATION_SCHEMA VIEWS 表”。

MySQL 允许您使用不同的sql_mode设置来告诉服务器支持的 SQL 语法类型。例如,您可以使用ANSI SQL 模式来确保 MySQL 正确解释标准 SQL 连接运算符,双竖线(||),在您的查询中。如果您创建一个连接项目的视图,您可能担心将sql_mode设置更改为与ANSI不同的值会导致视图无效。但事实并非如此。无论您如何编写视图定义,MySQL 始终以规范形式存储它。以下是一个示例,显示服务器如何将双竖线连接运算符更改为CONCAT()函数:

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

mysql> CREATE VIEW test.v AS SELECT 'a' || 'b' as col1;
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW CREATE VIEW test.v\G
*************************** 1\. row ***************************
                View: v
         Create View: CREATE VIEW "v" AS select concat('a','b') AS "col1"
... 1 row in set (0.00 sec)

将视图定义存储为规范形式的优势在于稍后对sql_mode值的更改不会影响视图的结果。然而,另一个后果是服务器会剥离SELECT之前的注释。

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

15.7.7.14 显示数据库语句

SHOW {DATABASES | SCHEMAS}
    [LIKE '*pattern*' | WHERE *expr*]

显示数据库 列出了 MySQL 服务器主机上的数据库。 显示模式显示数据库 的同义词。如果存在 LIKE 子句,则指示要匹配的数据库名称。可以使用 WHERE 子句选择使用更一般条件的行,如 第 28.8 节,“SHOW 语句的扩展” 中讨论的那样。

您只能看到您具有某种权限的数据库,除非具有全局 显示数据库 权限。您还可以使用 mysqlshow 命令获取此列表。

如果服务器是使用 --skip-show-database 选项启动的,则除非具有 显示数据库 权限,否则根本无法使用此语句。

MySQL 将数据库实现为数据目录中的目录,因此此语句仅列出该位置中的目录。但是,输出可能包括不对应实际数据库的目录名称。

数据库信息也可以从 INFORMATION_SCHEMA SCHEMATA 表中获取。请参阅 第 28.3.31 节,“INFORMATION_SCHEMA SCHEMATA 表”。

注意

因为任何静态全局权限都被视为所有数据库的权限,任何静态全局权限都使用户能够使用 显示数据库 或通过检查 INFORMATION_SCHEMASCHEMATA 表来查看所有数据库名称,除了通过部分撤销在数据库级别限制的数据库。

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

15.7.7.15 SHOW ENGINE Statement

SHOW ENGINE *engine_name* {STATUS | MUTEX}

SHOW ENGINE显示有关存储引擎的操作信息。它需要PROCESS权限。该语句有以下变体:

SHOW ENGINE INNODB STATUS
SHOW ENGINE INNODB MUTEX
SHOW ENGINE PERFORMANCE_SCHEMA STATUS

SHOW ENGINE INNODB STATUS显示有关InnoDB存储引擎状态的标准InnoDB监视器的详细信息。有关标准监视器和提供有关InnoDB处理信息的其他InnoDB监视器的信息,请参见第 17.17 节,“InnoDB 监视器”。

SHOW ENGINE INNODB MUTEX显示InnoDB mutex 和 rw-lock 统计信息。

注意

也可以使用性能模式表监视InnoDB互斥锁和读写锁。请参见第 17.16.2 节,“使用性能模式监视 InnoDB 互斥锁等待”。

互斥锁统计信息的收集通过以下选项动态配置:

  • 要启用互斥锁统计信息的收集,请运行:

    SET GLOBAL innodb_monitor_enable='latch';
    
  • 要重置互斥锁统计信息,请运行:

    SET GLOBAL innodb_monitor_reset='latch';
    
  • 要禁用互斥锁统计信息的收集,请运行:

    SET GLOBAL innodb_monitor_disable='latch';
    

通过设置innodb_monitor_enable='all'可以启用对SHOW ENGINE INNODB MUTEX的互斥锁统计信息的收集,通过设置innodb_monitor_disable='all'可以禁用。

SHOW ENGINE INNODB MUTEX输出具有以下列:

  • Type

    始终使用InnoDB

  • Name

    对于互斥锁,Name字段仅报告互斥锁名称。对于读写锁,Name字段报告实现读写锁的源文件,以及创建读写锁的文件中的行号。行号特定于您的 MySQL 版本。

  • Status

    互斥锁状态。此字段报告旋转次数、等待次数和调用次数。不报告在InnoDB之外实现的低级操作系统互斥锁的统计信息。

    • spins表示旋转次数。

    • waits表示互斥锁等待次数。

    • calls表示请求互斥锁的次数。

SHOW ENGINE INNODB MUTEX 不会列出每个缓冲池块的互斥锁和读写锁,因为在具有大缓冲池的系统上,输出量会非常庞大。然而,SHOW ENGINE INNODB MUTEX 会打印缓冲池块互斥锁和读写锁的聚合 BUF_BLOCK_MUTEX 自旋、等待和调用值。SHOW ENGINE INNODB MUTEX 也不会列出任何从未等待过的互斥锁或读写锁(os_waits=0)。因此,SHOW ENGINE INNODB MUTEX 仅显示导致至少一个操作系统级 等待 的互斥锁和读写锁的信息。

使用 SHOW ENGINE PERFORMANCE_SCHEMA STATUS 来检查性能模式代码的内部操作:

mysql> SHOW ENGINE PERFORMANCE_SCHEMA STATUS\G
...
*************************** 3\. row ***************************
  Type: performance_schema
  Name: events_waits_history.size
Status: 76
*************************** 4\. row ***************************
  Type: performance_schema
  Name: events_waits_history.count
Status: 10000
*************************** 5\. row ***************************
  Type: performance_schema
  Name: events_waits_history.memory
Status: 760000
...
*************************** 57\. row ***************************
  Type: performance_schema
  Name: performance_schema.memory
Status: 26459600
...

该语句旨在帮助数据库管理员了解不同性能模式选项对内存需求的影响。

Name 值由两部分组成,分别命名内部缓冲区和缓冲属性。解释缓冲区名称如下:

  • 未公开为表的内部缓冲区在括号内命名。例如:(pfs_cond_class).size(pfs_mutex_class).memory

  • performance_schema 数据库中作为表公开的内部缓冲区以表名命名,不带括号。例如:events_waits_history.sizemutex_instances.count

  • 适用于整个性能模式的值以 performance_schema 开头。例如:performance_schema.memory

缓冲属性具有以下含义:

  • size 是实现中使用的内部记录的大小,比如表中行的大小。size 值无法更改。

  • count 是内部记录的数量,比如表中的行数。count 值可以通过性能模式配置选项进行更改。

  • 对于表,*tbl_name*.memorysizecount 的乘积。对于整个性能模式,performance_schema.memory是所有内存使用量的总和(所有其他memory` 值的总和)。

在某些情况下,性能模式配置参数与 SHOW ENGINE 值之间存在直接关系。例如,events_waits_history_long.count 对应于 performance_schema_events_waits_history_long_size。在其他情况下,关系更为复杂。例如,events_waits_history.count 对应于 performance_schema_events_waits_history_size(每个线程的行数)乘以 performance_schema_max_thread_instances(线程数)。

**SHOW ENGINE NDB STATUS. ** 如果服务器启用了NDB存储引擎,SHOW ENGINE NDB STATUS显示集群状态信息,如连接的数据节点数量、集群连接字符串和集群二进制日志时代,以及 MySQL 服务器连接到集群时创建的各种 Cluster API 对象的计数。此语句的示例输出如下:

mysql> SHOW ENGINE NDB STATUS;
+------------+-----------------------+--------------------------------------------------+
| Type       | Name                  | Status                                           |
+------------+-----------------------+--------------------------------------------------+
| ndbcluster | connection            | cluster_node_id=7,
  connected_host=198.51.100.103, connected_port=1186, number_of_data_nodes=4,
  number_of_ready_data_nodes=3, connect_count=0                                         |
| ndbcluster | NdbTransaction        | created=6, free=0, sizeof=212                    |
| ndbcluster | NdbOperation          | created=8, free=8, sizeof=660                    |
| ndbcluster | NdbIndexScanOperation | created=1, free=1, sizeof=744                    |
| ndbcluster | NdbIndexOperation     | created=0, free=0, sizeof=664                    |
| ndbcluster | NdbRecAttr            | created=1285, free=1285, sizeof=60               |
| ndbcluster | NdbApiSignal          | created=16, free=16, sizeof=136                  |
| ndbcluster | NdbLabel              | created=0, free=0, sizeof=196                    |
| ndbcluster | NdbBranch             | created=0, free=0, sizeof=24                     |
| ndbcluster | NdbSubroutine         | created=0, free=0, sizeof=68                     |
| ndbcluster | NdbCall               | created=0, free=0, sizeof=16                     |
| ndbcluster | NdbBlob               | created=1, free=1, sizeof=264                    |
| ndbcluster | NdbReceiver           | created=4, free=0, sizeof=68                     |
| ndbcluster | binlog                | latest_epoch=155467, latest_trans_epoch=148126,
  latest_received_binlog_epoch=0, latest_handled_binlog_epoch=0,
  latest_applied_binlog_epoch=0                                                         |
+------------+-----------------------+--------------------------------------------------+

这些行中的Status列提供有关 MySQL 服务器与集群的连接以及集群二进制日志状态的信息。Status信息以逗号分隔的名称/值对形式呈现。

connection行的Status列包含以下表中描述的名称/值对。

名称
cluster_node_id集群中 MySQL 服务器的节点 ID
connected_hostMySQL 服务器连接的集群管理服务器的主机名或 IP 地址
connected_portMySQL 服务器用于连接管理服务器(connected_host)的端口号
number_of_data_nodes集群配置的数据节点数量(即,集群config.ini文件中[ndbd]部分的数量)
number_of_ready_data_nodes集群中实际运行的数据节点数量
connect_countmysqld连接或重新连接到集群数据节点的次数

binlog行的Status列包含与 NDB 集群复制相关的信息。它包含的名称/值对在以下表中描述。

名称
latest_epoch此 MySQL 服务器上最近运行的最新时代(即,服务器上最近运行的最新事务的序列号)
latest_trans_epoch集群数据节点处理的最新时代
latest_received_binlog_epoch二进制日志线程接收的最新时代
latest_handled_binlog_epoch二进制日志线程处理的最新时代(用于写入二进制日志)
latest_applied_binlog_epoch实际写入二进制日志的最新时代

更多信息请参阅第 25.7 节,“NDB 集群复制”。

SHOW ENGINE NDB STATUS输出中剩余的行最有可能在监视集群时证明有用,按Name列在此处列出:

  • NdbTransaction:已创建的NdbTransaction对象的数量和大小。每次在NDB表上执行表模式操作(如CREATE TABLEALTER TABLE)时都会创建一个NdbTransaction

  • NdbOperation: 已创建的NdbOperation对象的数量和大小。

  • NdbIndexScanOperation: 已创建的NdbIndexScanOperation对象的数量和大小。

  • NdbIndexOperation: 已创建的NdbIndexOperation对象的数量和大小。

  • NdbRecAttr: 已创建的NdbRecAttr对象的数量和大小。通常,每当由 SQL 节点执行数据操作语句时,就会创建一个NdbRecAttr

  • NdbBlob: 已创建的NdbBlob对象的数量和大小。每当涉及NDB表中的BLOB列的新操作时,就会创建一个NdbBlob

  • NdbReceiver: 已创建的任何NdbReceiver对象的数量和大小。created列中的数字与 MySQL 服务器连接的集群中的数据节点数量相同。

注意

如果在当前会话中,通过访问运行此语句的 SQL 节点的 MySQL 客户端执行了涉及NDB表的操作,则SHOW ENGINE NDB STATUS将返回空结果。

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

15.7.7.16 显示引擎语句

SHOW [STORAGE] ENGINES

显示引擎 显示关于服务器存储引擎的状态信息。这对于检查存储引擎是否受支持或查看默认引擎特别有用。

有关 MySQL 存储引擎的信息,请参阅 第十七章,“InnoDB 存储引擎” 和 第十八章,“替代存储引擎”。

mysql> SHOW ENGINES\G
*************************** 1\. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2\. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3\. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4\. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 5\. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6\. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7\. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 8\. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9\. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO

显示引擎 的输出可能根据使用的 MySQL 版本和其他因素而有所不同。

显示引擎 输出包含以下列:

  • 引擎

    存储引擎的名称。

  • 支持

    服务器对存储引擎的支持级别,如下表所示。

    含义
    YES引擎受支持且处于活动状态
    DEFAULT类似于 YES,并且这是默认引擎
    NO引擎不受支持
    DISABLED引擎受支持但已被禁用

    NO 的值表示服务器在编译时没有对该引擎的支持,因此无法在运行时启用。

    DISABLED 的值可能是因为服务器启动时使用了禁用引擎的选项,或者因为未提供启用引擎所需的所有选项。在后一种情况下,错误日志应包含指示为何选项被禁用的原因。参见 第 7.4.2 节,“错误日志”。

    如果服务器在编译时支持某个存储引擎,但启动时使用了 --skip-*engine_name* 选项,则可能会看到存储引擎的 DISABLED。对于 NDB 存储引擎,DISABLED 表示服务器已编译支持 NDB Cluster,但未使用 --ndbcluster 选项启动。

    所有 MySQL 服务器都支持 MyISAM 表。无法禁用 MyISAM

  • 注释

    存储引擎的简要描述。

  • 事务

    存储引擎是否支持事务。

  • XA

    存储引擎是否支持 XA 事务。

  • 保存点

    存储引擎是否支持保存点。

存储引擎信息也可以从 INFORMATION_SCHEMA ENGINES 表中获取。参见 第 28.3.13 节,“INFORMATION_SCHEMA ENGINES 表”。

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

15.7.7.17 SHOW ERRORS Statement

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

SHOW ERRORS是一条诊断语句,类似于SHOW WARNINGS,不同之处在于它仅显示错误的信息,而不是错误、警告和注释。

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

SHOW COUNT(*) ERRORS语句显示错误的数量。您还可以从error_count变量中检索此数字:

SHOW COUNT(*) ERRORS;
SELECT @@error_count;

SHOW ERRORSerror_count仅适用于错误,而不是警告或注释。在其他方面,它们类似于SHOW WARNINGSwarning_count。特别是,SHOW ERRORS无法显示超过max_error_count条消息的信息,如果错误数量超过max_error_count,则error_count的值可以超过max_error_count的值。

有关更多信息,请参见 Section 15.7.7.42, “SHOW WARNINGS Statement”。

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

15.7.7.18 显示事件语句

SHOW EVENTS
    [{FROM | IN} *schema_name*]
    [LIKE '*pattern*' | WHERE *expr*]

此语句显示有关事件管理器事件的信息,这些事件在第 27.4 节“使用事件调度程序”中讨论。它需要对要显示事件的数据库具有EVENT权限。

在其最简单形式中,显示事件列出当前模式中的所有事件:

mysql> SELECT CURRENT_USER(), SCHEMA();
+----------------+----------+
| CURRENT_USER() | SCHEMA() |
+----------------+----------+
| jon@ghidora    | myschema |
+----------------+----------+
1 row in set (0.00 sec)

mysql> SHOW EVENTS\G
*************************** 1\. row ***************************
                  Db: myschema
                Name: e_daily
             Definer: jon@ghidora
           Time zone: SYSTEM
                Type: RECURRING
          Execute at: NULL
      Interval value: 1
      Interval field: DAY
              Starts: 2018-08-08 11:06:34
                Ends: NULL
              Status: ENABLED
          Originator: 1
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci

要查看特定模式的事件,请使用FROM子句。例如,要查看test模式的事件,请使用以下语句:

SHOW EVENTS FROM test;

如果存在LIKE子句,则指示要匹配的事件名称。可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节“SHOW 语句的扩展”中讨论的那样。

显示事件输出包括以下列:

  • 数据库

    事件所属的模式(数据库)的名称。

  • 名称

    事件的名称。

  • 定义者

    创建事件的用户账户,格式为'*user_name*'@'*host_name*

  • 时区

    事件的时区,用于调度事件并在事件执行时生效的时区。默认值为SYSTEM

  • 类型

    事件重复类型,可以是ONE TIME(瞬时)或RECURRING(重复)。

  • 执行时间

    对于一次性事件,这是在CREATE EVENT语句的AT子句中指定的DATETIME值,或者最后一个修改事件的ALTER EVENT语句中指定的值。此列中显示的值反映了事件的AT子句中包含的任何INTERVAL值的加减。例如,如果使用ON SCHEDULE AT CURRENT_TIMESTAMP + '1:6' DAY_HOUR创建事件,并且事件在 2018-02-09 14:05:30 创建,则此列中显示的值将是'2018-02-10 20:05:30'。如果事件的时间由EVERY子句确定而不是AT子句(即事件是重复的),则此列的值为NULL

  • 间隔值

    对于重复事件,事件执行之间等待的间隔数。对于瞬时事件,此列的值始终为NULL

  • 间隔字段

    用于重复事件等待重复之前的间隔的时间单位。对于瞬时事件,此列的值始终为NULL

  • 开始时间

    循环事件的开始日期和时间。显示为DATETIME值,如果未为事件定义开始日期和时间,则为NULL。对于瞬时事件,此列始终为NULL。对于定义包含STARTS子句的循环事件,此列包含相应的DATETIME值。与Execute At列一样,此值解析任何使用的表达式。如果没有影响事件定时的STARTS子句,则此列为NULL

  • 结束

    对于定义包含ENDS子句的循环事件,此列包含相应的DATETIME值。与Execute At列一样,此值解析任何使用的表达式。如果没有影响事件定时的ENDS子句,则此列为NULL

  • 状态

    事件状态。ENABLEDDISABLEDSLAVESIDE_DISABLED之一。SLAVESIDE_DISABLED表示事件的创建发生在另一个作为复制源的 MySQL 服务器上,并复制到当前作为副本的 MySQL 服务器,但事件目前未在副本上执行。有关更多信息,请参见 Section 19.5.1.16, “Replication of Invoked Features”。

  • 发起者

    创建事件的 MySQL 服务器的服务器 ID;用于复制。如果在源服务器上执行,则此值可能会被ALTER EVENT更新为该语句发生的服务器的服务器 ID。默认值为 0。

  • character_set_client

    事件创建时character_set_client系统变量的会话值。

  • collation_connection

    事件创建时collation_connection系统变量的会话值。

  • 数据库排序规则

    事件关联的数据库的排序规则。

有关SLAVESIDE_DISABLED发起者列的更多信息,请参见 Section 19.5.1.16, “Replication of Invoked Features”。

SHOW EVENTS显示的时间以事件时区显示,如 Section 27.4.4, “Event Metadata”中所述。

事件信息也可以从INFORMATION_SCHEMA EVENTS表中获取。请参见 Section 28.3.14, “The INFORMATION_SCHEMA EVENTS Table”。

事件操作语句不会显示在SHOW EVENTS的输出中。请使用SHOW CREATE EVENTINFORMATION_SCHEMA EVENTS表。

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

15.7.7.19 显示函数代码语句

SHOW FUNCTION CODE *func_name*

这个语句类似于SHOW PROCEDURE CODE,但用于存储函数。请参阅 Section 15.7.7.27, “SHOW PROCEDURE CODE Statement”。

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

15.7.7.20 显示函数状态语句

SHOW FUNCTION STATUS
    [LIKE '*pattern*' | WHERE *expr*]

这个语句类似于SHOW PROCEDURE STATUS,但用于存储函数。参见 Section 15.7.7.28, “SHOW PROCEDURE STATUS Statement”。

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

15.7.7.21 SHOW GRANTS Statement

SHOW GRANTS
    [FOR *user_or_role*
        [USING *role* [, *role*] ...]]

*user_or_role*: {
    *user* (see Section 8.2.4, “Specifying Account Names”)
  | *role* (see Section 8.2.5, “Specifying Role Names”.
}

此语句显示了分配给 MySQL 用户账户或角色的特权和角色,以GRANT语句的形式呈现,必须执行以复制特权和角色分配。

注意

要显示 MySQL 账户的非特权信息,请使用SHOW CREATE USER语句。请参阅 Section 15.7.7.12, “SHOW CREATE USER Statement”。

SHOW GRANTS需要对mysql系统模式的SELECT特权,除了显示当前用户的特权和角色。

要为SHOW GRANTS命名账户或角色,请使用与GRANT语句相同的格式(例如,'jeffrey'@'localhost'):

mysql> SHOW GRANTS FOR 'jeffrey'@'localhost';
+------------------------------------------------------------------+
| Grants for jeffrey@localhost                                     |
+------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `jeffrey`@`localhost`                      |
| GRANT SELECT, INSERT, UPDATE ON `db1`.* TO `jeffrey`@`localhost` |
+------------------------------------------------------------------+

如果省略主机部分,则默认为'%'。有关指定账户和角色名称的其他信息,请参阅 Section 8.2.4, “Specifying Account Names”和 Section 8.2.5, “Specifying Role Names”。

要显示授予当前用户的特权(您用于连接到服务器的账户)可以使用以下任何语句之一:

SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();

如果在定义者上下文中使用SHOW GRANTS FOR CURRENT_USER(或任何等效语法),比如在以定义者而不是调用者特权执行的存储过程中,显示的授权是定义者的而不是调用者的。

在 MySQL 8.0 中与之前的系列相比,SHOW GRANTS不再在其全局特权输出中显示ALL PRIVILEGES,因为全局级别的ALL PRIVILEGES的含义取决于定义了哪些动态特权。相反,SHOW GRANTS明确列出了每个授予的全局特权:

mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost                                           |
+---------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD,         |
| SHUTDOWN, PROCESS, FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES,  |
| SUPER, CREATE TEMPORARY TABLES, LOCK TABLES, EXECUTE, REPLICATION   |
| SLAVE, REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ROUTINE,  |
| ALTER ROUTINE, CREATE USER, EVENT, TRIGGER, CREATE TABLESPACE,      |
| CREATE ROLE, DROP ROLE ON *.* TO `root`@`localhost` WITH GRANT      |
| OPTION                                                              |
| GRANT PROXY ON ''@'' TO `root`@`localhost` WITH GRANT OPTION        |
+---------------------------------------------------------------------+

处理SHOW GRANTS输出的应用程序应相应调整。

在全局级别,如果为任何静态全局特权授予了GRANT OPTION,则适用于所有授予的静态全局特权,但适用于单独授予的动态特权。SHOW GRANTS以这种方式显示全局特权:

  • 一行列出所有授予的静态特权,如果有的话,包括适当时的WITH GRANT OPTION

  • 一行列出所有授予的动态权限,如果有的话,包括 WITH GRANT OPTION

  • 一行列出所有授予的动态权限,如果有的话,不带 WITH GRANT OPTION

使用可选的 USING 子句,SHOW GRANTS 使您能够检查用户角色的权限。USING 子句中命名的每个角色必须授予用户。

假设用户 u1 被分配角色 r1r2,如下所示:

CREATE ROLE 'r1', 'r2';
GRANT SELECT ON db1.* TO 'r1';
GRANT INSERT, UPDATE, DELETE ON db1.* TO 'r2';
CREATE USER 'u1'@'localhost' IDENTIFIED BY 'u1pass';
GRANT 'r1', 'r2' TO 'u1'@'localhost';

不带 USINGSHOW GRANTS 显示授予的角色:

mysql> SHOW GRANTS FOR 'u1'@'localhost';
+---------------------------------------------+
| Grants for u1@localhost                     |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost`      |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+

添加 USING 子句会导致语句还显示与子句中命名的每个角色相关联的权限:

mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1';
+---------------------------------------------+
| Grants for u1@localhost                     |
+---------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost`      |
| GRANT SELECT ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost` |
+---------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r2';
+-------------------------------------------------------------+
| Grants for u1@localhost                                     |
+-------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost`                      |
| GRANT INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost`                 |
+-------------------------------------------------------------+
mysql> SHOW GRANTS FOR 'u1'@'localhost' USING 'r1', 'r2';
+---------------------------------------------------------------------+
| Grants for u1@localhost                                             |
+---------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `u1`@`localhost`                              |
| GRANT SELECT, INSERT, UPDATE, DELETE ON `db1`.* TO `u1`@`localhost` |
| GRANT `r1`@`%`,`r2`@`%` TO `u1`@`localhost`                         |
+---------------------------------------------------------------------+

注意

授予给帐户的权限始终有效,但角色不是。帐户的活动角色可以根据 activate_all_roles_on_login 系统变量的值、帐户默认角色以及会话内是否执行了 SET ROLE 而在会话间和会话内部有所不同。

MySQL 8.0.16 及更高版本支持对全局权限进行部分撤销,使得全局权限可以限制应用于特定模式(参见 第 8.2.12 节,“使用部分撤销进行权限限制”)。为了指示已经为特定模式撤销的全局模式权限,SHOW GRANTS 输出包括 REVOKE 语句:

mysql> SET PERSIST partial_revokes = ON;
mysql> CREATE USER u1;
mysql> GRANT SELECT, INSERT, DELETE ON *.* TO u1;
mysql> REVOKE SELECT, INSERT ON mysql.* FROM u1;
mysql> REVOKE DELETE ON world.* FROM u1;
mysql> SHOW GRANTS FOR u1;
+--------------------------------------------------+
| Grants for u1@%                                  |
+--------------------------------------------------+
| GRANT SELECT, INSERT, DELETE ON *.* TO `u1`@`%`  |
| REVOKE SELECT, INSERT ON `mysql`.* FROM `u1`@`%` |
| REVOKE DELETE ON `world`.* FROM `u1`@`%`         |
+--------------------------------------------------+

SHOW GRANTS 不显示对命名帐户可用但授予给不同帐户的权限。例如,如果存在匿名帐户,则命名帐户可能能够使用其权限,但 SHOW GRANTS 不会显示它们。

SHOW GRANTS 显示在 mandatory_roles 系统变量值中命名的强制角色如下:

  • 不带 FOR 子句的 SHOW GRANTS 显示当前用户的权限,并包括强制角色。

  • SHOW GRANTS FOR *user* 显示命名用户的权限,不包括强制角色。

这种行为有利于使用SHOW GRANTS FOR *user*输出的应用程序,以确定哪些权限明确授予了指定用户。如果输出包括强制角色,将很难区分明确授予用户的角色和强制角色。

对于当前用户,应用程序可以使用SHOW GRANTSSHOW GRANTS FOR CURRENT_USER来确定权限,无论是否具有强制角色。

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

15.7.7.22 显示索引语句

SHOW [EXTENDED] {INDEX | INDEXES | KEYS}
    {FROM | IN} *tbl_name*
    [{FROM | IN} *db_name*]
    [WHERE *expr*]

显示索引返回表索引信息。格式类似于 ODBC 中的SQLStatistics调用。此语句对表中的任何列都需要一些特权。

mysql> SHOW INDEX FROM City\G
*************************** 1\. row ***************************
        Table: city
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: ID
    Collation: A
  Cardinality: 4188
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL
*************************** 2\. row ***************************
        Table: city
   Non_unique: 1
     Key_name: CountryCode
 Seq_in_index: 1
  Column_name: CountryCode
    Collation: A
  Cardinality: 232
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
      Visible: YES
   Expression: NULL

作为*tbl_name* FROM *db_name*语法的替代方案是*db_name.tbl_name*。这两个语句是等效的:

SHOW INDEX FROM mytable FROM mydb;
SHOW INDEX FROM mydb.mytable;

可选的EXTENDED关键字导致输出包括 MySQL 内部使用但用户无法访问的隐藏索引的信息。

可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节“SHOW 语句的扩展”中所讨论的。

显示索引返回以下字段:

  • 表的名称。

  • 非唯一

    如果索引不能包含重复项,则为 0,如果可以,则为 1。

  • 键名

    索引的名称。如果索引是主键,则名称始终为PRIMARY

  • Seq_in_index

    索引中的列序号,从 1 开始。

  • 列名

    列名。另请参阅Expression列的描述。

  • 排序规则

    列在索引中的排序方式。这可以是A(升序)、D(降序)或NULL(未排序)的值。

  • 基数

    索引中唯一值的估计数量。要更新此数字,请运行ANALYZE TABLE或(对于MyISAM表)myisamchk -a

    基数是根据存储为整数的统计数据计算的,因此即使对于小表,该值也不一定是精确的。基数越高,MySQL 在执行连接时使用索引的可能性就越大。

  • 子部分

    索引前缀。也就是,如果列仅部分索引,则索引字符数,如果整个列被索引,则为NULL

    注意

    前缀限制以字节为单位。但是,在CREATE TABLEALTER TABLECREATE INDEX语句中的索引规范中,对于非二进制字符串类型(CHARVARCHARTEXT),解释为字符数,对于二进制字符串类型(BINARYVARBINARYBLOB),解释为字节数。在为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。

    有关索引前缀的其他信息,请参见第 10.3.5 节,“列索引”和第 15.1.15 节,“CREATE INDEX Statement”。

  • Packed

    指示键是如何打包的。如果不是,则为NULL

  • Null

    包含YES表示列可能包含NULL值,''表示不包含。

  • Index_type

    使用的索引方法(BTREEFULLTEXTHASHRTREE)。

  • Comment

    有关索引未在其自己的列中描述的信息,例如如果索引已禁用,则为disabled

  • Index_comment

    在创建索引时使用COMMENT属性提供的任何注释。

  • Visible

    索引是否对优化器可见。请参见第 10.3.12 节,“不可见索引”。

  • Expression

    MySQL 8.0.13 及更高版本支持功能键部分(参见功能键部分表中获取。请参见第 28.3.34 节,“INFORMATION_SCHEMA STATISTICS Table”。有关隐藏索引的扩展信息仅可使用SHOW EXTENDED INDEX获得;无法从STATISTICS表中获取。

您可以使用**mysqlshow -k db_name *tbl_name***命令列出表的索引。

在 MySQL 8.0.30 及更高版本中,默认情况下,SHOW INDEX 包括表的生成的不可见键。您可以通过设置show_gipk_in_create_table_and_information_schema = OFF来抑制该信息在语句输出中的显示。更多信息,请参见 Section 15.1.20.11, “Generated Invisible Primary Keys”。

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

15.7.7.23 SHOW MASTER STATUS Statement

SHOW MASTER STATUS

这个语句提供了关于源服务器的二进制日志文件的状态信息。它需要REPLICATION CLIENT权限(或已弃用的SUPER权限)。

示例:

mysql> SHOW MASTER STATUS\G
*************************** 1\. row ***************************
             File: source-bin.000002
         Position: 1307
     Binlog_Do_DB: test
 Binlog_Ignore_DB: manual, mysql
Executed_Gtid_Set: 3E11FA47-71CA-11E1-9E33-C80AA9429562:1-5 1 row in set (0.00 sec)

当全局事务 ID 被使用时,Executed_Gtid_Set显示了在源服务器上已执行的事务的 GTID 集合。这与此服务器上的gtid_executed系统变量的值相同,以及在此服务器上SHOW REPLICA STATUS输出中的Executed_Gtid_Set的值(或在 MySQL 8.0.22 之前,在此服务器上SHOW SLAVE STATUS中的值)。

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

15.7.7.24 SHOW OPEN TABLES 语句

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

SHOW OPEN TABLES列出了当前在表缓存中打开的非TEMPORARY表。请参阅 Section 10.4.3.1, “MySQL 如何打开和关闭表”。FROM子句(如果存在)限制显示的表为*db_name*数据库中存在的表。LIKE子句(如果存在)指示要匹配的表名。WHERE子句可以用于使用更一般的条件选择行,如 Section 28.8, “SHOW 语句的扩展”中所讨论的。

SHOW OPEN TABLES输出包含这些列:

  • Database

    包含表的数据库。

  • Table

    表名。

  • In_use

    表中的表锁数或锁请求数。例如,如果一个客户端使用LOCK TABLE t1 WRITE为表获取锁,In_use为 1。如果另一个客户端在表仍被锁定时发出LOCK TABLE t1 WRITE,该客户端会被阻塞,等待锁,但锁请求会导致In_use为 2。如果计数为零,则表是打开的但当前未被使用。In_use也会被HANDLER ... OPEN语句增加,并被HANDLER ... CLOSE语句减少。

  • Name_locked

    表名是否被锁定。名称锁定用于诸如删除或重命名表等操作。

如果您对表没有权限,它在SHOW OPEN TABLES的输出中不会显示。

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

15.7.7.25 显示插件语句

SHOW PLUGINS

显示插件显示有关服务器插件的信息。

显示插件输出示例:

mysql> SHOW PLUGINS\G
*************************** 1\. row ***************************
   Name: binlog
 Status: ACTIVE
   Type: STORAGE ENGINE
Library: NULL
License: GPL
*************************** 2\. row ***************************
   Name: CSV
 Status: ACTIVE
   Type: STORAGE ENGINE
Library: NULL
License: GPL
*************************** 3\. row ***************************
   Name: MEMORY
 Status: ACTIVE
   Type: STORAGE ENGINE
Library: NULL
License: GPL
*************************** 4\. row ***************************
   Name: MyISAM
 Status: ACTIVE
   Type: STORAGE ENGINE
Library: NULL
License: GPL
...

显示插件输出具有以下列:

  • 名称

    安装插件卸载插件等语句中用于引用插件的名称。

  • 状态

    插件状态,其中之一为活动非活动已禁用正在删除已删除

  • 类型

    插件的类型,如存储引擎INFORMATION_SCHEMA认证

  • 插件共享库文件的名称。这是在安装插件卸载插件等语句中用于引用插件文件的名称。此文件位于由plugin_dir系统变量命名的目录中。如果库名称为NULL,则插件已编译并且无法使用卸载插件卸载。

  • 许可证

    插件的许可证(例如,GPL)。

对于使用安装插件安装的插件,名称值也在mysql.plugin系统表中注册。

有关形成显示插件显示的信息基础的插件数据结构的信息,请参阅 MySQL 插件 API。

插件信息也可以从INFORMATION_SCHEMA.PLUGINS表中获取。请参阅第 28.3.22 节,“INFORMATION_SCHEMA PLUGINS 表”。

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

15.7.7.26 SHOW PRIVILEGES Statement

SHOW PRIVILEGES

SHOW PRIVILEGES 显示了 MySQL 服务器支持的系统权限列表。显示的权限包括所有静态权限和当前注册的动态权限。

mysql> SHOW PRIVILEGES\G
*************************** 1\. row ***************************
Privilege: Alter
  Context: Tables
  Comment: To alter the table
*************************** 2\. row ***************************
Privilege: Alter routine
  Context: Functions,Procedures
  Comment: To alter or drop stored functions/procedures
*************************** 3\. row ***************************
Privilege: Create
  Context: Databases,Tables,Indexes
  Comment: To create new databases and tables
*************************** 4\. row ***************************
Privilege: Create routine
  Context: Databases
  Comment: To use CREATE FUNCTION/PROCEDURE
*************************** 5\. row ***************************
Privilege: Create temporary tables
  Context: Databases
  Comment: To use CREATE TEMPORARY TABLE
...

特定用户拥有的权限可以通过 SHOW GRANTS 语句显示。更多信息请参见 Section 15.7.7.21, “SHOW GRANTS Statement”。

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

15.7.7.27 显示存储过程代码语句

SHOW PROCEDURE CODE *proc_name*

此语句是 MySQL 的扩展,仅适用于已使用调试支持构建的服务器。它显示了命名存储过程的内部实现的表示。类似的语句,SHOW FUNCTION CODE,显示有关存储函数的信息(请参阅第 15.7.7.19 节,“显示函数代码语句”)。

要使用任一语句,您必须是以例程DEFINER命名的用户,具有SHOW_ROUTINE权限,或者在全局级别具有SELECT权限。

如果命名例程可用,则每个语句都会生成一个结果集。结果集中的每一行对应于例程中的一个“指令”。第一列是Pos,它是从 0 开始的序号。第二列是Instruction,其中包含一个 SQL 语句(通常是从原始源更改而来),或者仅对存储过程处理程序有意义的指令。

mysql> DELIMITER //
mysql> CREATE PROCEDURE p1 ()
       BEGIN
         DECLARE fanta INT DEFAULT 55;
         DROP TABLE t2;
         LOOP
           INSERT INTO t3 VALUES (fanta);
           END LOOP;
         END//
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW PROCEDURE CODE p1//
+-----+----------------------------------------+
| Pos | Instruction                            |
+-----+----------------------------------------+
|   0 | set fanta@0 55                         |
|   1 | stmt 9 "DROP TABLE t2"                 |
|   2 | stmt 5 "INSERT INTO t3 VALUES (fanta)" |
|   3 | jump 2                                 |
+-----+----------------------------------------+
4 rows in set (0.00 sec)

mysql> CREATE FUNCTION test.hello (s CHAR(20))
       RETURNS CHAR(50) DETERMINISTIC
       RETURN CONCAT('Hello, ',s,'!');
Query OK, 0 rows affected (0.00 sec)

mysql> SHOW FUNCTION CODE test.hello;
+-----+---------------------------------------+
| Pos | Instruction                           |
+-----+---------------------------------------+
|   0 | freturn 254 concat('Hello, ',s@0,'!') |
+-----+---------------------------------------+
1 row in set (0.00 sec)

在此示例中,不可执行的BEGINEND语句已消失,对于DECLARE *variable_name*语句,仅显示可执行部分(分配默认值的部分)。对于从源中提取的每个语句,都有一个代码词stmt,后跟一个类型(9 表示DROP,5 表示INSERT,依此类推)。最后一行包含指令jump 2,表示GOTO 指令#2

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

15.7.7.28 显示存储过程状态语句

SHOW PROCEDURE STATUS
    [LIKE '*pattern*' | WHERE *expr*]

此语句是 MySQL 的扩展。它返回存储过程的特征,如数据库、名称、类型、创建者、创建和修改日期以及字符集信息。类似的语句,SHOW FUNCTION STATUS,显示有关存储函数的信息(参见第 15.7.7.20 节,“显示函数状态语句”)。

要使用任一语句,您必须是以例行DEFINER身份命名的用户,具有SHOW_ROUTINE权限,在全局级别具有SELECT权限,或者在包含例程的范围内被授予CREATE ROUTINEALTER ROUTINE,或EXECUTE权限。

如果存在LIKE子句,则指示要匹配的过程或函数名称。可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节,“SHOW 语句的扩展”中所讨论的。

mysql> SHOW PROCEDURE STATUS LIKE 'sp1'\G
*************************** 1\. row ***************************
                  Db: test
                Name: sp1
                Type: PROCEDURE
             Definer: testuser@localhost
            Modified: 2018-08-08 13:54:11
             Created: 2018-08-08 13:54:11
       Security_type: DEFINER
             Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci 
mysql> SHOW FUNCTION STATUS LIKE 'hello'\G
*************************** 1\. row ***************************
                  Db: test
                Name: hello
                Type: FUNCTION
             Definer: testuser@localhost
            Modified: 2020-03-10 11:10:03
             Created: 2020-03-10 11:10:03
       Security_type: DEFINER
             Comment:
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
  Database Collation: utf8mb4_0900_ai_ci

character_set_client是创建例程时的character_set_client系统变量的会话值。collation_connection是创建例程时的collation_connection系统变量的会话值。数据库排序规则是例程所关联的数据库的排序规则。

存储例程信息也可以从INFORMATION_SCHEMAPARAMETERSROUTINES表中获取。请参见第 28.3.20 节,“INFORMATION_SCHEMA PARAMETERS 表”,以及第 28.3.30 节,“INFORMATION_SCHEMA ROUTINES 表”。

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

15.7.7.29 SHOW PROCESSLIST Statement

SHOW [FULL] PROCESSLIST

重要提示

SHOW PROCESSLIST的 INFORMATION SCHEMA 实现已被弃用,并将在未来的 MySQL 版本中移除。建议改用 Performance Schema 实现的SHOW PROCESSLIST

MySQL 进程列表显示当前在服务器内执行的线程集合正在执行的操作。SHOW PROCESSLIST语句是进程信息的一个来源。有关此语句与其他来源的比较,请参见进程信息的来源。

注意

截至 MySQL 8.0.22,基于 Performance Schema processlist表的SHOW PROCESSLIST的替代实现已经可用,与默认的SHOW PROCESSLIST实现不同,它不需要互斥锁,并具有更好的性能特性。详情请参见第 29.12.21.7 节,“The processlist Table”。

如果你拥有PROCESS权限,你可以查看所有线程,甚至属于其他用户的线程。否则(没有PROCESS权限),非匿名用户可以访问有关自己线程的信息,但不能访问其他用户的线程,匿名用户无法访问线程信息。

没有FULL关键字,SHOW PROCESSLIST仅显示Info字段中每个语句的前 100 个字符。

如果收到“连接过多”错误消息并想找出原因,SHOW PROCESSLIST语句非常有用。MySQL 保留一个额外的连接供具有CONNECTION_ADMIN权限(或已弃用的SUPER权限)的帐户使用,以确保管理员始终能够连接并检查系统(假设您没有将此权限授予所有用户)。

线程可以使用KILL语句终止。请参见第 15.7.8.4 节,“KILL Statement”。

SHOW PROCESSLIST输出示例:

mysql> SHOW FULL PROCESSLIST\G
*************************** 1\. row ***************************
     Id: 1
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 1030455
  State: Waiting for source to send event
   Info: NULL
*************************** 2\. row ***************************
     Id: 2
   User: system user
   Host:
     db: NULL
Command: Connect
   Time: 1004
  State: Has read all relay log; waiting for the replica
         I/O thread to update it
   Info: NULL
*************************** 3\. row ***************************
     Id: 3112
   User: replikator
   Host: artemis:2204
     db: NULL
Command: Binlog Dump
   Time: 2144
  State: Has sent all binlog to replica; waiting for binlog to be updated
   Info: NULL
*************************** 4\. row ***************************
     Id: 3113
   User: replikator
   Host: iconnect2:45781
     db: NULL
Command: Binlog Dump
   Time: 2086
  State: Has sent all binlog to replica; waiting for binlog to be updated
   Info: NULL
*************************** 5\. row ***************************
     Id: 3123
   User: stefan
   Host: localhost
     db: apollon
Command: Query
   Time: 0
  State: NULL
   Info: SHOW FULL PROCESSLIST

SHOW PROCESSLIST输出具有以下列:

  • Id

    连接标识符。这是在INFORMATION_SCHEMA PROCESSLIST表中的ID列中显示的相同值,在性能模式threads表中的PROCESSLIST_ID列中显示的值,并在线程内部由CONNECTION_ID()函数返回。

  • 用户

    发出语句的 MySQL 用户。系统用户的值指的是服务器生成的非客户端线程,用于内部处理任务,例如延迟行处理程序线程或在副本主机上使用的 I/O(接收器)或 SQL(应用程序)线程。对于系统用户,在Host列中没有指定主机。未经身份验证的用户指的是已与客户端连接关联但尚未对客户端用户进行身份验证的线程。event_scheduler指的是监视计划事件的线程(参见第 27.4 节,“使用事件调度程序”)。

    注意

    系统用户用户值与SYSTEM_USER权限是不同的。前者指定内部线程。后者区分系统用户和常规用户账户类别(参见第 8.2.11 节,“账户类别”)。

  • 主机

    发出语句的客户端的主机名(除了系统用户外,没有主机)。TCP/IP 连接的主机名以*host_name*:*client_port*格式报告,以便更容易确定哪个客户端正在执行什么操作。

  • 数据库

    线程的默认数据库,如果没有选择任何数据库���则为NULL

  • 命令

    线程代表客户端执行的命令类型,或者如果会话空闲,则为Sleep。有关线程命令的描述,请参见第 10.14 节,“检查服务器线程(进程)信息”。此列的值对应于客户端/服务器协议的COM_*xxx*命令和Com_*xxx*状态变量。请参见第 7.1.10 节,“服务器状态变量”。

  • 时间

    线程处于当前状态的秒数。对于副本 SQL 线程,该值是最后一个复制事件的时间戳与副本主机的实时时间之间的秒数。请参见第 19.2.3 节,“复制线程”。

  • 状态

    表示线程正在执行的操作、事件或状态。有关State值的描述,请参见第 10.14 节,“检查服务器线程(进程)信息”。

    大多数状态对应非常快速的操作。如果一个线程停留在某个状态很多秒钟,可能存在需要调查的问题。

  • 信息

    线程正在执行的语句,如果没有执行语句则为NULL。该语句可能是发送给服务器的语句,或者如果该语句执行其他语句,则为最内层语句。例如,如果一个CALL语句执行一个正在执行SELECT语句的存储过程,那么信息值显示SELECT语句。

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

15.7.7.30 SHOW PROFILE Statement

SHOW PROFILE [*type* [, *type*] ... ]
    [FOR QUERY *n*]
    [LIMIT *row_count* [OFFSET *offset*]]

*type*: {
    ALL
  | BLOCK IO
  | CONTEXT SWITCHES
  | CPU
  | IPC
  | MEMORY
  | PAGE FAULTS
  | SOURCE
  | SWAPS
}

SHOW PROFILESHOW PROFILES语句显示有关在当前会话期间执行的语句的资源使用情况的分析信息。

注意

SHOW PROFILESHOW PROFILES语句已弃用;预计它们将在未来的 MySQL 版本中被移除。请改用性能模式;参见第 29.19.1 节,“使用性能模式进行查询分析”。

要控制分析,使用profiling会话变量,默认值为 0(OFF)。通过将profiling设置为 1 或ON来启用分析:

mysql> SET profiling = 1;

SHOW PROFILES显示发送到服务器的最近语句列表。列表的大小由profiling_history_size会话变量控制,默认值为 15。最大值为 100。将值设置为 0 的实际效果是禁用分析。

所有语句都会被分析,除了SHOW PROFILESHOW PROFILES,因此这两个语句都不会出现在分析列表中。格式错误的语句会被分析。例如,SHOW PROFILING是一个非法语句,如果尝试执行它,会发生语法错误,但它会出现在分析列表中。

SHOW PROFILE显示关于单个语句的详细信息。如果没有FOR QUERY *n*子句,则输出与最近执行的语句相关。如果包括FOR QUERY *n*SHOW PROFILE显示语句n的信息。n的值对应于SHOW PROFILES显示的Query_ID值。

可以使用LIMIT *row_count*子句来限制输出为*row_count行。如果给出LIMIT,则可以添加OFFSET *offset*以从完整行集的第offset*行开始输出。

默认情况下,SHOW PROFILE 显示StatusDuration列。Status值类似于SHOW PROCESSLIST显示的State值,尽管对于某些状态值,这两个语句的解释可能存在一些细微差异(请参阅第 10.14 节,“检查服务器线程(进程)信息” Information"))。

可以指定可选的*type*值以显示特定的附加信息:

  • ALL 显示所有信息

  • BLOCK IO 显示块输入和输出操作的计数

  • CONTEXT SWITCHES 显示自愿和非自愿上下文切换的计数

  • CPU 显示用户和系统 CPU 使用时间

  • IPC 显示发送和接收消息的计数

  • MEMORY 目前尚未实现

  • PAGE FAULTS 显示主要和次要页面错误的计数

  • SOURCE 显示源代码中函数的名称,以及函数出现的文件的名称和行号

  • SWAPS 显示交换计数

会话级别启用了性能分析。当会话结束时,其性能分析信息将丢失。

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

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

mysql> DROP TABLE IF EXISTS t1;
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> CREATE TABLE T1 (id INT);
Query OK, 0 rows affected (0.01 sec)

mysql> SHOW PROFILES;
+----------+----------+--------------------------+
| Query_ID | Duration | Query                    |
+----------+----------+--------------------------+
|        0 | 0.000088 | SET PROFILING = 1        |
|        1 | 0.000136 | DROP TABLE IF EXISTS t1  |
|        2 | 0.011947 | CREATE TABLE t1 (id INT) |
+----------+----------+--------------------------+
3 rows in set (0.00 sec)

mysql> SHOW PROFILE;
+----------------------+----------+
| Status               | Duration |
+----------------------+----------+
| checking permissions | 0.000040 |
| creating table       | 0.000056 |
| After create         | 0.011363 |
| query end            | 0.000375 |
| freeing items        | 0.000089 |
| logging slow query   | 0.000019 |
| cleaning up          | 0.000005 |
+----------------------+----------+
7 rows in set (0.00 sec)

mysql> SHOW PROFILE FOR QUERY 1;
+--------------------+----------+
| Status             | Duration |
+--------------------+----------+
| query end          | 0.000107 |
| freeing items      | 0.000008 |
| logging slow query | 0.000015 |
| cleaning up        | 0.000006 |
+--------------------+----------+
4 rows in set (0.00 sec)

mysql> SHOW PROFILE CPU FOR QUERY 2;
+----------------------+----------+----------+------------+
| Status               | Duration | CPU_user | CPU_system |
+----------------------+----------+----------+------------+
| checking permissions | 0.000040 | 0.000038 |   0.000002 |
| creating table       | 0.000056 | 0.000028 |   0.000028 |
| After create         | 0.011363 | 0.000217 |   0.001571 |
| query end            | 0.000375 | 0.000013 |   0.000028 |
| freeing items        | 0.000089 | 0.000010 |   0.000014 |
| logging slow query   | 0.000019 | 0.000009 |   0.000010 |
| cleaning up          | 0.000005 | 0.000003 |   0.000002 |
+----------------------+----------+----------+------------+
7 rows in set (0.00 sec)

注意

在某些架构上,性能分析仅部分功能可用。对于依赖于getrusage()系统调用的值,在不支持该调用的系统(如 Windows)上将返回NULL。此外,性能分析是针对进程而不是线程的。这意味着服务器中除了您自己的线程之外的其他线程的活动可能会影响您看到的时间信息。

性能分析信息也可以从INFORMATION_SCHEMA PROFILING表中获取。请参阅第 28.3.24 节,“INFORMATION_SCHEMA PROFILING 表”。例如,以下查询是等效的:

SHOW PROFILE FOR QUERY 2;

SELECT STATE, FORMAT(DURATION, 6) AS DURATION
FROM INFORMATION_SCHEMA.PROFILING
WHERE QUERY_ID = 2 ORDER BY SEQ;

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

15.7.7.31 SHOW PROFILES 语句

SHOW PROFILES

SHOW PROFILES 语句与 SHOW PROFILE 一起显示了在当前会话期间执行的语句的资源使用情况的分析信息。更多信息,请参见第 15.7.7.30 节,“SHOW PROFILE 语句”。

注意

SHOW PROFILESHOW PROFILES 语句已被弃用;预计在未来的 MySQL 版本中将被移除。请改用性能模式;参见第 29.19.1 节,“使用性能模式进行查询分析”。

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

15.7.7.32 SHOW RELAYLOG EVENTS语句

SHOW RELAYLOG EVENTS
    [IN '*log_name*']
    [FROM *pos*]
    [LIMIT [*offset*,] *row_count*]
    [*channel_option*]

*channel_option*:
    FOR CHANNEL *channel*

显示副本中的中继日志中的事件。如果不指定'*log_name*',则显示第一个中继日志。此语句对源没有影响。SHOW RELAYLOG EVENTS需要REPLICATION SLAVE权限。

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

注意

发出不带LIMIT子句的SHOW RELAYLOG EVENTS可能会启动一个非常耗时和资源消耗的过程,因为服务器会将中继日志的完整内容(包括所有已被副本接收的修改数据的语句)返回给客户端。

可选的FOR CHANNEL *channel*子句使您能够命名语句适用于哪个复制通道。提供FOR CHANNEL *channel*子句将语句应用于特定的复制通道。如果未命名通道且没有额外通道存在,则该语句适用于默认通道。

在使用多个复制通道时,如果SHOW RELAYLOG EVENTS语句没有使用FOR CHANNEL *channel*子句定义通道,则会生成错误。有关更多信息,请参见 Section 19.2.2,“复制通道”。

SHOW RELAYLOG EVENTS为中继日志中的每个事件显示以下字段:

  • Log_name

    正在列出的文件的名称。

  • Pos

    事件发生的位置。

  • Event_type

    描述事件类型的标识符。

  • Server_id

    事件发生的服务器的服务器 ID。

  • End_log_pos

    此事件在源二进制日志中的End_log_pos值。

  • Info

    有关事件类型的更详细信息。此信息的格式取决于事件类型。

对于压缩的事务负载,Transaction_payload_event首先作为一个单元打印出来,然后解压缩并打印其中的每个事件。

一些涉及设置用户和系统变量的事件不包括在SHOW RELAYLOG EVENTS的输出中。要完整覆盖中继日志中的事件,请使用mysqlbinlog