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
。 -
InnoDB
SPATIAL
索引的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 节,“不可见索引”。
-
Expression
MySQL 8.0.13 及更高版本支持功能键部分(参见功能键部分表中获取。请参见第 28.3.34 节,“INFORMATION_SCHEMA STATISTICS Table”。有关隐藏索引的扩展信息仅可使用
SHOW EXTENDED INDEX
获得;无法从STATISTICS
表中获取。
您可以使用mysqlshow -k db_name
tbl_name
命令列出表的索引。
在 MySQL 8.0.30 及更高版本中,默认情况下,SHOW INDEX
包括表的生成的不可见键。您可以通过设置show_gipk_in_create_table_and_information_schema = OFF
来抑制该信息在语句输出中的显示。更多信息,请参见 Section 15.1.20.11, “Generated Invisible Primary Keys”。
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_SCHEMA
PROCESSLIST
表中的ID
列中显示的相同值,在性能模式threads
表中的PROCESSLIST_ID
列中显示的值,并在线程内部由CONNECTION_ID()
函数返回。 -
用户
发出语句的 MySQL 用户。
系统用户
的值指的是服务器生成的非客户端线程,用于内部处理任务,例如延迟行处理程序线程或在副本主机上使用的 I/O(接收器)或 SQL(应用程序)线程。对于系统用户
,在Host
列中没有指定主机。未经身份验证的用户
指的是已与客户端连接关联但尚未对客户端用户进行身份验证的线程。event_scheduler
指的是监视计划事件的线程(参见第 27.4 节,“使用事件调度程序”)。注意
系统用户
的用户
值与SYSTEM_USER
权限是不同的。前者指定内部线程。后者区分系统用户和常规用户账户类别(参见第 8.2.11 节,“账户类别”)。 -
主机
发出语句的客户端的主机名(除了
系统用户
外,没有主机)。TCP/IP 连接的主机名以*
host_name*:*
client_port*
格式报告,以便更容易确定哪个客户端正在执行什么操作。 -
数据库
线程的默认数据库,如果没有选择任何数据库���则为
NULL
。 -
命令
线程代表客户端执行的命令类型,或者如果会话空闲,则为
Sleep
。有关线程命令的描述,请参见第 10.14 节,“检查服务器线程(进程)信息”。此列的值对应于客户端/服务器协议的COM_*
xxx*
命令和Com_*
xxx*
状态变量。请参见第 7.1.10 节,“服务器状态变量”。 -
时间
线程处于当前状态的秒数。对于副本 SQL 线程,该值是最后一个复制事件的时间戳与副本主机的实时时间之间的秒数。请参见第 19.2.3 节,“复制线程”。
-
状态
表示线程正在执行的操作、事件或状态。有关
State
值的描述,请参见第 10.14 节,“检查服务器线程(进程)信息”。大多数状态对应非常快速的操作。如果一个线程停留在某个状态很多秒钟,可能存在需要调查的问题。
-
信息
线程正在执行的语句,如果没有执行语句则为
NULL
。该语句可能是发送给服务器的语句,或者如果该语句执行其他语句,则为最内层语句。例如,如果一个CALL
语句执行一个正在执行SELECT
语句的存储过程,那么信息
值显示SELECT
语句。
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_Pos
I/O(接收器)线程已读取的当前源二进制日志文件中的位置。对于具有
GTID_ONLY
设置的复制通道,在服务器启动后,此设置将设置为零。当副本联系源时,它将被更新。 -
Relay_Log_File
SQL(应用程序)线程当前正在读取和执行的中继日志文件的名称。
-
Relay_Log_Pos
SQL(应用程序)线程已读取和执行的当前中继日志文件中的位置。
-
Relay_Source_Log_File
源二进制日志文件的名称,其中包含 SQL(应用程序)线程执行的最新事件。对于具有
GTID_ONLY
设置的复制通道,在服务器启动后,此设置将设置为INVALID
。当执行或跳过事务时,它将被更新。 -
Replica_IO_Running
复制 I/O(接收器)线程是否已启动并已成功连接到源。在内部,此线程的状态由以下三个值之一表示:
-
**MYSQL_REPLICA_NOT_RUN. ** 复制 I/O(接收器)线程未运行。对于此状态,
Replica_IO_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_Counter
sql_slave_skip_counter
系统变量的当前值。参见 SET GLOBAL sql_slave_skip_counter Syntax。 -
Exec_Source_Log_Pos
复制 SQL 线程已读取和执行的当前源二进制日志文件中的位置,标记下一个要处理的事务或事件的开始。对于具有
GTID_ONLY
设置的复制通道,此值在服务器启动后设置为零。当执行或跳过事务时,它将被更新。当从现有副本开始新建副本时,可以使用此值与
CHANGE REPLICATION SOURCE TO
语句的SOURCE_LOG_POS
选项(从 MySQL 8.0.23 开始)或CHANGE MASTER TO
语句的MASTER_LOG_POS
选项(MySQL 8.0.23 之前)一起使用,以便新副本从此处读取。源二进制日志中的 (Relay_Source_Log_File
,Exec_Source_Log_Pos
) 给出的坐标对应于中继日志中的 (Relay_Log_File
,Relay_Log_Pos
) 给出的坐标。从已执行的中继日志中的事务序列中的不一致性可能导致此值成为“低水位标记”。换句话说,在该位置之前出现的事务已经提交,但在该位置之后的事务可能已经提交或未提交。如果需要纠正这些间隙,请使用
START REPLICA UNTIL SQL_AFTER_MTS_GAPS
。有关更多信息,请参��Section 19.5.1.34, “Replication and Transaction Inconsistencies”。 -
Relay_Log_Space
所有现有中继日志文件的总合大小。
-
Until_Condition
、Until_Log_File
、Until_Log_Pos
START REPLICA
语句中UNTIL
子句中指定的值。Until_Condition
有以下值:-
如果未指定
UNTIL
子句,则为None
。 -
Source
如果复制品正在读取直到源的二进制日志中的特定位置。 -
Relay
如果复制品正在读取直到其中继日志中的特定位置。 -
SQL_BEFORE_GTIDS
如果复制 SQL 线程正在处理事务,直到达到gtid_set
中列出的第一个事务。 -
SQL_AFTER_GTIDS
如果复制线程正在处理直到gtid_set
中的最后一个事务被两个线程都处理完。 -
SQL_AFTER_MTS_GAPS
如果多线程复制品的 SQL 线程正在运行,直到在中继日志中不再找到间隙为止。
Until_Log_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, 9
Ignored_server_ids: 3, 2, 6, 9
Replicate_Ignore_Server_Ids
过滤是由 I/O(接收器)线程执行的,而不是由 SQL(应用程序)线程执行的,这意味着被过滤掉的事件不会被写入中继日志。这与服务器选项--replicate-do-table
采取的过滤操作不同,后者适用于应用程序线程。注意
从 MySQL 8.0 开始,如果在任何通道具有使用
IGNORE_SERVER_IDS
设置的现有服务器 ID 时发出SET GTID_MODE=ON
,则会发出弃用警告。在启动基于 GTID 的复制之前,使用SHOW REPLICA STATUS
检查并清除涉及服务器上的所有被忽略的服务器 ID 列表。您可以通过发出包含空列表的IGNORE_SERVER_IDS
选项的CHANGE REPLICATION SOURCE TO
|CHANGE MASTER TO
语句来清除列表。 -
Source_Server_Id
来自源的
server_id
值。 -
Source_UUID
来自源的
server_uuid
值。 -
Source_Info_File
master.info
文件的位置,现在已经不推荐使用。从 MySQL 8.0 开始,默认情况下,表用于复制品的连接元数据存储库。 -
SQL_Delay
复制品必须滞后源的秒数。
-
SQL_Remaining_Delay
当
Replica_SQL_Running_State
为Waiting until MASTER_DELAY seconds after source executed event
时,此字段包含剩余的延迟秒数。在其他时间,此字段为NULL
。 -
Replica_SQL_Running_State
SQL 线程的状态(类似于
Replica_IO_State
)。该值与通过SHOW PROCESSLIST
显示的 SQL 线程的State
值相同。第 10.14.6 节,“复制 SQL 线程状态”提供了可能状态的列表。 -
Source_Retry_Count
复制品在连接丢失的情况下可以尝试重新连接到源的次数。可以使用
CHANGE REPLICATION SOURCE TO
语句(从 MySQL 8.0.23 开始)的SOURCE_RETRY_COUNT
|MASTER_RETRY_COUNT
选项或CHANGE MASTER TO
语句(在 MySQL 8.0.23 之前)的选项来设置此值,或者使用旧的--master-retry-count
服务器选项(仍然支持向后兼容性)。 -
Source_Bind
如果有的话,复制品绑定到的网络接口。这是使用
CHANGE REPLICATION SOURCE TO
语句(从 MySQL 8.0.23 开始)或CHANGE MASTER TO
语句(在 MySQL 8.0.23 之前)的SOURCE_BIND
|MASTER_BIND
选项设置的。 -
Last_IO_Error_Timestamp
以
YYMMDD hh:mm:ss
格式表示的时间戳,显示最近一次 I/O 错误发生的时间。 -
Last_SQL_Error_Timestamp
以
YYMMDD hh:mm:ss
格式表示的时间戳,显示最近一次 SQL 错误发生的时间。 -
Retrieved_Gtid_Set
对应于此复制品接收的所有事务的全局事务 ID 集合。如果不使用 GTID,则为空。有关更多信息,请参见 GTID Sets。
这是存在或曾经存在于中继日志中的所有 GTID 的集合。每个 GTID 在接收到
Gtid_log_event
时立即添加。这可能导致部分传输的事务的 GTID 被包含在集合中。当所有中继日志因执行
RESET 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_DB
Replicate_Rewrite_DB
值显示指定的任何复制过滤规则。例如,如果设置了以下复制过滤规则:CHANGE REPLICATION FILTER REPLICATE_REWRITE_DB=((db1,db2), (db3,db4));
Replicate_Rewrite_DB
值显示:Replicate_Rewrite_DB: (db1,db2),(db3,db4)
有关更多信息,请参阅第 15.4.2.2 节,“CHANGE REPLICATION FILTER Statement”。
-
Channel_name
正在显示的复制通道。始终存在一个默认的复制通道,可以添加更多复制通道。查看第 19.2.2 节,“复制通道”获取更多信息。
-
Master_TLS_Version
源使用的 TLS 版本。有关 TLS 版本信息,请参阅第 8.3.2 节,“加密连接 TLS 协议和密码”。
-
Source_public_key_path
文件路径名,其中包含源所需的用于 RSA 密钥对密码交换的副本端的公钥文件。文件必须采用 PEM 格式。此列适用于使用
sha256_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_SCHEMA
PARTITIONS
表,如本例所示:SELECT SUM(DATA_FREE) FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = 'mytable';
有关更多信息,请参见第 28.3.21 节,“INFORMATION_SCHEMA PARTITIONS 表”。
-
Auto_increment
下一个
AUTO_INCREMENT
值。 -
Create_time
表创建时间。
-
Update_time
数据文件上次更新时间。对于某些存储引擎,此值为
NULL
。例如,InnoDB
在其系统表空间中存储多个表,数据文件时间戳不适用。即使每个InnoDB
表在单独的.ibd
文件中使用 file-per-table 模式,change buffering 也可以延迟对数据文件的写入,因此文件修改时间与最后一次插入、更新或删除的时间不同。对于MyISAM
,使用数据文件时间戳;但是在 Windows 上,时间戳不会被更新,因此该值不准确。Update_time
显示了对未分区的InnoDB
表执行的最后一次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.
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 2 本地部署DeepSeek模型构建本地知识库+联网搜索详细步骤