MySQL8-中文参考-二十九-
MySQL8 中文参考(二十九)
15.7.1.7 RENAME USER 语句
RENAME USER *old_user* TO *new_user*
[, *old_user* TO *new_user*] ...
RENAME USER 语句重命名现有的 MySQL 帐户。对于不存在的旧帐户或已存在的新帐户,将出现错误。
要使用RENAME USER,您必须具有全局CREATE USER特权,或者对mysql系统模式具有UPDATE特权。当启用read_only系统变量时,RENAME USER 还需要CONNECTION_ADMIN特权(或已弃用的SUPER特权)。
截至 MySQL 8.0.22 版,如果要重命名的任何帐户被命名为任何存储对象的DEFINER属性,则RENAME USER 将失败并显示错误。(也就是说,如果重命名帐户会导致存储对象变成孤立状态,则该语句将失败。)要执行操作,您必须具有SET_USER_ID特权;在这种情况下,该语句将成功并显示警告,而不是失败并显示错误。有关更多信息,包括如何识别哪些对象将给定帐户命名为DEFINER属性,请参见孤立存储对象。
每个帐户名使用第 8.2.4 节,“指定帐户名”中描述的格式。例如:
RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';
账户名的主机名部分,如果省略,默认为'%'。
RENAME USER 导致旧用户持有的特权变为新用户持有的特权。然而,RENAME USER 不会自动删除或使旧用户创建的数据库或其中的对象失效。这包括DEFINER属性命名旧用户的存储过程或视图。如果在定义者安全上下文中执行这些对象,访问这些对象可能会产生错误。(有关安全上下文的信息,请参见第 27.6 节,“存储对象访问控制”。)
特权更改将按照第 8.2.13 节,“特权更改生效时间”中指示的方式生效。
15.7.1.8 REVOKE Statement
REVOKE [IF EXISTS]
*priv_type* [(*column_list*)]
[, *priv_type* [(*column_list*)]] ...
ON [*object_type*] *priv_level*
FROM *user_or_role* [, *user_or_role*] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] ALL [PRIVILEGES], GRANT OPTION
FROM *user_or_role* [, *user_or_role*] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] PROXY ON *user_or_role*
FROM *user_or_role* [, *user_or_role*] ...
[IGNORE UNKNOWN USER]
REVOKE [IF EXISTS] *role* [, *role* ] ...
FROM *user_or_role* [, *user_or_role* ] ...
[IGNORE UNKNOWN USER]
*user_or_role*: {
*user* (see Section 8.2.4, “Specifying Account Names”)
| *role* (see Section 8.2.5, “Specifying Role Names”
}
REVOKE语句使系统管理员能够撤销用户帐户和角色的权限和角色。
有关权限存在的级别、允许的priv_type、priv_level和object_type值,以及指定用户和密码的语法的详细信息,请参见第 15.7.1.6 节,“GRANT Statement”。
有关角色的信息,请参见第 8.2.10 节,“使用角色”。
当启用read_only系统变量时,REVOKE需要CONNECTION_ADMIN或权限(或已弃用的SUPER权限),以及以下讨论中描述的任何其他所需权限。
从 MySQL 8.0.30 开始,所有REVOKE显示的形式都支持IF EXISTS选项以及IGNORE UNKNOWN USER选项。如果没有这两个修改,REVOKE对所有命名用户和角色都成功,或者如果发生任何错误则回滚并且没有效果;如果对所有命名用户和角色都成功,则该语句仅写入二进制日志。IF EXISTS 和 IGNORE UNKNOWN USER 的确切效果将在本节后面讨论。
每个帐户名称使用第 8.2.4 节,“指定帐户名称”中描述的格式。每个角色名称使用第 8.2.5 节,“指定角色名称”中描述的格式。例如:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
REVOKE 'role1', 'role2' FROM 'user1'@'localhost', 'user2'@'localhost';
REVOKE SELECT ON world.* FROM 'role3';
帐户或角色名称的主机名部分,如果省略,默认为'%'。
要使用第一个REVOKE语法,您必须具有GRANT OPTION权限,并且必须具有您要撤销的权限。
要撤销所有权限,请使用第二种语法,该语法会为指定的用户或角色删除所有全局、数据库、表、列和例程权限。
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM *user_or_role* [, *user_or_role*] ...
REVOKE ALL PRIVILEGES, GRANT OPTION 不会撤销任何角色。
要使用此REVOKE语法,您必须具有全局CREATE USER权限,或者对mysql系统模式具有UPDATE权限。
后跟一个或多个角���名称的REVOKE关键字的语法需要一个FROM子句,指示要从中撤销角色的一个或多个用户或角色。
IF EXISTS 和 IGNORE UNKNOWN USER 选项(MySQL 8.0.30 及更高版本)具有以下列出的效果:
-
IF EXISTS意味着,如果目标用户或角色存在,但由于任何原因未分配给目标,找不到这样的权限或角色,则会引发警告,而不是错误;如果语句中命名的权限或角色未分配给目标,语句没有(其他)效果。否则,REVOKE正常执行;如果用户不存在,则语句会引发错误。示例:给定数据库
test中的表t1,我们执行以下语句,并显示结果。mysql> CREATE USER jerry@localhost; Query OK, 0 rows affected (0.01 sec) mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' mysql> REVOKE IF EXISTS SELECT ON test.t1 FROM jerry@localhost; Query OK, 0 rows affected, 1 warning (0.00 sec) mysql> SHOW WARNINGS\G *************************** 1\. row *************************** Level: Warning Code: 1147 Message: There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' 1 row in set (0.00 sec)如果
REVOKE语句包括IF EXISTS,即使命名的权限或角色不存在,或者语句尝试在错误的级别分配它,也会将错误降级为警告。 -
如果
REVOKE语句包括IGNORE UNKNOWN USER,则对于语句中命名但未找到的任何目标用户或角色,语句会引发警告;如果语句中没有存在的目标,REVOKE成功但没有实际效果。否则,语句会像往常一样执行,并且尝试撤销由于任何原因未分配给目标的权限会引发错误,如预期的那样。示例(继续上一个示例):
mysql> DROP USER IF EXISTS jerry@localhost; Query OK, 0 rows affected (0.01 sec) mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 't1' mysql> REVOKE SELECT ON test.t1 FROM jerry@localhost IGNORE UNKNOWN USER; Query OK, 0 rows affected, 1 warning (0.01 sec) mysql> SHOW WARNINGS\G *************************** 1\. row *************************** Level: Warning Code: 3162 Message: Authorization ID jerry does not exist. 1 row in set (0.00 sec) -
IF EXISTS和IGNORE UNKNOWN USER的组合意味着REVOKE永远不会因为未知的目标用户或角色或未分配或不可用的权限而引发错误,在这种情况下,整个语句成功;只要可能,现有目标用户或角色将被移除角色或权限,并且任何无法撤销的撤销将引发警告并执行为NOOP。示例(继续上一项中的示例):
# No such user, no such role mysql> DROP ROLE IF EXISTS Bogus; Query OK, 0 rows affected, 1 warning (0.02 sec) mysql> SHOW WARNINGS; +-------+------+----------------------------------------------+ | Level | Code | Message | +-------+------+----------------------------------------------+ | Note | 3162 | Authorization ID 'Bogus'@'%' does not exist. | +-------+------+----------------------------------------------+ 1 row in set (0.00 sec) # This statement attempts to revoke a nonexistent role from a nonexistent user mysql> REVOKE Bogus ON test FROM jerry@localhost; ERROR 3619 (HY000): Illegal privilege level specified for test # The same, with IF EXISTS mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost; ERROR 1147 (42000): There is no such grant defined for user 'jerry' on host 'localhost' on table 'test' # The same, with IGNORE UNKNOWN USER mysql> REVOKE Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; ERROR 3619 (HY000): Illegal privilege level specified for test # The same, with both options mysql> REVOKE IF EXISTS Bogus ON test FROM jerry@localhost IGNORE UNKNOWN USER; Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> SHOW WARNINGS; +---------+------+--------------------------------------------+ | Level | Code | Message | +---------+------+--------------------------------------------+ | Warning | 3619 | Illegal privilege level specified for test | | Warning | 3162 | Authorization ID jerry does not exist. | +---------+------+--------------------------------------------+ 2 rows in set (0.00 sec)
在 mandatory_roles 系统变量值中命名的角色无法被撤销。当在尝试移除强制权限的语句中同时使用 IF EXISTS 和 IGNORE UNKNOWN USER 时,通常由于尝试这样做而引发的错误会降级为警告;语句成功执行,但不会进行任何更改。
撤销的角色立即影响被撤销的任何用户账户,因此在账户的任何当前会话中,其权限将在执行下一条语句时进行调整。
撤销角色会撤销角色本身,而不是它代表的权限。假设一个账户被授予一个包含给定权限的角色,并且还明确授予该权限或包含该权限的另一个角色。在这种情况下,如果撤销第一个角色,则账户仍然拥有该权限。例如,如果一个账户被授予两个都包含 SELECT 的角色,那么在撤销任一角色后,该账户仍然可以进行选择。
REVOKE ALL ON *.*(在全局级别)撤销所有授予的静态全局权限和所有授予的动态权限。
服务器不知道的已授予但未知的已撤销权限会带有警告被撤销。这种情况可能发生在动态权限上。例如,动态权限可以在安装注册它的组件时授予,但如果随后卸载该组件,则权限变为未注册,尽管拥有该权限的账户仍然拥有它,并且可以从他们那里撤销。
REVOKE会移除权限,但不会从mysql.user系统表中删除行。要完全删除用户账户,请使用DROP USER。参见 Section 15.7.1.5, “DROP USER Statement”。
如果授权表中包含包含大小写混合的数据库或表名的权限行,并且lower_case_table_names系统变量设置为非零值,则无法使用REVOKE来撤销这些权限。在这种情况下,必须直接操作授权表。(GRANT在设置lower_case_table_names时不会创建这样的行,但在设置变量之前可能已创建这样的行。只能在初始化服务器时配置lower_case_table_names设置。)
当成功从mysql程序执行时,REVOKE会回应Query OK, 0 rows affected。要确定操作后剩余的权限,使用SHOW GRANTS。参见 Section 15.7.7.21, “SHOW GRANTS Statement”。
15.7.1.9 SET DEFAULT ROLE Statement
SET DEFAULT ROLE
{NONE | ALL | *role* [, *role* ] ...}
TO *user* [, *user* ] ...
对于紧跟在TO关键字后面的每个user,此语句定义了用户连接到服务器并进行身份验证时或用户在会话期间执���SET ROLE DEFAULT语句时激活的角色。
SET DEFAULT ROLE是ALTER USER ... DEFAULT ROLE的替代语法(参见第 15.7.1.1 节,“ALTER USER Statement”)。然而,ALTER USER只能为单个用户设置默认角色,而SET DEFAULT ROLE可以为多个用户设置默认角色。另一方面,您可以为ALTER USER语句指定CURRENT_USER作为用户名,而对于SET DEFAULT ROLE则不行。
SET DEFAULT ROLE需要以下权限:
-
为另一个用户设置默认角色需要全局
CREATE USER权限,或者对mysql.default_roles系统表的UPDATE权限。 -
为自己设置默认角色不需要特殊权限,只要你想要作为默认角色的角色已经被授予。
每个角色名称使用第 8.2.5 节,“指定角色名称”中描述的格式。例如:
SET DEFAULT ROLE 'admin', 'developer' TO 'joe'@'10.0.0.1';
如果省略角色名称的主机名部分,则默认为'%'。
在DEFAULT ROLE关键字后面的子句允许这些值:
-
NONE: 将默认设置为NONE(无角色)。 -
ALL: 将默认设置为授予给账户的所有角色。 -
*role* [, *role* ] ...: 将默认设置为指定的角色,这些角色必须在执行SET DEFAULT ROLE时存在并被授予给账户。
注意
SET DEFAULT ROLE和SET ROLE DEFAULT是不同的语句:
-
SET DEFAULT ROLE定义了在账户会话中默认激活哪些账户角色。 -
SET ROLE DEFAULT将当前会话中的活动角色设置为当前账户的默认角色。
有关角色使用示例,请参见第 8.2.10 节,“使用角色”。
15.7.1.10 SET PASSWORD语句
SET PASSWORD [FOR *user*] *auth_option*
[REPLACE '*current_auth_string*']
[RETAIN CURRENT PASSWORD]
*auth_option*: {
= '*auth_string*'
| TO RANDOM
}
SET PASSWORD语句为 MySQL 用户帐户分配密码。密码可以在语句中明确指定,也可以由 MySQL 随机生成。该语句还可以包括一个密码验证条款,该条款指定要替换的帐户当前密码,以及一个管理帐户是否具有次要密码的条款。'*auth_string*'和'*current_auth_string*'分别表示明文(未加密)密码。
注意
与使用SET PASSWORD分配密码不同,ALTER USER是首选语句,用于帐户更改,包括分配密码。例如:
ALTER USER *user* IDENTIFIED BY '*auth_string*';
注意
仅适用于使用将凭据存储在 MySQL 内部的身份验证插件的帐户的随机密码生成、密码验证和次要密码的条款。对于使用针对 MySQL 外部凭据系统执行身份验证的插件的帐户,密码管理也必须在该系统外部处理。有关内部凭据存储的更多信息,请参见第 8.2.15 节,“密码管理”。
REPLACE '*current_auth_string*'条款执行密码验证,并自 MySQL 8.0.13 起可用。如果给出:
-
REPLACE指定要替换的帐户当前密码,作为明文(未加密)字符串。 -
如果需要更改帐户密码,则必须提供该条款,以指定当前密码,以验证试图进行更改的用户实际知道当前密码。
-
如果需要更改帐户密码,但不需要指定当前密码,则该条款是可选的。
-
如果给出该条款但与当前密码不匹配,则该语句将失败,即使该条款是可选的。
-
只有在更改当前用户的帐户密码时才可以指定
REPLACE。
有关通过指定当前密码进行密码验证的更多信息,请参见第 8.2.15 节,“密码管理”。
RETAIN CURRENT PASSWORD条款实现双密码功能,并自 MySQL 8.0.14 起可用。如果给出:
-
RETAIN CURRENT PASSWORD保留账户当前密码作为其次要密码,替换任何现有的次要密码。新密码成为主密码,但客户端可以使用该账户使用主密码或次要密码连接到服务器。 (例外情况:如果SET PASSWORD语句指定的新密码为空,则次要密码也变为空,即使给出了RETAIN CURRENT PASSWORD。) -
如果为一个主密码为空的账户指定
RETAIN CURRENT PASSWORD,该语句将失败。 -
如果一个账户有一个次要密码,并且您更改其主密码而不指定
RETAIN CURRENT PASSWORD,则次要密码保持不变。
有关双重密码使用的更多信息,请参阅第 8.2.15 节,“密码管理”。
SET PASSWORD 允许使用���些 auth_option 语法:
-
= '*auth_string*'为账户分配指定的明文密码。
-
TO RANDOM为账户分配由 MySQL 随机生成的密码。该语句还会在结果集中返回明文密码,以便用户或执行该语句的应用程序使用。
有关结果集和随机生成密码的特性的详细信息,请参阅随机密码生成。
随机密码生成功能自 MySQL 8.0.18 版本开始提供。
重要提示
在某些情况下,SET PASSWORD 可能会记录在服务器日志中或客户端的历史文件中,例如 ~/.mysql_history,这意味着明文密码可能被任何具有读取权限的人读取。有关在服务器日志中发生这种情况的条件以及如何控制它的信息,请参阅第 8.1.2.3 节,“密码和日志记录”。有关客户端日志记录的类似信息,请参阅第 6.5.1.3 节,“mysql 客户端日志记录”。
SET PASSWORD 可以使用或不使用显式命名用户账户的 FOR 子句:
-
使用
FOR *user*子句,该语句为指定的账户设置密码,该账户必须存在:SET PASSWORD FOR 'jeffrey'@'localhost' = '*auth_string*'; -
没有
FOR *user*子句,该语句为当前用户设置密码:SET PASSWORD = '*auth_string*';任何使用非匿名账户连接到服务器的客户端都可以更改该账户的密码(特别是可以更改自己的密码)。要查看服务器对您进行身份验证的账户,请调用
CURRENT_USER()函数:SELECT CURRENT_USER();
如果给出了FOR *user*子句,则账户名使用第 8.2.4 节“指定账户名”中描述的格式。 例如:
SET PASSWORD FOR 'bob'@'%.example.org' = '*auth_string*';
如果省略了账户名的主机名部分,则默认为'%'。
SET PASSWORD将字符串解释为明文字符串,将其传递给与账户关联的认证插件,并将插件返回的结果存储在mysql.user系统表中的账户行中。(插件有机会将值哈希为其期望的加密格式。插件可以按照指定的值使用该值,这种情况下不会发生哈希。)
为具名账户(使用FOR子句)设置密码需要对mysql系统模式具有UPDATE权限。 为自己设置密码(对于没有FOR子句的非匿名账户)不需要特殊权限。
修改次要密码的语句需要以下权限:
-
需要
APPLICATION_PASSWORD_ADMIN权限才能使用RETAIN CURRENT PASSWORD子句来对自己的账户执行SET PASSWORD语句。 大多数用户只需要一个密码,因此需要该权限来操作自己的次要密码。 -
如果要允许一个账户操作所有账户的次要密码,则应授予
CREATE USER权限,而不是APPLICATION_PASSWORD_ADMIN。
当启用read_only系统变量时,SET PASSWORD需要CONNECTION_ADMIN权限(或已弃用的SUPER权限),以及任何其他所需权限。
有关设置密码和认证插件的更多信息,请参见第 8.2.14 节“分配账户密码”和第 8.2.17 节“可插拔认证”。
15.7.1.11 设置角色语句
SET ROLE {
DEFAULT
| NONE
| ALL
| ALL EXCEPT *role* [, *role* ] ...
| *role* [, *role* ] ...
}
SET ROLE通过指定哪些授予的角色是活动的,修改当前用户在当前会话中的有效特权。授予的角色包括明确授予用户的角色和在mandatory_roles系统变量值中命名的角色。
示例:
SET ROLE DEFAULT;
SET ROLE 'role1', 'role2';
SET ROLE ALL;
SET ROLE ALL EXCEPT 'role1', 'role2';
每个角色名称使用第 8.2.5 节,“指定角色名称”中描述的格式。如果省略角色名称的主机名部分,则默认为'%'。
用户直接授予的特权(而不是通过角色)不受活动角色的更改影响。
该语句允许这些角色说明符:
-
DEFAULT: 激活账户的默认角色。默认角色是使用SET DEFAULT ROLE指定的角色。当用户连接到服务器并成功验证时,服务器确定要激活的默认角色。如果启用了
activate_all_roles_on_login系统变量,则服务器激活所有授予的角色。否则,服务器隐式执行SET ROLE DEFAULT。服务器仅激活可以激活的默认角色。服务器会将警告写入其错误日志,对于无法激活的默认角色,但客户端不会收到警告。如果用户在会话期间执行
SET ROLE DEFAULT,则如果任何默认角色无法激活(例如,如果不存在或未授予给用户),则会发生错误。在这种情况下,当前活动角色不会更改。 -
NONE: 将活动角色设置为NONE(无活动角色)。 -
ALL: 激活授予账户的所有角色。 -
ALL EXCEPT *role* [, *role* ] ...: 激活授予账户的所有角色,除了指定的角色。指定的角色不需要存在或被授予给账户。 -
*role* [, *role* ] ...: 激活命名的角色,这些角色必须授予给账户。
注意
SET DEFAULT ROLE和SET ROLE DEFAULT是不同的语句:
-
SET DEFAULT ROLE定义了默认情况下在账户会话中激活的账户角色。 -
SET ROLE DEFAULT将当前会话中的活动角色设置为当前账户的默认角色。
有关角色使用示例,请参见第 8.2.10 节,“使用角色”。
15.7.2 资源组管理语句
原文:
dev.mysql.com/doc/refman/8.0/en/resource-group-statements.html
15.7.2.1 ALTER RESOURCE GROUP 语句
15.7.2.2 CREATE RESOURCE GROUP 语句
15.7.2.3 DROP RESOURCE GROUP 语句
15.7.2.4 SET RESOURCE GROUP 语句
MySQL 支持资源组的创建和管理,并允许将在服务器内运行的线程分配到特定的组,以便线程根据组可用的资源执行。本节描述了用于资源组管理的 SQL 语句。有关资源组功能的一般讨论,请参见第 7.1.16 节,“资源组”。
原文:
dev.mysql.com/doc/refman/8.0/en/alter-resource-group.html
15.7.2.1 ALTER RESOURCE GROUP Statement
ALTER RESOURCE GROUP *group_name*
[VCPU [=] *vcpu_spec* [, *vcpu_spec*] ...]
[THREAD_PRIORITY [=] *N*]
[ENABLE|DISABLE [FORCE]]
*vcpu_spec*: {*N* | *M* - *N*}
ALTER RESOURCE GROUP 用于资源组管理(参见 Section 7.1.16, “Resource Groups”)。此语句更改现有资源组的可修改属性。它需要RESOURCE_GROUP_ADMIN 权限。
group_name 标识要更改的资源组。如果该组不存在,则会出现错误。
可以使用ALTER RESOURCE GROUP修改 CPU 亲和性、优先级以及组是否启用的属性。这些属性的指定方式与CREATE RESOURCE GROUP中描述的方式相同(参见 Section 15.7.2.2, “CREATE RESOURCE GROUP Statement”)。只有指定的属性会被更改,未指定的属性保留其当前值。
FORCE 修饰符与 DISABLE 一起使用。如果资源组有任何线程分配给它,则确定语句的行为:
-
如果未给出
FORCE,则组中的现有线程将继续运行直到终止,但新线程不能分配给该组。 -
如果给出
FORCE,则组中的现有线程将移动到各自的默认组(系统线程到SYS_default,用户线程到USR_default)。
名称和类型属性在组创建时设置,之后不能使用ALTER RESOURCE GROUP进行修改。
示例:
-
更改组 CPU 亲和性:
ALTER RESOURCE GROUP rg1 VCPU = 0-63; -
更改组线程优先级:
ALTER RESOURCE GROUP rg2 THREAD_PRIORITY = 5; -
禁用一个组,将任何分配给它的线程移动到默认组:
ALTER RESOURCE GROUP rg3 DISABLE FORCE;
资源组管理是在发生的服务器上本地的。ALTER RESOURCE GROUP 语句不会写入二进制日志,也不会被复制。
原文:
dev.mysql.com/doc/refman/8.0/en/create-resource-group.html
15.7.2.2 创建资源组语句
CREATE RESOURCE GROUP *group_name*
TYPE = {SYSTEM|USER}
[VCPU [=] *vcpu_spec* [, *vcpu_spec*] ...]
[THREAD_PRIORITY [=] *N*]
[ENABLE|DISABLE]
*vcpu_spec*: {*N* | *M* - *N*}
CREATE RESOURCE GROUP 用于资源组管理(参见 Section 7.1.16, “Resource Groups”)。此语句创建一个新的资源组并分配其初始属性值。它需要 RESOURCE_GROUP_ADMIN 权限。
group_name 标识要创建的资源组。如果该组已经存在,则会出现错误。
TYPE 属性是必需的。对于系统资源组应为 SYSTEM,对于用户资源组应为 USER。组类型会影响允许的 THREAD_PRIORITY 值,如后面所述。
VCPU 属性表示 CPU 亲和性;也就是说,组可以使用的虚拟 CPU 集合:
-
如果没有给定
VCPU,资源组没有 CPU 亲和性,可以使用所有可用的 CPU。 -
如果给定了
VCPU,则属性值是逗号分隔的 CPU 数字或范围的列表:-
每个数字必须是从 0 到 CPU 数量 - 1 的范围内的整数。例如,在具有 64 个 CPU 的系统上,数字的范围可以从 0 到 63。
-
范围以
M−N的形式给出,其中M小于或等于N,并且两个数字都在 CPU 范围内。 -
如果 CPU 数字是超出允许范围的整数或不是整数,则会出现错误。
-
示例 VCPU 指定器(这些都是等效的):
VCPU = 0,1,2,3,9,10
VCPU = 0-3,9-10
VCPU = 9,10,0-3
VCPU = 0,10,1,9,3,2
THREAD_PRIORITY 属性表示分配给组的线程的优先级:
-
如果没有给定
THREAD_PRIORITY,默认优先级为 0。 -
如果给定了
THREAD_PRIORITY,则属性值必须在 -20(最高优先级)到 19(最低优先级)的范围内。系统资源组的优先级必须在 -20 到 0 的范围内。用户资源组的优先级必须在 0 到 19 的范围内。使用不同的范围为系统和用户组确保用户线程永远不会比系统线程具有更高的优先级。
ENABLE 和 DISABLE 指定资源组最初是启用还是禁用。如果没有指定任何一个,那么该组默认是启用的。禁用的组不能分配线程。
示例:
-
创建一个启用的用户组,具有单个 CPU 和最低优先级:
CREATE RESOURCE GROUP rg1 TYPE = USER VCPU = 0 THREAD_PRIORITY = 19; -
创建一个禁用的系统组,没有 CPU 亲和性(可以使用所有 CPU)和最高优先级:
CREATE RESOURCE GROUP rg2 TYPE = SYSTEM THREAD_PRIORITY = -20 DISABLE;
资源组管理是在发生的服务器上本地的。CREATE RESOURCE GROUP 语句不会写入二进制日志,也不会被复制。
15.7.2.3 删除资源组语句
DROP RESOURCE GROUP *group_name* [FORCE]
DROP RESOURCE GROUP 用于资源组管理(参见第 7.1.16 节,“资源组”)。此语句删除一个资源组。它需要RESOURCE_GROUP_ADMIN 权限。
group_name 标识要删除的资源组。如果该组不存在,则会出现错误。
FORCE 修饰符确定资源组有任何线程分配时语句的行为:
-
如果未给出
FORCE并且任何线程被分配到该组,则会出现错误。 -
如果给出
FORCE,则组中的现有线程将移动到各自的默认组(系统线程到SYS_default,用户线程到USR_default)。
示例:
-
删除一个组,如果该组包含任何线程则失败:
DROP RESOURCE GROUP rg1; -
删除一个组并将现有线程移动到默认组:
DROP RESOURCE GROUP rg2 FORCE;
资源组管理是发生在其上的服务器本地的。DROP RESOURCE GROUP 语句不会写入二进制日志,也不会被复制。
15.7.2.4 SET RESOURCE GROUP Statement
SET RESOURCE GROUP *group_name*
[FOR *thread_id* [, *thread_id*] ...]
SET RESOURCE GROUP 用于资源组管理(参见 第 7.1.16 节,“资源组”)。此语句将线程分配给资源组。它需要 RESOURCE_GROUP_ADMIN 或 RESOURCE_GROUP_USER 权限。
group_name 标识要分配的资源组。任何 thread_id 值表示要分配给该组的线程。线程 ID 可以从性能模式 threads 表中确定。如果资源组或任何命名线程 ID 不存在,则会出现错误。
没有 FOR 子句时,该语句将当前会话的当前线程分配给资源组。
使用命名线程 ID 的 FOR 子句时,该语句将这些线程分配给资源组。
尝试将系统线程分配给用户资源组或用户线程分配给系统资源组时,会发出警告。
示例:
-
将当前会话线程分配给一个组:
SET RESOURCE GROUP rg1; -
将命名线程分配给一个组:
SET RESOURCE GROUP rg2 FOR 14, 78, 4;
资源组管理是局限于发生在其上的服务器的。SET RESOURCE GROUP 语句不会写入二进制日志,也不会被复制。
一个替代 SET RESOURCE GROUP 的方法是 RESOURCE_GROUP 优化器提示,它将单个语句分配给资源组。参见 第 10.9.3 节,“优化器提示”。
15.7.3 表维护语句
原文:
dev.mysql.com/doc/refman/8.0/en/table-maintenance-statements.html
15.7.3.1 分析表语句
15.7.3.2 检查表语句
15.7.3.3 校验表语句
15.7.3.4 优化表语句
15.7.3.5 修复表语句
15.7.3.1 ANALYZE TABLE Statement
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name* [, *tbl_name*] ...
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name*
UPDATE HISTOGRAM ON *col_name* [, *col_name*] ...
[WITH *N* BUCKETS]
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name*
UPDATE HISTOGRAM ON *col_name* [USING DATA '*json_data*']
ANALYZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name*
DROP HISTOGRAM ON *col_name* [, *col_name*] ...
ANALYZE TABLE生成表统计信息:
-
ANALYZE TABLE在没有HISTOGRAM子句的情况下执行键分布分析,并为指定的表或表存储分布。对于MyISAM表,进行键分布分析的ANALYZE TABLE等同于使用myisamchk --analyze。 -
带有
UPDATE HISTOGRAM子句的ANALYZE TABLE为指定表列生成直方图统计信息,并将其存储在数据字典中。此语法仅允许一个表名。MySQL 8.0.31 及更高版本还支持将单个列的直方图设置为用户定义的 JSON 值。 -
带有
DROP HISTOGRAM子句的ANALYZE TABLE从数据字典中删除指定表列的直方图统计信息。此语法仅允许一个表名。
此语句需要表的SELECT和INSERT权限。
ANALYZE TABLE适用于InnoDB、NDB和MyISAM表。它不适用于视图。
如果启用了innodb_read_only系统变量,则ANALYZE TABLE可能会失败,因为它无法更新使用InnoDB的数据字典中的统计表,用于更新键分布的ANALYZE TABLE操作,即使操作更新表本身(例如,如果是MyISAM表),也可能会发生失败。要获取更新后的分布统计信息,请设置information_schema_stats_expiry=0。
支持对分区表进行ANALYZE TABLE操作,您可以使用ALTER TABLE ... ANALYZE PARTITION来分析一个或多个分区;有关更多信息,请参见第 15.1.9 节,“ALTER TABLE Statement”和第 26.3.4 节,“Partitions 的维护”。
在分析过程中,对于InnoDB和MyISAM,表将被读锁定。
默认情况下,服务器将ANALYZE TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。
以前,ANALYZE TABLE需要一个刷新锁。这意味着,当调用ANALYZE TABLE时,如果仍有长时间运行的语句或事务在使用表,则任何后续语句和事务都必须等待这些操作完成,然后才能释放刷新锁。在 MySQL 8.0.24(及更高版本)中解决了这个问题,ANALYZE TABLE不再导致后续操作等待。
-
ANALYZE TABLE 输出
-
键分布分析
-
直方图统计分析
-
其他考虑
ANALYZE TABLE 输出
ANALYZE TABLE 返回一个包含以下表中所示列的结果集。
| 列 | 值 |
|---|---|
Table |
表名 |
Op |
analyze 或 histogram |
Msg_type |
status, error, info, note, 或 warning |
Msg_text |
一个信息性消息 |
键分布分析
ANALYZE TABLE没有HISTOGRAM子句时执行键分布分析并存储表或表的分布。任何现有的直方图统计数据保持不变。
如果表自上次键分布分析以来未发生更改,则不会再次分析该表。
MySQL 使用存储的键分布来决定除常数外其他内容的连接应该以什么顺序连接表。此外,在决定查询中特定表使用哪些索引时,可以使用键分布。
要检查存储的键分布基数,使用SHOW INDEX语句或INFORMATION_SCHEMA STATISTICS表。参见第 15.7.7.22 节,“SHOW INDEX Statement”和第 28.3.34 节,“The INFORMATION_SCHEMA STATISTICS Table”。
对于InnoDB表,ANALYZE TABLE通过在每个索引树上执行随机潜水并相应地更新索引基数估计来确定索引基数。由于这些只是估计值,多次运行ANALYZE TABLE可能会产生不同的数字。这使得ANALYZE TABLE在InnoDB表上运行速度快,但不是 100%准确,因为它没有考虑所有行。
通过启用innodb_stats_persistent,可以使ANALYZE TABLE收集的统计信息更加精确和稳定,如第 17.8.10.1 节,“配置持久性优化器统计参数”中所解释的那样。在启用innodb_stats_persistent时,重要的是在索引列数据发生重大更改后运行ANALYZE TABLE,因为统计信息不会定期重新计算(例如在服务器重新启动后)。
如果启用了innodb_stats_persistent,可以通过修改innodb_stats_persistent_sample_pages系统变量来更改随机潜水次数。如果禁用了innodb_stats_persistent,则改为修改innodb_stats_transient_sample_pages。
有关InnoDB中键分布分析的更多信息,请参见第 17.8.10.1 节,“配置持久性优化器统计参数”和第 17.8.10.3 节,“估算 InnoDB 表的 ANALYZE TABLE 复杂度”。
MySQL 在连接优化中使用索引基数估计。如果连接没有以正确的方式优化,请尝试运行ANALYZE TABLE。在极少数情况下,ANALYZE TABLE无法为您的特定表生成足够好的值,您可以在查询中使用FORCE INDEX强制使用特定索引,或者设置max_seeks_for_key系统变量以确保 MySQL 优先选择索引查找而不是表扫描。参见第 B.3.5 节,“与优化器相关的问题”。
直方图统计分析
带有HISTOGRAM子句的ANALYZE TABLE启用了对表列值的直方图统计管理。有关直方图统计信息,请参见第 10.9.6 节,“优化器统计信息”。
可用的直方图操作如下:
-
带有
UPDATE HISTOGRAM子句的ANALYZE TABLE为命名表列生成直方图统计信息,并将其存储在数据字典中。此语法仅允许一个表名。可选的
WITH *N* BUCKETS子句指定直方图的桶数。N的值必须是 1 到 1024 之间的整数。如果省略此子句,则桶数为 100。 -
带有
DROP HISTOGRAM子句的ANALYZE TABLE从数据字典中删除了命名表列的直方图统计信息。此语法仅允许一个表名。
存储的直方图管理语句仅影响指定的列。考虑以下语句:
ANALYZE TABLE t UPDATE HISTOGRAM ON c1, c2, c3 WITH 10 BUCKETS;
ANALYZE TABLE t UPDATE HISTOGRAM ON c1, c3 WITH 10 BUCKETS;
ANALYZE TABLE t DROP HISTOGRAM ON c2;
第一条语句更新了c1、c2和c3列的直方图,替换了这些列的任何现有直方图。第二条语句更新了c1和c3列的直方图,而c2列的直方图保持不变。第三条语句移除了c2列的直方图,而c1和c3列的直方图保持不变。
在对用户数据进行抽样以构建直方图时,并非所有值都会被读取;这可能导致遗漏一些被认为重要的值。在这种情况下,修改直方图或根据自己的标准明确设置自己的直方图可能是有用的,例如完整数据集。MySQL 8.0.31 添加了对ANALYZE TABLE *tbl_name* UPDATE HISTOGRAM ON *col_name* USING DATA '*json_data*'的支持,用于使用与显示信息模式COLUMN_STATISTICS表中HISTOGRAM列值相同的 JSON 格式提供的数据更新直方图表的列。在使用 JSON 数据更新直方图时,只能修改一个列。
我们可以通过首先在表t的列c1上生成直方图来说明USING DATA的用法,就像这样:
mysql> ANALYZE TABLE t UPDATE HISTOGRAM ON c1;
+--------+-----------+----------+-----------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+-----------+----------+-----------------------------------------------+
| mydb.t | histogram | status | Histogram statistics created for column 'c1'. |
+--------+-----------+----------+-----------------------------------------------+
我们可以在COLUMN_STATISTICS表中看到生成的直方图:
mysql> TABLE information_schema.column_statistics\G
*************************** 1\. row ***************************
SCHEMA_NAME: mydb
TABLE_NAME: t
COLUMN_NAME: c1
HISTOGRAM: {"buckets": [[206, 0.0625], [456, 0.125], [608, 0.1875]],
"data-type": "int", "null-values": 0.0, "collation-id": 8, "last-updated":
"2022-10-11 16:13:14.563319", "sampling-rate": 1.0, "histogram-type":
"singleton", "number-of-buckets-specified": 100}
现在我们删除了直方图,当我们检查COLUMN_STATISTICS时,它现在是空的:
mysql> ANALYZE TABLE t DROP HISTOGRAM ON c1;
+--------+-----------+----------+-----------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+-----------+----------+-----------------------------------------------+
| mydb.t | histogram | status | Histogram statistics removed for column 'c1'. |
+--------+-----------+----------+-----------------------------------------------+
mysql> TABLE information_schema.column_statistics\G
Empty set (0.00 sec)
我们可以通过将先前从COLUMN_STATISTICS表的HISTOGRAM列中获取的 JSON 表示插入来恢复已删除的直方图,当我们再次查询该表时,我们可以看到直方图已恢复到先前的状态:
mysql> ANALYZE TABLE t UPDATE HISTOGRAM ON c1
-> USING DATA '{"buckets": [[206, 0.0625], [456, 0.125], [608, 0.1875]],
-> "data-type": "int", "null-values": 0.0, "collation-id":
-> 8, "last-updated": "2022-10-11 16:13:14.563319",
-> "sampling-rate": 1.0, "histogram-type": "singleton",
-> "number-of-buckets-specified": 100}';
+--------+-----------+----------+-----------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+--------+-----------+----------+-----------------------------------------------+
| mydb.t | histogram | status | Histogram statistics created for column 'c1'. |
+--------+-----------+----------+-----------------------------------------------+
mysql> TABLE information_schema.column_statistics\G
*************************** 1\. row ***************************
SCHEMA_NAME: mydb
TABLE_NAME: t
COLUMN_NAME: c1
HISTOGRAM: {"buckets": [[206, 0.0625], [456, 0.125], [608, 0.1875]],
"data-type": "int", "null-values": 0.0, "collation-id": 8, "last-updated":
"2022-10-11 16:13:14.563319", "sampling-rate": 1.0, "histogram-type":
"singleton", "number-of-buckets-specified": 100}
不支持为加密表(以避免在统计数据中暴露数据)或TEMPORARY表生成直方图。
直方图生成适用于除几何类型(空间数据)和JSON之外的所有数据类型的列。
可以为存储和虚拟生成列生成直方图。
无法为由单列唯一索引覆盖的列生成直方图。
直方图管理语句尝试尽可能执行请求的操作,并对其余部分报告诊断消息。例如,如果UPDATE HISTOGRAM语句命名了多个列,但其中一些列不存在或具有不受支持的数据类型,则会为其他列生成直方图,并为无效列生成消息。
直方图受以下 DDL 语句影响:
-
DROP TABLE会移除已删除表中的列的直方图。 -
DROP DATABASE会移除已删除数据库中任何表的直方图,因为该语句会删除数据库中的所有表。 -
RENAME TABLE不会移除直方图。相反,它会将重命名后的表的直方图重命名为与新表名相关联。 -
ALTER TABLE语句删除或修改列时会删除该列的直方图。 -
ALTER TABLE ... CONVERT TO CHARACTER SET会移除字符列的直方图,因为它们受字符集更改的影响。非字符列的直方图不受影响。
histogram_generation_max_mem_size系统变量控制用于直方图生成的最大内存量。全局和会话值可以在运行时设置。
更改全局histogram_generation_max_mem_size值需要具有足够权限设置全局系统变量的权限。更改会话histogram_generation_max_mem_size值需要具有足够权限设置受限会话系统变量的权限。参见 Section 7.1.9.1, “System Variable Privileges”。
如果用于直方图生成的估计数据量超过由histogram_generation_max_mem_size定义的限制,MySQL 会对数据进行抽样而不是全部读入内存。抽样均匀分布在整个表上。MySQL 使用SYSTEM抽样,这是一种基于页面级别的抽样方法。
可以查询信息模式COLUMN_STATISTICS表中HISTOGRAM列中的sampling-rate值,以确定用于创建直方图的数据分数。sampling-rate是一个介于 0.0 和 1.0 之间的数字。值为 1 表示所有数据都被读取(没有抽样)。
以下示例演示了抽样。为了确保数据量超过histogram_generation_max_mem_size限制,以便进行示例,先将限制设置为较低值(2000000 字节),然后为employees表的birth_date列生成直方图统计信息。
mysql> SET histogram_generation_max_mem_size = 2000000;
mysql> USE employees;
mysql> ANALYZE TABLE employees UPDATE HISTOGRAM ON birth_date WITH 16 BUCKETS\G
*************************** 1\. row ***************************
Table: employees.employees
Op: histogram
Msg_type: status
Msg_text: Histogram statistics created for column 'birth_date'.
mysql> SELECT HISTOGRAM->>'$."sampling-rate"'
FROM INFORMATION_SCHEMA.COLUMN_STATISTICS
WHERE TABLE_NAME = "employees"
AND COLUMN_NAME = "birth_date";
+---------------------------------+
| HISTOGRAM->>'$."sampling-rate"' |
+---------------------------------+
| 0.0491431208869665 |
+---------------------------------+
sampling-rate值为 0.0491431208869665 表示大约有 4.9%的birth_date列数据被读入内存以生成直方图统计信息。
截至 MySQL 8.0.19,InnoDB存储引擎为存储在InnoDB表中的数据提供了自己的抽样实现。当存储引擎不提供自己的抽样实现时,MySQL 使用的默认抽样实现需要进行全表扫描,对于大表来说代价高昂。InnoDB抽样实现通过避免全表扫描来提高抽样性能。
sampled_pages_read和sampled_pages_skipped``INNODB_METRICS计数器可用于监视InnoDB数据页的采样。(有关一般INNODB_METRICS计数器使用信息,请参见 Section 28.4.21, “The INFORMATION_SCHEMA INNODB_METRICS Table”。)
以下示例演示了采样计数器的使用,需要在生成直方图统计信息之前启用计数器。
mysql> SET GLOBAL innodb_monitor_enable = 'sampled%';
mysql> USE employees;
mysql> ANALYZE TABLE employees UPDATE HISTOGRAM ON birth_date WITH 16 BUCKETS\G
*************************** 1\. row ***************************
Table: employees.employees
Op: histogram
Msg_type: status
Msg_text: Histogram statistics created for column 'birth_date'.
mysql> USE INFORMATION_SCHEMA;
mysql> SELECT NAME, COUNT FROM INNODB_METRICS WHERE NAME LIKE 'sampled%'\G
*************************** 1\. row ***************************
NAME: sampled_pages_read
COUNT: 43
*************************** 2\. row ***************************
NAME: sampled_pages_skipped
COUNT: 843
这个公式基于采样计数器数据近似采样率:
sampling rate = sampled_page_read/(sampled_pages_read + sampled_pages_skipped)
基于采样计数器数据的采样率大致等同于信息模式COLUMN_STATISTICS表中HISTOGRAM列中的sampling-rate值。
有关生成直方图时执行的内存分配的信息,请监视性能模式memory/sql/histograms工具。参见 Section 29.12.20.10, “Memory Summary Tables”。
其他考虑因素
ANALYZE TABLE从信息模式INNODB_TABLESTATS表中清除表统计信息,并将STATS_INITIALIZED列设置为Uninitialized。统计信息在下次访问表时再次收集。
15.7.3.2 CHECK TABLE Statement
CHECK TABLE *tbl_name* [, *tbl_name*] ... [*option*] ...
*option*: {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE 检查一个或多个表中的错误。CHECK TABLE 也可以检查视图是否存在问题,例如在视图定义中引用的表已不存在。
要检查一个表,您必须���其具有某些权限。
CHECK TABLE 适用于 InnoDB, MyISAM, ARCHIVE, 和 CSV 表。
在对 InnoDB 表运行 CHECK TABLE 之前,请参阅 InnoDB 表的 CHECK TABLE 使用注意事项。
CHECK TABLE 支持分区表,并且您可以使用 ALTER TABLE ... CHECK PARTITION 来检查一个或多个分区;有关更多信息,请参阅 第 15.1.9 节,“ALTER TABLE 语句” 和 第 26.3.4 节,“分区的维护”。
CHECK TABLE 忽略未建立索引的虚拟生成列。
-
检查表输出
-
检查版本兼容性
-
检查数据一致性
-
InnoDB 表的 CHECK TABLE 使用注意事项
-
MyISAM 表的 CHECK TABLE 使用注意事项
检查表输出
CHECK TABLE 返回一个结果集,其中包含以下表中显示的列。
| 列 | 值 |
|---|---|
Table |
表名 |
Op |
始终为 check |
Msg_type |
status, error, info, note, 或 warning |
Msg_text |
一个信息性消息 |
该语句可能为每个检查的表产生许多行信息。最后一行的 Msg_type 值为 status,Msg_text 通常应为 OK。 Table is already up to date 表示表的存储引擎指示无需检查表。
检查版本兼容性
FOR UPGRADE选项检查指定表是否与当前版本的 MySQL 兼容。使用FOR UPGRADE,服务器会检查每个表,以确定自创建表以来是否有任何数据类型或索引的不兼容更改。如果没有,则检查成功。否则,如果存在可能的不兼容性,服务器会对表进行全面检查(可能需要一些时间)。
不兼容性可能是因为数据类型的存储格式已更改或其排序顺序已更改。我们的目标是避免这些更改,但偶尔它们是必要的,以纠正比发布之间的不兼容性更糟糕的问题。
FOR UPGRADE会发现这些不兼容性:
-
在
InnoDB和MyISAM表中,TEXT列的末尾空格索引顺序在 MySQL 4.1 和 5.0 之间发生了变化。 -
新
DECIMAL数据类型的存储方法在 MySQL 5.0.3 和 5.0.5 之间发生了变化。 -
有时会对字符集或校对规则进行更改,需要重建表索引。有关此类更改的详细信息,请参见第 3.5 节,“MySQL 8.0 中的更改”。有关重建表的信息,请参见第 3.14 节,“重建或修复表或索引”。
-
MySQL 8.0 不支持旧版本 MySQL 中允许的 2 位数
YEAR(2)数据类型。对于包含YEAR(2)列的表,CHECK TABLE建议使用REPAIR TABLE,将 2 位数YEAR(2)列转换为 4 位数YEAR列。 -
触发器创建时间保持不变。
-
如果表中包含旧的时间列(不支持分数秒精度的
TIME、DATETIME和TIMESTAMP列)且avoid_temporal_upgrade系统变量已禁用,则会报告需要重建表。这有助于 MySQL 升级过程检测和升级包含旧时间列的表。如果启用了avoid_temporal_upgrade,FOR UPGRADE会忽略表中存在的旧时间列;因此,升级过程不会对其进行升级。要检查包含这种时间列并需要重建的表格,请在执行
CHECK TABLE ... FOR UPGRADE之前禁用avoid_temporal_upgrade。 -
对于使用非本机分区的表格会发出警告,因为 MySQL 8.0 中移除了非本机分区。请参阅第二十六章,分区。
检查数据一致性
下表显示了可以提供的其他检查选项。这些选项将传递给存储引擎,存储引擎可能会使用或忽略它们。
| 类型 | 意义 |
|---|---|
QUICK |
不扫描行以检查不正确的链接。适用于InnoDB和MyISAM表格和视图。 |
FAST |
仅检查未正确关闭的表格。对InnoDB无效;仅适用于MyISAM表格和视图。 |
CHANGED |
仅检查自上次检查以来已更改或未正确关闭的表格。对InnoDB无效;仅适用于MyISAM表格和视图。 |
MEDIUM |
扫描行以验证已删除链接是否有效。这还为行计算一个键校验和,并将其与键的计算校验和进行验证。对InnoDB无效;仅适用于MyISAM表格和视图。 |
EXTENDED |
对每一行的所有键进行完整的键查找。这确保表格是 100%一致的,但需要很长时间。对InnoDB无效;仅适用于MyISAM表格和视图。 |
您可以组合检查选项,如下例所示,对表格进行快速检查以确定是否已正确关闭:
CHECK TABLE test_table FAST QUICK;
注意
如果CHECK TABLE在标记为“损坏”或“未正确关闭”的表格中未发现问题,CHECK TABLE可能会移除标记。
如果表格损坏,问题很可能在索引中而不是数据部分。所有前面的检查类型都会彻底检查索引,因此应该能找到大多数错误。
要检查一个您认为没问题的表格,请不使用检查选项或使用QUICK选项。当您匆忙时可以使用后者,并且可以承担QUICK在数据文件中找不到错误的极小风险。(在大多数情况下,在正常使用情况下,MySQL 应该能找到数据文件中的任何错误。如果发生这种情况,表格将被标记为“损坏”,直到修复为止。)
FAST和CHANGED主要用于从脚本(例如从cron中执行)定期检查表格。在大多数情况下,FAST优于CHANGED。(唯一不优选的情况是当您怀疑在MyISAM代码中发现了错误时。)
仅在运行正常检查但 MySQL 尝试更新行或按键查找行时仍然从表中获得错误时才使用EXTENDED。如果正常检查成功,这是非常不可能的。
使用CHECK TABLE ... EXTENDED可能会影响查询优化器生成的执行计划。
CHECK TABLE报告的一些问题无法自动纠正:
-
找到行,其中自增列的值为 0。这意味着表中有一行,其中
AUTO_INCREMENT索引列包含值 0。(可以通过使用UPDATE语句显式将列设置为 0 来创建AUTO_INCREMENT列为 0 的行。)这本身不是错误,但如果您决定转储表并恢复它,或对表进行
ALTER TABLE操作可能会引起麻烦。在这种情况下,AUTO_INCREMENT列根据AUTO_INCREMENT列的规则更改值,可能会导致诸如重复键错误之类的问题。要消除警告,请执行
UPDATE语句将列设置为非 0 值。
InnoDB 表的CHECK TABLE使用注意事项
以下注意事项适用于InnoDB表:
-
如果
CHECK TABLE遇到损坏的页,服务器会退出以防止错误传播(Bug #10132)。如果损坏发生在辅助索引中但表数据可读,运行CHECK TABLE仍可能导致服务器退出。 -
如果
CHECK TABLE在聚簇索引中遇到损坏的DB_TRX_ID或DB_ROLL_PTR字段,CHECK TABLE可能会导致InnoDB访问无效的撤消日志记录,导致与 MVCC 相关的服务器退出。 -
如果
CHECK TABLE在InnoDB表或索引中遇到错误,它会报告错误,并通常标记索引,有时标记表为损坏,阻止进一步使用索引或表。此类错误包括辅助索引中不正确的条目数或不正确的链接。 -
如果
CHECK TABLE在辅助索引中发现不正确的条目数,它会报告错误,但不会导致服务器退出或阻止访问文件。 -
CHECK TABLE调查索引页结构,然后调查每个键入。它不验证指向聚簇记录的键指针,也不遵循BLOB指针的路径。 -
当
InnoDB表存储在自己的.ibd文件 中时,.ibd文件的前 3 个 页 包含头部信息而不是表或索引数据。CHECK TABLE语句不会检测仅影响头部数据的不一致性。要验证整个InnoDB.ibd文件的内容,使用 innochecksum 命令。 -
在大型
InnoDB表上运行CHECK TABLE时,其他线程可能在CHECK TABLE执行期间被阻塞。为避免超时,信号量等待阈值(600 秒)在CHECK TABLE操作期间延长 2 小时(7200 秒)。如果InnoDB检测到 240 秒或更长时间的信号量等待,它开始将InnoDB监视器输出打印到错误日志中。如果锁请求超出信号量等待阈值,InnoDB将中止该进程。为完全避免信号量等待超时的可能性,运行CHECK TABLE QUICK而不是CHECK TABLE。 -
InnoDBSPATIAL索引的CHECK TABLE功能包括 R 树有效性检查和确保 R 树行数与聚簇索引匹配的检查。 -
CHECK TABLE支持虚拟生成列上的辅助索引,这些索引由InnoDB支持。 -
截至 MySQL 8.0.14,
InnoDB支持并行聚簇索引读取,可以提高CHECK TABLE的性能。InnoDB在CHECK TABLE操作期间两次读取聚簇索引。第二次读取可以并行执行。innodb_parallel_read_threads会话变量必须设置为大于 1 的值,才能进行并行聚簇索引读取。默认值为 4。用于执行并行聚簇索引读取的实际线程数由innodb_parallel_read_threads设置或要扫描的索引子树数量决定,以较小者为准。
MyISAM 表的 CHECK TABLE 用法注意事项
以下注意事项适用于MyISAM表:
-
CHECK TABLE更新MyISAM表的关键统计信息。 -
如果
CHECK TABLE输出不返回OK或Table is already up to date,通常应该对表进行修复。请参阅第 9.6 节,“MyISAM 表维护和崩溃恢复”。 -
如果未指定
CHECK TABLE选项QUICK、MEDIUM或EXTENDED,动态格式MyISAM表的默认检查类型为MEDIUM。这与在表上运行myisamchk --medium-checktbl_name的结果相同。对于静态格式MyISAM表,默认的检查类型也是MEDIUM,除非指定了CHANGED或FAST。在这种情况下,默认值为QUICK。对于CHANGED和FAST,行扫描被跳过,因为行很少损坏。
15.7.3.3 CHECKSUM TABLE 语句
CHECKSUM TABLE *tbl_name* [, *tbl_name*] ... [QUICK | EXTENDED]
CHECKSUM TABLE报告表内容的校验值。您可以使用此语句在备份、回滚或其他旨在将数据恢复到已知状态的操作之前后验证内容是否相同。
这个语句需要表的SELECT权限。
这个语句不支持对视图的操作。如果你对视图运行CHECKSUM TABLE,Checksum值始终为NULL,并返回一个警告。
对于不存在的表,CHECKSUM TABLE返回NULL并生成一个警告。
在校验操作期间,对于InnoDB和MyISAM,表会被读锁定。
性能考虑
默认情况下,整个表会逐行读取并计算校验值。对于大表,这可能需要很长时间,因此您只会偶尔执行此操作。这种逐行计算是使用EXTENDED子句、InnoDB和除了MyISAM之外的所有其他存储引擎,以及未使用CHECKSUM=1子句创建的MyISAM表所得到的。
对于使用CHECKSUM=1子句创建的MyISAM表,CHECKSUM TABLE或CHECKSUM TABLE ... QUICK返回可以非常快速返回的“实时”表校验值。如果表不符合所有这些条件,QUICK方法返回NULL。QUICK方法不支持InnoDB表。有关CHECKSUM子句的语法,请参见第 15.1.20 节,“CREATE TABLE Statement”。
校验值取决于表行格式。如果行格式发生变化,校验值也会发生变化。例如,MySQL 5.6 之前的 MySQL 5.6.5 对于诸如TIME、DATETIME和TIMESTAMP等时间类型的存储格式发生了变化,因此如果将一个 5.5 表升级到 MySQL 5.6,校验值可能会发生变化。
重要提示
如果两个表的校验值不同,那么这两个表在某种程度上肯定是不同的。然而,由于CHECKSUM TABLE使用的哈希函数不能保证无碰撞,所以两个不完全相同的表可能产生相同的校验值的几率很小。
15.7.3.4 OPTIMIZE TABLE 语句
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name* [, *tbl_name*] ...
OPTIMIZE TABLE重新组织表数据和相关索引数据的物理存储,以减少存储空间并在访问表时提高 I/O 效率。对每个表所做的确切更改取决于该表使用的存储引擎。
在这些情况下使用OPTIMIZE TABLE,取决于表的类型:
-
在对启用了
innodb_file_per_table选项创建了自己的.ibd 文件的InnoDB表上进行大量插入、更新或删除操作之后。表和索引将重新组织,并且磁盘空间可以被回收供操作系统使用。 -
在对
InnoDB表中的FULLTEXT索引的列进行大量插入、更新或删除操作之后。首先设置配置选项innodb_optimize_fulltext_only=1。为了保持索引维护时间在合理范围内,设置innodb_ft_num_word_optimize选项以指定要更新搜索索引中的单词数量,并运行一系列OPTIMIZE TABLE语句,直到搜索索引完全更新。 -
在删除
MyISAM或ARCHIVE表的大部分内容,或对具有可变长度行的MyISAM或ARCHIVE表进行许多更改(具有VARCHAR、VARBINARY、BLOB或TEXT列的表)。已删除的行将保留在链表中,并且后续的INSERT操作将重用旧的行位置。您可以使用OPTIMIZE TABLE来回收未使用的空间并对数据文件进行碎片整理。在对表进行大量更改后,此语句有时也可以显著改善使用该表的语句的性能。
此语句需要表的SELECT和INSERT权限。
OPTIMIZE TABLE适用于InnoDB、MyISAM和ARCHIVE表。OPTIMIZE TABLE也支持内存中动态列的NDB表。它不适用于内存表的固定宽度列,也不适用于磁盘数据表。可以使用--ndb-optimization-delay来调整 NDB Cluster 表上OPTIMIZE的性能,该选项控制OPTIMIZE TABLE处理批处理行之间等待的时间长度。有关更多信息,请参见第 25.2.7.11 节,“NDB Cluster 8.0 中解决的以前的 NDB Cluster 问题”。
对于 NDB Cluster 表,OPTIMIZE TABLE可以被(例如)终止执行OPTIMIZE操作的 SQL 线程所中断。
默认情况下,OPTIMIZE TABLE不适用于使用任何其他存储引擎创建的表,并返回指示此不支持的结果。您可以通过使用--skip-new选项启动mysqld来使OPTIMIZE TABLE适用于其他存储引擎。在这种情况下,OPTIMIZE TABLE只是映射到ALTER TABLE。
此语句不适用于视图。
OPTIMIZE TABLE支持分区表。有关在分区表和表分区中使用此语句的信息,请参见第 26.3.4 节,“分区的维护”。
默认情况下,服务器会将OPTIMIZE TABLE语句写入二进制日志,以便在副本中复制。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。
-
OPTIMIZE TABLE 输出
-
InnoDB 详细信息
-
MyISAM 详细信息
-
其他考虑因素
OPTIMIZE TABLE 输出
OPTIMIZE TABLE 返回一个结果集,其中包含下表所示的列。
| 列 | 值 |
|---|---|
Table |
表名 |
Op |
始终为 optimize |
Msg_type |
status, error, info, note, 或 warning |
Msg_text |
一个信息性消息 |
OPTIMIZE TABLE 表捕获并抛出在从旧文件复制表统计信息到新创建的文件时发生的任何错误。例如,如果.MYD或.MYI文件的所有者用户 ID 与 mysqld 进程的用户 ID 不同,OPTIMIZE TABLE 会生成“无法更改文件所有权”错误,除非 mysqld 是由 root 用户启动的。
InnoDB 详情
对于 InnoDB 表,OPTIMIZE TABLE 被映射为 ALTER TABLE ... FORCE,该操作重建表以更新索引统计信息并释放聚簇索引中未使用的空间。当你在 InnoDB 表上运行 OPTIMIZE TABLE 时,输出中会显示这一点:
mysql> OPTIMIZE TABLE foo;
+----------+----------+----------+-------------------------------------------------------------------+
| Table | Op | Msg_type | Msg_text |
+----------+----------+----------+-------------------------------------------------------------------+
| test.foo | optimize | note | Table does not support optimize, doing recreate + analyze instead |
| test.foo | optimize | status | OK |
+----------+----------+----------+-------------------------------------------------------------------+
OPTIMIZE TABLE 使用在线 DDL 来对常规和分区的 InnoDB 表进行重建,从而减少并发 DML 操作的停机时间。由 OPTIMIZE TABLE 触发的表重建是就地完成的。在操作的准备阶段和提交阶段仅短暂地获取独占表锁。在准备阶段,元数据被更新并创建一个中间表。在提交阶段,表元数据更改被提交。
在以下条件下,OPTIMIZE TABLE 使用表复制方法重建表:
-
当启用
old_alter_table系统变量时。 -
当服务器使用
--skip-new选项启动时。
使用在线 DDL 的 OPTIMIZE TABLE 不支持包含 FULLTEXT 索引的 InnoDB 表。而是使用表复制方法。
InnoDB 使用页面分配方法存储数据,并且不像传统存储引擎(如MyISAM)那样受到碎片化的影响。在考虑是否运行优化时,请考虑服务器预计要处理的事务工作负载:
-
一定程度的碎片化是可以预期的。
InnoDB只将页面填充到 93%的容量,以便为更新留出空间,而无需分割页面。 -
删除操作可能会留下间隙,导致页面填充不足,这可能值得优化表格。
-
对行的更新通常会在同一页面内重写数据,取决于数据类型和行格式,在有足够空间的情况下。请参阅 Section 17.9.1.5, “How Compression Works for InnoDB Tables” 和 Section 17.10, “InnoDB Row Formats”。
-
高并发工作负载可能会随着时间的推移在索引中留下间隙,因为
InnoDB通过其 MVCC 机制保留了相同数据的多个版本。请参阅 Section 17.3, “InnoDB Multi-Versioning”。
MyISAM 详细信息
对于MyISAM表,OPTIMIZE TABLE 的工作方式如下:
-
如果表中有已删除或已分割的行,请修复表格。
-
如果索引页面未排序,请对其进行排序。
-
如果表格的统计数据不是最新的(且无法通过对索引进行排序来修复),请更新它们。
其他考虑事项
OPTIMIZE TABLE 用于在线执行常规和分区的InnoDB表。否则,在运行OPTIMIZE TABLE 时,MySQL 会锁定表格。
OPTIMIZE TABLE 不会对 R-tree 索引进行排序,例如POINT列上的空间索引。(Bug #23578)
15.7.3.5 修复表语句
REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
TABLE *tbl_name* [, *tbl_name*] ...
[QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE 修复可能损坏的表,仅适用于某些存储引擎。
此语句需要表的SELECT和INSERT权限。
虽然通常情况下您不应该经常运行REPAIR TABLE,但如果发生灾难,这个语句很可能从MyISAM表中恢复所有数据。如果您的表经常损坏,请尝试找出原因,以消除使用REPAIR TABLE的必要性。参见第 B.3.3.3 节,“如果 MySQL 经常崩溃怎么办”,以及第 18.2.4 节,“MyISAM 表问题”。
REPAIR TABLE 检查表以查看是否需要升级。如果需要,它执行升级,遵循与CHECK TABLE ... FOR UPGRADE相同的规则。有关更多信息,请参见第 15.7.3.2 节,���检查表语句”。
重要提示
-
在执行表修复操作之前备份表;在某些情况下,该操作可能导致数据丢失。可能的原因包括但不限于文件系统错误。请参见第九章,“备份和恢复”。
-
如果服务器在
REPAIR TABLE操作期间退出,在重新启动后,立即执行另一个REPAIR TABLE语句对该表进行修复是至关重要的,然后再对其执行其他操作。在最坏的情况下,您可能会得到一个没有关于数据文件信息的新干净索引文件,然后您执行的下一个操作可能会覆盖数据文件。这是一个不太可能但可能发生的情况,强调了首先进行备份的价值。 -
如果源上的表损坏并且您在其上运行
REPAIR TABLE,则对原始表的任何更改不会传播到副本。 -
修复表存储引擎和分区支持
-
修复表选项
-
修复表输出
-
表修复注意事项
修复表存储引擎和分区支持
REPAIR TABLE适用于MyISAM、ARCHIVE和CSV表。对于MyISAM表,默认情况下具有与myisamchk --recover tbl_name相同的效果。此语句不适用于视图。
REPAIR TABLE支持分区表。但是,在分区表上不能使用USE_FRM选项。
您可以使用ALTER TABLE ... REPAIR PARTITION来修复一个或多个分区;有关更多信息,请参见第 15.1.9 节,“ALTER TABLE 语句”和第 26.3.4 节,“分区维护”。
修复表选项
-
NO_WRITE_TO_BINLOG或LOCAL默认情况下,服务器将
REPAIR TABLE语句写入二进制日志,以便它们复制到副本。要禁止记录日志,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。 -
QUICK如果使用
QUICK选项,REPAIR TABLE尝试仅修复索引文件,而不是数据文件。这种类型的修复类似于myisamchk --recover --quick所做的操作。 -
EXTENDED如果使用
EXTENDED选项,MySQL 会逐行创建索引行,而不是一次性创建一个索引并进行排序。这种类型的修复类似于myisamchk --safe-recover所做的操作。 -
USE_FRM如果
.MYI索引文件丢失或其头部损坏,可以使用USE_FRM选项。此选项告诉 MySQL 不要信任.MYI文件头中的信息,并使用数据字典中的信息重新创建它。这种修复无法使用myisamchk进行。注意
仅在无法使用常规
REPAIR模式时才使用USE_FRM选项。告诉服务器忽略.MYI文件会使存储在.MYI中的重要表元数据对修复过程不可用,这可能会产生有害后果:-
当前的
AUTO_INCREMENT值丢失了。 -
表中已删除记录的链接丢失了,这意味着删除记录后的空闲空间仍然未被占用。
-
.MYI头部指示表是否被压缩。如果服务器忽略这些信息,它就无法知道表是否被压缩,修复可能会导致表内容的更改或丢失。这意味着不应该在压缩表上使用USE_FRM。无论如何,这是不必要的:压缩表是只读的,因此它们不应该变得损坏。
如果您对由当前运行的 MySQL 服务器的不同版本创建的表使用
USE_FRM,REPAIR TABLE不会尝试修复表。在这种情况下,REPAIR TABLE返回的结果集包含一个Msg_type值为error和Msg_text值为Failed repairing incompatible .FRM file的行。如果使用
USE_FRM,REPAIR TABLE不会检查表以查看是否需要升级。 -
修复表输出
REPAIR TABLE 返回一个包含以下表中列的结果集。
| 列 | 值 |
|---|---|
Table |
表名 |
Op |
始终为 repair |
Msg_type |
status、error、info、note 或 warning |
Msg_text |
一个信息性消息 |
REPAIR TABLE 语句可能为每个修复的表产生许多行信息。最后一行的 Msg_type 值为 status,Msg_test 通常应为 OK。对于 MyISAM 表,如果没有得到 OK,应尝试使用 myisamchk --safe-recover 进行修复。(REPAIR TABLE 没有实现所有 myisamchk 的选项。使用 myisamchk --safe-recover,您还可以使用 --max-record-length 等 REPAIR TABLE 不支持的选项。)
REPAIR TABLE 表捕获并抛出在从旧损坏文件复制表统计信息到新创建文件时发生的任何错误。例如,如果 .MYD 或 .MYI 文件的所有者的用户 ID 与 mysqld 进程的用户 ID 不同,REPAIR TABLE 会生成一个“无法更改文件所有权”的错误,除非 mysqld 是由 root 用户启动的。
表修复考虑事项
修复表 会升级表格,如果它包含旧的时间列,格式为 5.6.4 之前的格式(TIME,DATETIME 和 TIMESTAMP 列,不支持分数秒精度),并且 avoid_temporal_upgrade 系统变量被禁用。如果 avoid_temporal_upgrade 被启用,修复表 会忽略表中存在的旧时间列,并且不会升级它们。
要升级包含这些时间列的表格,请在执行 修复表 前禁用 avoid_temporal_upgrade。
通过设置特定的系统变量,您可以提高 修复表 的性能。请参阅 第 10.6.3 节,“优化修复表语句”。
15.7.4 组件、插件和可加载函数语句
原文:
dev.mysql.com/doc/refman/8.0/en/component-statements.html
15.7.4.1 创建可加载函数的 CREATE FUNCTION 语句
15.7.4.2 卸载可加载函数的 DROP FUNCTION 语句
15.7.4.3 安装组件语句
15.7.4.4 安装插件语句
15.7.4.5 卸载组件语句
15.7.4.6 卸载插件语句
原文:
dev.mysql.com/doc/refman/8.0/en/create-function-loadable.html
15.7.4.1 可加载函数的 CREATE FUNCTION 语句
CREATE [AGGREGATE] FUNCTION [IF NOT EXISTS] *function_name*
RETURNS {STRING|INTEGER|REAL|DECIMAL}
SONAME *shared_library_name*
这个语句加载了名为function_name的可加载函数。(CREATE FUNCTION也用于创建存储函数;请参阅 Section 15.1.17, “CREATE PROCEDURE and CREATE FUNCTION Statements”.)
可加载函数是通过新函数扩展 MySQL 的一种方式,其工作方式类似于本机(内置)MySQL 函数,如ABS()或CONCAT()。请参阅添加可加载函数。
function_name是应在 SQL 语句中使用的名称来调用函数。RETURNS子句指示函数返回值的类型。DECIMAL是RETURNS后的合法值,但当前DECIMAL函数返回字符串值,应该像STRING函数一样编写。
IF NOT EXISTS可以防止出现错误,如果已经存在具有相同名称的可加载函数。它不会防止出现错误,如果已经存在具有相同名称的内置函数。IF NOT EXISTS支持从 MySQL 8.0.29 开始的CREATE FUNCTION语句。另请参阅函数名称解析。
如果指定了AGGREGATE关键字,则表示该函数是一个聚合(组)函数。聚合函数的工作方式与本机 MySQL 聚合函数(如SUM()或COUNT())完全相同。
shared_library_name是包含实现函数代码的共享库文件的基本名称。该文件必须位于插件目录中。此目录由plugin_dir系统变量的值给出。有关更多信息,请参阅 Section 7.7.1, “Installing and Uninstalling Loadable Functions”.
CREATE FUNCTION需要对mysql系统模式具有INSERT权限,因为它向mysql.func系统表添加一行以注册函数。
CREATE FUNCTION还将函数添加到提供有关已安装可加载函数的运行时信息的性能模式user_defined_functions表中。请参阅 Section 29.12.21.10, “The user_defined_functions Table”。
注意
与mysql.func系统表类似,性能模式user_defined_functions表列出使用CREATE FUNCTION安装的可加载函数。与mysql.func表不同,user_defined_functions表还列出服务器组件或插件自动安装的可加载函数。这种差异使得user_defined_functions比mysql.func更适合检查已安装的可加载函数。
在正常启动序列期间,服务器加载在mysql.func表中注册的函数。如果使用--skip-grant-tables选项启动服务器,则表中注册的函数不会加载且不可用。
注意
要升级与可加载函数关联的共享库,请发出DROP FUNCTION语句,升级共享库,然后发出CREATE FUNCTION语句。如果您先升级共享库,然后使用DROP FUNCTION,服务器可能会意外关闭。
原文:
dev.mysql.com/doc/refman/8.0/en/drop-function-loadable.html
15.7.4.2 DROP FUNCTION Statement for Loadable Functions
DROP FUNCTION [IF EXISTS] *function_name*
此语句删除名为 function_name 的可加载函数。(DROP FUNCTION 也用于删除存储函数;请参阅 Section 15.1.29, “DROP PROCEDURE and DROP FUNCTION Statements”.)
DROP FUNCTION 是 CREATE FUNCTION 的补充。它需要 mysql 系统模式的 DELETE 权限,因为它会从注册函数的 mysql.func 系统表中删除行。
DROP FUNCTION 还会从性能模式 user_defined_functions 表中删除提供有关已安装可加载函数的运行时信息的函数。请参阅 Section 29.12.21.10, “The user_defined_functions Table”.
在正常启动序列期间,服务器会加载在 mysql.func 表中注册的函数。因为 DROP FUNCTION 删除了被删除函数的 mysql.func 行,所以服务器在后续重新启动时不会加载该函数。
DROP FUNCTION 不能用于删除由组件或插件自动安装而不是使用 CREATE FUNCTION 安装的可加载函数。这样的函数在卸载安装它的组件或插件时也会自动删除。
注意
要升级与可加载函数关联的共享库,请发出 DROP FUNCTION 语句,升级共享库,然后发出 CREATE FUNCTION 语句。如果先升级共享库,然后使用 DROP FUNCTION,服务器可能会意外关闭。
15.7.4.3 INSTALL COMPONENT 语句
INSTALL COMPONENT *component_name* [, *component_name* ...
[SET *variable* = *expr* [, *variable* = *expr*] ...]
*variable*: {
{GLOBAL | @@GLOBAL.} [*component_prefix*.]*system_var_name*
| {PERSIST | @@PERSIST.} [*component_prefix*.]*system_var_name*
}
此语句安装一个或多个组件,这些组件立即生效。组件提供服务器和其他组件可用的服务;请参阅第 7.5 节,“MySQL 组件”。INSTALL COMPONENT需要对mysql.component系统表具有INSERT权限,因为它向该表添加一行以注册组件。
示例:
INSTALL COMPONENT 'file://component1', 'file://component2';
组件使用以file://开头的 URN 命名,指示实现组件的库文件的基本名称,位于由plugin_dir系统变量命名的目录中。组件名称不包括任何平台相关的文件名后缀,如.so或.dll。(这些命名细节可能会发生变化,因为组件名称的解释本身是由一个服务执行的,并且组件基础设施使得可以用替代实现替换默认服务实现。)
INSTALL COMPONENT(从 8.0.33 版本开始)允许在安装一个或多个组件时设置组件系统变量的值。SET子句使您能够在需要时精确指定变量值,而不会受到其他形式赋值的不便或限制。具体来说,您还可以使用以下替代方法设置组件变量:
-
在服务器启动时使用命令行选项或选项文件,但这样做需要重新启动服务器。在安装组件之前,这些值不会生效。您可以在命令行上为组件指定一个无效的变量名而不会触发错误。
-
在服务器运行时通过
SET语句动态设置,这使您可以修改服务器的操作而无需停止和重新启动。不允许设置只读变量。
可选的SET子句仅将一个值或多个值应用于INSTALL COMPONENT语句中指定的组件,而不是应用于该组件的所有后续安装。SET GLOBAL|PERSIST适用于所有类型的变量,包括只读变量,而无需重新启动服务器。使用INSTALL COMPONENT设置的组件系统变量优先于来自命令行或选项文件的任何冲突值。
示例:
INSTALL COMPONENT 'file://component1', 'file://component2'
SET GLOBAL component1.var1 = 12 + 3, PERSIST component2.var2 = 'strings';
省略PERSIST或GLOBAL等同于指定GLOBAL。
在 SET 中为任何变量指定 PERSIST 会在 INSTALL COMPONENT 加载组件后立即执行 SET PERSIST_ONLY,但在更新 mysql.component 表之前。如果 SET PERSIST_ONLY 失败,则服务器会卸载所有先前加载的新组件,而不会将任何内容持久化到 mysql.component。
SET 子句仅接受正在安装的组件的有效变量名称,并对所有无效名称发出错误消息。子查询、存储函数和聚合函数不允许作为值表达式的一部分。如果安装单个组件,则不需要使用组件名称作为变量名称的前缀。
注意
使用 SET 子句指定变量值与命令行类似——在变量注册时立即可用——但 SET 子句在处理布尔变量的 无效数值 时有明显差异。例如,如果将布尔变量设置为 11(component1.boolvar = 11),您会看到以下行为:
-
SET子句返回 true -
命令行返回 false(11 既不是 ON 也不是 1)
如果发生任何错误,语句将失败且不会产生任何效果。例如,如果组件名称错误,命名组件不存在或已安装,或组件初始化失败,则会发生这种情况。
加载服务处理组件加载,包括将已安装的组件添加到作为注册表的 mysql.component 系统表。对于后续的服务器重启,mysql.component 中列出的任何组件都将在启动序列期间由加载服务加载。即使服务器使用 --skip-grant-tables 选项启动也会发生这种情况。
如果一个组件依赖于注册表中不存在的服务,并且您尝试安装该组件而没有安装提供所依赖服务的组件或组件,则会发生错误:
ERROR 3527 (HY000): Cannot satisfy dependency for service 'component_a'
required by component 'component_b'.
要避免此问题,要么在同一语句中安装所有组件,要么在安装任何依赖的组件之后安装依赖组件。
注意
对于密钥环组件,请勿使用 INSTALL COMPONENT。而是使用清单文件配置密钥环组件加载。参见 Section 8.4.4.2, “Keyring Component Installation”。
15.7.4.4 安装插件语句
INSTALL PLUGIN *plugin_name* SONAME '*shared_library_name*'
此语句安装服务器插件。它需要对mysql.plugin系统表的INSERT权限,因为它向该表添加一行以注册插件。
plugin_name 是插件的名称,定义在库文件中包含的插件描述符结构中(参见插件数据结构)。插件名称不区分大小写。为了最大兼容性,插件名称应该限制为 ASCII 字母、数字和下划线,因为它们在 C 源文件、shell 命令行、M4 和 Bourne shell 脚本以及 SQL 环境中使用。
shared_library_name 是包含插件代码的共享库的名称。该名称包括文件名扩展名(例如,libmyplugin.so,libmyplugin.dll,或 libmyplugin.dylib)。
共享库必须位于插件目录中(由plugin_dir系统变量命名的目录)。库必须位于插件目录本身,而不是子目录中。默认情况下,plugin_dir是由pkglibdir配置变量命名的目录下的plugin目录,但可以通过在服务器启动时设置plugin_dir的值来更改。例如,在my.cnf文件中设置其值:
[mysqld]
plugin_dir=*/path/to/plugin/directory*
如果plugin_dir的值是相对路径名,则被视为相对于 MySQL 基本目录(basedir系统变量的值)。
INSTALL PLUGIN 加载并初始化插件代码,使插件可供使用。插件通过执行其初始化函数进行初始化,该函数处理插件在可以使用之前必须执行的任何设置。当服务器关闭时,它会执行每个已加载插件的去初始化函数,以便插件有机会执行任何最终清理。
INSTALL PLUGIN还通过向mysql.plugin系统表添加指示插件名称和库文件名的行来注册插件。在正常启动序列期间,服务器加载和初始化在mysql.plugin中注册的插件。这意味着插件仅通过INSTALL PLUGIN安装一次,而不是每次服务器启动时都安装。如果使用--skip-grant-tables选项启动服务器,则在mysql.plugin表中注册的插件不会被加载,也无法使用。
插件库可以包含多个插件。为了安装每个插件,使用单独的INSTALL PLUGIN语句。每个语句命名不同的插件,但它们都指定相同的库名称。
INSTALL PLUGIN会导致服务器在启动时读取选项(my.cnf)文件,使得插件可以从这些文件中获取任何相关选项。甚至可以在加载插件之前将插件选项添加到选项文件中(如果使用loose前缀)。也可以卸载插件,编辑my.cnf,然后再次安装插件。通过这种方式重新启动插件,使其能够在无需重新启动服务器的情况下使用新的选项值。
对于控制单个插件在服务器启动时加载的选项,请参阅第 7.6.1 节,“安装和卸载插件”。如果需要在给定--skip-grant-tables选项(告诉服务器不要读取系统表)的情况下为单个服务器启动加载插件,请使用--plugin-load选项。请参阅第 7.1.7 节,“服务器命令选项”。
要移除插件,请使用UNINSTALL PLUGIN语句。
有关插件加载的其他信息,请参阅第 7.6.1 节,“安装和卸载插件”。
要查看已安装的插件,请使用SHOW PLUGINS语句或查询INFORMATION_SCHEMA的PLUGINS表。
如果重新编译插件库并需要重新安装它,可以使用以下任一方法:
-
使用
UNINSTALL PLUGIN命令卸载库中的所有插件,将新的插件库文件安装到插件目录中,然后使用INSTALL PLUGIN命令安装库中的所有插件。这个过程的优点是可以在不停止服务器的情况下使用。然而,如果插件库包含许多插件,您必须发出许多INSTALL PLUGIN和UNINSTALL PLUGIN命令。 -
停止服务器,将新的插件库文件安装到插件目录中,然后重新启动服务器。
15.7.4.5 UNINSTALL COMPONENT Statement
UNINSTALL COMPONENT *component_name* [, *component_name* ] ...
此语句停用并卸载一个或多个组件。组件提供服务器和其他组件可用的服务;请参阅 Section 7.5, “MySQL Components”。UNINSTALL COMPONENT是INSTALL COMPONENT的补充。它需要对mysql.component系统表具有DELETE权限,因为它会从注册组件的表中删除行。UNINSTALL COMPONENT不会撤消已持久化的变量,包括使用INSTALL COMPONENT ... SET PERSIST持久化的变量。
示例:
UNINSTALL COMPONENT 'file://component1', 'file://component2';
有关组件命名的信息,请参阅 Section 15.7.4.3, “INSTALL COMPONENT Statement”。
如果发生任何错误,该语句将失败且不起作用。例如,如果组件名称错误,未安装命名组件或无法卸载因为其他已安装的组件依赖于它。
一个加载程序服务处理组件卸载,包括从作为注册表的mysql.component系统表中删除已卸载的组件。因此,在后续服务器重新启动的启动序列中不会加载已卸载的组件。
注意
此语句对于使用清单文件加载的密钥环组件没有效果,并且无法卸载。请参阅 Section 8.4.4.2, “Keyring Component Installation”。
15.7.4.6 UNINSTALL PLUGIN Statement
UNINSTALL PLUGIN *plugin_name*
此语句移除已安装的服务器插件。UNINSTALL PLUGIN是INSTALL PLUGIN的补充。它需要对mysql.plugin系统表的DELETE权限,因为它会从该表中删除注册插件的行。
plugin_name必须是mysql.plugin表中列出的某个插件的名称。服务器执行插件的去初始化函数,并从mysql.plugin系统表中删除插件的行,以便后续服务器重新启动时不加载和初始化插件。UNINSTALL PLUGIN不会删除插件的共享库文件。
如果使用插件的任何表是打开状态,则无法卸载插件。
插件的移除对关联表的使用有影响。例如,如果一个全文解析器插件与表上的FULLTEXT索引相关联,卸载插件会使表无法使用。任何尝试访问该表的操作都会导致错误。甚至无法打开表,因此无法删除使用该插件的索引。这意味着慎重卸载插件,除非你不在乎表的内容。如果你打算卸载插件而不打算以后重新安装它,并且你关心表的内容,你应该使用mysqldump导出表,并从导出的CREATE TABLE语句中删除WITH PARSER子句,以便以后重新加载表。如果你不在乎表,即使表上关联的插件丢失,也可以使用DROP TABLE。
有关插件加载的更多信息,请参见 Section 7.6.1, “Installing and Uninstalling Plugins”。
15.7.5 CLONE 语句
CLONE *clone_action*
*clone_action*: {
LOCAL DATA DIRECTORY [=] '*clone_dir*';
| INSTANCE FROM '*user*'@'*host*':*port*
IDENTIFIED BY '*password*'
[DATA DIRECTORY [=] '*clone_dir*']
[REQUIRE [NO] SSL]
}
CLONE 语句用于在本地或从远程 MySQL 服务器实例克隆数据。要使用CLONE 语法,必须安装克隆插件。请参见 Section 7.6.7, “克隆插件”。
CLONE LOCAL DATA DIRECTORY 语法从本地 MySQL 数据目录克隆数据到 MySQL 服务器实例运行的同一服务器或节点上的目录。'clone_dir' 目录是数据克隆到的本地目录的完整路径。需要绝对路径。指定的目录不能存在,但指定的路径必须是现有路径。MySQL 服务器需要必要的写入权限以创建指定目录。有关更多信息,请参见 Section 7.6.7.2, “本地克隆数据”。
CLONE INSTANCE 语法从远程 MySQL 服务器实例(捐赠方)克隆数据并将其传输到启动克隆操作的 MySQL 实例(接收方)。
-
*user*是在捐赠 MySQL 服务器实例上的克隆用户。 -
*host*是捐赠 MySQL 服务器实例的hostname地址。不支持 Internet Protocol version 6 (IPv6) 地址格式。可以使用 IPv6 地址的别名。IPv4 地址可以直接使用。 -
*port*是捐赠 MySQL 服务器实例的port号。 (不支持由mysqlx_port指定的 X 协议端口。也不支持通过 MySQL Router 连接到捐赠 MySQL 服务器实例。) -
IDENTIFIED BY '*password*'指定捐赠 MySQL 服务器实例上克隆用户的密码。 -
DATA DIRECTORY [=] '*clone_dir*'是一个可选子句,用于指定在接收方用于克隆数据的目录。如果您不想删除接收方数据目录中的现有数据,请使用此选项。需要绝对路径,并且目录不能存在。MySQL 服务器必须具有必要的写入权限以创建目录。当不使用可选的
DATA DIRECTORY [=] '*clone_dir*'子句时,克隆操作会删除接收方数据目录中的现有数据,用克隆数据替换它,并在之后自动重新启动服务器。 -
[REQUIRE [NO] SSL]明确指定在通过网络传输克隆数据时是否使用加密连接。如果无法满足明确规定,将返回错误。如果未指定 SSL 子句,克隆尝试默认建立加密连接,如果安全连接尝试失败,则回退到不安全连接。无论是否指定此子句,克隆加密数据时都需要安全连接。有关更多信息,请参见为克隆配置加密连接。
关于从远程 MySQL 服务器实例克隆数据的更多信息,请参见 Section 7.6.7.3, “Cloning Remote Data”。
15.7.6 设置语句
15.7.6.1 变量赋值的 SET 语法
15.7.6.2 设置 CHARACTER SET 语句
15.7.6.3 设置 NAMES 语句
SET 语句有几种形式。那些与特定服务器功能不相关的形式的描述出现在本节的子部分中:
-
SET *var_name* = *value*允许您为影响服务器或客户端操作的变量分配值。参见 第 15.7.6.1 节,“变量赋值的 SET 语法”。 -
SET CHARACTER SET和SET NAMES为与服务器当前连接相关的字符集和校对变量分配值。参见 第 15.7.6.2 节,“设置字符集语句”,以及 第 15.7.6.3 节,“设置 NAMES 语句”。
其他形式的描述出现在其他地方,与帮助实现它们的其他语句分组在一起:
-
SET DEFAULT ROLE和SET ROLE设置用户账户的默认角色和当前角色。参见 第 15.7.1.9 节,“设置默认角色语句”,以及 第 15.7.1.11 节,“设置角色语句”。 -
SET PASSWORD用于分配账户密码。参见 第 15.7.1.10 节,“设置密码语句”。 -
SET RESOURCE GROUP为线程分配资源组。参见 第 15.7.2.4 节,“设置资源组语句”。 -
SET TRANSACTION ISOLATION LEVEL用于设置事务处理的隔离级别。参见 第 15.3.7 节,“设置事务语句”。
15.7.6.1 SET 变量赋值语法
SET *variable* = *expr* [, *variable* = *expr*] ...
*variable*: {
*user_var_name*
| *param_name*
| *local_var_name*
| {GLOBAL | @@GLOBAL.} *system_var_name*
| {PERSIST | @@PERSIST.} *system_var_name*
| {PERSIST_ONLY | @@PERSIST_ONLY.} *system_var_name*
| [SESSION | @@SESSION. | @@] *system_var_name*
}
SET语法用于分配值给不同类型的变量,影响服务器或客户端的操作:
-
用户定义的变量。参见第 11.4 节,“用户定义的变量”。
-
存储过程和函数参数,以及存储程序局部变量。参见第 15.6.4 节,“存储程序中的变量”。
-
系统变量。参见第 7.1.8 节,“服务器系统变量”。系统变量也可以在服务器启动时设置,如第 7.1.9 节,“使用系统变量”所述。
一个SET语句分配变量值不会写入二进制日志,因此在复制场景中仅影响执行该语句的主机。要影响所有复制主机,请在每个主机上执行该语句。
以下各节描述了用于设置变量的SET语法。它们使用=赋值运算符,但:=赋值运算符也可用于此目的。
-
用户定义的变量赋值
-
参数和局部变量赋值
-
系统变量赋值
-
SET 错误处理
-
多变量赋值
-
表达式中的系统变量引用
用户定义的变量赋值
用户定义的变量在会话内部局部创建,仅在该会话的上下文中存在;参见第 11.4 节,“用户定义的变量”。
用户定义的变量写作@*var_name*,并按以下方式分配表达式值:
SET @*var_name* = *expr*;
示例:
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
正如这些语句所示,expr可以从简单(字面值)到更复杂(标量子查询返回的值)。
Performance Schema user_variables_by_thread 表包含有关用户定义变量的信息。请参阅 Section 29.12.10, “Performance Schema User-Defined Variable Tables”。
参数和局部变量赋值
SET 适用于存储对象内部定义的参数和局部变量。以下过程使用了increment过程参数和counter局部变量:
CREATE PROCEDURE p(increment INT)
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + increment;
END WHILE;
END;
系统变量赋值
MySQL 服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值,影响当前会话的会话值,或两者都有。许多系统变量是动态的,可以使用SET语句在运行时更改,以影响当前服务器实例的操作。SET还可以用于将某些系统变量持久化到数据目录中的mysqld-auto.cnf文件中,以影响后续启动的服务器操作。
如果对敏感系统变量发出SET语句,则在将其记录到一般日志和审计日志之前,查询将被重写以用“<redacted>”替换值。即使在服务器实例上没有通过密钥环组件进行安全存储,这也会发生。
如果更改会话系统变量,则该值在您的会话中保持有效,直到您将变量更改为不同的值或会话结束。更改对其他会话没有影响。
如果更改全局系统变量,则该值将被记住,并用于初始化新会话的会话值,直到您将变量更改为不同的值或服务器退出。更改对访问全局值的任何客户端都是可见的。但是,更改仅影响在更改后连接的客户端的相应会话值。全局变量更改不会影响任何当前客户端会话的会话值(甚至不会影响进行全局值更改的会话)。
要使全局系统变量设置永久生效,以便在服务器重新启动时应用,您可以将其持久化到数据目录中的mysqld-auto.cnf文件中。也可以通过手动修改my.cnf选项文件来进行持久化配置更改,但这样做更加繁琐,手动输入设置中的错误可能要等到很久之后才能发现。持久化系统变量的SET语句更加方便,避免了设置语法错误的可能性,因为具有语法错误的设置不会成功,也不会更改服务器配置。有关持久化系统变量和mysqld-auto.cnf文件的更多信息,请参见第 7.1.9.3 节,“持久化系统变量”。
注意
设置或持久化全局系统变量值始终需要特殊权限。通常设置会话系统变量值不需要特殊权限,任何用户都可以执行,尽管也有例外情况。有关更多信息,请参见第 7.1.9.1 节,“系统变量权限”。
以下讨论描述了设置和持久化系统变量的语法选项:
-
要为全局系统变量分配一个值,请在变量名称之前加上
GLOBAL关键字或@@GLOBAL.修饰符:SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000; -
要为会话系统变量分配一个值,请在变量名称之前加上
SESSION或LOCAL关键字,或者使用@@SESSION.、@@LOCAL.或@@修饰符,或者根本不使用关键字或修饰符:SET SESSION sql_mode = 'TRADITIONAL'; SET LOCAL sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@LOCAL.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; SET sql_mode = 'TRADITIONAL';客户端可以更改自己的会话变量,但不能更改任何其他客户端的变量。
-
要将全局系统变量持久化到数据目录中的
mysqld-auto.cnf选项文件中,请在变量名称之前加上PERSIST关键字或@@PERSIST.修饰符:SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;此
SET语法允许您在运行时进行配置更改,这些更改也会在服务器重新启动时保留。与SET GLOBAL类似,SET PERSIST设置全局变量的运行时值,并将变量设置写入mysqld-auto.cnf文件(如果存在任何现有变量设置,则会替换)。 -
要将全局系统变量持久化到
mysqld-auto.cnf文件中,而不设置全局变量的运行时值,请在变量名称之前加上PERSIST_ONLY关键字或@@PERSIST_ONLY.修饰符:SET PERSIST_ONLY back_log = 100; SET @@PERSIST_ONLY.back_log = 100;与
PERSIST类似,PERSIST_ONLY将变量设置写入mysqld-auto.cnf。但是,与PERSIST不同,PERSIST_ONLY不会修改全局变量的运行时值。这使得PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。
要将全局系统变量值设置为编译时 MySQL 默认值或会话系统变量设置为当前对应的全局值,将变量设置为值 DEFAULT。例如,以下两个语句在将 max_join_size 的会话值设置为当前全局值时是相同的:
SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
使用 SET 来将全局系统变量持久化为 DEFAULT 值或其字面默认值,会将变量赋予其默认值并在 mysqld-auto.cnf 中添加变量的设置。要从文件中移除变量,使用 RESET PERSIST。
一些系统变量无法持久化或者受到持久化限制。参见第 7.1.9.4 节,“不可持久化和受限制持久化的系统变量”。
如果插件在执行 SET 语句时已安装,则插件实现的系统变量可以持久化。如果插件仍然安装,则持久化插件变量的赋值会在后续服务器重启时生效。如果插件不再安装,则当服务器读取 mysqld-auto.cnf 文件时,插件变量将不再存在。在这种情况下,服务器会向错误日志写入警告并继续:
currently unknown variable '*var_name*'
was read from the persisted config file
要显示系统变量名称和值:
-
使用
SHOW VARIABLES语句;参见第 15.7.7.41 节,“SHOW VARIABLES 语句”。 -
几个 Performance Schema 表提供系统变量信息。参见第 29.12.14 节,“Performance Schema System Variable Tables”。
-
Performance Schema
variables_info表包含了显示每个系统变量最近由哪个用户何时设置的信息。参见第 29.12.14.2 节,“Performance Schema variables_info Table”。 -
Performance Schema
persisted_variables表提供了一个 SQL 接口来访问mysqld-auto.cnf文件,使得可以在运行时使用SELECT语句检查其内容。参见第 29.12.14.1 节,“Performance Schema persisted_variables Table”。
设置错误处理
如果SET语句中的任何变量赋值失败,则整个语句失败,变量不会更改,mysqld-auto.cnf文件也不会更改。
SET在这里描述的情况下会产生错误。大多数示例显示使用关键字语法的SET语句(例如,GLOBAL或SESSION),但这些原则也适用于使用相应修饰符的语句(例如,@@GLOBAL.或@@SESSION.)。
-
使用
SET(任何变体)设置只读变量:mysql> SET GLOBAL version = 'abc'; ERROR 1238 (HY000): Variable 'version' is a read only variable -
使用
GLOBAL、PERSIST或PERSIST_ONLY设置仅具有会话值的变量:mysql> SET GLOBAL sql_log_bin = ON; ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL -
使用
SESSION设置仅具有全局值的变量:mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL -
省略
GLOBAL、PERSIST或PERSIST_ONLY以设置仅具有全局值的变量:mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL -
使用
PERSIST或PERSIST_ONLY设置无法持久化的变量:mysql> SET PERSIST port = 3307; ERROR 1238 (HY000): Variable 'port' is a read only variable mysql> SET PERSIST_ONLY port = 3307; ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable -
@@GLOBAL.、@@PERSIST.、@@PERSIST_ONLY.、@@SESSION.和@@修饰符仅适用于系统变量。尝试将它们应用于用户定义的变量、存储过程或函数参数或存储程序本地变量会导致错误。 -
并非所有系统变量都可以设置为
DEFAULT。在这种情况下,分配DEFAULT会导致错误。 -
尝试将
DEFAULT分配给用户定义的变量、存储过程或函数参数或存储程序本地变量会导致错误。
多变量赋值
一个SET语句可以包含多个变量赋值,用逗号分隔。此语句将值分配给用户定义的变量和系统变量:
SET @x = 1, SESSION sql_mode = '';
如果在单个语句中设置多个系统变量,则该语句中最近的GLOBAL、PERSIST、PERSIST_ONLY或SESSION关键字用于后续未指定关键字的赋值。
多变量赋值的示例:
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
@@GLOBAL.、@@PERSIST.、@@PERSIST_ONLY.、@@SESSION.和@@修饰符仅适用于紧接着的系统变量,而不适用于任何剩余的系统变量。此语句将sort_buffer_size全局值设置为 50000,会话值设置为 1000000:
SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
表达式中的系统变量引用
要在表达式中引用系统变量的值,请使用@@修饰符之一(除了在表达式中不允许使用@@PERSIST.和@@PERSIST_ONLY.)。例如,您可以在SELECT语句中像这样检索系统变量的值:
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
注意
在表达式中引用系统变量作为@@*var_name*(使用@@而不是@@GLOBAL.或@@SESSION.)如果存在会返回会话值,否则返回全局值。这与SET @@*var_name* = *expr*不同,后者始终引用会话值。
15.7.6.2 SET CHARACTER SET Statement
SET {CHARACTER SET | CHARSET}
{'*charset_name*' | DEFAULT}
此语句将服务器和当前客户端之间发送的所有字符串与给定映射进行映射。SET CHARACTER SET设置三个会话系统变量:character_set_client和character_set_results设置为给定的字符集,character_set_connection设置为character_set_database的值。请参阅第 12.4 节,“连接字符集和校对”。
charset_name可以带引号或不带引号。
默认字符集映射可以通过使用值DEFAULT来恢复。默认值取决于服务器配置。
一些字符集不能作为客户端字符集使用。尝试与SET CHARACTER SET一起使用会产生错误。请参阅不允许的客户端字符集。
15.7.6.3 SET NAMES 语句
SET NAMES {'*charset_name*'
[COLLATE '*collation_name*'] | DEFAULT}
这个语句将三个会话系统变量character_set_client,character_set_connection,和character_set_results设置为给定的字符集。将character_set_connection设置为charset_name也会将collation_connection设置为charset_name的默认排序规则。参见第 12.4 节,“连接字符集和排序规则”。
可选的COLLATE子句可用于显式指定排序规则。如果提供,排序规则必须是charset_name允许的排序规则之一。
charset_name和collation_name可以带引号或不带引号。
默认映射可以通过使用DEFAULT值来恢复。默认值取决于服务器配置。
一些字符集不能用作客户端字符集。尝试与SET NAMES一起使用它们会产生错误。参见不允许的客户端字符集。
15.7.7 显示语句
15.7.7.1 显示二进制日志语句
15.7.7.2 显示二进制日志事件语句
15.7.7.3 显示字符集语句
15.7.7.4 显示排序规则语句
15.7.7.5 显示列语句
15.7.7.6 显示创建数据库语句
15.7.7.7 显示创建事件语句
15.7.7.8 显示创建函数语句
15.7.7.9 显示创建存储过程语句
15.7.7.10 显示创建表语句
15.7.7.11 显示创建触发器语句
15.7.7.12 显示创建用户语句
15.7.7.13 显示创建视图语句
15.7.7.14 显示数据库语句
15.7.7.15 显示引擎语句
15.7.7.16 显示引擎语句
15.7.7.17 显示错误语句
15.7.7.18 显示事件语句
15.7.7.19 显示函数代码语句
15.7.7.20 显示函数状态语句
15.7.7.21 显示授权语句
15.7.7.22 显示索引语句
15.7.7.23 显示主状态语句
15.7.7.24 显示打开表语句
15.7.7.25 显示插件语句
15.7.7.26 显示权限语句
15.7.7.27 显示存储过程代码语句
15.7.7.28 显示存储过程状态语句
15.7.7.29 显示进程列表语句
15.7.7.30 显示概要语句
15.7.7.31 显示概要语句
15.7.7.32 显示中继日志事件语句
15.7.7.33 显示副本语句
15.7.7.34 显示从属主机 | 显示副本语句
15.7.7.35 显示副本状态语句
15.7.7.36 显示从属 | 副本状态语句
15.7.7.37 显示状态语句
[15.7.7.38 显示表状态语句] (show-table-status.html)
15.7.7.39 显示表语句
15.7.7.40 显示触发器语句
15.7.7.41 显示变量��句
15.7.7.42 显示警告语句
显示有许多形式,提供关于数据库、表、列或服务器状态信息的信息。本节描述了以下内容:
SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN '*log_name*'] [FROM *pos*] [LIMIT [*offset*,] *row_count*]
SHOW {CHARACTER SET | CHARSET} [*like_or_where*]
SHOW COLLATION [*like_or_where*]
SHOW [FULL] COLUMNS FROM *tbl_name* [FROM *db_name*] [*like_or_where*]
SHOW CREATE DATABASE *db_name*
SHOW CREATE EVENT *event_name*
SHOW CREATE FUNCTION *func_name*
SHOW CREATE PROCEDURE *proc_name*
SHOW CREATE TABLE *tbl_name*
SHOW CREATE TRIGGER *trigger_name*
SHOW CREATE VIEW *view_name*
SHOW DATABASES [*like_or_where*]
SHOW ENGINE *engine_name* {STATUS | MUTEX}
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [*offset*,] *row_count*]
SHOW EVENTS
SHOW FUNCTION CODE *func_name*
SHOW FUNCTION STATUS [*like_or_where*]
SHOW GRANTS FOR *user*
SHOW INDEX FROM *tbl_name* [FROM *db_name*]
SHOW MASTER STATUS
SHOW OPEN TABLES [FROM *db_name*] [*like_or_where*]
SHOW PLUGINS
SHOW PROCEDURE CODE *proc_name*
SHOW PROCEDURE STATUS [*like_or_where*]
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW PROFILE [*types*] [FOR QUERY *n*] [OFFSET *n*] [LIMIT *n*]
SHOW PROFILES
SHOW RELAYLOG EVENTS [IN '*log_name*'] [FROM *pos*] [LIMIT [*offset*,] *row_count*]
SHOW {REPLICAS | SLAVE HOSTS}
SHOW {REPLICA | SLAVE} STATUS [FOR CHANNEL *channel*]
SHOW [GLOBAL | SESSION] STATUS [*like_or_where*]
SHOW TABLE STATUS [FROM *db_name*] [*like_or_where*]
SHOW [FULL] TABLES [FROM *db_name*] [*like_or_where*]
SHOW TRIGGERS [FROM *db_name*] [*like_or_where*]
SHOW [GLOBAL | SESSION] VARIABLES [*like_or_where*]
SHOW WARNINGS [LIMIT [*offset*,] *row_count*]
*like_or_where*: {
LIKE '*pattern*'
| WHERE *expr*
}
如果给定的 SHOW 语句的语法包括一个 LIKE '*pattern*' 部分,'*pattern*' 是一个字符串,可以包含 SQL 中的 % 和 _ 通配符。该模式对于将语句输出限制为匹配值非常有用。
几个 SHOW 语句还接受一个 WHERE 子句,以提供更灵活的指定要显示哪些行的方式。请参阅 第 28.8 节,“SHOW Statements 的扩展”。
在 SHOW 语句的结果中,用户名称和主机名使用反引号(`)引用。
许多 MySQL API(如 PHP)使您可以将从 SHOW 语句返回的结果视为从 SELECT 返回的结果集一样处理;请参阅 第三十一章,Connectors and APIs,或者查看您的 API 文档以获取更多信息。此外,您可以在 SQL 中使用来自 INFORMATION_SCHEMA 数据库表查询的结果,而这是您无法轻松使用 SHOW 语句的结果所能做到的。请参阅 第二十八章,INFORMATION_SCHEMA Tables。
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。
15.7.7.33 SHOW REPLICAS Statement
{SHOW REPLICAS}
显示当前在源服务器上注册的副本列表。从 MySQL 8.0.22 开始,使用SHOW REPLICAS代替从该版本开始弃用的SHOW SLAVE HOSTS。在 MySQL 8.0.22 之前的版本中,请使用SHOW SLAVE HOSTS。SHOW REPLICAS需要REPLICATION SLAVE权限。
SHOW REPLICAS应在充当复制源的服务器上执行。该语句显示有关作为副本连接的服务器的信息,结果的每一行对应一个副本服务器,如下所示:
mysql> SHOW REPLICAS;
+------------+-----------+------+-----------+--------------------------------------+
| Server_id | Host | Port | Source_id | Replica_UUID |
+------------+-----------+------+-----------+--------------------------------------+
| 10 | iconnect2 | 3306 | 3 | 14cb6624-7f93-11e0-b2c0-c80aa9429562 |
| 21 | athena | 3306 | 3 | 07af4990-f41f-11df-a566-7ac56fdaf645 |
+------------+-----------+------+-----------+--------------------------------------+
-
Server_id: 副本服务器的唯一服务器 ID,在副本服务器的选项文件中配置,或者使用--server-id=*value*在命令行上配置。 -
Host: 副本服务器的主机名,使用--report-host选项在副本上指定。这可能与在操作系统中配置的机器名称不同。 -
User: 在副本服务器上指定的副本用户名称,使用--report-user选项。只有在源服务器启动时使用--show-replica-auth-info或--show-slave-auth-info选项时,语句输出才包括此列。 -
Password: 副本服务器密码,使用--report-password选项在副本上指定。只有在源服务器启动时使用--show-replica-auth-info或--show-slave-auth-info选项时,语句输出才包括此列。 -
Port: 副本服务器正在侦听的源端口,使用--report-port选项在副本上指定。此列中的零表示未设置副本端口(
--report-port)。 -
Source_id: 副本服务器正在复制的源服务器的唯一服务器 ID。这是在执行SHOW REPLICAS的服务器的服务器 ID,因此结果中的每一行都列出相同的值。 -
Replica_UUID: 此副本的全局唯一 ID,在副本上生成,并在副本的auto.cnf文件中找到。
15.7.7.34 展示从机主机 | 展示副本语句
{SHOW SLAVE HOSTS | SHOW REPLICAS}
显示当前在源端注册的副本列表。从 MySQL 8.0.22 开始,展示从机主机已被弃用,应改用别名 展示副本。该语句的工作方式与以前相同,只是语句及其输出所使用的术语已更改。在使用时,两个版本的语句都会更新相同的状态变量。请参阅 展示副本 的文档以获取语句的描述。
15.7.7.35 SHOW REPLICA STATUS Statement
SHOW {REPLICA | SLAVE} STATUS [FOR CHANNEL *channel*]
此语句提供有关复制线程的关键参数的状态信息。从 MySQL 8.0.22 开始,使用SHOW REPLICA STATUS代替SHOW SLAVE STATUS,该语句从该版本开始已弃用。在 MySQL 8.0.22 之前的版本中,请使用SHOW SLAVE STATUS。该语句需要REPLICATION CLIENT权限(或已弃用的SUPER权限)。
SHOW REPLICA STATUS是非阻塞的。与STOP REPLICA同时运行时,SHOW REPLICA STATUS会立即返回,而不会等待STOP REPLICA完成关闭复制 SQL(应用程序)线程或复制 I/O(接收器)线程(或两者)。这允许在监控和其他应用程序中使用SHOW REPLICA STATUS,其中从SHOW REPLICA STATUS获得即时响应比确保返回最新数据更重要。在 MySQL 8.0.22 中,SLAVE 关键字被 REPLICA 替换。
如果您使用mysql客户端发出此语句,可以使用\G语句终止符,而不是分号,以获得更易读的垂直布局:
mysql> SHOW REPLICA STATUS\G
*************************** 1\. row ***************************
Replica_IO_State: Waiting for source to send event
Source_Host: 127.0.0.1
Source_User: root
Source_Port: 13000
Connect_Retry: 1
Source_Log_File: master-bin.000001
Read_Source_Log_Pos: 927
Relay_Log_File: slave-relay-bin.000002
Relay_Log_Pos: 1145
Relay_Source_Log_File: master-bin.000001
Replica_IO_Running: Yes
Replica_SQL_Running: Yes
Replicate_Do_DB:
Replicate_Ignore_DB:
Replicate_Do_Table:
Replicate_Ignore_Table:
Replicate_Wild_Do_Table:
Replicate_Wild_Ignore_Table:
Last_Errno: 0
Last_Error:
Skip_Counter: 0
Exec_Source_Log_Pos: 927
Relay_Log_Space: 1355
Until_Condition: None
Until_Log_File:
Until_Log_Pos: 0
Source_SSL_Allowed: No
Source_SSL_CA_File:
Source_SSL_CA_Path:
Source_SSL_Cert:
Source_SSL_Cipher:
Source_SSL_Key:
Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: No
Last_IO_Errno: 0
Last_IO_Error:
Last_SQL_Errno: 0
Last_SQL_Error:
Replicate_Ignore_Server_Ids:
Source_Server_Id: 1
Source_UUID: 73f86016-978b-11ee-ade5-8d2a2a562feb
Source_Info_File: mysql.slave_master_info
SQL_Delay: 0
SQL_Remaining_Delay: NULL
Replica_SQL_Running_State: Replica has read all relay log; waiting for more updates
Source_Retry_Count: 10
Source_Bind:
Last_IO_Error_Timestamp:
Last_SQL_Error_Timestamp:
Source_SSL_Crl:
Source_SSL_Crlpath:
Retrieved_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
Executed_Gtid_Set: 73f86016-978b-11ee-ade5-8d2a2a562feb:1-3
Auto_Position: 1
Replicate_Rewrite_DB:
Channel_Name:
Source_TLS_Version:
Source_public_key_path:
Get_Source_public_key: 0
Network_Namespace:
性能模式提供了暴露复制信息的表。这类似于从SHOW REPLICA STATUS语句中获取的信息,但以表格形式表示。有关详细信息,请参阅第 29.12.11 节,“性能模式复制表”。
从 MySQL 8.0.27 开始,您可以在CHANGE REPLICATION SOURCE TO语句上设置GTID_ONLY选项,以阻止复制通道在复制元数据存储库中持久化文件名和文件位置。使用此设置,源二进制日志文件和中继日志文件的文件位置将在内存中跟踪。SHOW REPLICA STATUS语句在正常使用中仍会显示文件位置。然而,由于文件位置在连接元数据存储库和应用程序元数据存储库中除了在少数情况下不会定期更新,如果服务器重新启动,它们可能会过时。
对于在服务器启动后具有GTID_ONLY设置的复制通道,源二进制日志文件的读取和应用文件位置(Read_Source_Log_Pos和Exec_Source_Log_Pos)设置为零,并且文件名(Source_Log_File和Relay_Source_Log_File)设置为INVALID。中继日志文件名(Relay_Log_File)根据 relay_log_recovery 设置进行设置,可以是在服务器启动时创建的新文件,也可以是第一个中继日志文件。文件位置(Relay_Log_Pos)设置为位置 4,并且使用 GTID 自动跳过来跳过文件中已经应用的任何事务。
当接收器线程联系源并获取有效位置信息时,读取位置(Read_Source_Log_Pos)和文件名(Source_Log_File)将更新为正确的数据并变为有效。当应用程序线程应用来自源的事务,或跳过已执行的事务时,执行位置(Exec_Source_Log_Pos)和文件名(Relay_Source_Log_File)将更新为正确的数据并变为有效。中继日志文件位置(Relay_Log_Pos)也在那时更新。
以下列表描述了SHOW REPLICA STATUS返回的字段。有关解释其含义的更多信息,请参见第 19.1.7.1 节,“检查复制状态”。
-
Replica_IO_State复制
SHOW PROCESSLIST输出的State字段,用于复制 I/O(接收器)线程。这告诉您线程正在做什么:尝试连接到源,等待来自源的事件,重新连接到源等等。有关可能状态的列表,请参见第 10.14.5 节,“复制 I/O(接收器)线程状态” Thread States")。 -
Source_Host复制品连接到的源主机。
-
Source_User用于连接到源的帐户的用户名。
-
Source_Port用于连接到源的端口。
-
Connect_Retry连接重试之间的秒数(默认为 60)。可以使用
CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)进行设置。 -
Source_Log_File当 I/O(接收器)线程当前正在读取的源二进制日志文件的名称。对于在服务器启动后具有
GTID_ONLY设置的复制通道,此设置为INVALID。当复制品联系源时,它将被更新。 -
Read_Source_Log_PosI/O(接收器)线程已读取的当前源二进制日志文件中的位置。对于具有
GTID_ONLY设置的复制通道,在服务器启动后,此设置将设置为零。当副本联系源时,它将被更新。 -
Relay_Log_FileSQL(应用程序)线程当前正在读取和执行的中继日志文件的名称。
-
Relay_Log_PosSQL(应用程序)线程已读取和执行的当前中继日志文件中的位置。
-
Relay_Source_Log_File源二进制日志文件的名称,其中包含 SQL(应用程序)线程执行的最新事件。对于具有
GTID_ONLY设置的复制通道,在服务器启动后,此设置将设置为INVALID。当执行或跳过事务时,它将被更新。 -
Replica_IO_Running复制 I/O(接收器)线程是否已启动并已成功连接到源。在内部,此线程的状态由以下三个值之一表示:
-
**MYSQL_REPLICA_NOT_RUN. ** 复制 I/O(接收器)线程未运行。对于此状态,
Replica_IO_Running为No。 -
**MYSQL_REPLICA_RUN_NOT_CONNECT. ** 复制 I/O(接收器)线程正在运行,但未连接到复制源。对于此状态,
Replica_IO_Running为Connecting。 -
**MYSQL_REPLICA_RUN_CONNECT. ** 复制 I/O(接收器)线程正在运行,并且已连接到复制源。对于此状态,
Replica_IO_Running为Yes。
-
-
Replica_SQL_Running复制 SQL(应用程序)线程是否已启动。
-
Replicate_Do_DB,Replicate_Ignore_DB使用
--replicate-do-db和--replicate-ignore-db选项或CHANGE REPLICATION FILTER语句指定的任何数据库的名称。如果使用了FOR CHANNEL子句,则显示特定通道的复制过滤器。否则,显示每个复制通道的复制过滤器。 -
Replicate_Do_Table,Replicate_Ignore_Table,Replicate_Wild_Do_Table,Replicate_Wild_Ignore_Table任何使用
--replicate-do-table、--replicate-ignore-table、--replicate-wild-do-table和--replicate-wild-ignore-table选项或CHANGE REPLICATION FILTER语句指定的表的名称。如果使用了FOR CHANNEL子句,则显示特定通道的复制过滤器。否则,显示每个复制通道的复制过滤器。 -
Last_Errno,Last_Error这些列是
Last_SQL_Errno和Last_SQL_Error的别名。执行
RESET MASTER或RESET REPLICA会重置这些列中显示的值。注意
当复制 SQL 线程收到错误时,首先报告错误,然后停止 SQL 线程。这意味着在
SHOW REPLICA STATUS显示Last_SQL_Errno的值为非零时,Replica_SQL_Running仍显示Yes,存在一个很小的时间窗口。 -
Skip_Countersql_slave_skip_counter系统变量的当前值。参见 SET GLOBAL sql_slave_skip_counter Syntax。 -
Exec_Source_Log_Pos复制 SQL 线程已读取和执行的当前源二进制日志文件中的位置,标记下一个要处理的事务或事件的开始。对于具有
GTID_ONLY设置的复制通道,此值在服务器启动后设置为零。当执行或跳过事务时,它将被更新。当从现有副本开始新建副本时,可以使用此值与
CHANGE REPLICATION SOURCE TO语句的SOURCE_LOG_POS选项(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句的MASTER_LOG_POS选项(MySQL 8.0.23 之前)一起使用,以便新副本从此处读取。源二进制日志中的 (Relay_Source_Log_File,Exec_Source_Log_Pos) 给出的坐标对应于中继日志中的 (Relay_Log_File,Relay_Log_Pos) 给出的坐标。从已执行的中继日志中的事务序列中的不一致性可能导致此值成为“低水位标记”。换句话说,在该位置之前出现的事务已经提交,但在该位置之后的事务可能已经提交或未提交。如果需要纠正这些间隙,请使用
START REPLICA UNTIL SQL_AFTER_MTS_GAPS。有关更多信息,请参��Section 19.5.1.34, “Replication and Transaction Inconsistencies”。 -
Relay_Log_Space所有现有中继日志文件的总合大小。
-
Until_Condition、Until_Log_File、Until_Log_PosSTART REPLICA语句中UNTIL子句中指定的值。Until_Condition有以下值:-
如果未指定
UNTIL子句,则为None。 -
Source如果复制品正在读取直到源的二进制日志中的特定位置。 -
Relay如果复制品正在读取直到其中继日志中的特定位置。 -
SQL_BEFORE_GTIDS如果复制 SQL 线程正在处理事务,直到达到gtid_set中列出的第一个事务。 -
SQL_AFTER_GTIDS如果复制线程正在处理直到gtid_set中的最后一个事务被两个线程都处理完。 -
SQL_AFTER_MTS_GAPS如果多线程复制品的 SQL 线程正在运行,直到在中继日志中不再找到间隙为止。
Until_Log_File和Until_Log_Pos指示定义复制 SQL 线程停止执行的坐标的日志文件名和位置。有关
UNTIL子句的更多信息,请参见 Section 15.4.2.7, “START SLAVE Statement”。 -
-
Source_SSL_Allowed、Source_SSL_CA_File、Source_SSL_CA_Path、Source_SSL_Cert、Source_SSL_Cipher、Source_SSL_CRL_File、Source_SSL_CRL_Path、Source_SSL_Key、Source_SSL_Verify_Server_Cert这些字段显示了复制品用于连接到源的 SSL 参数(如果有)。
Source_SSL_Allowed有以下值:-
如果允许与源建立 SSL 连接,则为
Yes。 -
如果不允许与源建立 SSL 连接,则为
No。 -
如果允许 SSL 连接但复制品服务器未启用 SSL 支持,则为
Ignored。
其他与 SSL 相关字段的值对应于
CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)的SOURCE_SSL_*选项的值,或者CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的MASTER_SSL_*选项的值。请参见 Section 15.4.2.1, “CHANGE MASTER TO Statement”。 -
-
Seconds_Behind_Source该字段表示副本的“延迟”程度:
-
当副本正在处理更新时,此字段显示副本上当前时间戳与源上记录的当前正在处理的事件的原始时间戳之间的差异。
-
当副本当前没有处理任何事件时,此值为 0。
本质上,该字段衡量了复制 SQL(应用程序)线程和复制 I/O(接收器)线程之间的时间差(以秒为单位)。如果源和副本之间的网络连接速度很快,复制接收线程与源之间非常接近,因此该字段很好地近似了复制应用程序线程相对于源的延迟。如果网络速度慢,这不是一个很好的近似值;复制应用程序线程可能经常赶上读取速度慢的复制接收线程,因此
Seconds_Behind_Source经常显示为 0,即使复制接收线程相对于源来说是延迟的。换句话说,此列仅适用于快速网络。即使源和副本的时钟时间不相同,只要在副本接收线程启动时计算的差异保持不变,这种时间差计算也能正常工作。任何更改,包括 NTP 更新,都可能导致时钟偏差,从而使
Seconds_Behind_Source的计算不太可靠。在 MySQL 8.0 中,如果复制应用程序线程未运行,或者应用程序线程已消耗完中继日志且复制接收线程未运行,则此字段为
NULL(未定义或未知)。(在旧版本的 MySQL 中,如果复制应用程序线程或复制接收线程未运行或未连接到源,则此字段为NULL。)如果复制接收线程正在运行但中继日志已用尽,则Seconds_Behind_Source设置为 0。Seconds_Behind_Source的值基于事件中存储的时间戳,这些时间戳通过复制进行保留。这意味着如果源 M1 本身是 M0 的副本,那么来自 M1 二进制日志的任何事件,其来源于 M0 的二进制日志,都具有该事件的 M0 时间戳。这使得 MySQL 能够成功复制TIMESTAMP。然而,对于Seconds_Behind_Source的问题在于,如果 M1 还接收来自客户端的直接更新,那么Seconds_Behind_Source的值会随机波动,因为有时来自 M1 的最后一个事件源自 M0,有时是 M1 上的直接更新的结果。当使用多线程副本时,应注意此值基于
Exec_Source_Log_Pos,因此可能不反映最近提交事务的位置。 -
-
Last_IO_Errno,Last_IO_Error导致复制 I/O(接收器)线程停止的最近错误的错误编号和错误消息。错误编号为 0,消息为空字符串表示“无错误”。如果
Last_IO_Error值不为空,则错误值也会出现在副本的错误日志中。I/O 错误信息包括一个时间戳,显示最近一次 I/O(接收器)线程错误发生的时间。这个时间戳使用格式
YYMMDD hh:mm:ss,并显示在Last_IO_Error_Timestamp列中。发出
RESET MASTER或RESET REPLICA将重置这些列中显示的值。 -
Last_SQL_Errno,Last_SQL_Error导致复制 SQL(应用程序)线程停止的最近错误的错误编号和错误消息。错误编号为 0,消息为空字符串表示“无错误”。如果
Last_SQL_Error值不为空,则错误值也会出现在副本的错误日志中。如果副本是多线程的,则复制 SQL 线程是工作线程的协调员。在这种情况下,
Last_SQL_Error字段显示的内容与性能模式replication_applier_status_by_coordinator表中的Last_Error_Message列显示的内容完全相同。该字段值被修改以暗示其他工作线程可能存在更多故障,这可以在显示每个工作线程状态的replication_applier_status_by_worker表中看到。如果该表不可用,则可以使用副本错误日志。日志或replication_applier_status_by_worker表还应用于了解由SHOW REPLICA STATUS或协调员表显示的故障的更多信息。SQL 错误信息包括一个时间戳,显示最近一次 SQL(应用程序)线程错误发生的时间。这个时间戳使用格式
YYMMDD hh:mm:ss,并显示在Last_SQL_Error_Timestamp列中。发出
RESET MASTER或RESET REPLICA将重置这些列中显示的值。在 MySQL 8.0 中,
Last_SQL_Errno和Last_SQL_Error列中显示的所有错误代码和消息对应于服务器错误消息参考中列出的错误值。在以前的版本中,这并不总是正确的。(Bug #11760365,Bug #52768) -
Replicate_Ignore_Server_Ids任何已经使用
CHANGE REPLICATION SOURCE TO|CHANGE MASTER TO语句的IGNORE_SERVER_IDS选项指定的服务器 ID,以便复制品忽略来自这些服务器的事件。在循环或其他多源复制设置中,当其中一个服务器被移除时,会使用此选项。如果以这种方式设置了任何服务器 ID,则会显示一个逗号分隔的一个或多个数字的列表。如果没有设置任何服务器 ID,则该字段为空。注意
slave_master_info表中的Ignored_server_ids值还显示要忽略的服务器 ID,但作为一个以空格分隔的列表,前面是要忽略的服务器 ID 总数。例如,如果发出包含IGNORE_SERVER_IDS = (2,6,9)选项的CHANGE REPLICATION SOURCE TO|CHANGE MASTER TO语句,告诉复制品忽略具有服务器 ID 2、6 或 9 的源,那么该信息显示如下:Replicate_Ignore_Server_Ids: 2, 6, 9Ignored_server_ids: 3, 2, 6, 9Replicate_Ignore_Server_Ids过滤是由 I/O(接收器)线程执行的,而不是由 SQL(应用程序)线程执行的,这意味着被过滤掉的事件不会被写入中继日志。这与服务器选项--replicate-do-table采取的过滤操作不同,后者适用于应用程序线程。注意
从 MySQL 8.0 开始,如果在任何通道具有使用
IGNORE_SERVER_IDS设置的现有服务器 ID 时发出SET GTID_MODE=ON,则会发出弃用警告。在启动基于 GTID 的复制之前,使用SHOW REPLICA STATUS检查并清除涉及服务器上的所有被忽略的服务器 ID 列表。您可以通过发出包含空列表的IGNORE_SERVER_IDS选项的CHANGE REPLICATION SOURCE TO|CHANGE MASTER TO语句来清除列表。 -
Source_Server_Id来自源的
server_id值。 -
Source_UUID来自源的
server_uuid值。 -
Source_Info_Filemaster.info文件的位置,现在已经不推荐使用。从 MySQL 8.0 开始,默认情况下,表用于复制品的连接元数据存储库。 -
SQL_Delay复制品必须滞后源的秒数。
-
SQL_Remaining_Delay当
Replica_SQL_Running_State为Waiting until MASTER_DELAY seconds after source executed event时,此字段包含剩余的延迟秒数。在其他时间,此字段为NULL。 -
Replica_SQL_Running_StateSQL 线程的状态(类似于
Replica_IO_State)。该值与通过SHOW PROCESSLIST显示的 SQL 线程的State值相同。第 10.14.6 节,“复制 SQL 线程状态”提供了可能状态的列表。 -
Source_Retry_Count复制品在连接丢失的情况下可以尝试重新连接到源的次数。可以使用
CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)的SOURCE_RETRY_COUNT|MASTER_RETRY_COUNT选项或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的选项来设置此值,或者使用旧的--master-retry-count服务器选项(仍然支持向后兼容性)。 -
Source_Bind如果有的话,复制品绑定到的网络接口。这是使用
CHANGE REPLICATION SOURCE TO语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO语句(在 MySQL 8.0.23 之前)的SOURCE_BIND|MASTER_BIND选项设置的。 -
Last_IO_Error_Timestamp以
YYMMDD hh:mm:ss格式表示的时间戳,显示最近一次 I/O 错误发生的时间。 -
Last_SQL_Error_Timestamp以
YYMMDD hh:mm:ss格式表示的时间戳,显示最近一次 SQL 错误发生的时间。 -
Retrieved_Gtid_Set对应于此复制品接收的所有事务的全局事务 ID 集合。如果不使用 GTID,则为空。有关更多信息,请参见 GTID Sets。
这是存在或曾经存在于中继日志中的所有 GTID 的集合。每个 GTID 在接收到
Gtid_log_event时立即添加。这可能导致部分传输的事务的 GTID 被包含在集合中。当所有中继日志因执行
RESET REPLICA或CHANGE REPLICATION SOURCE TO|CHANGE MASTER TO,或由--relay-log-recovery选项的影响而丢失时,集合将被清除。当relay_log_purge = 1时,始终保留最新的中继日志,并且集合不会被清除。 -
Executed_Gtid_Set写入二进制日志的全局事务 ID 集。这与此服务器上全局
gtid_executed系统变量的值相同,以及此服务器上SHOW MASTER STATUS输出中的Executed_Gtid_Set的值。如果未使用 GTID,则为空。查看 GTID 集获取更多信息。 -
Auto_Position如果通道使用 GTID 自动定位,则为 1,否则为 0。
-
Replicate_Rewrite_DBReplicate_Rewrite_DB值显示指定的任何复制过滤规则。例如,如果设置了以下复制过滤规则:CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=((db1,db2), (db3,db4));Replicate_Rewrite_DB值显示:Replicate_Rewrite_DB: (db1,db2),(db3,db4)有关更多信息,请参阅第 15.4.2.2 节,“CHANGE REPLICATION FILTER Statement”。
-
Channel_name正在显示的复制通道。始终存在一个默认的复制通道,可以添加更多复制通道。查看第 19.2.2 节,“复制通道”获取更多信息。
-
Master_TLS_Version源使用的 TLS 版本。有关 TLS 版本信息,请参阅第 8.3.2 节,“加密连接 TLS 协议和密码”。
-
Source_public_key_path文件路径名,其中包含源所需的用于 RSA 密钥对密码交换的副本端的公钥文件。文件必须采用 PEM 格式。此列适用于使用
sha256_password或caching_sha2_password认证插件进行身份验证的副本。如果给定
Source_public_key_path并指定有效的公钥文件,则优先于Get_source_public_key。 -
Get_source_public_key是否从源请求基于 RSA 密钥对的密码交换所需的公钥。此列适用于使用
caching_sha2_password认证插件进行身份验证的副本。对于该插件,除非请求,否则源不会发送公钥。如果给定
Source_public_key_path并指定有效的公钥文件,则优先于Get_source_public_key。 -
Network_Namespace网络命名空间名称;如果连接使用默认(全局)命名空间,则为空。有关网络命名空间的信息,请参阅第 7.1.14 节,“网络命名空间支持”。此列在 MySQL 8.0.22 中添加。
15.7.7.36 展示从属 | 复制状态语句
SHOW {SLAVE | REPLICA} STATUS [FOR CHANNEL *channel*]
该语句提供了关于从属线程的关键参数状态信息。从 MySQL 8.0.22 开始,SHOW SLAVE STATUS 已被弃用,应改用别名 SHOW REPLICA STATUS。该语句的工作方式与以前相同,只是语句及其输出所使用的术语已更改。使用两个版本的语句时,它们会更新相同的状态变量。请参阅 SHOW REPLICA STATUS 的文档以获取语句的描述。
15.7.7.37 显示状态语句
SHOW [GLOBAL | SESSION] STATUS
[LIKE '*pattern*' | WHERE *expr*]
显示状态提供服务器状态信息(参见第 7.1.10 节,“服务器状态变量”)。此语句不需要任何特权,只需要连接到服务器的能力。
状态变量信息也可以从以下来源获得:
-
性能模式表。参见第 29.12.15 节,“性能模式状态变量表”。
-
mysqladmin extended-status命令。参见第 6.5.2 节,“mysqladmin — 一个 MySQL 服务器管理程序”。
对于显示状态,如果存在LIKE子句,则指示要匹配的变量名称。可以给出WHERE子句以使用更一般的条件选择行,如第 28.8 节,“SHOW 语句的扩展”中所讨论的。
显示状态接受可选的GLOBAL或SESSION变量范围修饰符:
-
使用
GLOBAL修饰符,该语句显示全局状态值。全局状态变量可以表示服务器本身某个方面的状态(例如,Aborted_connects),或者 MySQL 所有连接的聚合状态(例如,Bytes_received和Bytes_sent)。如果变量没有全局值,则显示会话值。 -
使用
SESSION修饰符,该语句显示当前连接的状态变量值。如果变量没有会话值,则显示全局值。LOCAL是SESSION的同义词。 -
如果没有修饰符,则默认为
SESSION。
每个状态变量的范围在第 7.1.10 节,“服务器状态变量”中列出。
每次调用显示状态语句都会使用内部临时表并增加全局Created_tmp_tables值。
此处显示了部分输出。名称和值的列表可能与您的服务器不同。每个变量的含义在第 7.1.10 节,“服务器状态变量”中给出。
mysql> SHOW STATUS;
+--------------------------+------------+
| Variable_name | Value |
+--------------------------+------------+
| Aborted_clients | 0 |
| Aborted_connects | 0 |
| Bytes_received | 155372598 |
| Bytes_sent | 1176560426 |
| Connections | 30023 |
| Created_tmp_disk_tables | 0 |
| Created_tmp_tables | 8340 |
| Created_tmp_files | 60 |
...
| Open_tables | 1 |
| Open_files | 2 |
| Open_streams | 0 |
| Opened_tables | 44600 |
| Questions | 2026873 |
...
| Table_locks_immediate | 1920382 |
| Table_locks_waited | 0 |
| Threads_cached | 0 |
| Threads_created | 30022 |
| Threads_connected | 1 |
| Threads_running | 1 |
| Uptime | 80380 |
+--------------------------+------------+
使用LIKE子句,该语句仅显示那些名称与模式匹配的变量的行:
mysql> SHOW STATUS LIKE 'Key%';
+--------------------+----------+
| Variable_name | Value |
+--------------------+----------+
| Key_blocks_used | 14955 |
| Key_read_requests | 96854827 |
| Key_reads | 162040 |
| Key_write_requests | 7589728 |
| Key_writes | 3813196 |
+--------------------+----------+
15.7.7.38 SHOW TABLE STATUS 语句
SHOW TABLE STATUS
[{FROM | IN} *db_name*]
[LIKE '*pattern*' | WHERE *expr*]
SHOW TABLE STATUS 类似于 SHOW TABLES,但提供有关每个非TEMPORARY表的大量信息。您还可以使用 mysqlshow --status db_name 命令获取此列表。如果存在 LIKE 子句,则指示要匹配的表名。WHERE 子句可以用于使用更一般的条件选择行,如 第 28.8 节 “SHOW 语句的扩展” 中所讨论的。
此语句还显示有关视图的信息。
SHOW TABLE STATUS 输出包括以下列:
-
Name表的名称。
-
Engine表的存储引擎。请参阅 第十七章 InnoDB 存储引擎 和 第十八章 替代存储引擎。
对于分区表,
Engine显示所有分区使用的存储引擎的名称。 -
Version此列未使用。随着 MySQL 8.0 中
.frm文件的移除,此列现在报告一个硬编码值10,这是 MySQL 5.7 中使用的最后一个.frm文件版本。 -
Row_format行存储格式(
Fixed、Dynamic、Compressed、Redundant、Compact)。对于MyISAM表,Dynamic对应于 myisamchk -dvv 报告的Packed。 -
Rows行数。一些存储引擎,如
MyISAM,存储确切的计数。对于其他存储引擎,如InnoDB,此值是一个近似值,可能与实际值相差 40% 到 50%。在这种情况下,使用SELECT COUNT(*)来获取准确的计数。对于
INFORMATION_SCHEMA表,Rows值为NULL。对于
InnoDB表,行数仅是 SQL 优化中使用的粗略估计。(如果InnoDB表被分区,这也是正确的。) -
Avg_row_length平均行长度。
-
Data_length对于
MyISAM,Data_length是数据文件的长度,以字节为单位。对于
InnoDB,Data_length是为聚簇索引分配的空间的近似量,以字节为单位。具体来说,它是聚簇索引大小(以页为单位)乘以InnoDB页大小。有关其他存储引擎的信息,请参考本节末尾的注释。
-
Max_data_length对于
MyISAM,Max_data_length是数据文件的最大长度。这是可以存储在表中的数据字节数总数,考虑到使用的数据指针大小。对于
InnoDB不适用。有关其他存储引擎的信息,请参考本节末尾的注释。
-
Index_length对于
MyISAM,Index_length是索引文件的长度,以字节为单位。对于
InnoDB,Index_length是非聚簇索引分配的大致空间量,以字节为单位。具体来说,它是非聚簇索引大小(以页为单位)的总和,乘以InnoDB页大小。有关其他存储引擎的信息,请参考本节末尾的注释。
-
Data_free已分配但未使用字节数。
InnoDB表报告表所属表空间的可用空间。对于位于共享表空间中的表,这是共享表空间的可用空间。如果您使用多个表空间并且表有自己的表空间,则可用空间仅针对该表。可用空间指完全空闲的区段字节数减去安全边界。即使可用空间显示为 0,也可能可以插入行,只要不需要分配新的区段。对于 NDB Cluster,
Data_free显示为磁盘上为磁盘数据表或片段分配但未使用的空间。(内存数据资源使用由Data_length列报告。)对于分区表,此值仅为估计值,可能不完全正确。在这种情况下获取此信息的更准确方法是查询
INFORMATION_SCHEMAPARTITIONS表,如本例所示:SELECT SUM(DATA_FREE) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'mytable';有关更多信息,请参见第 28.3.21 节,“INFORMATION_SCHEMA PARTITIONS 表”。
-
Auto_increment下一个
AUTO_INCREMENT值。 -
Create_time表创建时间。
-
Update_time数据文件上次更新时间。对于某些存储引擎,此值为
NULL。例如,InnoDB在其系统表空间中存储多个表,数据文件时间戳不适用。即使每个InnoDB表在单独的.ibd文件中使用 file-per-table 模式,change buffering 也可以延迟对数据文件的写入,因此文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM,使用数据文件时间戳;但是在 Windows 上,时间戳不会被更新,因此该值不准确。Update_time显示了对未分区的InnoDB表执行的最后一次UPDATE、INSERT或DELETE的时间戳值。对于 MVCC,时间戳值反映了COMMIT时间,被视为最后更新时间。当服务器重新启动或表从InnoDB数据字典缓存中删除时,时间戳不会被持久化。 -
Check_time上次检查表的时间。并非所有存储引擎都更新此时间,此时值始终为
NULL。对于分区
InnoDB表,Check_time始终为NULL。 -
校对规则表的默认校对规则。输出不明确列出表的默认字符集,但校对规则名称以字符集名称开头。
-
校验和实时校验和值(如果有)。
-
Create_options与
CREATE TABLE一起使用的额外选项。对于分区表,
Create_options显示partitioned。在 MySQL 8.0.16 之前,对于在文件表空间中创建的表,
Create_options显示指定的ENCRYPTION子句。从 MySQL 8.0.16 开始,如果表已加密或指定的加密与模式加密不同,则显示文件表空间的加密子句。对于在一般表空间中创建的表,不显示加密子句。要识别加密的文件表空间和一般表空间,请查询INNODB_TABLESPACES的ENCRYPTION列。在禁用严格模式创建表时,如果指定的行格式不受支持,则使用存储引擎的默认行格式。表的实际行格式在
Row_format列中报告。Create_options显示了在CREATE TABLE语句中指定的行格式。当更改表的存储引擎时,不适用于新存储引擎的表选项将保留在表定义中,以便在必要时将表及其先前定义的选项还原为原始存储引擎。
Create_options可能显示保留的选项。 -
注释创建表时使用的注释(或 MySQL 无法访问表信息的原因)。
备注
-
对于
InnoDB表,SHOW TABLE STATUS除了表所保留的物理大小外,不提供准确的统计信息。行数仅是 SQL 优化中使用的粗略估计。 -
对于
NDB表,此语句的输出显示了Avg_row_length和Data_length列的适当值,但不考虑BLOB列。 -
对于
NDB表,Data_length仅包括存储在主内存中的数据;Max_data_length和Data_free列适用于磁盘数据。 -
对于 NDB 集群磁盘数据表,
Max_data_length显示为磁盘数据表或片段的磁盘部分分配的空间。(内存数据资源使用情况由Data_length列报告。) -
对于
MEMORY表,Data_length、Max_data_length和Index_length的值近似表示实际分配的内存量。分配算法会大量保留内存以减少分配操作的次数。 -
对于视图,
SHOW TABLE STATUS显示的大多数列都为 0 或NULL,除了Name表示视图名称,Create_time表示创建时间,Comment显示为VIEW。
表信息也可以从INFORMATION_SCHEMA TABLES表中获取。请参见第 28.3.38 节,“INFORMATION_SCHEMA TABLES 表”。
15.7.7.39 SHOW TABLES Statement
SHOW [EXTENDED] [FULL] TABLES
[{FROM | IN} *db_name*]
[LIKE '*pattern*' | WHERE *expr*]
SHOW TABLES列出给定数据库中的非TEMPORARY表。您也可以使用mysqlshow db_name命令获取此列表。如果存在LIKE子句,则表示要匹配的表名。WHERE子句可以用于使用更一般的条件选择行,如第 28.8 节,“SHOW 语句的扩展”中所讨论的。
LIKE子句执行的匹配取决于lower_case_table_names系统变量的设置。
可选的EXTENDED修饰符会导致SHOW TABLES列出由失败的ALTER TABLE语句创建的隐藏表。这些临时表的名称以#sql开头,可以使用DROP TABLE进行删除。
这个语句还列出了数据库中的任何视图。可选的FULL修饰符会导致SHOW TABLES显示第二个输出列,其中表的值为BASE TABLE,视图的值为VIEW,INFORMATION_SCHEMA表的值为SYSTEM VIEW。
如果您对基表或视图没有权限,则它不会出现在SHOW TABLES或mysqlshow db_name的输出中。
表信息也可以从INFORMATION_SCHEMA的TABLES表中获取。请参阅第 28.3.38 节,“INFORMATION_SCHEMA TABLES 表”。
15.7.7.40 SHOW TRIGGERS Statement
SHOW TRIGGERS
[{FROM | IN} *db_name*]
[LIKE '*pattern*' | WHERE *expr*]
SHOW TRIGGERS列出了当前为数据库中的表定义的触发器(默认数据库,除非给出FROM子句)。此语句仅对具有TRIGGER权限的数据库和表返回结果。如果存在LIKE子句,则指示匹配哪些表名(而不是触发器名称)并导致语句显示这些表的触发器。可以使用WHERE子句来选择使用更一般条件选择行,如第 28.8 节,“SHOW 语句的扩展”中讨论的那样。
对于在第 27.3 节,“使用触发器”中定义的ins_sum触发器,SHOW TRIGGERS的输出如下所示:
mysql> SHOW TRIGGERS LIKE 'acc%'\G
*************************** 1\. row ***************************
Trigger: ins_sum
Event: INSERT
Table: account
Statement: SET @sum = @sum + NEW.amount
Timing: BEFORE
Created: 2018-08-08 10:10:12.61
sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,
NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,
NO_ENGINE_SUBSTITUTION
Definer: me@localhost
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
Database Collation: utf8mb4_0900_ai_ci
SHOW TRIGGERS输出具有以下列:
-
触发器触发器的名称。
-
事件触发事件。这是触发器激活的相关表上的操作类型。值为
INSERT(插入了一行),DELETE(删除了一行)或UPDATE(修改了一行)。 -
表定义触发器的表。
-
语句触发器主体;即触发器激活时执行的语句。
-
时机触发器在触发事件之前还是之后激活。值为
BEFORE或AFTER。 -
创建���间触发器创建的日期和时间。这是一个
TIMESTAMP(2)值(带有百分之一秒的小数部分)。 -
sql_mode触发器创建时生效的 SQL 模式,以及触发器执行的模式。有关允许的值,请参见第 7.1.11 节,“服务器 SQL 模式”。
-
定义者创建触发器的用户的帐户,格式为
'*user_name*'@'*host_name*'。 -
character_set_client触发器创建时的
character_set_client系统变量的会话值。 -
collation_connection触发器创建时的
collation_connection系统变量的会话值。 -
数据库排序规则触发器关联的数据库的排序规则。
触发器信息也可以从INFORMATION_SCHEMA TRIGGERS表中获取。请参阅第 28.3.45 节,“INFORMATION_SCHEMA TRIGGERS 表”。
15.7.7.41 显示变量语句
SHOW [GLOBAL | SESSION] VARIABLES
[LIKE '*pattern*' | WHERE *expr*]
SHOW VARIABLES显示 MySQL 系统变量的值(参见第 7.1.8 节,“服务器系统变量”)。此语句不需要任何特权。只需要连接到服务器的能力。
系统变量信息也可以从以下来源获取:
-
性能模式表。参见第 29.12.14 节,“性能模式系统变量表”。
-
mysqladmin variables命令。参见第 6.5.2 节,“mysqladmin — MySQL 服务器管理程序”。
对于SHOW VARIABLES,如果存在LIKE子句,则指示匹配哪些变量名。可以使用WHERE子句选择使用更一般条件的行,如第 28.8 节,“SHOW 语句的扩展”中讨论的。
SHOW VARIABLES接受可选的GLOBAL或SESSION变量范围修饰符:
-
使用
GLOBAL修饰符,该语句显示全局系统变量值。这些值用于初始化 MySQL 新连接的相应会话变量。如果变量没有全局值,则不显示任何值。 -
使用
SESSION修饰符,该语句显示当前连接中生效的系统变量值。如果变量没有会话值,则显示全局值。LOCAL是SESSION的同义词。 -
如果没有修饰符,则默认为
SESSION。
每个系统变量的范围在第 7.1.8 节,“服务器系统变量”中列出。
SHOW VARIABLES受版本相关的显示宽度限制。对于值非常长且未完全显示的变量,可以使用SELECT作为解决方法。例如:
SELECT @@GLOBAL.innodb_data_file_path;
大多数系统变量可以在服务器启动时设置(只读变量如version_comment是例外)。许多可以通过SET语句在运行时更改。参见第 7.1.9 节,“使用系统变量”,以及第 15.7.6.1 节,“变量赋值的 SET 语法”。
这里显示了部分输出。名称和值的列表可能因您的服务器而异。第 7.1.8 节,“服务器系统变量”描述了每个变量的含义,第 7.1.1 节,“配置服务器”提供了有关调整它们的信息。
mysql> SHOW VARIABLES;
+--------------------------------------------+------------------------------+
| Variable_name | Value |
+--------------------------------------------+------------------------------+
| activate_all_roles_on_login | OFF |
| auto_generate_certs | ON |
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| autocommit | ON |
| automatic_sp_privileges | ON |
| avoid_temporal_upgrade | OFF |
| back_log | 151 |
| basedir | /usr/ |
| big_tables | OFF |
| bind_address | * |
| binlog_cache_size | 32768 |
| binlog_checksum | CRC32 |
| binlog_direct_non_transactional_updates | OFF |
| binlog_error_action | ABORT_SERVER |
| binlog_expire_logs_seconds | 2592000 |
| binlog_format | ROW |
| binlog_group_commit_sync_delay | 0 |
| binlog_group_commit_sync_no_delay_count | 0 |
| binlog_gtid_simple_recovery | ON |
| binlog_max_flush_queue_time | 0 |
| binlog_order_commits | ON |
| binlog_row_image | FULL |
| binlog_row_metadata | MINIMAL |
| binlog_row_value_options | |
| binlog_rows_query_log_events | OFF |
| binlog_stmt_cache_size | 32768 |
| binlog_transaction_dependency_history_size | 25000 |
| binlog_transaction_dependency_tracking | COMMIT_ORDER |
| block_encryption_mode | aes-128-ecb |
| bulk_insert_buffer_size | 8388608 |
...
| max_allowed_packet | 67108864 |
| max_binlog_cache_size | 18446744073709547520 |
| max_binlog_size | 1073741824 |
| max_binlog_stmt_cache_size | 18446744073709547520 |
| max_connect_errors | 100 |
| max_connections | 151 |
| max_delayed_threads | 20 |
| max_digest_length | 1024 |
| max_error_count | 1024 |
| max_execution_time | 0 |
| max_heap_table_size | 16777216 |
| max_insert_delayed_threads | 20 |
| max_join_size | 18446744073709551615 |
...
| thread_handling | one-thread-per-connection |
| thread_stack | 286720 |
| time_zone | SYSTEM |
| timestamp | 1530906638.765316 |
| tls_version | TLSv1.2,TLSv1.3 |
| tmp_table_size | 16777216 |
| tmpdir | /tmp |
| transaction_alloc_block_size | 8192 |
| transaction_allow_batching | OFF |
| transaction_isolation | REPEATABLE-READ |
| transaction_prealloc_size | 4096 |
| transaction_read_only | OFF |
| transaction_write_set_extraction | XXHASH64 |
| unique_checks | ON |
| updatable_views_with_limit | YES |
| version | 8.0.36 |
| version_comment | MySQL Community Server - GPL |
| version_compile_machine | x86_64 |
| version_compile_os | Linux |
| version_compile_zlib | 1.2.11 |
| wait_timeout | 28800 |
| warning_count | 0 |
| windowing_use_high_precision | ON |
+--------------------------------------------+------------------------------+
使用LIKE子句,该语句仅显示那些名称与模式匹配的变量的行。要获取特定变量的行,请使用如下所示的LIKE子句:
SHOW VARIABLES LIKE 'max_join_size';
SHOW SESSION VARIABLES LIKE 'max_join_size';
要获取名称与模式匹配的变量列表,请在LIKE子句中使用%通配符:
SHOW VARIABLES LIKE '%size%';
SHOW GLOBAL VARIABLES LIKE '%size%';
通配符可以在要匹配的模式中的任何位置使用。严格来说,因为_是一个匹配任意单个字符的通配符,你应该将其转义为\_以确实匹配它。在实践中,这很少是必要的。
15.7.7.42 SHOW WARNINGS Statement
SHOW WARNINGS [LIMIT [*offset*,] *row_count*]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS 是一个诊断性语句,显示关于当前会话中执行语句产生的条件(错误、警告和注释)的信息。警告会为诸如 INSERT、UPDATE 和 LOAD DATA 等 DML 语句以及 CREATE TABLE 和 ALTER TABLE 等 DDL 语句生成。
LIMIT 子句与 SELECT 语句具有相同的语法。参见 Section 15.2.13, “SELECT Statement”。
SHOW WARNINGS 也用于在 EXPLAIN 之后,显示由 EXPLAIN 生成的扩展信息。参见 Section 10.8.3, “Extended EXPLAIN Output Format”。
SHOW WARNINGS 显示关于当前会话中最近一次非诊断性语句执行结果的条件信息。如果最近的语句在解析过程中出现错误,SHOW WARNINGS 将显示结果的条件,无论语句类型(诊断性或非诊断性)如何。
SHOW COUNT(*) WARNINGS 诊断性语句显示错误、警告和注释的总数。您还可以从 warning_count 系统变量中检索此数字:
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
这些语句的区别在于第一个是一个不清除消息列表的诊断性语句。第二个,因为是一个 SELECT 语句,被视为非诊断性语句并清除消息列表。
相关的诊断语句SHOW ERRORS仅显示错误条件(排除警告和注释),而SHOW COUNT(*) ERRORS语句显示错误的总数。请参阅 Section 15.7.7.17, “SHOW ERRORS Statement”。GET DIAGNOSTICS可用于检查各个条件的信息。请参阅 Section 15.6.7.3, “GET DIAGNOSTICS Statement”。
这里有一个简单的示例,显示了INSERT的数据转换警告。该示例假定严格的 SQL 模式已禁用。启用严格模式后,警告将变为错误,并终止INSERT。
mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4));
Query OK, 0 rows affected (0.05 sec)
mysql> INSERT INTO t1 VALUES(10,'mysql'), (NULL,'test'), (300,'xyz');
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 3
mysql> SHOW WARNINGS\G
*************************** 1\. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2\. row ***************************
Level: Warning
Code: 1048
Message: Column 'a' cannot be null
*************************** 3\. row ***************************
Level: Warning
Code: 1264
Message: Out of range value for column 'a' at row 3 3 rows in set (0.00 sec)
max_error_count系统变量控制服务器存储信息的最大错误、警告和注释消息数量,因此也控制SHOW WARNINGS显示的消息数量。要更改服务器可以存储的消息数量,请更改max_error_count的值。
max_error_count仅控制存储的消息数量,而不是计数的数量。即使生成的消息数量超过max_error_count,warning_count的值也不受max_error_count的限制。以下示例演示了这一点。ALTER TABLE语句生成三条警告消息(示例中已禁用严格的 SQL 模式,以防止在单个转换问题后发生错误)。只有一条消息被存储和显示,因为max_error_count已设置为 1,但所有三条都被计数(如warning_count的值所示):
mysql> SHOW VARIABLES LIKE 'max_error_count';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_error_count | 1024 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> SET max_error_count=1, sql_mode = '';
Query OK, 0 rows affected (0.00 sec)
mysql> ALTER TABLE t1 MODIFY b CHAR;
Query OK, 3 rows affected, 3 warnings (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 3
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message |
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT @@warning_count;
+-----------------+
| @@warning_count |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.01 sec)
要禁用消息存储,请将max_error_count设置为 0。在这种情况下,warning_count仍然指示发生了多少警告,但消息不会被存储,也无法显示。
sql_notes系统变量控制注释消息是否会增加warning_count以及服务器是否会存储它们。默认情况下,sql_notes为 1,但如果设置为 0,则注释不会增加warning_count,服务器也不会存储它们:
mysql> SET sql_notes = 1;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS;
+-------+------+------------------------------------+
| Level | Code | Message |
+-------+------+------------------------------------+
| Note | 1051 | Unknown table 'test.no_such_table' |
+-------+------+------------------------------------+
1 row in set (0.00 sec)
mysql> SET sql_notes = 0;
mysql> DROP TABLE IF EXISTS test.no_such_table;
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW WARNINGS;
Empty set (0.00 sec)
MySQL 服务器向每个客户端发送一个计数,指示由该客户端执行的最近语句导致的错误、警告和注释的总数。从 C API,可以通过调用mysql_warning_count()来获取此值。参见 mysql_warning_count()。
在mysql客户端中,可以使用warnings和nowarning命令或它们的快捷方式\W和\w(参见第 6.5.1.2 节,“mysql 客户端命令”
Warning (Code 1365): Division by 0
mysql> \w
Show warnings disabled.


浙公网安备 33010602011771号