首页 > 数据库 > > 13.7 数据库管理语句(2)
13.7.1.5 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还需要SUPER权限。
每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:
RENAME USER 'jeffrey'@'localhost' TO 'jeff'@'127.0.0.1';
帐户名称的主机名部分(如果省略)默认为'%'。
RENAME USER会使旧用户拥有的权限成为新用户拥有的权限。 但是,RENAME USER不会自动删除和失效数据库或者旧用户创建的对象。 这包括DEFINER属性为旧用户命名的存储程序或视图。 尝试访问这些对象如果在定义者安全上下文中执行,则可能会产生错误
13.7.1.6 REVOKE 语法
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL [PRIVILEGES], GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
REVOKE语句使系统管理员可以撤消MySQL帐户的权限。
当启用read_only系统变量时,REVOKE除了在下面的讨论中描述的任何其他所需特权之外还需要SUPER特权。
每个帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:
REVOKE INSERT ON *.* FROM 'jeffrey'@'localhost';
帐户名称的主机名部分(如果省略)默认为'%'。
有关特权级别的详细信息,允许的priv_type,priv_level和object_type值以及指定用户和密码的语法,请参见第13.7.1.4节“GRANT语法”
要使用第一个REVOKE语法,您必须具有GRANT OPTION特权,并且您必须拥有您要撤消的特权。
要撤销所有权限,请使用第二种语法,该语法会删除指定用户或用户的所有全局,数据库,表,列和例程权限:
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
要使用此REVOKE语法,您必须具有全局CREATE USER特权或MySQL数据库的UPDATE特权。
必须从中撤销权限的用户帐户必须存在。
REVOKE删除权限,但不会删除mysql.user表项。 要完全删除用户帐户,请使用DROP USER。
如果授予表保存包含混合大小数据库或表名称的特权行,并且lower_case_table_names系统变量设置为非零值,则不能使用REVOKE来撤销这些特权。 有必要直接操作授权表。 (当设置lower_case_table_names时,GRANT不会创建这样的行,但可能在设置变量之前创建了这样的行。)
当从mysql程序成功执行时,REVOKE以 Query OK, 0 rows affected. 要确定操作后剩余的权限,请使用SHOW GRANTS。
13.7.1.7 SET PASSWORD 语法
SET PASSWORD [FOR user] = password_option
password_option: {
'auth_string' | PASSWORD('auth_string')
}
SET PASSWORD语句将密码分配给MySQL用户帐户。 'auth_string'表示明文(未加密)密码。
注意:
SET PASSWORD FOR 'jeffrey'@'localhost' = 'auth_string';
SET PASSWORD = 'auth_string';
任何使用非匿名帐户连接到服务器的客户端都可以更改该帐户的密码。 要查看服务器认证了哪个帐户,请调用CURRENT_USER()函数:
SELECT CURRENT_USER();
为指定帐户(使用FOR子句)设置密码需要MySQL数据库的UPDATE特权。 为自己设置密码(对于不含FOR子句的非匿名帐户)不需要特殊权限。 当启用read_only系统变量时,SET PASSWORD需要SUPER权限以及其他所需的权限。
如果给出了FOR用户子句,则帐户名称使用第6.2.3节“指定帐户名称”中描述的格式。 例如:
SET PASSWORD FOR 'bob'@'%.example.org' = 'auth_string';
帐户名称的主机名部分(如果省略)默认为'%'。
密码可以通过以下方式指定:
SET PASSWORD FOR 'jeffrey'@'localhost' = 'password';
SET PASSWORD将字符串解释为明文字符串,将其传递给与该帐户关联的验证插件,并将插件返回的结果存储在mysql.user帐户行中。 (这个插件有机会将这个值散列成它期望的加密格式,插件可以使用指定的值,在这种情况下不会发生哈希。)

