MySQL8 中文参考(六十六)
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。
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 来实现此目的。
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表中获取。
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_SCHEMA 的 COLLATIONS 表中获取。请参见 第 28.3.6 节,“INFORMATION_SCHEMA COLLATIONS 表”。
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为空,则该列要么未被索引,要么仅作为多列非唯一索引中的次要列被索引。 -
如果
Key为PRI,则该列是PRIMARY KEY或是多列PRIMARY KEY中的一列。 -
如果
Key为UNI,则该列是UNIQUE索引的第一列。(UNIQUE索引允许多个NULL值,但您可以通过检查Null字段来确定该列是否允许NULL。) -
如果
Key为MUL,则该列是非唯一索引的第一列,在该索引中允许列中出现给定值的多个实例。
如果多个
Key值适用于表的某一列,则Key按照PRI,UNI,MUL的顺序显示具有最高优先级的值。如果
UNIQUE索引不能包含NULL值且表中没有PRIMARY KEY,则UNIQUE索引可能显示为PRI。如果几列形成复合UNIQUE索引,则UNIQUE索引可能显示为MUL;尽管列的组合是唯一的,但每列仍然可以包含给定值的多个出现。 -
-
默认列的默认值。如果列具有显式默认值为
NULL,或者列定义中不包含DEFAULT子句,则为NULL。 -
额外有关给定列的任何其他可用信息。在以下情况下,该值不为空:
-
对于具有
AUTO_INCREMENT属性的列,显示auto_increment。 -
对于具有
ON UPDATE CURRENT_TIMESTAMP属性的TIMESTAMP或DATETIME列,显示on update CURRENT_TIMESTAMP。 -
用于生成列的
VIRTUAL GENERATED或STORED GENERATED。 -
对于具有表达式默认值的列,使用
DEFAULT_GENERATED。
-
-
权限您对该列的权限。仅当使用
FULL关键字时才显示此值。 -
注释列定义中包含的任何注释。仅当使用
FULL关键字时才显示此值。
表列信息也可以从INFORMATION_SCHEMA的COLUMNS表中获取。请参阅第 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 TABLE,SHOW TABLE STATUS和SHOW 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 SCHEMA是SHOW 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 节,“服务器系统变量”。
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 ROUTINE、ALTER ROUTINE或EXECUTE权限。如果您只具有CREATE ROUTINE、ALTER ROUTINE或EXECUTE权限,则Create Procedure或Create 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系统变量的会话值。数据库排序规则是与例程关联的数据库的排序规则。
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”。
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 表”。
15.7.7.12 显示创建用户语句
SHOW CREATE USER *user*
此语句显示创建指定用户的CREATE USER语句。如果用户不存在,则会出现错误。该语句需要对mysql系统模式的SELECT权限,除了查看当前用户的信息。对于当前用户,在IDENTIFIED AS子句中显示密码哈希值需要对mysql.user系统表的SELECT权限;否则,哈希值显示为<secret>。
要命名账户,请使用第 8.2.4 节“指定账户名称”中描述的格式。如果省略账户名的主机名部分,则默认为'%'。还可以指定CURRENT_USER或CURRENT_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”。
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之前的注释。
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_SCHEMA 的 SCHEMATA 表来查看所有数据库名称,除了通过部分撤销在数据库级别限制的数据库。
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.size,mutex_instances.count。 -
适用于整个性能模式的值以
performance_schema开头。例如:performance_schema.memory。
缓冲属性具有以下含义:
-
size是实现中使用的内部记录的大小,比如表中行的大小。size值无法更改。 -
count是内部记录的数量,比如表中的行数。count值可以通过性能模式配置选项进行更改。 -
对于表,
*tbl_name*.memory是size和count的乘积。对于整个性能模式,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_host | MySQL 服务器连接的集群管理服务器的主机名或 IP 地址 |
connected_port | MySQL 服务器用于连接管理服务器(connected_host)的端口号 |
number_of_data_nodes | 集群配置的数据节点数量(即,集群config.ini文件中[ndbd]部分的数量) |
number_of_ready_data_nodes | 集群中实际运行的数据节点数量 |
connect_count | 此mysqld连接或重新连接到集群数据节点的次数 |
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 TABLE或ALTER 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将返回空结果。
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 表”。
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 ERRORS和error_count仅适用于错误,而不是警告或注释。在其他方面,它们类似于SHOW WARNINGS和warning_count。特别是,SHOW ERRORS无法显示超过max_error_count条消息的信息,如果错误数量超过max_error_count,则error_count的值可以超过max_error_count的值。
有关更多信息,请参见 Section 15.7.7.42, “SHOW WARNINGS Statement”。
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。 -
状态事件状态。
ENABLED、DISABLED或SLAVESIDE_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 EVENT或INFORMATION_SCHEMA EVENTS表。
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”。
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 被分配角色 r1 和 r2,如下所示:
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';
不带 USING 的 SHOW 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 GRANTS或SHOW GRANTS FOR CURRENT_USER来确定权限,无论是否具有强制角色。
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 TABLE、ALTER TABLE和CREATE INDEX语句中的索引规范中,对于非二进制字符串类型(CHAR、VARCHAR、TEXT),解释为字符数,对于二进制字符串类型(BINARY、VARBINARY、BLOB),解释为字节数。在为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。有关索引前缀的其他信息,请参见第 10.3.5 节,“列索引”和第 15.1.15 节,“CREATE INDEX Statement”。
-
Packed指示键是如何打包的。如果不是,则为
NULL。 -
Null包含
YES表示列可能包含NULL值,''表示不包含。 -
Index_type使用的索引方法(
BTREE、FULLTEXT、HASH、RTREE)。 -
Comment有关索引未在其自己的列中描述的信息,例如如果索引已禁用,则为
disabled。 -
Index_comment在创建索引时使用
COMMENT属性提供的任何注释。 -
Visible索引是否对优化器可见。请参见第 10.3.12 节,“不可见索引”。
-
ExpressionMySQL 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”。
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中的值)。
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的输出中不会显示。
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 表”。
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”。
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)
在此示例中,不可执行的BEGIN和END语句已消失,对于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 ROUTINE,ALTER 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_SCHEMA的PARAMETERS和ROUTINES表中获取。请参见第 28.3.20 节,“INFORMATION_SCHEMA PARAMETERS 表”,以及第 28.3.30 节,“INFORMATION_SCHEMA ROUTINES 表”。
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_SCHEMAPROCESSLIST表中的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语句。
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 PROFILE和SHOW PROFILES语句显示有关在当前会话期间执行的语句的资源使用情况的分析信息。
注意
SHOW PROFILE和SHOW PROFILES语句已弃用;预计它们将在未来的 MySQL 版本中被移除。请改用性能模式;参见第 29.19.1 节,“使用性能模式进行查询分析”。
要控制分析,使用profiling会话变量,默认值为 0(OFF)。通过将profiling设置为 1 或ON来启用分析:
mysql> SET profiling = 1;
SHOW PROFILES显示发送到服务器的最近语句列表。列表的大小由profiling_history_size会话变量控制,默认值为 15。最大值为 100。将值设置为 0 的实际效果是禁用分析。
所有语句都会被分析,除了SHOW PROFILE和SHOW 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 显示Status和Duration列。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;
15.7.7.31 SHOW PROFILES 语句
SHOW PROFILES
SHOW PROFILES 语句与 SHOW PROFILE 一起显示了在当前会话期间执行的语句的资源使用情况的分析信息。更多信息,请参见第 15.7.7.30 节,“SHOW PROFILE 语句”。
注意
SHOW PROFILE 和 SHOW 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。