MySQL8-中文参考-二十九-

MySQL8 中文参考(二十九)

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

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

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 节,“特权更改生效时间”中指示的方式生效。

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

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_typepriv_levelobject_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 EXISTSIGNORE 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 EXISTSIGNORE 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 EXISTSIGNORE 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 EXISTSIGNORE 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”。

原文:dev.mysql.com/doc/refman/8.0/en/set-default-role.html

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 ROLEALTER 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 ROLESET ROLE DEFAULT是不同的语句:

  • SET DEFAULT ROLE定义了在账户会话中默认激活哪些账户角色。

  • SET ROLE DEFAULT将当前会话中的活动角色设置为当前账户的默认角色。

有关角色使用示例,请参见第 8.2.10 节,“使用角色”。

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

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 节“可插拔认证”。

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

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 ROLESET 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。

    • 范围以 MN 的形式给出,其中 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 的范围内。使用不同的范围为系统和用户组确保用户线程永远不会比系统线程具有更高的优先级。

ENABLEDISABLE 指定资源组最初是启用还是禁用。如果没有指定任何一个,那么该组默认是启用的。禁用的组不能分配线程。

示例:

  • 创建一个启用的用户组,具有单个 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 语句不会写入二进制日志,也不会被复制。

原文:dev.mysql.com/doc/refman/8.0/en/drop-resource-group.html

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 语句不会写入二进制日志,也不会被复制。

原文:dev.mysql.com/doc/refman/8.0/en/set-resource-group.html

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_ADMINRESOURCE_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 修复表语句

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

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从数据字典中删除指定表列的直方图统计信息。此语法仅允许一个表名。

此语句需要表的SELECTINSERT权限。

ANALYZE TABLE适用于InnoDBNDBMyISAM表。它不适用于视图。

如果启用了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 的维护”。

在分析过程中,对于InnoDBMyISAM,表将被读锁定。

默认情况下,服务器将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 analyzehistogram
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 TABLEInnoDB表上运行速度快,但不是 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;

第一条语句更新了c1c2c3列的直方图,替换了这些列的任何现有直方图。第二条语句更新了c1c3列的直方图,而c2列的直方图保持不变。第三条语句移除了c2列的直方图,而c1c3列的直方图保持不变。

在对用户数据进行抽样以构建直方图时,并非所有值都会被读取;这可能导致遗漏一些被认为重要的值。在这种情况下,修改直方图或根据自己的标准明确设置自己的直方图可能是有用的,例如完整数据集。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_readsampled_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。统计信息在下次访问表时再次收集。

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

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 值为 statusMsg_text 通常应为 OKTable is already up to date 表示表的存储引擎指示无需检查表。

检查版本兼容性

FOR UPGRADE选项检查指定表是否与当前版本的 MySQL 兼容。使用FOR UPGRADE,服务器会检查每个表,以确定自创建表以来是否有任何数据类型或索引的不兼容更改。如果没有,则检查成功。否则,如果存在可能的不兼容性,服务器会对表进行全面检查(可能需要一些时间)。

不兼容性可能是因为数据类型的存储格式已更改或其排序顺序已更改。我们的目标是避免这些更改,但偶尔它们是必要的,以纠正比发布之间的不兼容性更糟糕的问题。

FOR UPGRADE会发现这些不兼容性:

  • InnoDBMyISAM表中,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列。

  • 触发器创建时间保持不变。

  • 如果表中包含旧的时间列(不支持分数秒精度的TIMEDATETIMETIMESTAMP列)且avoid_temporal_upgrade系统变量已禁用,则会报告需要重建表。这有助于 MySQL 升级过程检测和升级包含旧时间列的表。如果启用了avoid_temporal_upgradeFOR UPGRADE会忽略表中存在的旧时间列;因此,升级过程不会对其进行升级。

    要检查包含这种时间列并需要重建的表格,请在执行CHECK TABLE ... FOR UPGRADE之前禁用avoid_temporal_upgrade

  • 对于使用非本机分区的表格会发出警告,因为 MySQL 8.0 中移除了非本机分区。请参阅第二十六章,分区

检查数据一致性