key 分布分析
如果自上次密钥分发分析以来该表未发生更改,则不会再次分析该表。
MySQL使用存储的key 分布来决定连接的表连接顺序,而不是常量。 此外,可以在决定查询中的特定表使用哪些索引时使用key 分布
特别是,如果innodb_stats_persistent系统变量已启用,则必须在将实质数据加载到InnoDB表中或为其创建新索引之后运行ANALYZE TABLE。
要检查存储的key 分布 基数,请使用SHOW INDEX语句或INFORMATION_SCHEMA.STATISTICS表。
13.7.2.2 CHECK TABLE 语法
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {
FOR UPGRADE
| QUICK
| FAST
| MEDIUM
| EXTENDED
| CHANGED
}
CHECK TABLE检查一个或多个表的错误。 对于MyISAM表,关键统计信息也会更新。 CHECK TABLE还可以检查视图的问题,例如视图定义中引用的表不再存在的表。
要检查一个表格,你必须有一些权限。
CHECK TABLE适用于InnoDB,MyISAM,ARCHIVE和CSV表格。
CHECK TABLE会忽略未索引的虚拟生成列。
CHECK TABLE 输出
CHECK TABLE返回一个结果集,其列表如下表所示。

该语句可能会为每个检查表产生许多行信息。 最后一行有一个Msg_type状态值,Msg_text通常应该是OK。 对于MyISAM表,如果你没有得到OK或Table is already up to date,你通常应该对表进行修复。
Table is already up to date ,这意味着表的存储引擎表明不需要检查表
13.7.2.3 CHECKSUM 表语法
CHECKSUM TABLE tbl_name [, tbl_name] ... [QUICK | EXTENDED]
CHECKSUM TABLE报告表内容的校验和。 您可以使用此语句验证在备份,回滚或其他旨在将数据恢复到已知状态的操作之前和之后内容是否相同。
该语句需要该表的SELECT特权。
此声明不支持视图。 如果对视图运行CHECKSUM TABLE,则Checksum值始终为NULL,并返回警告。
对于不存在的表,CHECKSUM TABLE返回NULL并生成警告。
在校验和操作过程中,该表使用InnoDB和MyISAM的读锁来锁定。
性能考虑
默认情况下,整个表被逐行读取并计算校验和。 对于大型表,这可能需要很长时间,因此您只会偶尔执行此操作。 这种逐行计算是您通过EXTENDED子句,InnoDB和除MyISAM以外的所有其他存储引擎获得的结果,并且MyISAM表不是使用CHECKSUM = 1子句创建的。
对于使用CHECKSUM = 1子句创建的MyISAM表,CHECKSUM TABLE或CHECKSUM TABLE ... QUICK返回可以非常快地返回的“实时”表校验和。 如果该表不符合所有这些条件,则QUICK方法返回NULL。 InnoDB表不支持QUICK方法。
校验和值取决于表格行格式。 如果行格式更改,则校验和也会更改。 例如,时间类型(如TIME,DATETIME和TIMESTAMP)的存储格式在MySQL 5.6.5之前的MySQL 5.6中已更改,因此如果5.5表升级到MySQL 5.6,则校验和值可能会更改。
重要:
如果两个表的校验和不同,那么几乎可以肯定的是这些表在某种程度上是不同的。 但是,由于CHECKSUM TABLE使用的散列函数不能保证无冲突,所以两个不相同的表可能会产生相同的校验和。
13.7.2.4 OPTIMEIZE table 语法
OPTIMIZE [NO_WRITE_TO_BINLOG | LOCAL] TABLE tbl_name [, tbl_name] ...
OPTIMIZE TABLE重新组织表数据和关联索引数据的物理存储,以减少访问表时的存储空间并提高I/O效率。 对每个表进行的确切更改取决于该表使用的存储引擎。
在这些情况下使用OPTIMIZE TABLE,具体取决于表的类型:
此语句需要表的SELECT和INSERT权限。
OPTIMIZE TABLE适用于InnoDB,MyISAM和ARCHIVE表。 OPTIMIZE TABLE也支持内存NDB表的动态列。 它不适用于内存表的固定宽度列,也不适用于磁盘数据表。 可以使用--ndb_optimization_delay来调整NDB群集表上OPTIMIZE的性能,该控制通过OPTIMIZE TABLE控制处理批次行之间等待的时间长度。
对于NDB簇表,可以通过(例如)中断执行OPTIMIZE操作的SQL线程来中断OPTIMIZE TABLE。
默认情况下,OPTIMIZE TABLE不适用于使用任何其他存储引擎创建的表,并返回表示缺少支持的结果。 通过使用--skip-new选项启动mysqld,可以使OPTIMIZE TABLE适用于其他存储引擎。 在这种情况下,OPTIMIZE TABLE只是映射到ALTER TABLE。
此语句不适用于视图。
OPTIMIZE TABLE支持分区表。
默认情况下,服务器将OPTIMIZE TABLE语句写入二进制日志,以便它们复制到复制从服务器。 要禁止日志记录,请指定可选的NO_WRITE_TO_BINLOG关键字或其别名LOCAL。
OPTIMEIZE TABLE 输出
OPTIMIZE TABLE返回一个结果集,其列表如下表所示。

