13.5. 数据库管理语句
- 13.5.1. 账户管理语句
- 13.5.2. 表维护语句
- 13.5.3. SET语法
- 13.5.4. SHOW语法
- 13.5.5. 其它管理语句
13.5.1. 账户管理语句
- 13.5.1.1. CREATE USER语法
- 13.5.1.2. DROP USER语法
- 13.5.1.3. GRANT和REVOKE语法
- 13.5.1.4. RENAME USER语法
- 13.5.1.5. SET PASSWORD语法
13.5.1.1. CREATE USER语法
CREATE USER user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
CREATE USER用于创建新的MySQL账户。要使用CREATE USER,您必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限。对于每个账户,CREATE USER会在没有权限的mysql.user表中创建一个新记录。如果账户已经存在,则出现错误。
使用自选的IDENTIFIED BY子句,可以为账户给定一个密码。user值和密码的给定方法和GRANT语句一样。特别是,要在纯文本中指定密码,需忽略PASSWORD关键词。要把密码指定为由PASSWORD()函数返回的混编值,需包含关键字PASSWORD。请参见13.5.1.3节,“GRANT和REVOKE语法”。
13.5.1.2. DROP USER语法
DROP USER user [, user] ...
DROP USER语句用于删除一个或多个MySQL账户。要使用DROP USER,您必须拥有mysql数据库的全局CREATE USER权限或DELETE权限。使用与GRANT或REVOKE相同的格式为每个账户命名;例如,'jeffrey'@'localhost'。账户名称的用户和主机部分与用户表记录的User和Host列值相对应。
使用DROP USER,您可以取消一个账户和其权限,操作如下:
DROP USER user;
该语句可以删除来自所有授权表的帐户权限记录。
要点:DROP USER不能自动关闭任何打开的用户对话。而且,如果用户有打开的对话,此时取消用户,则命令不会生效,直到用户对话被关闭后才生效。一旦对话被关闭,用户也被取消,此用户再次试图登录时将会失败。这是有意设计的。
13.5.1.3. GRANT和REVOKE语法
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] {tbl_name | * | *.* | db_name.*} TO user [IDENTIFIED BY [PASSWORD] 'password'][, user [IDENTIFIED BY [PASSWORD] 'password']] ... [REQUIRENONE |[{SSL| X509}][CIPHER 'cipher' [AND]][ISSUER 'issuer' [AND]][SUBJECT 'subject']] [WITH with_option [with_option] ...]object_type = TABLE | FUNCTION | PROCEDUREwith_option = GRANT OPTION | MAX_QUERIES_PER_HOUR count | MAX_UPDATES_PER_HOUR count | MAX_CONNECTIONS_PER_HOUR count | MAX_USER_CONNECTIONS count
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... ON [object_type] {tbl_name | * | *.* | db_name.*} FROM user [, user] ...REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
GRANT和REVOKE语句允许系统管理员创建MySQL用户账户,授予权限和撤销权限。
MySQL账户信息存储在mysql数据库的表中。在第5章:数据库管理中对本数据库和访问控制系统进行了详尽的讨论。要了解更多详细信息,您应该查询此章。
如果授权表拥有含有mixed-case数据库或表名称的权限记录,并且lower_case_table_names系统变量已设置,则不能使用REVOKE撤销权限,必须直接操纵授权表。(当lower_case_table_names已设置时,GRANT将不会创建此类记录,但是此类记录可能已经在设置变量之前被创建了。)
授予的权限可以分为多个层级:
·全局层级
全局权限适用于一个给定服务器中的所有数据库。这些权限存储在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限。
·数据库层级
数据库权限适用于一个给定数据库中的所有目标。这些权限存储在mysql.db和mysql.host表中。GRANT ALL ON db_name.*和REVOKE ALL ON db_name.*只授予和撤销数据库权限。
·表层级
表权限适用于一个给定表中的所有列。这些权限存储在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤销表权限。
·列层级
列权限适用于一个给定表中的单一列。这些权限存储在mysql.columns_priv表中。当使用REVOKE时,您必须指定与被授权列相同的列。
·子程序层级
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。
当后续目标是一个表、一个已存储的函数或一个已存储的过程时,object_type子句应被指定为TABLE、FUNCTION或PROCEDURE。当从旧版本的MySQL升级时,要使用本子句,您必须升级您的授权表。请参见2.10.2节,“升级授权表”。
要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。
要撤销所有权限,需使用以下语法。此语法用于取消对于已命名的用户的所有全局层级、数据库层级、表层级和列层级的权限。
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
要使用本REVOKE语法,您必须拥有mysql数据库的全局CREATE USER权限或UPDATE权限。
对于GRANT和REVOKE语句,priv_type可以被指定为以下任何一种:
权限 | 意义 |
ALL [PRIVILEGES] | 设置除GRANT OPTION之外的所有简单权限 |
ALTER | 允许使用ALTER TABLE |
ALTER ROUTINE | 更改或取消已存储的子程序 |
CREATE | 允许使用CREATE TABLE |
CREATE ROUTINE | 创建已存储的子程序 |
CREATE TEMPORARY TABLES | 允许使用CREATE TEMPORARY TABLE |
CREATE USER | 允许使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。 |
CREATE VIEW | 允许使用CREATE VIEW |
DELETE | 允许使用DELETE |
DROP | 允许使用DROP TABLE |
EXECUTE | 允许用户运行已存储的子程序 |
FILE | 允许使用SELECT...INTO OUTFILE和LOAD DATA INFILE |
INDEX | 允许使用CREATE INDEX和DROP INDEX |
INSERT | 允许使用INSERT |
LOCK TABLES | 允许对您拥有SELECT权限的表使用LOCK TABLES |
PROCESS | 允许使用SHOW FULL PROCESSLIST |
REFERENCES | 未被实施 |
RELOAD | 允许使用FLUSH |
REPLICATION CLIENT | 允许用户询问从属服务器或主服务器的地址 |
REPLICATION SLAVE | 用于复制型从属服务器(从主服务器中读取二进制日志事件) |
SELECT | 允许使用SELECT |
SHOW DATABASES | SHOW DATABASES显示所有数据库 |
SHOW VIEW | 允许使用SHOW CREATE VIEW |
SHUTDOWN | 允许使用mysqladmin shutdown |
SUPER | 允许使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL语句,mysqladmin debug命令;允许您连接(一次),即使已达到max_connections。 |
UPDATE | 允许使用UPDATE |
USAGE | “无权限”的同义词 |
GRANT OPTION | 允许授予权限 |
当从旧版本的MySQL升级时,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE权限,您必须首先升级您的授权表。请参见2.10.2节,“升级授权表”。
REFERENCES权限目前未被使用。
当您想要创建一个没有权限的用户时,可以指定USAGE。
使用SHOW GRANTS来确定帐户拥有什么权限。请参见13.5.4.10节,“SHOW GRANTS语法”。
您可以通过使用ON *.*语法赋予全局权限,或通过使用ONdb_name.*语法赋予数据库层级权限。如果您指定了ON *并且您已经选择了一个默认数据库,则权限被赋予到这个数据库中。(警告:如果您指定了ON *同时您没有选择一个默认数据库,则权限是全局的。)
FILE, PROCESS, RELOAD, REPLICATION CLIENT, REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN和SUPER权限是管理性权限,只能进行全局授权(使用ON *.*语法)。
其它权限可以被全局授权,或被赋予为其它层级。
对于一个表,您可以指定的priv_type值只能是SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, GRANT OPTION, INDEX和ALTER。
对于一个列(也就是,当您使用一个column_list子句时),您可以指定的priv_type值只能是SELECT, INSERT和UPDATE。
在子程序层级,您可以指定的priv_type值只能是ALTER ROUTINE, EXECUTE和GRANT OPTION。CREATE ROUTINE不是一个子程序层级的权限,因为您必须拥有此权限,才能创建一个子程序。
对于全局、数据库、表和子程序层级,GRANT ALL只能赋予在您正在授权的层级中存在的权限。例如,如果您使用GRANT ALL ON db_name.*,这是一个数据库层级语句,因此不会授予全局权限,如FILE等。
MySQL允许您对不存在的数据库目标授予权限。在此情况下,将被授予的权限必须包括CREATE权限。这个性质是有意设计的,目的是允许数据库管理员为将在此后被创建的数据库目标预备用户账户和权限。
要点:当您取消一个表或数据库时,MySQL不会自动撤销任何权限。但是,如果您取消一个子程序,则被赋予该子程序的所有子程序层级的权限都被撤销。
注意:GRANT语句用于在全局层级或数据库层级赋予权限。当在GRANT语句中指定数据库名称时,允许使用‘_’和‘%’通配符。这意味着,如果您想要使用‘_’字符作为一个数据库名称的一部分,您应该在GRANT语句中指定它为‘\_’,以防止用户可以访问其它符合此通配符格式的数据库;例如,GRANT ... ON `foo\_bar`.* TO ...。
为了接纳对来自任意主机的用户授权的权利,MySQL支持以user_name@host_name的形式指定user值。如果一个user_name或host_name与一个不加引号的标识符一样是合法的,那么您不需要对它加引号。不过,要指定一个包含特殊字符(如‘-’)的user_name字符串,或一个包含特殊字符或通配字符(如‘%’),则引号是必要的;例如,'test-user'@'test-hostname'。分别对username和hostname加引号。
您可以在hostname中指定通配符。例如user_name@'%.loc.gov'适用于在loc.gov域中的任何主机的user_name。同时user_name@'144.155.166.%'适用于144.155.166 C级子网中的任何主机的user_name。
简单形式user_name是user_name@'%'的同义词。
MySQL不支持usernames中的通配符。通过把带有User=''的登录项插入到mysql.user表中,或通过使用GRANT语句创建一个带有空名称的用户,可以定义匿名用户:
mysql> GRANT ALL ON test.* TO ''@'localhost' ...
当把带引号的值是,需使用反勾号(‘`’)为数据库、表、列和子程序名称加引号。使用单引号(‘'’)为hostnames、usernames和密码加引号。
警告:如果您允许匿名用户连接到MySQL服务器,则您应该同时向所有本地用户授予user_name@localhost权限。否则,当有名称的用户试图从本地机器登录MySQL服务器时,mysql.user表中的用于localhost的匿名用户帐户会被使用。
您可以通过执行以下查询来确定是否这适合于您。以下查询列举了所有匿名用户:
mysql> SELECT Host, User FROM mysql.user WHERE User='';
如果您想要删除本地匿名用户账户,以避免出现刚才谈到的问题,则需使用以下语句:
mysql> DELETE FROM mysql.user WHERE Host='localhost' AND User='';
mysql> FLUSH PRIVILEGES;
GRANT支持最长为60个字符的hostnames。数据库、表、列和子程序名称最长可为64个字符。Usernames最长可为16个字符。注释:不能通过更改mysql.user表来改变usernames的允许长度。如果试图这么做,会导致出现不可预见的问题,可能会造成用户无法登录MySQL服务器。除了采用由MySQL公司提供的用于升级MySQL服务器的mysql_fix_privilege_tables原稿之外,请您不要以任何方式变更授权表。
对于表或列的权限是作为各个权限层级的逻辑OR权限被附加形成的。例如,如果mysql.user表指定一个用户拥有全局SELECT权限,则该权限不能被数据库、表或列层级的登录项定义。
可以按下列方法计算列权限:
global privileges
OR (database privileges AND host privileges)
OR table privileges
OR column privileges
在多数情况下,您只在一个权限层级下向用户授予权利,所以寿命通常不是那么复杂。有关权限检查规程的细节,请参见5.7节,“MySQL访问权限系统”。
如果您对一个在mysql.user表中不存在的username/hostname组合授予权限,则增加一个登录项并保持在此处,直到使用DELETE语句删除为止。换句话说,GRANT可以创建用户表登录项,但是REVOKE不会取消它们;您必须使用DROP USER或DELETE明确地操作。
如果创建了一个新的用户,或者如果您拥有全局授权权限,则用户密码被设置为由IDENTIFIED BY子句指定的密码(如果给定了一个)。如果用户已拥有了一个密码,则此密码被新密码替代。
警告:如果您创建了一个新用户,但是不指定IDENTIFIED BY子句,则用户没有密码。这是很不安全的。不过,您可以启用NO_AUTO_CREATE_USER SQL模式,来防止GRANT创建一个新用户(否则GRANT会这么做),除非给定了IDENTIFIED BY来为新用户提供一个密码。
使用SET PASSWORD语句也可以设置密码。请参见13.5.1.5节,“SET PASSWORD语法”。
在IDENTIFIED BY子句中,密码应被作为文字密码只被给定。没有必要使用PASSWORD()函数,因为该函数用于SET PASSWORD语句。例如:
GRANT ... IDENTIFIED BY 'mypass';
如果您不想以明白的文字发送密码,并且您知道PASSWORD()返回给密码的混编值,则您可以指定混编值,前面加入关键词PASSWORD:
GRANT ...
IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4';
在一个C程序中,您可以通过使用make_scrambled_password() C API函数得到混编值。
如果您为一个数据库授予权限,则在mysql.db表中,会根据需要创建登录项。如果使用REVOKE删除了所有的数据库权限,则本登录项被删除。
如果一个用户不拥有表权限,则当用户申请表清单时(例如,使用SHOW TABLES语句),表名称不显示。
SHOW DATABASES权限允许账户通过发布SHOW DATABASE语句来观看数据名称。不拥有此权限的账户只能看到他们拥有部分权限的数据库,并且如果使用--skip-show-database选项启动服务器,则根本不能使用本语句。
WITH GRANT OPTION子句给予用户能力,可以在指定的权限层级,向其它用户给定其拥有的任何权限。您应该留心您给予了谁GRANT OPTION权限,因为拥有不同权限的两个用户可以联合使用权限!
您不能向其它用户授予您自己没有的权限;GRANT OPTION权限只允许您赋予您自己拥有的权限。
要注意,当您在某个特定权限层级向一个用户授予GRANT OPTION权限时,用户拥有的该层级的任何权限(或未来将被给定的权限)也可以由该用户授予。假设您向一个用户赋予了数据库INSERT权限。如果您然后赋予数据库SELECT权限,并指定了WITH GRANT OPTION,则该用户不仅可以向其它用户给予SELECT权限,还可以给予INSERT。如果您然后向用户授予数据库UPDATE权限,则用户可以授予INSERT, SELECT和UPDATE。
您不应该向一个常规用户授予ALTER权限。如果您这么做,则该用户可以尝试通过对表重新命名来破坏授权系统!
The MAX_QUERIES_PER_HOUR count,MAX_UPDATES_PER_HOUR count, and MAX_CONNECTIONS_PER_HOUR count options limit the number of queries, updates, and logins a user can perform during any given one-hour period. If count is0 (the default), this means that there is no limitation for that user. MAX_QUERIES_PER_HOUR count,MAX_UPDATES_PER_HOUR count和MAX_CONNECTIONS_PER_HOURcount选项限制了在任何给定的一小时期间,用户可以执行的查询、更新和登录的数目。如果count是0(默认值),这意味着,对该用户没有限制。
MAX_USER_CONNECTIONS count选项限制了账户可以同时进行的连接的最大数目。如果count是0(默认值),则max_user_connections系统可以决定该账户同时连接的数目。
注释:要对一个原有的用户指定任何这类资源限制型选项,同时又不影响原有的权限,需使用GRANT USAGE ON *.* ... WITH MAX_...。
见5.8.4节,“限制账户资源”。
除了根据username和密码进行常规鉴定外,MySQL还可以检查X509证明属性。要为MySQL账户指定与SSL有关的选项,需使用GRANT语句的REQUIRE子句。(要了解有关在MySQL中使用SSL的背景信息,请参见5.8.7节,“使用安全连接”。)
对于一个给定的账户,有多种可能性可以限制连接类型:
·如果账户没有SSL或X509要求,并且如果username和密码是有效的,则允许不加密连接。但是,如果客户端有正确的证明和关键文件,则根据客户端的选择,也可以使用加密连接。
·REQUIRE SSL选项用于告知服务器,对于该账户只允许SSL加密连接。注意,如果有允许任何非SSL连接的访问控制记录,则本选项可以被忽略。
·mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE SSL;
·REQUIRE X509意味着客户端必须拥有一个有效证明,除非不需要确切的证明、发布者和主题。唯一的要求是,应可以使用CA证明其中之一来验证签名。
·mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret' REQUIRE X509;
·REQUIRE ISSUER 'issuer'用于对连接尝试进行限定,客户端必须出示一个由CA’issuer’发布的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的发布者,则服务器会拒绝连接。使用X509证明就意味着要加密,所以在这种情况下,SSL选项是不必要的。
·mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE ISSUER '/C=FI/ST=Some-State/L=Helsinki/
· O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com';
注意,ISSUER值应被作为一个单一字符串输入。
·REQUIRE SUBJECT 'subject'用于对连接尝试进行限定,客户端必须出示一个包含主题subject的有效的X509证明。如果客户端出示的证明是有效的,但是有一个不同的主题,则服务器会拒绝连接。
·mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
· O=MySQL demo client certificate/
· CN=Tonu Samuel/Email=tonu@example.com';
注意,SUBJECT值应被作为一个单一字符串输入。
·需要REQUIRE CIPHER 'cipher'来确认使用了密码和足够长度的关键字。如果使用了采用短型加密关键字的旧算法,SSL本身会比较脆弱。使用本选项,您可以要求使用特定的密码方法来许可一个连接。
·mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
· -> IDENTIFIED BY 'goodsecret'
· -> REQUIRE CIPHER 'EDH-RSA-DES-CBC3-SHA';
SUBJECT, ISSUER和CIPHER选项可以在REQUIRE子句中结合,如下:
mysql> GRANT ALL PRIVILEGES ON test.* TO 'root'@'localhost'
-> IDENTIFIED BY 'goodsecret'
-> REQUIRE SUBJECT '/C=EE/ST=Some-State/L=Tallinn/
O=MySQL demo client certificate/
CN=Tonu Samuel/Email=tonu@example.com'
-> AND ISSUER '/C=FI/ST=Some-State/L=Helsinki/
O=MySQL Finland AB/CN=Tonu Samuel/Email=tonu@example.com'
-> AND CIPHER 'EDH-RSA-DES-CBC3-SHA';
注意,SUBJECT和ISSUER值各自应被作为一个单一字符串输入。
在REQUIRE各选项之间,AND关键词是自选的。
选项的顺序无所谓,但是选项不能被指定两次。
当mysqld启动后,所有的权限被读入存储器中。要了解详细说明,请参见5.7.7节,“权限更改何时生效”。
注意,如果您正在使用表权限或列权限,即使只对一个用户使用,服务器也会对所有用户检查表权限和列权限,这会略微降低MySQL的速度。与此类似,如果您对某些用户限制查询、更新或连接的数目,则服务器必须监测这些值。
标准SQL版本和MySQL版本的GRANT之间的最大区别是:
·在MySQL中,权限与hostname和username的组合有关,与 单一的username无关。
·标准SQL不拥有全局层级或数据库层级权限,也不支持MySQL支持的所有权限类型。
·MySQL不支持标准SQL TRIGGER或UNDER权限。
·标准SQL权限以一种分等级的方式进行组织。如果您取消一个用户,则用户被授予的所有权限都被撤销。在MySQL中,如果您使用DROP USER,也会如此。请参见13.5.1.2节,“DROP USER语法”。
·在标准SQL中,当您取消一个表时,对一个表的所有权限会被撤销。在标准SQL中,当您撤销一个权限时,根据该权限被授予的所有权限也会被撤销。在MySQL中,只有使用明确的REVOKE语句,或通过操作存储在MySQL授权表中的值,才能取消权限。
·在MySQL中,可以只对一个表中的部分列拥有INSERT权限。在此情况下,如果您忽略您不拥有INSERT权限的那些列,,您仍然可以对表执行INSERT语句。如果没有启用严格的SQL模式,则被忽略的列被设置为各自隐含的默认值。在严格模式下,如果某个被忽略的列没有默认值,则该语句被拒绝。5.3.2节,“SQL服务器模式”对严格模式进行了讨论。13.1.5节,“CREATE TABLE语法”对隐含默认值进行了讨论。
您不拥有INSERT权限的列被设置为各自的默认值。标准SQL要求您拥有所有列的INSERT权限。
在MySQL中,如果您只拥有一个表中的部分列的INSERT权限,同时,如果您从INSERT语句中忽略您不拥有权限的列,则您仍然可以对表执行INSERT语句;那些列将被设置为各自的默认值。在严格模式下(即当sql_mode='traditional'时,如果某些被忽略的列没有默认值,则INSERT语句将被拒绝。
13.5.1.4. RENAME USER语法
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
RENAME USER语句用于对原有MySQL账户进行重命名。要使用RENAME USER,您必须拥有全局CREATE USER权限或mysql数据库UPDATE权限。如果旧账户不存在或者新账户已存在,则会出现错误。old_user和new_user值的给定方法与GRANT语句一样。
13.5.1.5. SET PASSWORD语法
SET PASSWORD = PASSWORD('some password')
SET PASSWORD FOR user = PASSWORD('some password')
SET PASSWORD语句用于向一个原有MySQL用户账户赋予一个密码。
第一个语法为当前用户设置密码。已使用一个非匿名账户连接到服务器上的任何客户即都可以更改该账户的密码。
第二个语法为当前服务器主机上的一个特定账户设置密码。只有拥有mysql数据库UPDATE权限的客户端可以这么做。user值应以user_name@host_name的格式被给定,此处user_name和host_name与mysql.user表登录项的User和Host列中列出的完全一样。举例说明,如果您有一个登录项,User和Host列值为'bob'和'%.loc.gov',您应该按如下方法写语句:
mysql> SET PASSWORD FOR 'bob'@'%.loc.gov' = PASSWORD('newpass');
这相当于以下语句:
mysql> UPDATE mysql.user SET Password=PASSWORD('newpass')
-> WHERE User='bob' AND Host='%.loc.gov';
mysql> FLUSH PRIVILEGES;
注释:如果您正在使用一个4.1以前的客户端连接到一个MySQL 4.1或MySQL 4.1以后的服务器,则在阅读5.7.9节,“MySQL 4.1中的密码哈希处理”之前,不能使用前面的SET PASSWORD或UPDATE语句。密码格式在MySQL 4.1中变更了,并且在特定情况下,如果您更改密码,您可能无法在连接到服务器上。
您可以通过执行SELECT CURRENT_USER()观看您当前的鉴定user@host登录项。
13.5.2. 表维护语句
- 13.5.2.1. ANALYZE TABLE语法
- 13.5.2.2. BACKUP TABLE语法
- 13.5.2.3. CHECK TABLE语法
- 13.5.2.4. CHECKSUM TABLE语法
- 13.5.2.5. OPTIMIZE TABLE语法
- 13.5.2.6. REPAIR TABLE语法
- 13.5.2.7. RESTORE TABLE语法
13.5.2.1. ANALYZE TABLE语法
ANALYZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
本语句用于分析和存储表的关键字分布。在分析期间,使用一个读取锁定对表进行锁定。这对于MyISAM, BDB和InnoDB表有作用。对于MyISAM表,本语句与使用myisamchk -a相当。
MySQL使用已存储的关键字分布来决定,当您对除常数以外的对象执行联合时,表按什么顺序进行联合。
本语句会返回一个含有以下列的表:
列 | 值 |
Table | 表名称 |
Op | 进行分析 |
Msg_type | 状态、错误、信息或警告之一 |
Msg_text | 消息 |
您可以使用SHOW INDEX语句检查已存储的关键字分布。请参见13.5.4.11节,“SHOW INDEX语法”。
如果从上一个ANALYZE TABLE语句开始,表没有变化,则不再分析该表。
ANALYZE TABLE语句被写入二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。
13.5.2.2. BACKUP TABLE语法
BACKUP TABLE tbl_name [, tbl_name] ... TO '/path/to/backup/directory'
注释:本语句不理想。我们正在努力寻找一种更好的替代方式,该方式将提供在线备份能力。同时,也可以使用mysqlhotcopy原本替代。
BACKUP TABLE用于在刷新了所有对磁盘的缓冲变更后,把恢复表所需的最少数目的表文件拷贝到备份目录中。本语句只对MyISAM表起作用。它可以拷贝.frm定义文件和.MYD数据文件。.MYI索引文件可以从这两个文件中重建。本目录应被指定为一个完整的路径名。
在使用本语句前,请参见5.9.1节,“数据库备份”。
在备份期间,为每个表保持一个读取锁定,每次一个,在正在备份时锁定。如果您想要把多个表作为一个快照来备份(防止它们在备份操作过程中被更改),您必须实现发布一个LOCK TABLES语句,以获得对一个组群中的每个表的读取锁定。
该语句会返回一个含有以下列的表:
列 | 值 |
Table | 表名称 |
Op | 进行备份 |
Msg_type | 状态、错误、信息或警告之一 |
Msg_text | 消息 |
13.5.2.3. CHECK TABLE语法
CHECK TABLE tbl_name [, tbl_name] ... [option] ...
option = {QUICK | FAST | MEDIUM | EXTENDED | CHANGED}
检查一个或多个表是否有错误。CHECK TABLE对MyISAM和InnoDB表有作用。对于MyISAM表,关键字统计数据被更新。
CHECK TABLE也可以检查视图是否有错误,比如在视图定义中被引用的表已不存在。
CHECK TABLE语句会返回一个含有以下列的表:
列 | 值 |
Table | 表名称 |
Op | 进行检查 |
Msg_type | 状态、错误、信息或错误之一 |
Msg_text | 消息 |
注意,该语句可能会为每个被检查的表产生多行信息。最后一行有一个Msg_type状态值。Msg_text通常应为OK。如果您没有得到OK,或表已经更新了,则您通常应该运行修复后的表。请参见5.9.4节,“表维护和崩溃恢复”。表已经更新了,这意味着表的存储引擎指示没有必要检查表。
可以给予的不同的检查选项列于下表中。这些选项只适用于检查MyISAM表。对于InnoDB表和视图,这些选项被忽略。
类型 | 意义 |
QUICK | 不扫描行,不检查错误的链接。 |
FAST | 只检查没有被正确关闭的表。 |
CHANGED | 只检查上次检查后被更改的表,和没有被正确关闭的表。 |
MEDIUM | 扫描行,以验证被删除的链接是有效的。也可以计算各行的关键字校验和,并使用计算出的校验和验证这一点。 |
EXTENDED | 对每行的所有关键字进行一个全面的关键字查找。这可以确保表是100%一致的,但是花的时间较长。 |
如果没有指定QUICK, MEDIUM或EXTENDED选项,则对于动态格式MyISAM表,默认检查类型是MEDIUM。这与对表运行myisamchk --medium-check tbl_name的结果相同。对于静态格式MyISAM表,默认检查类型也是MEDIUM,除非CHANGED或FAST已被指定。在此情况下,默认值为QUICK。对于CHANGED和FAST,行扫描被跳过,因为行极少被破坏。
您可以组合检查选项,如下面的例子所示。该例子对表进行了一个快速检查,来查看该表是否被正确关闭:
CHECK TABLE test_table FAST QUICK;
注释:在有些情况下,CHECK TABLE会更改表。如果表被标记为“corrupted”或“not closed properly”,则出现这种情况。但是CHECK TABLE不会找出表中的问题。在这种情况下,CHECK TABLE会把表标记为良好。
如果一个表被破坏,很有可能问题在索引中,而不在数据部分中。所有前述的检查类型都可以彻底地检查索引,因此,可以找出多数的错误。
如果您只想要检查您假定的表是良好的,您应该不使用检查选项或QUICK选项。当您时间匆忙时,应使用QUICK。QUICK无法找出数据文件中的错误的风险非常小。(在多数情况下,在正常使用中,MySQL应能在数据文件中找出错误。如果找出了错误,表被标记为“corrupted”,并不能被使用,直到修复为止。)
如果您想要时常检查表,FAST和CHANGED多数情况下从原本中被使用(例如,从cron中被执行)。在多数情况下,FAST优先于CHANGED。(只有一种情况FAST不优先于CHANGED,那就是当您怀疑您在MyISAM代码中发现了错误。)
当MySQL试图通过关键字更新一行或查找一行时,如果您已经运行了一个常规检查后但仍得到来自表的奇怪的错误,此时使用EXTENDED。(如果常规的检查运行成功,则基本用不着EXTENDED。)
被CHECK TABLE报告的部分问题不会被自动修正:
·发现行。此行中,auto_increment列有0值。
这意味着,您在表中有一行,该行的AUTO_INCREMENT索引列包含0值。(可以通过使用UPDATE语句,明确地把列设置为0,以创建一个AUTO_INCREMENT列为0的行。)
这本身不是一个错误,但是如果您决定转储表并恢复表,或对表进行ALTER TABLE,那么会导致出现麻烦。在此情况下,AUTO_INCREMENT列会根据AUTO_INCREMENT列的结果更改值,这会导致出现问题,如重复关键字错误等。
要消除警告,只需执行一个UPDATE语句,把列设置为除0以外的值。
13.5.2.4. CHECKSUM TABLE语法
CHECKSUM TABLE tbl_name [, tbl_name] ... [ QUICK | EXTENDED ]
报告一个表校验和。
如果指定了QUICK,则报告活性表校验和,否则报告NULL。这是非常快的。活性表通过指定CHECKSUM=1表选项启用,目前只支持用于MyISAM表。请参见13.1.5节,“CREATE TABLE语法”。
在EXTENDED模式下,整个表被一行一行地读取,并计算校验和。对于大型表,这是非常慢的。
默认情况下,如果既没有指定QUICK,也没有指定EXTENDED,并且如果表存储引擎支持,则MySQL返回一个活性校验和,否则会对表进行扫描。
CHECKSUM TABLE对于不存在的表会返回NULL。对于这种情况,会生成一个警告。
13.5.2.5. OPTIMIZE TABLE语法
OPTIMIZE [LOCAL | NO_WRITE_TO_BINLOG] TABLE tbl_name [, tbl_name] ...
如果您已经删除了表的一大部分,或者如果您已经对含有可变长度行的表(含有VARCHAR, BLOB或TEXT列的表)进行了很多更改,则应使用OPTIMIZE TABLE。被删除的记录被保持在链接清单中,后续的INSERT操作会重新使用旧的记录位置。您可以使用OPTIMIZE TABLE来重新利用未使用的空间,并整理数据文件的碎片。
在多数的设置中,您根本不需要运行OPTIMIZE TABLE。即使您对可变长度的行进行了大量的更新,您也不需要经常运行,每周一次或每月一次即可,只对特定的表运行。
OPTIMIZE TABLE只对MyISAM, BDB和InnoDB表起作用。
对于MyISAM表,OPTIMIZE TABLE按如下方式操作:
1. 如果表已经删除或分解了行,则修复表。
2. 如果未对索引页进行分类,则进行分类。
3. 如果表的统计数据没有更新(并且通过对索引进行分类不能实现修复),则进行更新。
对于BDB表,OPTIMIZE TABLE目前被映射到ANALYZE TABLE上。对于InnoDB表,OPTIMIZE TABLE被映射到ALTER TABLE上,这会重建表。重建操作能更新索引统计数据并释放成簇索引中的未使用的空间。请参见13.5.2.1节,“ANALYZE TABLE语法”。
使用—skip-new或—safe-mode选项可以启动mysqld。通过启动mysqld,您可以使OPTIMIZE TABLE对其它表类型起作用。
注意,在OPTIMIZE TABLE运行过程中,MySQL会锁定表。
OPTIMIZE TABLE语句被写入到二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。已经这么做了,因此,用于MySQL服务器的OPTIMIZE TABLE命令的作用相当于一个复制主服务器,在默认情况下,这些命令将被复制到复制从属服务器中。
13.5.2.6. REPAIR TABLE语法
REPAIR [LOCAL | NO_WRITE_TO_BINLOG] TABLE
tbl_name [, tbl_name] ... [QUICK] [EXTENDED] [USE_FRM]
REPAIR TABLE用于修复被破坏的表。默认情况下,REPAIR TABLE与myisamchk --recover tbl_name具有相同的效果。REPAIR TABLE对MyISAM和ARCHIVE表起作用。请参见15.1节,“MyISAM存储引擎”, 15.8节,“ARCHIVE存储引擎”。
通常,您基本上不必运行此语句。但是,如果灾难发生,REPAIR TABLE很有可能从MyISAM表中找回所有数据。如果您的表经常被破坏,您应该尽力找到原因,以避免使用REPAIR TALBE。请参见A.4.2节,“如果MySQL依然崩溃,应作些什么”。同时也见15.1.4节,“MyISAM表方面的问题”。
本语句会返回一个含有以下列的表:
列 | 值 |
Table | 表名称 |
Op | 进行修复 |
Msg_type | 状态、错误、信息或警告之一 |
Msg_text | 消息 |
对于每个被修复的表,REPAIR TABLE语句会产生多行的信息。上一行含有一个Msg_type状态值。Msg_test通常应为OK。如果您没有得到OK,您应该尝试使用myisamchk --safe-recover修复表,因为REPAIR TABLE尚不会执行所有的myisamchk选项。我们计划在将来使它的灵活性更强。
如果给定了QUICK,则REPAIR TABLE会尝试只修复索引树。这种类型的修复与使用myisamchk --recover --quick相似。
如果您使用EXTENDED,则MySQL会一行一行地创建索引行,代替使用分类一次创建一个索引。这种类型的修复与使用myisamchk --safe-recover相似。
对于REPAIR TABLE,还有一种USE_FRM模式可以利用。如果.MYI索引文件缺失或标题被破坏,则使用此模式。在这种模式下,MySQL可以使用来自.frm文件重新创建.MYI文件。这种修复不能使用myisamchk来完成。注释:只能在您不能使用常规REPAIR模式是,才能使用此模式。.MYI标题包含重要的表元数据(特别是,当前的AUTO_INCREMENT值和Delete链接)。这些元数据在REPAIR...USE_FRM中丢失。如果表被压缩,则不能使用USE_FRM。因为本信息也存储在.MYI文件中。
REPAIR TABLE语句被写入二进制日志中,除非使用了自选的NO_WRITE_TO_BINLOG关键词(或其别名LOCAL)。
警告:如果在REPAIR TABLE运行过程中,服务器停机,则在重新启动之后,在执行其它操作之前,您必须立刻对表再执行一个REPAIR TABLE语句。(通过制作一个备份来启动是一个好办法。)再最不利情况下,您可以有一个新的干净的索引文件,不含有关数据文件的信息。然后,您执行的下一个操作会覆盖数据文件。这很少发生,但是是有可能的。
13.5.2.7. RESTORE TABLE语法
RESTORE TABLE tbl_name [, tbl_name] ... FROM '/path/to/backup/directory'
用于恢复来自用BACKUP TABLE制作的备份的表。原有的表不会被覆盖;如果您试图覆盖一个原有的表,会发生错误。和BACKUP TABLE一样,RESTORE TABLE目前只对MyISAM表起作用。目录应被指定为一个完整路径名。
每个表的备份包括其.frm格式文件和.MYD数据文件。恢复操作会恢复这些文件,然后使用这些文件来重建.MYI索引文件。恢复操作比备份操作花的时间更长,这是因为需要重建索引。表含有的索引越多,花的时间就越长。
该语句会返回一个含有以下列的表:
列 | 值 |
Table | 表名称 |
Op | 进行恢复 |
Msg_type | 状态、错误、信息或警告之一 |
Msg_text | 消息 |
13.5.3. SET语法
SET variable_assignment [, variable_assignment] ...
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
SET用于设置不同类型的变量。这些变量会影响服务器或客户端的操作。SET可以用于向用户变量或系统变量赋值。
用于分配账户密码的SET PASSWORD语句在13.5.1.5节,“SET PASSWORD语法”中进行了讨论。
多数系统变量可以在运行时间被更改。可以被动态设置的系统变量在5.3.3.1节,“动态系统变量”中进行了讨论。
注释:旧版本的MySQL采用SET OPTION作为这个命令,但是由于有了SET,现在不赞成使用SET OPTION。
以下例子显示了您可以用于设置变量的不同语法。
用户变量可以被写作@var_name,并可以进行如下设置:
SET @var_name = expr;
在9.3节,“用户变量”中给出了有关用户变量的更多信息。
系统变量可以被作为var_name引用到SET语句中。在名称的前面可以自选地添加GLOBAL或@@global,以明确地指示该变量是全局变量。或者在名称前面添加SESSION, @@session,或@@,以指示它是一个会话变量。LOCAL和@@local是SESSION和@@session地同义词。如果没有修改符,则SET设置会话变量。
支持系统变量的@@var_name语法,以便使MySQL语法与其它数据库系统相兼容。
如果您在同一个语句中设置多个系统变量,则最后一个GLOBAL或SESSION选项被用于没有指定模式的变量。
SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
如果您使用SESSION(默认情况)设置一个系统变量,则该值仍然有效,直到当前会话结束为止,或者直到您吧变量设置为一个不同的值为止。如果您使用GLOBAL(要求SUPER权限)来设置一个系统变量,则该值被记住,并被用于新的连接,直到服务器重新启动为止。如果您想要进行永久式变量设置,您应该把它放入一个选项文件。请参见4.3.2节,“使用选项文件”。
为了防止不正确的使用,如果您使用SET GLOBAL时同时使用了一个只能与SET SESSION同时使用的变量,或者如果您在设置一个全局变量时未指定GLOBAL(或@@),则MySQL会产生一个错误。
如果您想要把一个SESSION变量设置为GLOBAL值或把一个GLOBAL值设置为内部MySQL默认值,需使用DEFAULT关键词。例如,在把max_join_size会话值设置为全局值时,以下两个语句是一样的:
SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
您可以使用SHOW VARIABLES来得到系统变量清单。(见13.5.4.21节,“SHOW VARIABLES语法”。)要获得与样式匹配的一个具体的变量名称或者名称清单,需使用LIKE子句,使用方法如下:
SHOW VARIABLES LIKE 'max_join_size';
SHOW GLOBAL VARIABLES LIKE 'max_join_size';
要得到名称与样式匹配的变量的清单,需使用通配符‘%’:
SHOW VARIABLES LIKE 'have%';
SHOW GLOBAL VARIABLES LIKE 'have%';
通配符可以被用于相匹配的样式中的任何位置。
您也可以通过使用@@[global.|local.]var_name语法和SELECT来得到值:
SELECT @@max_join_size, @@global.max_join_size;
当您使用SELECT @@var_name(即您不指定全局、会话或本地)来恢复一个变量时,则MySQL会返回SESSION值(如果存在)或者GLOBAL值。
以下清单用于描述带有非标准语法的变量,或描述在系统变量清单中(见5.3.3节,“服务器系统变量”。)中没有描述的变量。尽管这些变量没有被SHOW VARIABLES显示,但是您可以使用SELECT来获得它们的值(例外情况是,使用CHARACTER SET和SET NAMES)。例如:
mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
·AUTOCOMMIT = {0 | 1}
设置autocommit模式。如果设置为1,则所有对表的更改会立刻生效。如果设置为0,则您必须使用COMMIT来接受一个事务,或使用ROLLBACK来取消它。如果您把AUTOCOMMIT模式从0改为1,则MySQL会对开放事务执行一个自动COMMIT。开始一个事务的另一种方法是使用一个START TRANSACTION或BEGIN语句。请参见13.4.1节,“START TRANSACTION, COMMIT和ROLLBACK语法”。
·BIG_TABLES = {0 | 1}
如果设置为1,所有的临时表被存储在磁盘中,而不是存储在储存期中。这样会稍微慢些,但是对于需要一个大型临时表的SELECT操作,不会发生The table tbl_name is full错误。对于一个新连接,默认值为0(使用存储器内部临时表)。通常,您不必设置此变量,因为根据需要,存储器内部表会被自动转换为以磁盘为基础的表。(注释:本变量以前被命名为SQL_BIG_TABLES。)
·CHARACTER SET {charset_name | DEFAULT}
本语句使用给定的映射为所有来自客户端和指向客户端的字符串建立映射。您可以通过在MySQL源分布中编辑sql/convert.cc来添加新的映射。SET CHARACTER SET用于设定三个会话系统变量:character_set_client和character_set_results被设置为给定的字符集,character_set_connection被设置为character_set_database值。
可以通过使用DEFAULT值恢复默认的映射。
注意,SET CHARACTER SET的语法与设置其它选项的语法不同。
·FOREIGN_KEY_CHECKS = {0 | 1}
如果设置为1(默认情况),则检查InnoDB表的外键限制条件。如果设置为0,则限制条件被忽略。如果重新载入InnoDB表时按照的顺序与上级/下级目录所要求的顺序不同,此时禁用外键检查是有用的。请参见15.2.6.4节,“FOREIGN KEY约束”。
·IDENTITY = value
该变量是LAST_INSERT_ID变量的同义词。该变量的作用是保持与其它数据库兼容。您可以使用SELECT @@IDENTITY读取其值,并可以使用SET IDENTITY设置它。
·INSERT_ID = value
用于设置将被以下INSERT或ALTER TABLE语句使用的值。此值在插入一个AUTO_INCREMENT值时使用。本语句主要和二进制日志同时使用。
·LAST_INSERT_ID = value
用于设定将从LAST_INSERT_ID()被返回的值。当您在用于更新表的语句中使用LAST_INSERT_ID()时,它被存储在二进制日志中。设置此变量不会更新由mysql_insert_id() C API函数返回的值。
·NAMES {'charset_name' | DEFAULT}
SET NAMES用于把三个会话系统变量character_set_client, character_set_connection和character_set_results设置为给定的字符集。把character_set_connection设置为charset_name时,同时把collation_connection设置为charset_name的默认整序。
使用一个DEFAULT值可以恢复默认的映射。
注意,SET NAMES的语法与用于设置其它选项的语法不同。
·ONE_SHOT
这不是一个服务器系统变量,但是它可以被用来影响用于设置字符集、整序和时区的变量的效果。ONE_SHOT主要被用于复制:mysqlbinlog使用SET ONE_SHOT来暂时地修改字符集、整序和时区变量的值,以反映出它们原先的值。
您不能在使用ONE_SHOT时使用除允许的变量以外的变量;如果您这么做,您会得到如下错误:
mysql> SET ONE_SHOT max_allowed_packet = 1;
ERROR 1382 (HY000): The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server
如果同时使用ONE_SHOT和被允许的变量,则会根据要求更改变量,但是会在下一个语句后,重新设置所有的字符集、整序和与时区有关的服务器系统变量。唯一的例外是,当下一个语句是SET语句时,不会进行重新设置。换句话说,在下一个非SET语句之后,才会进行重新设置。例如:
mysql> SET ONE_SHOT character_set_connection = latin5;
mysql> SET ONE_SHOT collation_connection = latin5_turkish_ci;
mysql> SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| character_set_connection | latin5 |
| collation_connection | latin5_turkish_ci |
+--------------------------+-------------------+
mysql> SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| character_set_connection | latin1 |
| collation_connection | latin1_swedish_ci |
+--------------------------+-------------------+
·SQL_NOTES = {0 | 1}
当设置为1时(默认情况),“注意”一级的警报被记录下来。当设置为0时,“注意”警告被压制。Mysqldump包含输出,用于把此变量设置为0,这样,对于不会影响重新载入操作整体性的事件,重新载入转储文件时不会产生警告。
·SQL_AUTO_IS_NULL = {0 | 1}
如果设置为1(默认情况),您可以通过使用以下结构查找包含一个AUTO_INCREMENT列的表的最后插入的行:
WHERE auto_increment_column IS NULL
此性质被有些ODBC程序,比如Access使用。
·SQL_BIG_SELECTS = {0 | 1}
如果设定为0,则MySQL会放弃有可能会花很长时间来执行的SELECT语句(也就是,对于这些语句,优化程序估算被检查的行的数目超过了max_join_size的值)。当一个不妥当的WHERE语句被发布后,本语句有用。一个新连接的默认值为1,这可以允许所有的SELECT语句。
如果您把max_join_size系统变量设置为除DEFAULT以外的值,则SQL_BIG_SELECTS被设置为0。
·SQL_BUFFER_RESULT = {0 | 1}
SQL_BUFFER_RESULT会迫使来自SELECT语句的结果被放入临时表中。这可以帮助MySQL早点解除表锁定。当需要花较长时间把结果发送给客户端时,这是有好处的。
·SQL_LOG_BIN = {0 | 1}
如果设置为0,则客户端的二进制日志中不会记录日志。客户端必须拥有SUPER权限来设置此选项。
·SQL_LOG_OFF = {0 | 1}
如果设置为1,则此客户端的总查询日志中不会记录日志。客户端必须拥有SUPER权限来设置此选项。
·SQL_LOG_UPDATE = {0 | 1}
不赞成使用本变量。本变量被映射到SQL_LOG_BIN。
·SQL_QUOTE_SHOW_CREATE = {0 | 1}
如果设置为1,则SHOW CREATE TABLE会对表和列的名称加引号。如果设置为0,则加引号操作被禁用。默认情况下,本选项被启用,因此对于含有需要加引号的名称的表,复制操作起作用。请参见13.5.4.5节,“SHOW CREATE TABLE语法”。
·SQL_SAFE_UPDATES = {0 | 1}
如果设置为1,则MySQL会放弃在WHERE子句或LIMIT子句中不使用关键字的UPDATE或DELETE语句。这样,当关键字使用不正确时,也有可能理解UPDATE或DELETE语句。这样就可以更改或删除大量的行。
·SQL_SELECT_LIMIT = {value | DEFAULT}
从SELECT语句返回的记录的最大数目。对于一个新连接,默认值是“unlimited”。如果您更改了限值,可以使用SQL_SELECT_LIMIT DEFAULT值恢复默认值。
如果SELECT有一个LIMIT子句,则LIMIT优先于SQL_SELECT_LIMIT值。
SQL_SELECT_LIMT不适用于在被存储的子程序中执行的SELECT语句。它也不适用于不会产生将被返回到客户端的结果集合的SELECT语句。这些包括子查询中的SELECT语句,CREATE TABLE...SELECT和INSERT INTO...SELECT。
·SQL_WARNINGS = {0 | 1}
本变量用于控制当出现警告时,单行INSERT语句是否产生一个信息字符串。默认值为0。把值设置为1,来产生一个信息字符串。
·TIMESTAMP = {timestamp_value | DEFAULT}
用于为此客户端设置时间。当您使用二进制日志来恢复行时,本语句用于得到原始的时间标记。timestamp_value应为一个Unix时间标记,而不是MySQL时间标记。
·UNIQUE_CHECKS = {0 | 1}
如果设置为1(默认情况),则会对InnoDB表中的二级索引执行唯一性检查。如果设置为0,则对于被插入到InnoDB的插入缓冲器中的索引登录项,不执行唯一性检查。如果您可以肯定您的数据不违反唯一性要求,则您可以把此值设定为0,以加快向InnoDB导入大型表的速度。
13.5.4. SHOW语法
- 13.5.4.1. SHOW CHARACTER SET语法
- 13.5.4.2. SHOW COLLATION语法
- 13.5.4.3. SHOW COLUMNS语法
- 13.5.4.4. SHOW CREATE DATABASE语法
- 13.5.4.5. SHOW CREATE TABLE语法
- 13.5.4.6. SHOW DATABASES语法
- 13.5.4.7. SHOW ENGINE语法
- 13.5.4.8. SHOW ENGINES语法
- 13.5.4.9. SHOW ERRORS语法
- 13.5.4.10. SHOW GRANTS语法
- 13.5.4.11. SHOW INDEX语法
- 13.5.4.12. SHOW INNODB STATUS语法
- 13.5.4.13. SHOW LOGS语法
- 13.5.4.14. SHOW OPEN TABLES语法
- 13.5.4.15. SHOW PRIVILEGES语法
- 13.5.4.16. SHOW PROCESSLIST语法
- 13.5.4.17. SHOW STATUS语法
- 13.5.4.18. SHOW TABLE STATUS语法
- 13.5.4.19. SHOW TABLES语法
- 13.5.4.20. SHOW TRIGGERS语法
- 13.5.4.21. SHOW VARIABLES语法
- 13.5.4.22. SHOW WARNINGS语法
SHOW有多种形式,可以提供有关数据库、表、列或服务器状态的信息。本节叙述以下内容:
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW CREATE DATABASE db_name
SHOW CREATE TABLE tbl_name
SHOW DATABASES [LIKE 'pattern']
SHOW ENGINE engine_name {LOGS | STATUS }
SHOW [STORAGE] ENGINES
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW GRANTS FOR user
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW INNODB STATUS
SHOW [BDB] LOGS
SHOW PRIVILEGES
SHOW [FULL] PROCESSLIST
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
SHOW [OPEN] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TRIGGERS
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW语句还有一些形式,可以提供有关复制型主服务器和从属服务器的信息。这些形式在13.6节,“复制语句”中进行了叙述。
SHOW BINLOG EVENTS
SHOW MASTER LOGS
SHOW MASTER STATUS
SHOW SLAVE HOSTS
SHOW SLAVE STATUS
如果一个给定的SHOW语句的语法包括一个LIKE 'pattern'部分,则'pattern'是一个可以包含SQL‘%’和‘_’通配符的字符串。对于把语句输出值限定为匹配值,本样式是有用的。
13.5.4.1. SHOW CHARACTER SET语法
SHOW CHARACTER SET [LIKE 'pattern']
SHOW CHARACTER SET语句用于显示所有可用的字符集。该语句取一个自选的LIKE子句。该子句指示哪些字符集名称可以匹配。举例说明:
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 |
+---------+-----------------------------+-------------------+--------+
Maxlen列显示用于存储一个字符的最大的字节数目。
13.5.4.2. SHOW COLLATION语法
SHOW COLLATION [LIKE 'pattern']
来自SHOW COLLATION的输出包括所有可用的字符集。该语句取一个自选的LIKE子句。该子句的pattern指示哪些整序名称可以匹配。举例说明:
mysql> SHOW COLLATION LIKE 'latin1%';
+-------------------+---------+----+---------+----------+---------+
| Collation | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1 | 5 | | | 0 |
| latin1_swedish_ci | latin1 | 8 | Yes | Yes | 0 |
| latin1_danish_ci | latin1 | 15 | | | 0 |
| latin1_german2_ci | latin1 | 31 | | Yes | 2 |
| latin1_bin| latin1 | 47 | | Yes | 0 |
| latin1_general_ci | latin1 | 48 | | | 0 |
| latin1_general_cs | latin1 | 49 | | | 0 |
| latin1_spanish_ci | latin1 | 94 | | | 0 |
+-------------------+---------+----+---------+----------+---------+
Default列指示对于其字符集,整序值是否是默认值。Compiled指示字符集是否被编辑到服务器中。Sortlen与对字符串(在字符集中表达)分类所需的存储器的数量有关。
13.5.4.3. SHOW COLUMNS语法
SHOW [FULL] COLUMNS FROM tbl_name [FROM db_name] [LIKE 'pattern']
SHOW COLUMNS显示在一个给定表中的各列的信息。对于试图,本语句也起作用。
如果列类型与根据您的CREATE TABLE语句所预期的列类型不同,则需注意,当您创建或更改表时,MySQL有时会更改列类型。出现这种情况的条件在13.1.5.1节,“沉寂的列规格变更”中进行了描述。
FULL关键词会使得输出中包含您拥有的权限,并包含对每一列各自的评注。
您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的另一种形式。换句话说,这两个语句是等价的:
mysql> SHOW COLUMNS FROM mytable FROM mydb;
mysql> SHOW COLUMNS FROM mydb.mytable;
SHOW FIELDS是SHOW COLUMNS的同义词。您也可以使用mysqlshow db_name tbl_name命令列举表的各列。
DESCRIBE语句提供与SHOW COLUMNS相近的信息。请参见13.3.1节,“DESCRIBE语法(获取关于列的信息)”。
13.5.4.4. SHOW CREATE DATABASE语法
SHOW CREATE {DATABASE | SCHEMA} db_name
显示用于创建给定数据库CREATE DATABASE语句。也可以使用SHOW CREATE SCHEMA。
mysql> SHOW CREATE DATABASE test\G
*************************** 1. row ***************************
Database: test
Create Database: CREATE DATABASE `test`
/*!40100 DEFAULT CHARACTER SET latin1 */
mysql> SHOW CREATE SCHEMA test\G
*************************** 1. row ***************************
Database: test
Create Database: CREATE DATABASE `test`
/*!40100 DEFAULT CHARACTER SET latin1 */
13.5.4.5. SHOW CREATE TABLE语法
SHOW CREATE TABLE tbl_name
显示用于创建给定表的CREATE TABLE语句。本语句对视图也起作用。
mysql> SHOW CREATE TABLE t\G
*************************** 1. row ***************************
Table: t
Create Table: CREATE TABLE t (
id INT(11) default NULL auto_increment,
s char(60) default NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM
根据SQL_QUOTE_SHOW_CREATE选项,SHOW CREATE TABLE会对表名称和列名称加引号。请参见13.5.3节,“SET语法”。
13.5.4.6. SHOW DATABASES语法
SHOW {DATABASES | SCHEMAS} [LIKE 'pattern']
SHOW DATABASES可以在MySQL服务器主机上列举数据库。您也可以使用mysqlshow命令得到此清单。您只能看到您拥有某些权限的数据库,除非您拥有全局SHOW DATABASES权限。
如果服务器以--skip-show-database选项为起始,则您根本不能使用本语句,除非您拥有SHOW DATABASES权限。
也可以使用SHOW SCHEMAS。
13.5.4.7. SHOW ENGINE语法
SHOW ENGINE engine_name {LOGS | STATUS }
SHOW ENGINE显示存储引擎的日志或状态信息。目前支持以下语句:
SHOW ENGINE BDB LOGS
SHOW ENGINE INNODB STATUS
SHOW ENGINE BDB LOGS显示原有BDB日志文件的状态信息。它会返回以下字段:
·File
通向日志文件的完整路径。
·Type
日志文件类型(用于Berkeley DB日志文件的BDB)。
·Status
日志文件的状态(如果文件可以被取消,则为FREE。如果文件被事务子系统需要,则为IN USE)
SHOW ENGINE INNODB STATUS显示InnoDB存储引擎状态的全面信息。
这些语句的旧的同义词(现在不赞成使用)是SHOW [BDB] LOGS和SHOW INNODB STATUS。
SHOW ENGINE可以从MySQL 4.1.2起使用。
13.5.4.8. SHOW ENGINES语法
SHOW [STORAGE] ENGINES
SHOW ENGINES显示存储引擎的状态信息。对于检查一个存储引擎是否被支持,或者对于查看默认引擎是什么,本语句十分有用。SHOW TABLE TYPES是同义词,但不赞成使用。
mysql> SHOW ENGINES\G*************************** 1. row *************************** Engine: MyISAMSupport: DEFAULTComment: Default engine as of MySQL 3.23 with great performance*************************** 2. row *************************** Engine: MEMORYSupport: YESComment: Hash based, stored in memory, useful for temporary tables*************************** 3. row *************************** Engine: HEAPSupport: YESComment: Alias for MEMORY*************************** 4. row *************************** Engine: MERGESupport: YESComment: Collection of identical MyISAM tables*************************** 5. row *************************** Engine: MRG_MYISAMSupport: YESComment: Alias for MERGE*************************** 6. row *************************** Engine: ISAMSupport: NOComment: Obsolete storage engine, now replaced by MyISAM*************************** 7. row *************************** Engine: MRG_ISAMSupport: NOComment: Obsolete storage engine, now replaced by MERGE*************************** 8. row *************************** Engine: InnoDBSupport: YESComment: Supports transactions, row-level locking, and foreign keys*************************** 9. row *************************** Engine: INNOBASESupport: YESComment: Alias for INNODB*************************** 10. row *************************** Engine: BDBSupport: NOComment: Supports transactions and page-level locking*************************** 11. row *************************** Engine: BERKELEYDBSupport: NOComment: Alias for BDB*************************** 12. row *************************** Engine: NDBCLUSTERSupport: DISABLEDComment: Clustered, fault-tolerant, memory-based tables*************************** 13. row *************************** Engine: NDBSupport: DISABLEDComment: Alias for NDBCLUSTER*************************** 14. row *************************** Engine: EXAMPLESupport: NOComment: Example storage engine*************************** 15. row *************************** Engine: ARCHIVESupport: YESComment: Archive storage engine*************************** 16. row *************************** Engine: CSVSupport: YESComment: CSV storage engine*************************** 17. row *************************** Engine: FEDERATEDSupport: NOComment: Federated MySQL storage engine*************************** 18. row *************************** Engine: BLACKHOLESupport: YESComment: /dev/null storage engine (anything you write to it disappears)
Support值指示某个存储引擎是否被支持,并指示哪个是默认引擎。例如,如果服务器以--default-table-type=InnoDB选项为起始,则InnoDB行的Support值为DEFAULT值。请参见第15章:存储引擎和表类型。
13.5.4.9. SHOW ERRORS语法
SHOW ERRORS [LIMIT [offset,] row_count]
SHOW COUNT(*) ERRORS
本语句与SHOW WARNINGS接近,不过该语句只显示错误,不同时显示错误、警告和注意。
LIMIT子句与SELECT语句具有相同的语法,请参见13.2.7节,“SELECT语法”。
SHOW COUNT(*) ERRORS语句显示错误的数目。您也可以从error_count变量中找回此数目:
SHOW COUNT(*) ERRORS;
SELECT @@error_count;
要了解更多信息,请参见13.5.4.22节,“SHOW WARNINGS语法”。
13.5.4.10. SHOW GRANTS语法
SHOW GRANTS FOR user
本语句列出了在为MySQL用户账户复制权限时必须发布的GRANT语句。
mysql> SHOW GRANTS FOR 'root'@'localhost';
+---------------------------------------------------------------------+
| Grants for root@localhost |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
+---------------------------------------------------------------------+
要对当前的会话列出权限,您可以使用以下语句之一:
SHOW GRANTS;
SHOW GRANTS FOR CURRENT_USER;
SHOW GRANTS FOR CURRENT_USER();
13.5.4.11. SHOW INDEX语法
SHOW INDEX FROM tbl_name [FROM db_name]
SHOW INDEX会返回表索引信息。其格式与ODBC中的SQLStatistics调用相似。
SHOW INDEX会返回以下字段:
·Table
表的名称。
·Non_unique
如果索引不能包括重复词,则为0。如果可以,则为1。
·Key_name
索引的名称。
·Seq_in_index
索引中的列序列号,从1开始。
·Column_name
列名称。
·Collation
列以什么方式存储在索引中。在MySQL中,有值‘A’(升序)或NULL(无分类)。
·Cardinality
索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机会就越大。
·Sub_part
如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL。
·Packed
指示关键字如何被压缩。如果没有被压缩,则为NULL。
·Null
如果列含有NULL,则含有YES。如果没有,则该列含有NO。
·Index_type
用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。
·Comment
多种评注。
您可以使用db_name.tbl_name作为tbl_name FROM db_name语法的另一种形式。这两个语句是等价的:
mysql> SHOW INDEX FROM mytable FROM mydb;
mysql> SHOW INDEX FROM mydb.mytable;
SHOW KEYS是SHOW INDEX的同义词。您也可以使用mysqlshow -k db_nametbl_name命令列举一个表的索引。
13.5.4.12. SHOW INNODB STATUS语法
SHOW INNODB STATUS
在MySQL 5.1中,这是SHOW ENGINE INNODB STATUS的同义词,但不赞成使用。请参见13.5.4.7节,“SHOW ENGINE语法”。
13.5.4.13. SHOW LOGS语法
SHOW [BDB] LOGS
在MySQL 5.1中,这是SHOW ENGINE BDB LOGS的同义词,但是不赞成使用。请参见13.5.4.7节,“SHOW ENGINE语法”。
13.5.4.14. SHOW OPEN TABLES语法
SHOW OPEN TABLES [FROM db_name] [LIKE 'pattern']
SHOW OPEN TABLES列举在表缓存中当前被打开的非TEMPORARY表。请参见7.4.9节,“MySQL如何打开和关闭表”。
SHOW OPEN TABLES会返回以下字段:
·Database
含有该表的数据库。
·Table
表名称。
·In_use
表当前被查询使用的次数。如果该数为零,则表是打开的,但是当前没有被使用。
·Name_locked
表名称是否被锁定。名称锁定用于取消表或对表进行重命名等操作。
13.5.4.15. SHOW PRIVILEGES语法
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: Functions,Procedures
Comment: To use CREATE FUNCTION/PROCEDURE
*************************** 5. row ***************************
Privilege: Create temporary tables
Context: Databases
Comment: To use CREATE TEMPORARY TABLE
*************************** 6. row ***************************
Privilege: Create view
Context: Tables
Comment: To create new views
*************************** 7. row ***************************
Privilege: Create user
Context: Server Admin
Comment: To create new users
*************************** 8. row ***************************
Privilege: Delete
Context: Tables
Comment: To delete existing rows
*************************** 9. row ***************************
Privilege: Drop
Context: Databases,Tables
Comment: To drop databases, tables, and views
*************************** 10. row ***************************
Privilege: Execute
Context: Functions,Procedures
Comment: To execute stored routines
*************************** 11. row ***************************
Privilege: File
Context: File access on server
Comment: To read and write files on the server
*************************** 12. row ***************************
Privilege: Grant option
Context: Databases,Tables,Functions,Procedures
Comment: To give to other users those privileges you possess
*************************** 13. row ***************************
Privilege: Index
Context: Tables
Comment: To create or drop indexes
*************************** 14. row ***************************
Privilege: Insert
Context: Tables
Comment: To insert data into tables
*************************** 15. row ***************************
Privilege: Lock tables
Context: Databases
Comment: To use LOCK TABLES (together with SELECT privilege)
*************************** 16. row ***************************
Privilege: Process
Context: Server Admin
Comment: To view the plain text of currently executing queries
*************************** 17. row ***************************
Privilege: References
Context: Databases,Tables
Comment: To have references on tables
*************************** 18. row ***************************
Privilege: Reload
Context: Server Admin
Comment: To reload or refresh tables, logs and privileges
*************************** 19. row ***************************
Privilege: Replication client
Context: Server Admin
Comment: To ask where the slave or master servers are
*************************** 20. row ***************************
Privilege: Replication slave
Context: Server Admin
Comment: To read binary log events from the master
*************************** 21. row ***************************
Privilege: Select
Context: Tables
Comment: To retrieve rows from table
*************************** 22. row ***************************
Privilege: Show databases
Context: Server Admin
Comment: To see all databases with SHOW DATABASES
*************************** 23. row ***************************
Privilege: Show view
Context: Tables
Comment: To see views with SHOW CREATE VIEW
*************************** 24. row ***************************
Privilege: Shutdown
Context: Server Admin
Comment: To shut down the server
*************************** 25. row ***************************
Privilege: Super
Context: Server Admin
Comment: To use KILL thread, SET GLOBAL, CHANGE MASTER, etc.
*************************** 26. row ***************************
Privilege: Update
Context: Tables
Comment: To update existing rows
*************************** 27. row ***************************
Privilege: Usage
Context: Server Admin
Comment: No privileges - allow connect only
13.5.4.16. SHOW PROCESSLIST语法
SHOW [FULL] PROCESSLIST
SHOW PROCESSLIST显示哪些线程正在运行。您也可以使用mysqladmin processlist语句得到此信息。如果您有SUPER权限,您可以看到所有线程。否则,您只能看到您自己的线程(也就是,与您正在使用的MySQL账户相关的线程)。请参见13.5.5.3节,“KILL语法”。如果您不使用FULL关键词,则只显示每个查询的前100个字符。
本语句报告TCP/IP连接的主机名称(采用host_name:client_port格式),以方便地判定哪个客户端正在做什么。
如果您得到“too many connections”错误信息,并且想要了解正在发生的情况,本语句是非常有用的。MySQL保留一个额外的连接,让拥有SUPER权限的账户使用,以确保管理员能够随时连接和检查系统(假设您没有把此权限给予所有的用户)。
在来自SHOW PROCESSLIST的输出中常见的一些状态:
·Checking table
线程正在执行(自动)表格检查。
·Closing tables
意味着线程正在刷新更改后的表数据,并正在关闭使用过的表。这应该是一个快速的操作。如果不快,则您应该验证您的磁盘没有充满,并且磁盘没有被超负荷使用。
·Connect Out
连接到主服务器上的从属服务器。
·Copying to tmp table on disk
临时结果集合大于tmp_table_size。线程把临时表从存储器内部格式改变为磁盘模式,以节约存储器。
·Creating tmp table
线程正在创建一个临时表,以保持部分结果。
·deleting from main table
服务器正在执行多表删除的第一部分,只从第一个表中删除。
·deleting from reference tables
服务器正在执行多表删除的第二部分,从其它表中删除匹配的行。
·Flushing tables
线程正在执行FLUSH TABLES,并正在等待所有线程,以关闭表。
·FULLTEXT initialization
服务器正在准备执行一个自然语言全文本搜索。
·Killed
有人已经向线程发送了一个KILL命令。在下一次检查终止标记时,应放弃。该标记在MySQL的每个大循环中都检查,但是在有些情况下,线程终止只需要较短的时间。如果该线程被其它线程锁定,则只要其它线程接触锁定,终止操作就会生效。
·Locked
该查询被其它查询锁定。
·Sending data
线程正在为SELECT语句处理行,同时正在向客户端发送数据。
·Sorting for group
线程正在进行分类,以满足GROUP BY要求。
·Sorting for order
线程正在进行分类,以满足ORDER BY要求。
·Opening tables
线程正在试图打开一个表。这应该是非常快的过程,除非打开操作受到阻止。例如,一个ALTER TABLE或一个LOCK TABLE语句可以阻止打开一个表,直到语句完成为止。
·Removing duplicates
查询正在使用SELECT DISTINCT。使用时,在早期阶段,MySQL不能优化不同的操作。因此,MySQL要求一个额外的阶段,以便在把结果发送给客户端之前取消所有的复制行。
·Reopen table
线程得到一个表锁定,但是在得到锁定后被通知带下方的表结构已更改了。它已经释放了锁定,关闭了表,并试图重新打开它。
·Repair by sorting
修复代码正在使用一个分类来创建索引。
·Repair with keycache
修复代码正在通过关键缓存一个接一个地使用创建关键字。这比通过分类修复要慢很多。
·Searching rows for update
线程正在进行第一阶段,以在更新之前,查找所有匹配的行。如果UPDATE正在更改用于查找相关行的索引,则必须这么做。
·Sleeping
线程正在等待客户端,以向它发送一个新语句。
·System lock
线程正在等待得到一个用于表的外部系统锁定。如果您没有正在使用多个正在访问同一个表的mysqld服务器,则您可以使用--skip-external-locking选项禁用系统锁定。
·Upgrading lock
INSERT DELAYED管理程序正在试图得到一个表锁定,以插入行。
·Updating
线程正在搜索行,并正在更新这些行。
·User Lock
线程正在等待GET_LOCK()。
·Waiting for tables
线程得到一个通知,表的底层结构已经改变,需要重新打开表以得到新的结构。但是,为了能重新打开表,必须等待,直到所有其它的线程已经关闭了正在被质询的表。
如果其它线程已经对正在被质询的表使用了FLUSH TABLES或以下语句之一:FLUSH TABLEStbl_name, ALTER TABLE, RENAME TABLE,REPAIR TABLE,ANALYZE TABLE或OPTIMIZE TABLE;则会出现通知。
·waiting for handler insert
INSERT DELAYED管理程序已经处理了所有处于等待状态的插入,并正在等待新插入。
多数状态对应于非常快的操作。如果一个线程在这些状态下停留了数秒,则可能是有问题,需要进行调查。
有一些其它的状态,在前面的清单中没有提及,但是其中有很多状态对于查找服务器中的程序错误是有用的。
13.5.4.17. SHOW STATUS语法
SHOW [GLOBAL | SESSION] STATUS [LIKE 'pattern']
SHOW STATUS提供服务器状态信息。此信息也可以使用mysqladmin extended-status命令获得。
此处显示了局部的输出。对于您的服务器,变量和值的清单可以是不同的。在5.3.4节,“服务器状态变量”中给出了每个变量的意义。
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 |
+--------------------+----------+
使用GLOBAL选项,您可以得到所有MySQL连接的状态值。使用SESSION,您可以得到所有当前连接的状态值。如果您两个选项都不使用,则默认值为SESSION。LOCAL是SESSION的同义词。
注意,有些状态变量只有一个全局值。对于这些变量,使用GLOBAL和SESSION会得到同样的值。
13.5.4.18. SHOW TABLE STATUS语法
SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern']
SHOW TABLE STATUS的性质与SHOW TABLE类似,不过,可以提供每个表的大量信息。您也可以使用mysqlshow --status db_name命令得到此清单。
本语句也显示视图信息。
对于NDB Cluster表,本语句的输出显示Avg_row_length和Data_length列的适当值,不过BLOB列没有被考虑进来。另外,复制数量在Comment列中显示(作为number_of_replicas)。
SHOW TABLE STATUS会返回以下字段:
·Name
表的名称。
·Engine
表的存储引擎。在MySQL 4.1.2之前,本值被标记为Type。请参见第15章:存储引擎和表类型。
·Version
表的.frm文件的版本号。
·Row_format
行存储格式(Fixed,Dynamic,Compressed,Redundant,Compact)。InnoDB表的格式被报告为Redundant或Compact。
·Rows
行的数目。部分存储引擎,如MyISAM,存储精确的数目。
对于其它存储引擎,比如InnoDB,本值是一个大约的数,与实际值相差可达40到50%。在这些情况下,使用SELECT COUNT(*)来获得准确的数目。
对于在INFORMATION_SCHEMA数据库中的表,Rows值为NULL。
·Avg_row_length
平均的行长度。
·Data_length
数据文件的长度。
·Max_data_length
数据文件的最大长度。如果给定了数据指针的大小,这是可以被存储在表中的数据的字节总数。
·Index_length
索引文件的长度。
·Data_free
被整序,但是未使用的字节的数目。
·Auto_increment
下一个AUTO_INCREMENT值。
·Create_time
什么时候表被创建。
·Update_time
什么时候数据文件被最后一次更新。
·Check_time
什么时候表被最后一次检查。不是所有的存储引擎此时都更新,在此情况下,值为NULL。
·Collation
表的字符集和整序。
·Checksum
活性校验和值。
·Create_options
和CREATE TABLE同时使用的额外选项。
·Comment
创建表时使用的评注(或者有关为什么MySQL可以访问表信息的说明)。
在表评注中,InnoDB表报告表所属的表空间的空闲空间。对于一个位于共享表空间中的表,这是共享表空间中的空闲空间。如果您正在使用多个表空间,并且该表有自己的表空间,则空闲空间只用于此表。
对于MEMORY (HEAP)表,Data_length, Max_data_length和Index_length值近似于被整序的存储器的实际值。整序算法预留了大量的存储器,以减少整序操作的数量。
对于视图,由SHOW TABLE STATUS显示的所有字段均为NULL。例外情况是Name指示为视图名称同时Comment称为视图。
13.5.4.19. SHOW TABLES语法
SHOW [FULL] TABLES [FROM db_name] [LIKE 'pattern']
SHOW TABLES列举了给定数据库中的非TEMPORARY表。您也可以使用mysqlshowdb_name命令得到此清单。
本命令也列举数据库中的其它视图。支持FULL修改符,这样SHOW FULL TABLES就可以显示第二个输出列。对于一个表,第二列的值为BASE TABLE;对于一个视图,第二列的值为VIEW。
注释:如果您对于一个表没有权限,则该表不会在来自SHOW TABLES或的mysqlshow db_name输出中显示。
13.5.4.20. SHOW TRIGGERS语法
SHOW TRIGGERS [FROM db_name] [LIKE expr]
SHOW TRIGGERS列出了目前被MySQL服务器定义的触发程序。
对于在21.3节,“使用触发程序”中定义的触发程序ins_sum,本语句的输出显示如下:
mysql> SHOW TRIGGERS LIKE 'acc%';
+---------+--------+---------+-------------------------------+--------+---------+
| Trigger | Event | Table | Statement | Timing | Created |
+---------+--------+---------+-------------------------------+--------+---------+
| ins_sum | INSERT | account | SET @sum = @sum + NEW.amount | BEFORE | NULL |
+---------+--------+---------+-------------------------------+--------+---------+
注释:当使用一个含有SHOW TRIGGERS的LIKE子句时,待匹配的表达式(expr)会与触发程序定义时所在的表的名称相比较,而不与触发程序的名称相比较:
mysql> SHOW TRIGGERS LIKE 'ins%';
Empty set (0.01 sec)
对本语句输出中的各列的简要解释如下:
·Trigger: 触发程序的名称。
·Event: 调用触发程序的时间。必须为'INSERT','UPDATE'或 'DELETE'.之一。
·Table: 触发程序定义时对应的表。
·Statement: 当触发程序被调用时执行的语句。这与在INFORMATION_SCHEMA.TRIGGERS的ACTION_STATEMENT列中显示的文本一样。
·Timing:'BEFORE'或'AFTER'两个值之一。
·Created: 目前,本列的值为NULL。
为了执行SHOW TRIGGERS,您必须拥有SUPER权限。
同时也见23.1.16节,“INFORMATION_SCHEMA TRIGGERS表”。
13.5.4.21. SHOW VARIABLES语法
SHOW [GLOBAL | SESSION] VARIABLES [LIKE 'pattern']
SHOW VARIABLES显示了部门MySQL系统变量的值。本信息也可以使用mysqladmin variables命令获得。
使用GLOBAL选项,您可以获得被用于MySQL新连接的值。使用SESSION,您可以得到对于当前连接起效的值。如果您两个选项都不使用,默认值为SESSION。
LOCAL是SESSION的同义词。
如果默认值不合适,当mysqld启动时或在SET语句运行过程中,您可以使用命令行选项设置多数的这类变量。请参见5.3.1节,“mysqld命令行选项”和13.5.3节,“SET语法。
此处显示了部分的输出。对于您的服务器,变量和值的清单会有所不同。在5.3.3节,“服务器系统变量”中给出了每个变量的意义。在7.5.2节,“调节服务器参数”中提供了有关调整变量的信息。
mysql> SHOW VARIABLES;
+---------------------------------+-----------------------------------------------+
| Variable_name | Value |
+---------------------------------+-----------------------------------------------+
| auto_increment_increment| 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log| 50 |
| basedir | /home/jon/bin/mysql-5.1/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1|
| character_set_connection| latin1|
... ...
| max_user_connections | 0 |
| max_write_lock_count | 4294967295 |
| multi_range_count | 256 |
| myisam_data_pointer_size| 6 |
| myisam_max_sort_file_size | 2147483647 |
| myisam_recover_options | OFF |
| myisam_repair_threads | 1 |
| myisam_sort_buffer_size | 8388608 |
| ndb_autoincrement_prefetch_sz | 32 |
| ndb_cache_check_time | 0 |
| ndb_force_send | ON |
... ... ...
| time_zone | SYSTEM|
| timed_mutexes | OFF |
| tmp_table_size | 33554432 |
| tmpdir | |
| transaction_alloc_block_size | 8192 |
| transaction_prealloc_size | 4096 |
| tx_isolation | REPEATABLE-READ |
| updatable_views_with_limit | YES |
| version | 5.1.2-alpha-log |
| version_comment | Source distribution |
| version_compile_machine | i686 |
| version_compile_os | suse-linux |
| wait_timeout | 28800 |
+---------------------------------+-----------------------------------------------+
使用LIKE子句,本语句只显示与样式相匹配的变量:
mysql> SHOW VARIABLES LIKE 'have%';
+-----------------------+----------+
| Variable_name | Value |
+-----------------------+----------+
| have_archive | YES |
| have_bdb | NO |
| have_blackhole_engine | YES |
| have_compress | YES |
| have_crypt | YES |
| have_csv | YES |
| have_example_engine | NO |
| have_federated_engine | NO |
| have_geometry | YES |
| have_innodb | YES |
| have_isam | NO |
| have_ndbcluster | DISABLED |
| have_openssl | NO |
| have_partition_engine | YES |
| have_query_cache | YES |
| have_raid | NO |
| have_rtree_keys | YES |
| have_symlink | YES |
+-----------------------+----------+
13.5.4.22. SHOW WARNINGS语法
SHOW WARNINGS [LIMIT [offset,] row_count]
SHOW COUNT(*) WARNINGS
SHOW WARNINGS显示由上一个生成消息的语句导致的错误、警告和注意消息。如果上一个使用表的语句未生成消息,则什么也不显示。SHOW ERRORS是其相关语句,只显示错误。请参见13.5.4.9节,“SHOW ERRORS语法”。
对于使用一个表的每个新语句,消息清单均重新设置。
SHOW COUNT(*) WARNINGS语句显示错误、警告和注意的总数。您也可以从warning_count变量中找回此数目。
SHOW COUNT(*) WARNINGS;
SELECT @@warning_count;
如果max_error_count系统变量设置得过低,以致于有的消息没有被存储,则warning_count值可能比由SHOW WARNINGS显示的消息数目要大。本节后部显示的例子展示了这类情况是如何发生的。
LIMIT子句具有与SELECT语句相同的语法。请参见13.2.7节,“SELECT语法”。
MySQL服务器会发回由上一个语句引起的错误、警告和注意的总数。如果您正在使用C API,则此值可以通过调用mysql_warning_count()来获得。请参见25.2.3.69节,“mysql_warning_count()”。
对于如LOAD DATA INFILE等语句和如INSERT, UPDATE, CREATE TABLE和ALTER TABLE等DML语句,会生成警告。
以下DROP TABLE语句会导致一个注意:
mysql> DROP TABLE IF EXISTS no_such_table;
mysql> SHOW WARNINGS;
+-------+------+-------------------------------+
| Level | Code | Message |
+-------+------+-------------------------------+
| Note | 1051 | Unknown table 'no_such_table' |
+-------+------+-------------------------------+
以下是一个简单的例子,显示了对于CREATE TABLE的一个语法警告,和对于INSERT的转换警告:
mysql> CREATE TABLE t1 (a TINYINT NOT NULL, b CHAR(4)) TYPE=MyISAM;
Query OK, 0 rows affected, 1 warning (0.00 sec)
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1287
Message: 'TYPE=storage_engine' is deprecated, use
'ENGINE=storage_engine' instead
1 row in set (0.00 sec)
mysql> INSERT INTO t1 VALUES(10,'mysql'),(NULL,'test'),
-> (300,'Open Source');
Query OK, 3 rows affected, 4 warnings (0.01 sec)
Records: 3 Duplicates: 0 Warnings: 4
mysql> SHOW WARNINGS\G
*************************** 1. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'b' at row 1
*************************** 2. row ***************************
Level: Warning
Code: 1263
Message: Data truncated, NULL supplied to NOT NULL column 'a' at row 2
*************************** 3. row ***************************
Level: Warning
Code: 1264
Message: Data truncated, out of range for column 'a' at row 3
*************************** 4. row ***************************
Level: Warning
Code: 1265
Message: Data truncated for column 'b' at row 3
4 rows in set (0.00 sec)
要存储的错误、警告和注意消息的最大数目由max_error_count系统变量控制。默认情况下,该值为64。要更改您想要存储的信息的数目,需更改max_error_count值。在下面的例子中,ALTER TABLE语句会产生三个警告消息,但是只有一个被存储,因为max_error_count被设置为1:
mysql> SHOW VARIABLES LIKE 'max_error_count';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_error_count | 64 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> SET max_error_count=1;
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> SELECT @@warning_count;
+-----------------+
| @@warning_count |
+-----------------+
| 3 |
+-----------------+
1 row in set (0.01 sec)
mysql> SHOW WARNINGS;
+---------+------+----------------------------------------+
| Level | Code | Message|
+---------+------+----------------------------------------+
| Warning | 1263 | Data truncated for column 'b' at row 1 |
+---------+------+----------------------------------------+
1 row in set (0.00 sec)
要禁用警告,需把max_error_count设置为0。在此情况下,warning_count仍然指示有多少警告已经发生,但是这些消息不被存储。
您可以把SQL_NOTES会话变量设置为0,使“注意”级别的警告不被记录。
13.5.5. 其它管理语句
- 13.5.5.1. CACHE INDEX语法
- 13.5.5.2. FLUSH语法
- 13.5.5.3. KILL语法
- 13.5.5.4. LOAD INDEX INTO CACHE语法
- 13.5.5.5. RESET语法
13.5.5.1. CACHE INDEX语法
CACHE INDEX
tbl_index_list [, tbl_index_list] ...
IN key_cache_name
tbl_index_list:
tbl_name [[INDEX|KEY] (index_name[, index_name] ...)]
CACHE INDEX语句把表索引分配给某个关键缓存。该语句只用于MyISAM表。
下列语句把索引从表t1, t2和t3分配到名为hot_cache的关键缓存:
mysql> CACHE INDEX t1, t2, t3 IN hot_cache;
+---------+--------------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------------+----------+----------+
| test.t1 | assign_to_keycache | status | OK |
| test.t2 | assign_to_keycache | status | OK |
| test.t3 | assign_to_keycache | status | OK |
+---------+--------------------+----------+----------+
CACHE INDEX语法允许您指定,只有来自表的特定索引应被分配给缓存。但是,当前的实施会把所有的表索引分配给缓存,所以必须指定表名称,不能指定其它的。
被引用到CACHE INDEX语句中的关键缓存可以这样创建,即通过使用一个参数设置语句或在服务器参数设置中设置其大小。举例说明:
mysql> SET GLOBAL keycache1.key_buffer_size=128*1024;
关键缓存参数可以被作为一个结构化系统变量的成分进行访问。请参见9.4.1节,“结构式系统变量”。
在您可以把索引分配给一个关键缓存以前,缓存必须存在:
mysql> CACHE INDEX t1 IN non_existent_cache;
ERROR 1284 (HY000): Unknown key cache 'non_existent_cache'
默认情况下,表索引被分配给在服务器启动时被创建的主(默认)键缓存。当一个键高速缓冲被破坏时,所有被分配到此缓存中的索引会再次被分配给默认的键高速缓冲。
索引的分配会对服务器产生全局性影响:如果一个客户端把一个索引分配给一个给定的缓存,则不论什么客户端发布查询,本缓存都被用于所有涉及索引的查询。
13.5.5.2. FLUSH语法
FLUSH [LOCAL | NO_WRITE_TO_BINLOG] flush_option [, flush_option] ...
如果您想要清除MySQL使用的部分内部缓存,您应该使用FLUSH语句。要执行FLUSH,您必须拥有RELOAD权限。
flush_option可以为以下的任何一个:
·HOSTS
用于清空主机缓存表。如果有的主机更改了IP号或如果您得到了错误信息Hosthost_name is blocked,则您应该刷新主机表。当在连接到MySQL服务器时,如果对于一个给定的主机,接连出现错误“多于max_connect_errors”,此时,MySQL会假定出现了错误,并阻止主机后续的连接申请。刷新主机表允许主机尝试再次连接。请参见A.2.5节,“主机的host_name被屏蔽”。您可以使用max_connect_errors=999999999启动mysqld,以避免此错误信息。
·DES_KEY_FILE
用于在服务器启动时,从采用--des-key-file选项指定的文件重新载入DES关键字。
·LOGS
用于关闭并重新打开所有的日志文件。如果您已经指定了一个更新日志文件或一个二进制日志文件,同时没有扩展,则相对于前一个文件,日志文件的扩展号增加1。如果您在文件名称中使用了一个扩展,则MySQL会关闭并重新打开日志文件。在Unix中,当相mysqld服务器发送一个SIGHUP信号时,也会如此(例外情况是部分Mac OS X 10.3版本。在这些版本中,mysqld忽略SIGHUP和SIGQUIT)。
如果服务器使用--log-error选项,则FLUSH LOGS会导致错误日志被重命名(使用后缀-old),同时mysqld会创建一个新的空日志文件。如果没有给定--log-error选项,则不会进行重命名。
·PRIVILEGES
用于从mysql数据库中的授权表重新载入权限。
·QUERY CACHE
对查询缓存进行整理碎片,以更好得利用存储器。与RESET QUERY CACHE不同,本语句不会从缓存中取消任何查询。
·STATUS
用于把多数状态变量重新设置为零。只在当调试查询时,您才应该使用此项。请参见1.7.1.3节,“如何通报缺陷和问题”。
·{TABLE | TABLES} [tbl_name [, tbl_name] ...]
当没有表被命名时,关闭所有打开的表,并迫使所有正在使用的表关闭。这也会刷新查询缓存。此项含有一个或多个表名称,只刷新给定的表。和RESET QUERY CACHE语句一样,FLUSH TABLES还会取消来自查询缓存的所有查询结果。
·TABLES WITH READ LOCK
对于所有带读取锁定的数据库,关闭所有打开的表,并锁定所有的表,直到您执行UNLOCK TABLES为止。如果您拥有一个可以及时进行快照的文件系统,比如Veritas,则这是进行备份的非常方便的方法。
·USER_RESOURCES
用于把所有每小时用户资源重新设置为零。这可以使已经达到了每小时连接、查询或更新限值的客户端立刻重新恢复活性。FLUSH USER_RESOURCES不适用于同时连接的最大限值。请参见13.5.1.3节,“GRANT和REVOKE语法”。
FLUSH语句被写入二进制日志,除非使用了自选的NO_WRITE_TO_BINLOG关键字(或其别名LOCAL)。注释:在任何情况下,FLUSH LOGS,FLUSH MASTER,FLUSH SLAVE和FLUSH TABLES WITH READ LOCK都不会被记入日志,因为如果它们被复制到一个从属服务器上,会导致出现问题。
您也可以使用flush-hosts,flush-logs,flush-privileges,flush-status或flush-tables命令访问含有mysqladmin应用程序的语句。
注释:在MySQL 5.1.2-alpha中,不可能在已存储的函数或触发程序中发布FLUSH语句。不过,您可以在已存储的过程中使用FLUSH,只要它们不会从已存储的函数或触发程序中被调用。请参见I.1节,“对存储子程序和触发程序的限制”。
要了解有关RESET语句与复制同时使用的信息,也可以见13.5.5.5节,“RESET语法”。
13.5.5.3. KILL语法
KILL [CONNECTION | QUERY] thread_id
每个与mysqld的连接都在一个独立的线程里运行,您可以使用SHOW PROCESSLIST语句查看哪些线程正在运行,并使用KILLthread_id语句终止一个线程。
KILL允许自选的CONNECTION或QUERY修改符:
·KILL CONNECTION与不含修改符的KILL一样:它会终止与给定的thread_id有关的连接。
·KILL QUERY会终止连接当前正在执行的语句,但是会保持连接的原状。
如果您拥有PROCESS权限,则您可以查看所有线程。如果您拥有SUPER权限,您可以终止所有线程和语句。否则,您只能查看和终止您自己的线程和语句。
您也可以使用mysqladmin processlist和mysqladmin kill命令来检查和终止线程。
注释:您不能同时使用KILL和Embedded MySQL Server库,因为内植的服务器只运行主机应用程序的线程。它不能创建任何自身的连接线程。
当您进行一个KILL时,对线程设置一个特有的终止标记。在多数情况下,线程终止可能要花一些时间,这是因为终止标记只会在在特定的间隔被检查:
·在SELECT, ORDER BY和GROUP BY循环中,在读取一组行后检查标记。如果设置了终止标记,则该语句被放弃。
·在ALTER TABLE过程中,在每组行从原来的表中被读取前,检查终止标记。如果设置了终止标记,则语句被放弃,临时表被删除。
·在UPDATE或DELETE运行期间,在每个组读取之后以及每个已更行或已删除的行之后,检查终止标记。如果终止标记被设置,则该语句被放弃。注意,如果您正在使用事务,则变更不会被回滚。
·GET_LOCK()会放弃和返回NULL。
·INSERT DELAYED线程会快速地刷新(插入)它在存储器中的所有的行,然后终止。
·如果线程在表锁定管理程序中(状态:锁定),则表锁定被快速地放弃。
·如果在写入调用中,线程正在等待空闲的磁盘空间,则写入被放弃,并伴随"disk full"错误消息。
·警告:对MyISAM表终止一个REPAIR TABLE或OPTIMIZE TABLE操作会导致出现一个被损坏的没有用的表。对这样的表的任何读取或写入都会失败,直到您再次优化或修复它(不中断)。
13.5.5.4. LOAD INDEX INTO CACHE语法
LOAD INDEX INTO CACHE
tbl_index_list [, tbl_index_list] ...
tbl_index_list:
tbl_name
[[INDEX|KEY] (index_name[, index_name] ...)]
[IGNORE LEAVES]
LOAD INDEX INTO CACHE语句会把一个表索引预载入到某个关键缓存中。它已经被一个明确的CACHE INDEX语句分配到此关键缓存中。或者,表索引被预载入到默认的关键缓存中。LOAD INDEX INTO CACHE只用于MyISAM表。
IGNORE LEAVES修改符只会导致索引的非叶子节点被预载入。
对于表t1和t2,以下语句会预载入索引的节点(索引组):
mysql> LOAD INDEX INTO CACHE t1, t2 IGNORE LEAVES;
+---------+--------------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+---------+--------------+----------+----------+
| test.t1 | preload_keys | status | OK |
| test.t2 | preload_keys | status | OK |
+---------+--------------+----------+----------+
本语句会预载入所有来自t1的索引组。它只预载入来自t2的非叶子节点的组。
LOAD INDEX INTO CACHE语法允许您指定,只有来自表的特定的索引应被预载入。但是,当前实施会把所有的表索引预载入缓存中,所以一定要指定表名称,不能指定其它的。
13.5.5.5. RESET语法
RESET reset_option [, reset_option] ...
RESET语句被用于清除不同的服务器操作的状态。它也作为FLUSH语句的更强大的版本。请参见13.5.5.2节,“FLUSH语法”。
为了执行RESET,您必须拥有RELOAD权限。
reset_option可以为以下的任何一项:
·MASTER
可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。(在以前版本的MySQL中,被称为FLUSH MASTER。)见13.6.1节,“用于控制主服务器的SQL语句”。
·QUERY CACHE
从查询缓存中取消所有的查询结果。
·SLAVE
可以使从属服务器忘记其在主服务器二进制日志中的复制位置,另外,也可以通过删除原有的中继日志文件和开始一个新文件来重新设置中继日志。请参见13.6.2节,“用于控制从服务器的SQL语句”。