下表显示了可以提供的其他检查选项。这些选项将传递给存储引擎,存储引擎可能会使用或忽略它们。

类型 意义
QUICK 不扫描行以检查不正确的链接。适用于InnoDBMyISAM表格和视图。
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 应该能找到数据文件中的任何错误。如果发生这种情况,表格将被标记为“损坏”,直到修复为止。)

FASTCHANGED主要用于从脚本(例如从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_IDDB_ROLL_PTR字段,CHECK TABLE可能会导致InnoDB访问无效的撤消日志记录,导致与 MVCC 相关的服务器退出。

  • 如果CHECK TABLEInnoDB表或索引中遇到错误,它会报告错误,并通常标记索引,有时标记表为损坏,阻止进一步使用索引或表。此类错误包括辅助索引中不正确的条目数或不正确的链接。

  • 如果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 的性能。InnoDBCHECK TABLE 操作期间两次读取聚簇索引。第二次读取可以并行执行。innodb_parallel_read_threads 会话变量必须设置为大于 1 的值,才能进行并行聚簇索引读取。默认值为 4。用于执行并行聚簇索引读取的实际线程数由 innodb_parallel_read_threads 设置或要扫描的索引子树数量决定,以较小者为准。

MyISAM 表的 CHECK TABLE 用法注意事项

以下注意事项适用于MyISAM表:

  • CHECK TABLE更新MyISAM表的关键统计信息。

  • 如果CHECK TABLE输出不返回OKTable is already up to date,通常应该对表进行修复。请参阅第 9.6 节,“MyISAM 表维护和崩溃恢复”。

  • 如果未指定CHECK TABLE选项QUICKMEDIUMEXTENDED,动态格式MyISAM表的默认检查类型为MEDIUM。这与在表上运行myisamchk --medium-check tbl_name的结果相同。对于静态格式MyISAM表,默认的检查类型也是MEDIUM,除非指定了CHANGEDFAST。在这种情况下,默认值为QUICK。对于CHANGEDFAST,行扫描被跳过,因为行很少损坏。

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

15.7.3.3 CHECKSUM TABLE 语句

CHECKSUM TABLE *tbl_name* [, *tbl_name*] ... [QUICK | EXTENDED]

CHECKSUM TABLE报告表内容的校验值。您可以使用此语句在备份、回滚或其他旨在将数据恢复到已知状态的操作之前后验证内容是否相同。

这个语句需要表的SELECT权限。

这个语句不支持对视图的操作。如果你对视图运行CHECKSUM TABLEChecksum值始终为NULL,并返回一个警告。

对于不存在的表,CHECKSUM TABLE返回NULL并生成一个警告。

在校验操作期间,对于InnoDBMyISAM,表会被读锁定。

性能考虑

默认情况下,整个表会逐行读取并计算校验值。对于大表,这可能需要很长时间,因此您只会偶尔执行此操作。这种逐行计算是使用EXTENDED子句、InnoDB和除了MyISAM之外的所有其他存储引擎,以及未使用CHECKSUM=1子句创建的MyISAM表所得到的。

对于使用CHECKSUM=1子句创建的MyISAM表,CHECKSUM TABLECHECKSUM TABLE ... QUICK返回可以非常快速返回的“实时”表校验值。如果表不符合所有这些条件,QUICK方法返回NULLQUICK方法不支持InnoDB表。有关CHECKSUM子句的语法,请参见第 15.1.20 节,“CREATE TABLE Statement”。

校验值取决于表行格式。如果行格式发生变化,校验值也会发生变化。例如,MySQL 5.6 之前的 MySQL 5.6.5 对于诸如TIMEDATETIMETIMESTAMP等时间类型的存储格式发生了变化,因此如果将一个 5.5 表升级到 MySQL 5.6,校验值可能会发生变化。

重要提示

如果两个表的校验值不同,那么这两个表在某种程度上肯定是不同的。然而,由于CHECKSUM TABLE使用的哈希函数不能保证无碰撞,所以两个不完全相同的表可能产生相同的校验值的几率很小。

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

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语句,直到搜索索引完全更新。

  • 在删除MyISAMARCHIVE表的大部分内容,或对具有可变长度行的MyISAMARCHIVE表进行许多更改(具有VARCHARVARBINARYBLOBTEXT列的表)。已删除的行将保留在链表中,并且后续的INSERT操作将重用旧的行位置。您可以使用OPTIMIZE TABLE来回收未使用的空间并对数据文件进行碎片整理。在对表进行大量更改后,此语句有时也可以显著改善使用该表的语句的性能。

此语句需要表的SELECTINSERT权限。

OPTIMIZE TABLE适用于InnoDBMyISAMARCHIVE表。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 的工作方式如下:

  1. 如果表中有已删除或已分割的行,请修复表格。

  2. 如果索引页面未排序,请对其进行排序。

  3. 如果表格的统计数据不是最新的(且无法通过对索引进行排序来修复),请更新它们。

其他考虑事项

OPTIMIZE TABLE 用于在线执行常规和分区的InnoDB表。否则,在运行OPTIMIZE TABLE 时,MySQL 会锁定表格。

OPTIMIZE TABLE 不会对 R-tree 索引进行排序,例如POINT列上的空间索引。(Bug #23578)

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

15.7.3.5 修复表语句

REPAIR [NO_WRITE_TO_BINLOG | LOCAL]
    TABLE *tbl_name* [, *tbl_name*] ...
    [QUICK] [EXTENDED] [USE_FRM]

REPAIR TABLE 修复可能损坏的表,仅适用于某些存储引擎。

此语句需要表的SELECTINSERT权限。

虽然通常情况下您不应该经常运行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适用于MyISAMARCHIVECSV表。对于MyISAM表,默认情况下具有与myisamchk --recover tbl_name相同的效果。此语句不适用于视图。

REPAIR TABLE支持分区表。但是,在分区表上不能使用USE_FRM选项。

您可以使用ALTER TABLE ... REPAIR PARTITION来修复一个或多个分区;有关更多信息,请参见第 15.1.9 节,“ALTER TABLE 语句”和第 26.3.4 节,“分区维护”。

修复表选项
  • NO_WRITE_TO_BINLOGLOCAL

    默认情况下,服务器将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_FRMREPAIR TABLE 不会尝试修复表。在这种情况下,REPAIR TABLE 返回的结果集包含一个 Msg_type 值为 errorMsg_text 值为 Failed repairing incompatible .FRM file 的行。

    如果使用 USE_FRMREPAIR TABLE 不会检查表以查看是否需要升级。

修复表输出

REPAIR TABLE 返回一个包含以下表中列的结果集。

Table 表名
Op 始终为 repair
Msg_type statuserrorinfonotewarning
Msg_text 一个信息性消息

REPAIR TABLE 语句可能为每个修复的表产生许多行信息。最后一行的 Msg_type 值为 statusMsg_test 通常应为 OK。对于 MyISAM 表,如果没有得到 OK,应尝试使用 myisamchk --safe-recover 进行修复。(REPAIR TABLE 没有实现所有 myisamchk 的选项。使用 myisamchk --safe-recover,您还可以使用 --max-record-lengthREPAIR TABLE 不支持的选项。)

REPAIR TABLE 表捕获并抛出在从旧损坏文件复制表统计信息到新创建文件时发生的任何错误。例如,如果 .MYD.MYI 文件的所有者的用户 ID 与 mysqld 进程的用户 ID 不同,REPAIR TABLE 会生成一个“无法更改文件所有权”的错误,除非 mysqld 是由 root 用户启动的。

表修复考虑事项

修复表 会升级表格,如果它包含旧的时间列,格式为 5.6.4 之前的格式(TIMEDATETIMETIMESTAMP 列,不支持分数秒精度),并且 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子句指示函数返回值的类型。DECIMALRETURNS后的合法值,但当前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_functionsmysql.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 FUNCTIONCREATE 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,服务器可能会意外关闭。

原文:dev.mysql.com/doc/refman/8.0/en/install-component.html

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';

省略PERSISTGLOBAL等同于指定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”。

原文:dev.mysql.com/doc/refman/8.0/en/install-plugin.html

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.solibmyplugin.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_SCHEMAPLUGINS表。

如果重新编译插件库并需要重新安装它,可以使用以下任一方法:

  • 使用UNINSTALL PLUGIN命令卸载库中的所有插件,将新的插件库文件安装到插件目录中,然后使用INSTALL PLUGIN命令安装库中的所有插件。这个过程的优点是可以在不停止服务器的情况下使用。然而,如果插件库包含许多插件,您必须发出许多INSTALL PLUGINUNINSTALL PLUGIN命令。

  • 停止服务器,将新的插件库文件安装到插件目录中,然后重新启动服务器。

原文:dev.mysql.com/doc/refman/8.0/en/uninstall-component.html

15.7.4.5 UNINSTALL COMPONENT Statement

UNINSTALL COMPONENT *component_name* [, *component_name* ] ...

此语句停用并卸载一个或多个组件。组件提供服务器和其他组件可用的服务;请参阅 Section 7.5, “MySQL Components”。UNINSTALL COMPONENTINSTALL 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”。

原文:dev.mysql.com/doc/refman/8.0/en/uninstall-plugin.html

15.7.4.6 UNINSTALL PLUGIN Statement

UNINSTALL PLUGIN *plugin_name*

此语句移除已安装的服务器插件。UNINSTALL PLUGININSTALL 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 语句

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

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 设置语句

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

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 SETSET NAMES 为与服务器当前连接相关的字符集和校对变量分配值。参见 第 15.7.6.2 节,“设置字符集语句”,以及 第 15.7.6.3 节,“设置 NAMES 语句”。

其他形式的描述出现在其他地方,与帮助实现它们的其他语句分组在一起:

  • SET DEFAULT ROLESET 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 节,“设置事务语句”。

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

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;
    
  • 要为会话系统变量分配一个值,请在变量名称之前加上SESSIONLOCAL关键字,或者使用@@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语句(例如,GLOBALSESSION),但这些原则也适用于使用相应修饰符的语句(例如,@@GLOBAL.@@SESSION.)。

  • 使用SET(任何变体)设置只读变量:

    mysql> SET GLOBAL version = 'abc';
    ERROR 1238 (HY000): Variable 'version' is a read only variable
    
  • 使用GLOBALPERSISTPERSIST_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
    
  • 省略GLOBALPERSISTPERSIST_ONLY以设置仅具有全局值的变量:

    mysql> SET max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
    
  • 使用PERSISTPERSIST_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 = '';

如果在单个语句中设置多个系统变量,则该语句中最近的GLOBALPERSISTPERSIST_ONLYSESSION关键字用于后续未指定关键字的赋值。

多变量赋值的示例:

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*不同,后者始终引用会话值。

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

15.7.6.2 SET CHARACTER SET Statement

SET {CHARACTER SET | CHARSET}
    {'*charset_name*' | DEFAULT}

此语句将服务器和当前客户端之间发送的所有字符串与给定映射进行映射。SET CHARACTER SET设置三个会话系统变量:character_set_clientcharacter_set_results设置为给定的字符集,character_set_connection设置为character_set_database的值。请参阅第 12.4 节,“连接字符集和校对”。

charset_name可以带引号或不带引号。

默认字符集映射可以通过使用值DEFAULT来恢复。默认值取决于服务器配置。

一些字符集不能作为客户端字符集使用。尝试与SET CHARACTER SET一起使用会产生错误。请参阅不允许的客户端字符集。

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

15.7.6.3 SET NAMES 语句

SET NAMES {'*charset_name*'
    [COLLATE '*collation_name*'] | DEFAULT}

这个语句将三个会话系统变量character_set_clientcharacter_set_connection,和character_set_results设置为给定的字符集。将character_set_connection设置为charset_name也会将collation_connection设置为charset_name的默认排序规则。参见第 12.4 节,“连接字符集和排序规则”。

可选的COLLATE子句可用于显式指定排序规则。如果提供,排序规则必须是charset_name允许的排序规则之一。

charset_namecollation_name可以带引号或不带引号。

默认映射可以通过使用DEFAULT值来恢复。默认值取决于服务器配置。

一些字符集不能用作客户端字符集。尝试与SET NAMES一起使用它们会产生错误。参见不允许的客户端字符集。

15.7.7 显示语句

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

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

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

15.7.7.1 SHOW BINARY LOGS Statement

SHOW BINARY LOGS
SHOW MASTER LOGS

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

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

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

SHOW MASTER LOGS 等同于 SHOW BINARY LOGS

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

15.7.7.2 SHOW BINLOG EVENTS Statement

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

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

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

注意

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

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

  • Log_name

    正在列出的文件的名称。

  • Pos

    事件发生的位置。

  • Event_type

    描述事件类型的标识符。

  • Server_id

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

  • End_log_pos

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

  • Info

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

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

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

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

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

15.7.7.3 SHOW CHARACTER SET Statement

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

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

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

SHOW CHARACTER SET输出具有以下列:

  • Charset

    字符集名称。

  • Description

    字符集的描述。

  • Default collation

    字符集的默认排序规则。

  • Maxlen

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

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

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

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

15.7.7.4 SHOW COLLATION Statement

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

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

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

SHOW COLLATION 的输出包括以下列:

  • Collation

    排序规则名称。

  • Charset

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

  • Id

    排序规则 ID。

  • Default

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

  • Compiled

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

  • Sortlen

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

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

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

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

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

15.7.7.5 显示列语句

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

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

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

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

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

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

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

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

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

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

  • Field

    列的名称。

  • Type

    列数据类型。

  • Collation

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

  • Null

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

  • Key

    列是否被索引:

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

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

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

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

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

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

  • 默认

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

  • 额外

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

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

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

    • 用于生成列的VIRTUAL GENERATEDSTORED GENERATED

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

  • 权限

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

  • 注释

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

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

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

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

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

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

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

15.7.7.6 显示创建数据库语句

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

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

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

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

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

15.7.7.7 显示创建事件语句

SHOW CREATE EVENT *event_name*

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

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

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

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

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

15.7.7.8 SHOW CREATE FUNCTION Statement

SHOW CREATE FUNCTION *func_name*

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

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

15.7.7.9 显示创建存储过程语句

SHOW CREATE PROCEDURE *proc_name*

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

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

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

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

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

15.7.7.10 SHOW CREATE TABLE Statement

SHOW CREATE TABLE *tbl_name*

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

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

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

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

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

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

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

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

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

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

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

15.7.7.11 显示 CREATE TRIGGER 语句

SHOW CREATE TRIGGER *trigger_name*

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

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

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

  • 触发器:触发器名称。

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

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

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

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

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

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

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

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

15.7.7.12 显示创建用户语句

SHOW CREATE USER *user*

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

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

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

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

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

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

15.7.7.13 显示创建视图语句

SHOW CREATE VIEW *view_name*

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

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

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

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

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

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

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

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

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

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

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

15.7.7.14 显示数据库语句

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

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

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

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

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

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

注意

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

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

15.7.7.15 SHOW ENGINE Statement

SHOW ENGINE *engine_name* {STATUS | MUTEX}

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

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

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

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

注意

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

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

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

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

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

    SET GLOBAL innodb_monitor_disable='latch';
    

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

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

  • Type

    始终使用InnoDB

  • Name

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

  • Status

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

    • spins表示旋转次数。

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

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

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

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

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

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

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

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

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

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

缓冲属性具有以下含义:

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

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

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

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

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

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

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

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

名称
cluster_node_id 集群中 MySQL 服务器的节点 ID
connected_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 TABLEALTER TABLE)时都会创建一个NdbTransaction

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

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

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

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

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

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

注意

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

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

15.7.7.16 显示引擎语句

SHOW [STORAGE] ENGINES

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

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

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

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

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

  • 引擎

    存储引擎的名称。

  • 支持

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

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

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

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

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

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

  • 注释

    存储引擎的简要描述。

  • 事务

    存储引擎是否支持事务。

  • XA

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

  • 保存点

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

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

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

15.7.7.17 SHOW ERRORS Statement

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

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

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

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

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

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

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

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

15.7.7.18 显示事件语句

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

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

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

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

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

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

SHOW EVENTS FROM test;

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

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

  • 数据库

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

  • 名称

    事件的名称。

  • 定义者

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

  • 时区

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

  • 类型

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

  • 执行时间

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

  • 间隔值

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

  • 间隔字段

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

  • 开始时间

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

  • 结束

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

  • 状态

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

  • 发起者

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

  • character_set_client

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

  • collation_connection

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

  • 数据库排序规则

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

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

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

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

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

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

15.7.7.19 显示函数代码语句

SHOW FUNCTION CODE *func_name*

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

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

15.7.7.20 显示函数状态语句

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

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

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

15.7.7.21 SHOW GRANTS Statement

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

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

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

注意

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

注意

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

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

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

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

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

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

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

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

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

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

15.7.7.22 显示索引语句

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

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

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

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

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

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

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

显示索引返回以下字段:

  • 表的名称。

  • 非唯一

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

  • 键名

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

  • Seq_in_index

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

  • 列名

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

  • 排序规则

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

  • 基数

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

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

  • 子部分

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

    注意

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

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

  • Packed

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

  • Null

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

  • Index_type

    使用的索引方法(BTREEFULLTEXTHASHRTREE)。

  • Comment

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

  • Index_comment

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

  • Visible

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

  • Expression

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

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

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

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

15.7.7.23 SHOW MASTER STATUS Statement

SHOW MASTER STATUS

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

示例:

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

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

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

15.7.7.24 SHOW OPEN TABLES 语句

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

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

SHOW OPEN TABLES输出包含这些列:

  • Database

    包含表的数据库。

  • Table

    表名。

  • In_use

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

  • Name_locked

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

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

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

15.7.7.25 显示插件语句

SHOW PLUGINS

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

显示插件输出示例:

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

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

  • 名称

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

  • 状态

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

  • 类型

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

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

  • 许可证

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

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

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

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

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

15.7.7.26 SHOW PRIVILEGES Statement

SHOW PRIVILEGES

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

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

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

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

15.7.7.27 显示存储过程代码语句

SHOW PROCEDURE CODE *proc_name*

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

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

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

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

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

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

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

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

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

15.7.7.28 显示存储过程状态语句

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

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

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

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

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

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

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

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

15.7.7.29 SHOW PROCESSLIST Statement

SHOW [FULL] PROCESSLIST

重要提示

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

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

注意

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

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

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

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

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

SHOW PROCESSLIST输出示例:

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

SHOW PROCESSLIST输出具有以下列:

  • Id

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

  • 用户

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

    注意

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

  • 主机

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

  • 数据库

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

  • 命令

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

  • 时间

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

  • 状态

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

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

  • 信息

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

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

15.7.7.30 SHOW PROFILE Statement

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

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

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

注意

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

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

mysql> SET profiling = 1;

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

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

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

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

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

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

  • ALL 显示所有信息

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

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

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

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

  • MEMORY 目前尚未实现

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

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

  • SWAPS 显示交换计数

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

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

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

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

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

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

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

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

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

注意

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

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

SHOW PROFILE FOR QUERY 2;

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

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

15.7.7.31 SHOW PROFILES 语句

SHOW PROFILES

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

注意

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

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

15.7.7.32 SHOW RELAYLOG EVENTS语句

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

*channel_option*:
    FOR CHANNEL *channel*

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

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

注意

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

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

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

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

  • Log_name

    正在列出的文件的名称。

  • Pos

    事件发生的位置。

  • Event_type

    描述事件类型的标识符。

  • Server_id

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

  • End_log_pos

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

  • Info

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

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

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

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

15.7.7.33 SHOW REPLICAS Statement

{SHOW REPLICAS}

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

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

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

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

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

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

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

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

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

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

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

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

{SHOW SLAVE HOSTS | SHOW REPLICAS}

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

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

15.7.7.35 SHOW REPLICA STATUS Statement

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

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

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

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

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

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

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

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

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

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

  • Replica_IO_State

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

  • Source_Host

    复制品连接到的源主机。

  • Source_User

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

  • Source_Port

    用于连接到源的端口。

  • Connect_Retry

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

  • Source_Log_File

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

  • Read_Source_Log_Pos

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

  • Relay_Log_File

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

  • Relay_Log_Pos

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

  • Relay_Source_Log_File

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

  • Replica_IO_Running

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

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

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

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

  • Replica_SQL_Running

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

  • Replicate_Do_DB, Replicate_Ignore_DB

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

  • Replicate_Do_Table, Replicate_Ignore_Table, Replicate_Wild_Do_Table, Replicate_Wild_Ignore_Table

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

  • Last_ErrnoLast_Error

    这些列是 Last_SQL_ErrnoLast_SQL_Error 的别名。

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

    注意

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

  • Skip_Counter

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

  • Exec_Source_Log_Pos

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

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

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

  • Relay_Log_Space

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

  • Until_ConditionUntil_Log_FileUntil_Log_Pos

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

    Until_Condition 有以下值:

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

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

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

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

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

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

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

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

  • Source_SSL_AllowedSource_SSL_CA_FileSource_SSL_CA_PathSource_SSL_CertSource_SSL_CipherSource_SSL_CRL_FileSource_SSL_CRL_PathSource_SSL_KeySource_SSL_Verify_Server_Cert

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

    Source_SSL_Allowed 有以下值:

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

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

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

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

  • Seconds_Behind_Source

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

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

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

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

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

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

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

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

  • Last_IO_ErrnoLast_IO_Error

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

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

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

  • Last_SQL_ErrnoLast_SQL_Error

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

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

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

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

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

  • Replicate_Ignore_Server_Ids

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

    注意

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

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

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

    注意

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

  • Source_Server_Id

    来自源的server_id值。

  • Source_UUID

    来自源的server_uuid值。

  • Source_Info_File

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

  • SQL_Delay

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

  • SQL_Remaining_Delay

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

  • Replica_SQL_Running_State

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

  • Source_Retry_Count

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

  • Source_Bind

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

  • Last_IO_Error_Timestamp

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

  • Last_SQL_Error_Timestamp

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

  • Retrieved_Gtid_Set

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

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

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

  • Executed_Gtid_Set

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

  • Auto_Position

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

  • Replicate_Rewrite_DB

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

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

    Replicate_Rewrite_DB 值显示:

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

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

  • Channel_name

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

  • Master_TLS_Version

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

  • Source_public_key_path

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

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

  • Get_source_public_key

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

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

  • Network_Namespace

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

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

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

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

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

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

15.7.7.37 显示状态语句

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

15.7.7.38 SHOW TABLE STATUS 语句

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

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

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

SHOW TABLE STATUS 输出包括以下列:

  • Name

    表的名称。

  • Engine

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

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

  • Version

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

  • Row_format

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

  • Rows

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

    对于 INFORMATION_SCHEMA 表,Rows 值为 NULL

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

  • Avg_row_length

    平均行长度。

  • Data_length

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

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

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

  • Max_data_length

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

    对于InnoDB不适用。

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

  • Index_length

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

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

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

  • Data_free

    已分配但未使用字节数。

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

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

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

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

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

  • Auto_increment

    下一个AUTO_INCREMENT值。

  • Create_time

    表创建时间。

  • Update_time

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

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

  • Check_time

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

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

  • 校对规则

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

  • 校验和

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

  • Create_options

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

    对于分区表,Create_options显示partitioned

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

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

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

  • 注释

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

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

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

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

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

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

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

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

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

15.7.7.39 SHOW TABLES Statement

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

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

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

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

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

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

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

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

15.7.7.40 SHOW TRIGGERS Statement

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

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

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

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

SHOW TRIGGERS输出具有以下列:

  • 触发器

    触发器的名称。

  • 事件

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

  • 定义触发器的表。

  • 语句

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

  • 时机

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

  • 创建���间

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

  • sql_mode

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

  • 定义者

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

  • character_set_client

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

  • collation_connection

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

  • 数据库排序规则

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

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

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

15.7.7.41 显示变量语句

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

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

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

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

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

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

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

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

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

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

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

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

SELECT @@GLOBAL.innodb_data_file_path;

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

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

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

...

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

...

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

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

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

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

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

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

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

15.7.7.42 SHOW WARNINGS Statement

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

posted @ 2024-06-23 00:40  绝不原创的飞龙  阅读(7)  评论(0编辑  收藏  举报