OPTIMIZE TABLE表捕获和抛出从旧文件复制表统计信息到新创建文件时发生的任何错误。 例如。 如果.frm,.MYD或.MYI文件的所有者的用户标识与mysqld进程的用户标识不同,则OPTIMIZE TABLE将生成一个“ cannot change ownership of the file”错误,除非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使用常规和分区的InnoDB表的在线DDL,这可以减少并发DML操作的停机时间。 由OPTIMIZE TABLE触发并在ALTER TABLE ... FORCE的封面下执行的表重建已完成。 在操作的准备阶段和提交阶段只会短暂地执行排他表锁。 在准备阶段,更新元数据并创建中间表。 在提交阶段,提交表元数据更改。
OPTIMIZE TABLE在下列条件下使用表复制方法重建表:
包含FULLTEXT索引的InnoDB表不支持使用联机DDL的OPTIMIZE TABLE。 而是使用表复制方法。
InnoDB使用页面分配方法存储数据,并且不会像传统存储引擎(如MyISAM)那样遭受碎片化。 在考虑是否运行优化时,请考虑服务器将要处理的事务的工作量:
MyISAM 细节
对于MyISAM表,OPTIMIZE TABLE的工作原理如下:
1.如果该表已删除或拆分行,请修复该表。
2.如果索引页面未被排序,请对它们进行排序。
3.如果表的统计信息不是最新的(并且通过对索引进行排序无法完成修复),请更新它们。
其他考虑
OPTIMIZE TABLE在线执行,用于常规和分区的InnoDB表。 否则,MySQL在OPTIMIZE TABLE运行时锁定该表。
OPTIMIZE TABLE不排序R-tree索引,例如POINT列上的空间索引。 (Bug#23578)
13.7.3.3 INSTALL PLUGIN 语法
INSTALL PLUGIN plugin_name SONAME 'shared_library_name'
这条语句安装一个服务器插件。 它需要mysql.plugin系统表的INSERT权限。
plugin_name是在库文件中包含的插件描述符结构中定义的插件的名称(请参见第28.2.4.2节“插件数据结构”)。 插件名称不区分大小写。 为了获得最大的兼容性,插件名称应限制为ASCII字母,数字和下划线,因为它们在C源文件,shell命令行,M4和Bourne shell脚本以及SQL环境中使用。
shared_library_name是包含插件代码的共享库的名称。 该名称包含文件扩展名(例如,libmyplugin.so,libmyplugin.dll或libmyplugin.dylib)。
共享库必须位于plugin目录(由plugin_dir系统变量命名的目录)中。 该库必须位于插件目录中,而不是在子目录中。 默认情况下,plugin_dir是pkglibdir配置变量所指定目录下的插件目录,但可以通过在服务器启动时设置plugin_dir的值来更改它。 例如,在my.cnf文件中设置它的值:
[mysqld] plugin_dir=/path/to/plugin/directory
如果plugin_dir的值是一个相对路径名,它将被视为相对于MySQLbase 目录(basedir系统变量的值)。
INSTALL PLUGIN加载并初始化插件代码,使插件可供使用。 通过执行初始化函数来初始化插件, 该函数在可以使用之前处理插件必须执行的任何设置。 当服务器关闭时,它会为加载的每个插件执行取消初始化功能,以便插件能够执行任何最终的清理。
INSTALL PLUGIN通过向mysql.plugin表中添加一行代表插件名称和库文件名称来注册该插件。 在服务器启动时,服务器加载并初始化mysql.plugin表中列出的任何插件。 这意味着插件与INSTALL PLUGIN一起安装仅仅一次,而不是每次服务器启动时。 如果使用--skip-grant-tables选项启动服务器,则不会在启动时加载插件。
一个插件库可以包含多个插件。 对于要安装的每一个,请使用单独的INSTALL PLUGIN语句。 每个语句都会命名一个不同的插件,但它们都指定相同的库名称。
INSTALL PLUGIN会导致服务器读取选项(my.cnf)文件,就像在服务器启动时一样。 这使得插件可以从这些文件中获取任何相关的选项。 即使在加载插件之前(如果使用宽松前缀),也可以将插件选项添加到选项文件中。 也可以卸载插件,编辑my.cnf,然后再次安装插件。 通过这种方式重新启动插件可以在不重新启动服务器的情况下启用新的选项值。
要删除插件,请使用UNINSTALL PLUGIN语句。
要查看安装了哪些插件,请使用SHOW PLUGINS语句或查询INFORMATION_SCHEMA.PLUGINS表。
如果您重新编译插件库并需要重新安装它,则可以使用以下任一方法:
13.7.3.4 UNINSTALL PLUGIN 语法
UNINSTALL PLUGIN plugin_name
该语句删除已安装的服务器插件。 它需要mysql.plugin系统表的DELETE权限。 UNINSTALL PLUGIN是INSTALL PLUGIN 的补充。
plugin_name必须是mysql.plugin表中列出的某个插件的名称。 服务器执行插件的反初始化函数,并从mysql.plugin表中删除该插件的行,以便后续服务器重新启动时不会加载并初始化该插件。 UNINSTALL PLUGIN不会删除插件的共享库文件。
如果任何使用它的表已打开,则无法卸载插件。
删除插件会影响关联表的使用。 例如,如果全文分析器插件与表上的FULLTEXT索引关联,则卸载该插件将使表不可用。 任何访问表的尝试都会导致错误。 该表甚至无法打开,因此您不能删除使用该插件的索引。 这意味着除非你不关心格内容,否则卸载插件是值得关注的。 如果您卸载的插件无意在稍后重新安装,并且您关心表内容,则应该使用mysqldump转储表并从转储的CREATE TABLE语句中除去WITH PARSER子句,以便稍后可以重新加载表。 如果您不关心表 甚至可以在缺少相关插件的表上使用DROP TABLE。
13.7.4.1 分配变量的set 语法
SET variable_assignment [, variable_assignment] ... variable_assignment:
user_var_name = expr
| param_name = expr
| local_var_name = expr
| [GLOBAL | SESSION]
system_var_name = expr
| [@@global. | @@session. | @@]
system_var_name = expr
变量赋值的SET语法使您可以将值分配给影响一个或多个服务器操作的不同类型的变量:
系统变量也可以在服务器启动时设置,要显示系统变量名称和值,请使用SHOW VARIABLES语句。
分配变量值的SET语句不会写入二进制日志,因此在复制方案中,它只影响执行它的主机。 要影响所有复制主机,请在每个主机上执行语句。
以下示例说明了设置变量的SET语法, 他们使用=赋值运算符。但是:=赋值运算符也被允许用于此目的。
用户变量被写为@var_name,并被赋值为一个表达式值,如下所示:
SET @var_name = expr;
例子:
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
expr的范围可以从简单(一个文字值)到复杂(由标量子查询返回的值)。
SET适用于定义它们的存储对象上下文中的参数和局部变量。 以下过程将计数器局部变量用作循环计数器:
CREATE PROCEDURE p()
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + 1;
END WHILE;
END;
许多系统变量都是动态的,并且可以在运行时使用SET语句进行更改。 要用SET更改系统变量,请按名称引用它,可选地在前面加上一个修饰符:
SET GLOBAL max_connections = 1000;
SET @@global.max_connections = 1000;
SUPER权限是设置全局变量所必需的。
SET SESSION sql_mode = 'TRADITIONAL';
SET @@session.sql_mode = 'TRADITIONAL';
SET @@sql_mode = 'TRADITIONAL';
设置会话变量通常不需要特殊权限,虽然有例外需要SUPER权限(例如sql_log_bin)。 客户端可以更改自己的会话变量,但不能更改其他客户端的会话变量。
mysql> SET GLOBAL sql_log_bin = ON; ERROR 1231 (42000): Variable 'sql_log_bin' can't be set to the value of 'ON'
mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
前面的修饰符只适用于系统变量。 尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。
SET语句可以包含多个变量赋值,用逗号分隔。 该语句将值分配给用户定义的变量和系统变量:
SET @x = 1, SESSION sql_mode = '';
如果您设置了多个系统变量,则语句中最新的GLOBAL或SESSION修饰符将用于未指定修饰符的后续赋值。
多变量赋值的例子:
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@global.sort_buffer_size = 1000000, @@local.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
如果SET语句中的任何变量赋值失败,则整个语句将失败并且不会更改任何变量。
如果更改了会话系统变量,则该值将在会话中保持有效,直到您将变量更改为不同的值或会话结束。 该更改对其他会话没有影响。
如果更改全局系统变量,则会将该值记住并用于新会话,直到将该变量更改为其他值或服务器退出。 任何访问全局变量的客户端都可以看到该更改。 但是,更改仅影响更改后连接的客户端的相应会话变量。 全局变量更改不会影响任何当前客户端会话的会话变量(甚至不会影响SET GLOBAL语句发生的会话)。
要使全局系统变量设置为永久性的,以便它适用于跨服务器重新启动,则还应将其设置为选项文件。
要将GLOBAL值设置为已编译的MySQL默认值或将SESSION变量设置为当前对应的GLOBAL值,请将该变量设置为值DEFAULT。 例如,以下两个语句在将max_join_size的会话值设置为当前全局值时是相同的:
SET @@session.max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
并非所有的系统变量都可以设置为DEFAULT。 在一些情况下,分配DEFAULT会出现错误。
尝试将DEFAULT分配给用户定义的变量,存储过程或函数参数或存储的程序局部变量时发生错误。
要在表达式中引用系统变量的值,请使用@@-修饰符之一。 例如,您可以像这样在SELECT语句中检索值:
SELECT @@global.sql_mode, @@session.sql_mode, @@sql_mode;
要在表达式中以@@var_name(而不是@@ global.或@@ session.)引用系统变量,MySQL会返回会话值(如果存在),否则返回全局值。 这与SET @@var_name = expr不同,后者始终引用会话值。
13.7.5 SHOW 语法
SHOW有很多形式提供有关服务器的数据库,表,列或状态信息的信息。 本节介绍以下内容:
SHOW {BINARY | MASTER} LOGS
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
SHOW CHARACTER SET [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 SLAVE HOSTS
SHOW 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
like_or_where: LIKE 'pattern' | WHERE expr
如果给定的SHOW语句的语法包含一个LIKE 'pattern'部分,'pattern'是一个可以包含SQL%和_通配符的字符串。 该模式对于将语句输出限制为匹配值很有用。
多数SHOW语句也接受一个WHERE子句,在指定显示哪些行时提供了更大的灵活性。
许多MySQL API(如PHP)使您可以像从SELECT中选择结果集那样处理从SHOW语句返回的结果; 另外,您可以在SQL中使用INFORMATION_SCHEMA数据库中表的查询结果,而使用SHOW语句的可能无法轻松完成这些结果
13.7.5.1 SHOW BINARY LOGS 语法
SHOW BINARY LOGS
SHOW MASTER LOGS
列出服务器上的二进制日志文件。 此语句作为第13.4.1.1节“PURGE BINARY LOGS语法”中介绍的过程的一部分使用,该语句显示如何确定可以清除哪些日志。
mysql> SHOW BINARY LOGS;
+---------------+-----------+
| Log_name | File_size |
+---------------+-----------+
| binlog.000015 | 724935 |
| binlog.000016 | 733481 |
+---------------+-----------+
SHOW MASTER LOGS相当于SHOW BINARY LOGS。
具有SUPER或REPLICATION CLIENT特权的用户可以执行此语句。
13.7.5.2 SHOW BINLOG EVENTS 语法
SHOW BINLOG EVENTS [IN 'log_name'] [FROM pos] [LIMIT [offset,] row_count]
显示二进制日志中的事件。 如果您不指定'log_name',则会显示第一个二进制日志。
LIMIT子句与SELECT语句的语法相同。
注意:
发出不带LIMIT子句的SHOW BINLOG EVENT可能会导致耗时且耗费资源的过程,因为服务器会向客户端返回二进制日志的完整内容(其中包含修改数据的服务器执行的所有语句)。 作为SHOW BINLOG EVENTS的替代方案,使用mysqlbinlog实用程序将二进制日志保存到文本文件中供日后检查和分析
SHOW BINLOG EVENTS显示二进制日志中每个事件的以下字段:
列出的文件的名称。
事件发生的位置。
描述事件类型的标识符。
发生事件的服务器的服务器ID。
下一个事件开始的位置,等于Pos加上事件的大小。
有关事件类型的更多详细信息。 这些信息的格式取决于事件类型。
注意:
一些与设置用户和系统变量有关的事件不包括在SHOW BINLOG EVENTS的输出中。 要全面了解二进制日志中的事件,请使用mysqlbinlog。
SHOW BINLOG EVENTS不适用于中继日志文件。 您可以使用SHOW RELAYLOG EVENT来实现此目的。
13.7.5.5 SHOW COLUMNS 语法
SHOW [FULL]
{COLUMNS | FIELDS}
{FROM | IN} tbl_name [{FROM | IN} db_name]
[LIKE 'pattern' | WHERE expr]
SHOW COLUMNS显示有关给定表中列的信息。 它也适用于视图。 SHOW COLUMNS仅显示您拥有权限的列的信息。
您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的替代方法。 换句话说,这两个语句是等价的:
SHOW COLUMNS FROM mytable FROM mydb;
SHOW COLUMNS FROM mydb.mytable;
可选的FULL关键字会使输出包含列排序规则和注释,以及您对每列的权限。
LIKE子句(如果存在)指示要匹配哪些列名称。 可以使用WHERE子句来使用更一般的条件来选择行。
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 | | +-------------+----------+------+-----+---------+----------------+
数据类型可能与您期望它们基于CREATE TABLE语句不同,因为当您创建或更改表时,MySQL有时会更改数据类型。
SHOW COLUMNS显示每个表格列的以下值:
列名称
列数据类型
非二进制字符串列的排序规则,或其他列为NULL。 只有使用FULL关键字时,才会显示此值。
列可空性。 如果NULL值可以存储在列中,则值为YES,否则为NO。
列是否被索引:
如果多个Key值应用于表的给定列,那么Key将按照PRI,UNI,MUL的顺序显示具有最高优先级的那个值。
如果UNIQUE索引不能包含NULL值并且表中没有PRIMARY KEY,则可以将其显示为PRI。 如果多个列形成复合UNIQUE索引,则UNIQUE索引可能会显示为MUL; 尽管列的组合是唯一的,但每列仍可以存在给定值的多次出现。
列的默认值。 如果列的显式默认为NULL,或者列定义不包含DEFAULT子句,则该值为NULL。
任何有关给定列的其他信息。 在这些情况下,该值不是空的:
您拥有专栏的权限。 只有使用FULL关键字时,才会显示此值。
列定义中包含的任何注释。 只有使用FULL关键字时,才会显示此值。
您还可以从INFORMATION_SCHEMA获取有关表列的信息,其中包含一个COLUMNS表。
您可以使用mysqlshow db_name tbl_name命令列出表的列。
DESCRIBE语句提供与SHOW COLUMNS类似的信息。
SHOW CREATE TABLE,SHOW TABLE STATUS和SHOW INDEX语句还提供有关表的信息。
13.7.5.12 SHOW CREATE USER 语法
SHOW CREATE USER user
该语句显示创建指定用户的CREATE USER语句。 如果用户不存在,则会发生错误。 该语句需要mysql数据库的SELECT特权,除了显示当前用户的信息。
mysql> SHOW CREATE USER 'root'@'localhost'\G *************************** 1. row ***************************
CREATE USER for root@localhost: CREATE USER 'root'@'localhost'
IDENTIFIED WITH 'mysql_native_password' AS
'*2470C0C06DEE42FD1618BB99005ADCA2EC9D1E19'
REQUIRE NONE PASSWORD EXPIRE DEFAULT ACCOUNT UNLOCK
输出格式受log_builtin_as_identified_by_password系统变量设置的影响。
要显示授予帐户的权限,请使用SHOW GRANTS语句。
13.7.5.13 SHOW CREATE VIEW 语法
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: latin1
collation_connection: latin1_swedish_ci
character_set_client是创建视图时character_set_client系统变量的会话值。 collation_connection是创建视图时collation_connection系统变量的会话值。
使用SHOW CREATE VIEW需要SHOW VIEW权限,以及有问题视图的SELECT权限。
您还可以从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之前的注释被服务器从定义中剥离。
13.7.5.15 SHOW ENGINE 语法
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 Monitor的关于InnoDB存储引擎状态的大量信息。
注意:
InnoDB mutexes 和rwlocks也可以使用性能模式表进行监控
SHOW ENGINE INNODB在MySQL 5.7.2中删除了MUTEX输出。 它被修改并重新在MySQL 5.7.8中引入。
在MySQL 5.7.8中,使用以下选项动态配置互斥量统计信息收集:
SET GLOBAL innodb_monitor_enable='latch';
SET GLOBAL innodb_monitor_reset='latch';
SET GLOBAL innodb_monitor_disable='latch';
SHOW ENGINE INNODB MUTEX的互斥量统计数据集也可以通过设置innodb_monitor_enable ='all'来启用,或者通过设置innodb_monitor_disable ='all'来禁用。
SHOW ENGINE INNODB MUTEX输出具有以下列:
总是 InnoDB
在MySQL 5.7.8之前,名称字段会报告执行互斥锁的源文件以及创建互斥锁的文件中的行号。 行号是特定于您的MySQL版本的。 从MySQL 5.7.8开始,仅报告互斥体名称。 文件名和行号仍然报告rwlocks。
mutex 状态
在MySQL 5.7.8之前,如果在MySQL编译时定义了WITH_DEBUG,则Status字段会显示多个值。 如果未定义WITH_DEBUG,则语句仅显示os_waits值。 在后一种情况下(没有WITH_DEBUG),输出所基于的信息不足以区分保护rwlock(允许多个读取器或单个writer)的常规互斥锁和互斥锁。 因此,对于相同的互斥锁,输出可能看起来包含多行。 Pre-MySQL 5.7.8 Status 字段值包括:
从MySQL 5.7.8开始,状态字段会报告旋转次数,等待和调用次数。 未报告在InnoDB之外实施的低级别操作系统互斥的统计信息。
SHOW ENGINE INNODB MUTEX跳过缓冲池块的互斥锁和rw锁,因为在具有大缓冲池的系统上,输出量可能会被压倒。 (每个16K缓冲池块中有一个互斥锁和一个rw锁,每千兆字节有65,536个块。)SHOW ENGINE INNODB MUTEX也未列出从未等待的任何互斥锁或rw锁(os_waits = 0)。 因此,SHOW ENGINE INNODB MUTEX仅显示有关导致至少一个OS级别等待的缓冲池外部的互斥锁和rw锁的信息
使用SHOW ENGINE PERFORMANCE_SCHEMA STATUS检查性能架构代码的内部操作.
此声明旨在帮助DBA了解不同性能模式选项对内存要求的影响。
名称值由两部分组成,分别命名为内部缓冲区和缓冲区属性。 解释缓冲区名称如下:
缓冲区属性具有以下含义:
在某些情况下,Performance Schema配置参数与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(线程数)。
13.7.5.17 show errors 语法
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW COUNT(*) ERRORS
SHOW ERRORS是一种类似于SHOW WARNINGS的诊断语句,只是它仅显示错误信息,而不显示错误,警告和注释。
LIMIT子句与SELECT语句的语法相同。
SHOW COUNT(*) ERRORS语句显示错误的数量。 您也可以从error_count变量中检索这个数字:
SHOW COUNT(*) ERRORS;
SELECT @@error_count;
SHOW ERRORS和error_count仅适用于错误,而不是警告或注释。 在其他方面,它们与SHOW WARNINGS和warning_count类似。 特别是,SHOW ERRORS不能显示超过max_error_count消息的信息,并且如果错误数量超过max_error_count,则error_count可能会超过max_error_count的值。
13.7.5.18 SHOW EVENTS 语法
SHOW EVENTS [{FROM | IN} schema_name] [LIKE 'pattern' | WHERE expr]
此语句显示有关事件管理器事件的信息。 它需要用于显示事件的数据库的EVENT权限。
以最简单的形式,SHOW EVENTS列出当前方案中的所有事件:
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: 10
Interval field: SECOND
Starts: 2006-02-09 10:41:23
Ends: NULL
Status: ENABLED
Originator: 0
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci
要查看特定模式的事件,请使用FROM子句。 例如,要查看test 方案的事件,请使用以下语句:
SHOW EVENTS FROM test;
LIKE子句(如果存在)指示要匹配哪些事件名称。 可以使用WHERE子句来使用更一般的条件来选择行,如第24.34节“SHOW语句的扩展”所述。
SHOW EVENTS输出包含以下列:
对于重复性事件,此列的值始终为NULL。
对于瞬态事件,此列的值始终为NULL。
对于瞬态事件,此列的值始终为NULL。
对于瞬态事件,此列的值始终为NULL。
重复事件的结束日期和时间。 这显示为DATETIME值,如果没有为事件定义结束日期和时间,则默认为NULL。
对于瞬态事件,此列始终为NULL。
SLAVESIDE_DISABLED表示事件的创建发生在另一台充当复制主服务器的MySQL服务器上,并复制到当前作为从服务器的MySQL服务器上,但该事件目前未在从服务器上执行。
事件活动语句未显示在SHOW EVENTS的输出中。 使用SHOW CREATE EVENT或INFORMATION_SCHEMA.EVENTS表
SHOW EVENTS输出中的列与INFORMATION_SCHEMA.EVENTS表中的列类似,但不相同。
13.7.5.21 SHOW GRANTS 语法
SHOW GRANTS [FOR user]
此语句以GRANT语句的形式显示分配给MySQL用户帐户的权限,该权限必须执行以复制特权分配。
注意:
要显示MySQL帐户的非特权信息,请使用SHOW CREATE USER语句。
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` | +------------------------------------------------------------------+
要显示授予当前用户(您用于连接服务器的帐户)的权限,可以使用以下任何语句:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
如果在定义者上下文中使用SHOW GRANTS FOR CURRENT_USER(或任何等效语法),例如在使用定义者而不是调用者特权执行的存储过程中),那么显示的定义是定义者而不是调用者。
SHOW GRANTS不显示可用于指定帐户但授予其他帐户的权限。 例如,如果存在匿名帐户,则指定的帐户可能能够使用其权限,但SHOW GRANTS不会显示它们。
SHOW GRANTS输出不包含IDENTIFIED BY PASSWORD子句。 改用SHOW CREATE USER语句。
13.7.5.22 show index 语法
SHOW {INDEX | INDEXES | KEYS}
{FROM | IN} tbl_name
[{FROM | IN} db_name]
[WHERE expr]
SHOW INDEX返回表索引信息。 该格式类似于ODBC中的SQLStatistics调用。 此声明需要表中任何列的某些特权。
您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的替代方法。 这两个语句是等同的:
SHOW INDEX FROM mytable FROM mydb;
SHOW INDEX FROM mydb.mytable;
WHERE子句可用于使用更一般的条件来选择行
SHOW INDEX返回以下字段:
表的名称
如果索引不能包含重复项,则为0;如果可以,则为1。
索引的名称。 如果索引是主键,则名称始终为 PRIMARY。
索引中的列序号,从1开始。
字段名称
列如何在索引中排序。 这可以具有值A(升序)或NULL(不排序)。
估计索引中唯一值的数量。 要更新此数值,请运行ANALYZE TABLE或(对于MyISAM表)myisamchk -a。
基数是基于统计信息的整数,所以即使对于小表格,该值也不一定准确。 基数越高,MySQL在进行连接时使用索引的机会就越大
索引前缀。 也就是说,如果列只是部分索引,则索引字符的数量,如果整列索引,则为NULL。
注意:
前缀限制以字节度量,而CREATE TABLE,ALTER TABLE和CREATE INDEX语句中的前缀长度被解释为非二进制字符串类型(CHAR,VARCHAR,TEXT)的字符数和二进制字符串类型(BINARY, VARBINARY,BLOB)字节数。 为使用多字节字符集的非二进制字符串列指定前缀长度时,请考虑这一点。
指示key的打包方式。 如果不是,则为NULL。
如果该列可能包含NULL值,则为YES;否则为''。
使用的索引方法(BTREE,FULLTEXT,HASH,RTREE)。
有关未在自己的列中描述的索引的信息,如禁用索引时为 disabled 。
在创建索引时为索引提供的任何都带有COMMENT属性的注释。
您还可以从INFORMATION_SCHEMA获取有关表索引的信息,其中包含STATISTICS表。
您可以使用mysqlshow -k db_name tbl_name命令列出表的索引。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69946831/viewspace-3158478/ ,如需转载,请注明出处,否则将追究法律责任。