文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>MySQL 5.1参考手册 :: 13. SQL语句语法(9)

MySQL 5.1参考手册 :: 13. SQL语句语法(9)

时间:2008-05-11  来源:sdccf

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 TABLES tbl_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表。您也可以使用mysqlshow db_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号或如果您得到了错误信息Host host_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语句查看哪些线程正在运行,并使用KILL thread_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语句”。

13.6. 复制语句

13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从服务器的SQL语句 本节叙述了与复制有关的SQL语句。一组语句被用于控制主服务器。其它的被用于控制从属服务器。

13.6.1. 用于控制主服务器的SQL语句

13.6.1.1. PURGE MASTER LOGS语法 13.6.1.2. RESET MASTER语法 13.6.1.3. SET SQL_LOG_BIN语法 13.6.1.4. SHOW BINLOG EVENTS语法 13.6.1.5. SHOW MASTER LOGS语法 13.6.1.6. SHOW MASTER STATUS语法 13.6.1.7. SHOW SLAVE HOSTS语法

可以通过SQL界面控制复制。本节讨论了用于管理主复制服务器的语句。13.6.2节,“用于控制从服务器的SQL语句”讨论了用于管理从属服务器的语句。

13.6.1.1. PURGE MASTER LOGS语法

PURGE {MASTER | BINARY} LOGS TO 'log_name'
PURGE {MASTER | BINARY} LOGS BEFORE 'date'

用于删除列于在指定的日志或日期之前的日志索引中的所有二进制日志。这些日志也会从记录在日志索引文件中的清单中被删除,这样被给定的日志成为第一个。

例如:

PURGE MASTER LOGS TO 'mysql-bin.010';
PURGE MASTER LOGS BEFORE '2003-04-02 22:46:26';

BEFORE变量的date自变量可以为'YYYY-MM-DD hh:mm:ss'格式。MASTER和BINARY是同义词。

如果您有一个活性的从属服务器,该服务器当前正在读取您正在试图删除的日志之一,则本语句不会起作用,而是会失败,并伴随一个错误。不过,如果从属服务器是休止的,并且您碰巧清理了其想要读取的日志之一,则从属服务器启动后不能复制。当从属服务器正在复制时,本语句可以安全运行。您不需要停止它们。

要清理日志,需按照以下步骤:

1.    在每个从属服务器上,使用SHOW SLAVE STATUS来检查它正在读取哪个日志。

2.    使用SHOW MASTER LOGS获得主服务器上的一系列日志。

3.    在所有的从属服务器中判定最早的日志。这个是目标日志。如果所有的从属服务器是更新的,这是清单上的最后一个日志。

4.    制作您将要删除的所有日志的备份。(这个步骤是自选的,但是建议采用。)

5.    清理所有的日志,但是不包括目标日志。

13.6.1.2. RESET MASTER语法

RESET MASTER

可以删除列于索引文件中的所有二进制日志,把二进制日志索引文件重新设置为空,并创建一个新的二进制日志文件。

13.6.1.3. SET SQL_LOG_BIN语法

SET SQL_LOG_BIN = {0|1}

如果客户端使用一个有SUPER权限的账户连接,则可以禁用或启用当前连接的二进制日志记录。如果客户端没有此权限,则语句被拒绝,并伴随有错误。

13.6.1.4. SHOW BINLOG EVENTS语法

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

用于在二进制日志中显示事件。如果您不指定'log_name',则显示第一个二进制日志。

LIMIT子句和SELECT语句具有相同的语法。请参见13.2.7节,“SELECT语法”。

注释:当服务器把二进制日志的完整内容(该日志包括多数的由MySQL执行的查询)转储到stdout时,发布一个不含LIMIT子句的SHOW BINLOG EVENTS可以启动一个过程,该过程非常消耗时间并消耗资源。要把二进制日志保存到一个文本文件中,用于以后的检查和分析,需使用mysqlbinlog应用程序。请参见8.6节,“mysqlbinlog:用于处理二进制日志文件的实用工具”。

13.6.1.5. SHOW MASTER LOGS语法

SHOW MASTER LOGS
SHOW BINARY LOGS

用于列出服务器中的二进制日志文件。本语句被用作13.6.1.1节,“PURGE MASTER LOGS语法”中所述的过程的一部分,用于确定哪些日志可以被清理。

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

SHOW BINARY LOGS与SHOW MASTER LOGS相当。

13.6.1.6. SHOW MASTER STATUS语法

SHOW MASTER STATUS

用于提供主服务器二进制日志文件的状态信息。例如:

mysql > SHOW MASTER STATUS;
+---------------+----------+--------------+------------------+
| File          | Position | Binlog_Do_DB | Binlog_Ignore_DB |
+---------------+----------+--------------+------------------+
| mysql-bin.003 | 73       | test         | manual,mysql     |
+---------------+----------+--------------+------------------+

13.6.1.7. SHOW SLAVE HOSTS语法

SHOW SLAVE HOSTS

用于显示当前使用主服务器注册的复制从属服务器的清单。不以--report-host=slave_name选项为开头的从属服务器不会显示在本清单中。

13.6.2. 用于控制从服务器的SQL语句

13.6.2.1. CHANGE MASTER TO语法 13.6.2.2. LOAD DATA FROM MASTER语法 13.6.2.3. LOAD TABLE tbl_name FROM MASTER语法 13.6.2.4. MASTER_POS_WAIT()语法 13.6.2.5. RESET SLAVE语法 13.6.2.6. SET GLOBAL SQL_SLAVE_SKIP_COUNTER语法 13.6.2.7. SHOW SLAVE STATUS语法 13.6.2.8. START SLAVE语法 13.6.2.9. STOP SLAVE语法
 

复制操作可以通过SQL界面控制。本节讨论了用于管理从属复制服务器的语句。13.6.1节,“用于控制主服务器的SQL语句”讨论了用于管理主服务器的语句。

13.6.2.1. CHANGE MASTER TO语法

  CHANGE MASTER TO master_def [, master_def] ...
 
master_def:
      MASTER_HOST = 'host_name'
    | MASTER_USER = 'user_name'
    | MASTER_PASSWORD = 'password'
    | MASTER_PORT = port_num
    | MASTER_CONNECT_RETRY = count
    | MASTER_LOG_FILE = 'master_log_name'
    | MASTER_LOG_POS = master_log_pos
    | RELAY_LOG_FILE = 'relay_log_name'
    | RELAY_LOG_POS = relay_log_pos
    | MASTER_SSL = {0|1}
    | MASTER_SSL_CA = 'ca_file_name'
    | MASTER_SSL_CAPATH = 'ca_directory_name'
    | MASTER_SSL_CERT = 'cert_file_name'
    | MASTER_SSL_KEY = 'key_file_name'
    | MASTER_SSL_CIPHER = 'cipher_list'

可以更改从属服务器用于与主服务器进行连接和通讯的参数。

MASTER_USER, MASTER_PASSWORD, MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY和MASTER_SSL_CIPHER用于向从属服务器提供有关如何与主服务器连接的信息。

即使对于在编译时没有SSL支持的从属服务器,SSL选项(MASTER_SSL, MASTER_SSL_CA, MASTER_SSL_CAPATH, MASTER_SSL_CERT, MASTER_SSL_KEY和MASTER_SSL_CIPHER)也可以被更改。它们被保存到master.info文件中,但是会被忽略,直到您使用一个SSL支持已启用的服务器。

如果您不指定一个给定的参数,则它会保持其原有的值。例外情况在后面的讨论中进行了说明。举例说明,如果用于连接到您的MySQL主服务器的 密码被更改了,您只需发布这些语句,就可以告知从属服务器新的密码:

mysql> STOP SLAVE; -- if replication was running
mysql> CHANGE MASTER TO MASTER_PASSWORD='new3cret';
mysql> START SLAVE; -- if you want to restart replication

没有必要指定没有改变的参数(主机、接口、用户等)。

MASTER_HOST和MASTER_PORT是主服务器主机和其TCP/IP接口的主机名(或IP地址)。注意,如果MASTER_HOST与localhost相等,那么,和MySQL的其它部分一样,接口可以被忽略(例如,如果可以使用Unix插槽文件)。

如果您指定了MASTER_HOST或MASTER_PORT,则从属服务器会假定主服务器与以前不一样(即使您指定的主机或接口值与当前值是一样的。)在此情况下,主服务器二进制日志的名称和位置的原有值不再适用,因此,如果您不指定语句中的MASTER_LOG_FILE和MASTER_LOG_POS,MASTER_LOG_FILE=''和MASTER_LOG_POS=4会被静默地添加。

在MASTER_LOG_FILE和MASTER_LOG_POS坐标点,从属服务器I/O线程在启动之后从主服务器读取。如果您只指定了其中一个,则从属服务器不能指定RELAY_LOG_FILE或RELAY_LOG_POS。如果MSATER_LOG_FILE和MASTER_LOG_POS都没有被指定,则从属服务器会使用在CHANGE MASTER被发布前的最后一个slave SQL thread坐标。当您只想改变要使用的 密码时,这可以确保复制的连续性。即使从属服务器SQL线程落后于从属服务器I/O线程,也可以确保复制的连续性。

CHANGE MASTER会删除所有的中继日志文件并启动一个新的日志,除非您指定了RELAY_LOG_FILE或RELAY_LOG_POS。在此情况下,中继日志被保持;relay_log_purge全局变量被静默地设置为0。

CHANGE MASTER TO可以更新master.info和relay-log.info文件的内容。

当您拥有主服务器快照并拥有日志和对应的偏移量时,CHANGE MASTER对于设置从属服务器是有用的。在把快照载入从属服务器之后,您可以在从属服务器上运行CHANGE MASTER TO MASTER_LOG_FILE='log_name_on_master', MASTER_LOG_POS=log_offset_on_master。

举例说明:

mysql> CHANGE MASTER TO
    ->     MASTER_HOST='master2.mycompany.com',
    ->     MASTER_USER='replication',
    ->     MASTER_PASSWORD='bigs3cret',
    ->     MASTER_PORT=3306,
    ->     MASTER_LOG_FILE='master2-bin.001',
    ->     MASTER_LOG_POS=4,
    ->     MASTER_CONNECT_RETRY=10;
 
mysql> CHANGE MASTER TO
    ->     RELAY_LOG_FILE='slave-relay-bin.006',
    ->     RELAY_LOG_POS=4025;

第一个例子可以更改主服务器及其二进制日志坐标。当想要设置从属服务器来复制主服务器时使用。

第二个例子显示了较少被使用的一个操作。当从属服务器含有中继日志,并且您出于某种原因想要执行此日志时使用。要这么做时,不需要连接主服务器。您只需要使用CHANGE MASTER TO并启动SQL线程(START SLAVE SQL_THREAD)。

您甚至可以在一个用于独立非从属服务器的非复制型设置中使用第二种操作,在崩溃之后进行复原。假设您的服务器已崩溃,同时您已恢复了备份。您想要重新播放服务器自己的二进制日志(不是中继日志,而是正规的二进制文件),例如名为myhost-bin.*。首先,应在安全的地方制作这些二进制日志的备份,以防您没有完全遵守以下步骤,意外地让服务器清理了二进制文件。使用SET GLOBAL relay_log_purge=0,进一步增加安全性。然后启动不含--log-bin选项的服务器。使用--replicate-same-server-id, --relay-log=myhost-bin(让服务器相信,这些正规的二进制日志是中继日志)和--skip-slave-start options选项。当服务器启动后,发布以下语句:

mysql> CHANGE MASTER TO
    ->     RELAY_LOG_FILE='myhost-bin.153',
    ->     RELAY_LOG_POS=410,
    ->     MASTER_HOST='some_dummy_string';
mysql> START SLAVE SQL_THREAD;

服务器会读取并执行自己的二进制日志,完成崩溃复原。当复原完成后,运行STOP SLAVE,关闭服务器,删除master.info和relay-log.info,并使用原来的选项重新启动服务器。

要让服务器认为它是一个从属服务器,需要指定MASTER_HOST(甚至使用假值)。

13.6.2.2. LOAD DATA FROM MASTER语法

LOAD DATA FROM MASTER

本命令用于对主服务器进行快照,并拷贝到从属服务器上。它可以更新MASTER_LOG_FILE和MASTER_LOG_POS的值,这样,从属服务器就可以从正确的位置开始进行复制。使用--replicate-*-do-*和--replicate-*-ignore-*选项指定的表和数据库排除规则均被兑现。--replicate-rewrite-db没有被考虑。这是因为使用本选项,用户就可以设置一个例如--replicate-rewrite-db=db1->db3和--replicate-rewrite-db=db2->db3的非唯一映射。当从主服务器载入表时,该映射会使从属服务器发生混淆。

本语句的使用受以下条件的制约:

·         只对MyISAM表起作用。如果试图载入一个非MyISAM表,会导致以下错误:

·                ERROR 1189 (08S01): Net error reading from master

·         当拍摄快照时,会获得对主服务器的全局读取锁定。在载入操作期间,该锁定会阻止对主服务器的更新。

如果您正在载入大表,您可能必须对主服务器和从属服务器均增加net_read_timeout和net_write_timeout值。请参见5.3.3节,“服务器系统变量”。

注意,LOAD DATA FROM MASTER不从mysql数据库拷贝任何表。这可以更容易地让主服务器和从属服务器拥有不同的用户和权限。

LOAD DATA FROM MASTER语句要求用于连接主服务器的复制帐户,以便让主服务器拥有RELOAD和SUPER权限,并让所有您想要载入的主服务器表拥有SELECT权限。所有的用户不拥有SELECT权限的主服务器表均被LOAD DATA FROM MASTER忽略。这是因为主服务器会对用户隐藏它们:LOAD DATA FROM MASTER会调用SHOW DATABASES以了解要载入的主服务器数据库,但是SHOW DATABASES只会返回用户有部分权限的数据库。请参见13.5.4.6节,“SHOW DATABASES语法”。在从属服务器方面,发布LOAD DATA FROM MASTER的用户应拥有授权,以取消或创建被复制的数据库和表。

13.6.2.3. LOAD TABLE tbl_name FROM MASTER语法

LOAD TABLE tbl_name FROM MASTER

用于把表的拷贝从主服务器转移到从属服务器。本语句的主要作用是调试LOAD DATA FROM MASTER。它要求用于连接主服务器的帐户拥有对主服务器的RELOAD和SUPER权限,并拥有对要载入的主服务器表的SELECT权限。在从属服务器方面,发布LOAD TABLE FROM MASTER的用户应拥有取消和创建表的权限。

用于LOAD DATA FROM MASTER的条件也适用于这里。举例说明,LOAD TABLE FROM MASTER仅对于MyISAM表起作用。对LOAD DATA FROM MASTER的暂停注意也适用。

13.6.2.4. MASTER_POS_WAIT()语法

SELECT MASTER_POS_WAIT('master_log_file', master_log_pos)
这实际上是一个函数,而不是一个语句。它被用于确认,从属服务器已读取并执行了到达主服务器二进制日志的给定位置。要了解完整的描述,请参见12.9.4节,“其他函数”

13.6.2.5. RESET SLAVE语法

RESET SLAVE

用于让从属服务器忘记其在主服务器的二进制日志中的复制位置。本语句被用于进行一个明确的启动:它会删除master.info和relay-log.info文件,以及所有的中继日志,并启动一个新的中继日志。

注释:所有的中继日志被删除,即使它们没有被从属服务器SQL线程完全的执行。(如果您已经发布了一个SLAVE语句或如果从属服务器的载入量很大,则这对于一个复制从属服务器是一个很可能出现的情况。)

存储在master.info文件中的连接信息通过使用在对应的启动选项中指定的值,被立即重新设置了。此信息包括主服务器主机、主服务器接口、主服务器用户和主服务器 密码等值。当从属服务器SQL线程被中止时,它位于正在复制的临时表的中间,并且发布了RESET SLAVE,则已被复制的临时表在从属服务器中被删除。

13.6.2.6. SET GLOBAL SQL_SLAVE_SKIP_COUNTER语法

SET GLOBAL SQL_SLAVE_SKIP_COUNTER = n

从主服务器中跳过后面的n个事件。要复原由语句导致的复制中止,这是有用的。

仅当从属线程没有正在运行时,本语句时有效的。否则,会产生一个错误。

13.6.2.7. SHOW SLAVE STATUS语法

SHOW SLAVE STATUS

用于提供有关从属服务器线程的关键参数的信息。如果您使用mysql客户端发布此语句,则您可以使用一个\G语句终止符来获得更便于阅读的竖向版面,而不是使用分号:

mysql> SHOW SLAVE STATUS\G
*************************** 1. row ***************************
       Slave_IO_State: Waiting for master to send event
          Master_Host: localhost
          Master_User: root
          Master_Port: 3306
        Connect_Retry: 3
      Master_Log_File: gbichot-bin.005
  Read_Master_Log_Pos: 79
       Relay_Log_File: gbichot-relay-bin.005
        Relay_Log_Pos: 548
Relay_Master_Log_File: gbichot-bin.005
     Slave_IO_Running: Yes
    Slave_SQL_Running: Yes
      Replicate_Do_DB:
  Replicate_Ignore_DB:
           Last_Errno: 0
           Last_Error:
         Skip_Counter: 0
  Exec_Master_Log_Pos: 79
      Relay_Log_Space: 552
      Until_Condition: None
       Until_Log_File:
        Until_Log_Pos: 0
   Master_SSL_Allowed: No
   Master_SSL_CA_File:
   Master_SSL_CA_Path:
      Master_SSL_Cert:
    Master_SSL_Cipher:
       Master_SSL_Key:
Seconds_Behind_Master: 8

SHOW SLAVE STATUS会返回以下字段:

·         Slave_IO_State

SHOW PROCESSLIST输出的State字段的拷贝。SHOW PROCESSLIST用于从属I/O线程。如果线程正在试图连接到主服务器,正在等待来自主服务器的时间或正在连接到主服务器等,本语句会通知您。在6.3节,“复制实施细节”中列出了可能的状态。旧版本的MySQL在连接主服务器不成功时,允许线程继续运行。对于旧版本的MySQL,观看此字段是必须的。如果它正在运行,则无问题;如果它没有运行,则您会在Last_Error字段中发现错误(后面有说明)。

·         Master_Host

当前的主服务器主机。

·         Master_User

被用于连接主服务器的当前用户。

·         Master_Port

当前的主服务器接口。

·         Connect_Retry

--master-connect-retry选项的当前值

·         Master_Log_File

I/O线程当前正在读取的主服务器二进制日志文件的名称。

·         Read_Master_Log_Pos

在当前的主服务器二进制日志中,I/O线程已经读取的位置。

·         Relay_Log_File

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

·         Relay_Log_Pos

在当前的中继日志中,SQL线程已读取和执行的位置。

·         Relay_Master_Log_File

由SQL线程执行的包含多数近期事件的主服务器二进制日志文件的名称。

·         Slave_IO_Running

I/O线程是否被启动并成功地连接到主服务器上。对于旧版本的MySQL(在4.1.14和5.0.12之前),如果I/O线程已被启动,即使从属服务器仍没有连接到主服务器上,Slave_IO_Running也将被设置到YES。

·         Slave_SQL_Running

SQL线程是否被启动。

·         Replicate_Do_DB, Replicate_Ignore_DB

使用--replicate-do-db和--replicate-ignore-db选项指定的数据库清单。

·         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选项指定的表清单。

·         Last_Errno, Last_Error

被多数最近被执行的查询返回的错误数量和错误消息。错误数量为0并且消息为空字符串意味着“没有错误”。如果Last_Error值不是空值,它也会在从属服务器的错误日志中作为消息显示。

举例说明:

Last_Errno: 1051
Last_Error: error 'Unknown table 'z'' on query 'drop table z'

该消息指示,表z曾经存在于在主服务器中并已被取消了,但是它没有在从属服务器中存在过,因此对于从属服务器,DROP TABLE失败。(举例说明,在设置复制时,如果您忘记了把此表拷贝到从属服务器中,则这有可能发生。)

·         Skip_Counter

最近被使用的用于SQL_SLAVE_SKIP_COUNTER的值。

·         Exec_Master_Log_Pos

来自主服务器的二进制日志的由SQL线程执行的上一个时间的位置(Relay_Master_Log_File)。在主服务器的二进制日志中的(Relay_Master_Log_File, Exec_Master_Log_Pos)对应于在中继日志中的(Relay_Log_File, Relay_Log_Pos)。

·         Relay_Log_Space

所有原有的中继日志结合起来的总大小。

·         Until_Condition, Until_Log_File, Until_Log_Pos

在START SLAVE语句的UNTIL子句中指定的值。

Until_Condition具有以下值:

o        如果没有指定UNTIL子句,则没有值

o        如果从属服务器正在读取,直到达到主服务器的二进制日志的给定位置为止,则值为Master

o        如果从属服务器正在读取,直到达到其中继日志的给定位置为止,则值为Relay

Until_Log_File和Until_Log_Pos用于指示日志文件名和位置值。日志文件名和位置值定义了SQL线程在哪个点中止执行。

·         Master_SSL_Allowed, Master_SSL_CA_File, Master_SSL_CA_Path, Master_SSL_Cert, Master_SSL_Cipher, Master_SSL_Key

这些字段显示了被从属服务器使用的参数。这些参数用于连接主服务器。

Master_SSL_Allowed具有以下值:

o        如果允许对主服务器进行SSL连接,则值为Yes

o        如果不允许对主服务器进行SSL连接,则值为No

o        如果允许SSL连接,但是从属服务器没有让SSL支持被启用,则值为Ignored。

与SSL有关的字段的值对应于--master-ca, --master-capath, --master-cert, --master-cipher和--master-key选项的值。

·         Seconds_Behind_Master

本字段是从属服务器“落后”多少的一个指示。当从属SQL线程正在运行时(处理更新),本字段为在主服务器上由此线程执行的最近的一个事件的时间标记开始,已经过的秒数。当此线程被从属服务器I/O线程赶上,并进入闲置状态,等待来自I/O线程的更多的事件时,本字段为零。总之,本字段测量从属服务器SQL线程和从属服务器I/O线程之间的时间差距,单位以秒计。

如果主服务器和从属服务器之间的网络连接较快,则从属服务器I/O线程会非常接近主服务器,所以本字段能够十分近似地指示,从属服务器SQL线程比主服务器落后多少。如果网络较慢,则这种指示不准确;从属SQL线程经常会赶上读取速度较慢地从属服务器I/O线程,因此,Seconds_Behind_Master经常显示值为0。即使I/O线程落后于主服务器时,也是如此。换句话说,本列只对速度快的网络有用。

即使主服务器和从属服务器不具有相同的时钟,时间差计算也会起作用(当从属服务器I/O线程启动时,计算时间差。并假定从此时以后,时间差保持不变)。如果从属SQL线程不运行,或者如果从属服务器I/O线程不运行或未与主服务器连接,则Seconds_Behind_Master为NULL(意义为“未知”)。举例说明,如果在重新连接之前,从属服务器I/O线程休眠了master-connect-retry秒,则显示NULL,因为从属服务器不知道主服务器正在做什么,也不能有把握地说落后多少。

本字段有一个限制。时间标记通过复制被保留,这意味着,如果一个主服务器M1本身是一个从属服务器M0,则来自M1的binlog的任何事件(通过复制来自M0的binlog的事件而产生),与原事件具有相同的时间标记。这可以使MySQL成功地复制TIMESTAMP。但是,Seconds_Behind_Master的缺点是,如果M1也收到来自客户端的直接更新,则值会随机变化,因为有时最近的M1时间来自M0,有时来自直接更新,最近的时间标记也是如此。

13.6.2.8. START SLAVE语法

START SLAVE [thread_type [, thread_type] ... ]
START SLAVE [SQL_THREAD] UNTIL
    MASTER_LOG_FILE = 'log_name', MASTER_LOG_POS = log_pos
START SLAVE [SQL_THREAD] UNTIL
    RELAY_LOG_FILE = 'log_name', RELAY_LOG_POS = log_pos
 
thread_type: IO_THREAD | SQL_THREAD

不含选项的START SLAVE会同时启动两个从属服务器线程。I/O线程从主服务器中读取查询,并把它们存储在中继日志中。SQL线程读取中继日志并执行查询。START SLAVE要求SUPER权限。

如果START SLAVE成功地启动了从属服务器线程,则会返回,不会出现错误。但是,即使在此情况下,也有可能出现这样的现象——服务器线程启动了,然后又停止了(例如,因为它们没有成功地连接到主服务器上,或者没有能读取二进制日志,或者出现了其它问题)。START SLAVE对此不会发出警告。您必须检查从属服务器的错误日志,查看是否有由从属服务器线程产生的错误消息,或者使用SHOW SLAVE STATUS检查它们是否运行正常。

您可以把IO_THREAD和SQL_THREAD选项添加到语句中,指明哪些线程将要启动。

可以添加一个UNTIL子句,指定从属服务器应启动并运行,直到SQL线程达到主服务器二进制日志中的一个给定点为止。当SQL线程达到此点时,它会停止。如果在该语句中指定了SQL_THREAD选项,则它只会启动SQL线程。否则,它会同时启动两个从属服务器线程。如果SQL线程正在运行,则UNTIL子句被忽略,并发布一个警告。

对于一个UNTIL子句,您必须同时指定一个日志文件名和位置。不要把主服务器和中继日志选项混合在一起。

UNTIL条件由一个后续的STOP SLAVE语句,或一个不包括UNTIL子句的START SLAVE语句,或一个服务器重启命令重新设置。

UNTIL子句对于调试复制操作是有用的,或者可用于促使复制操作继续,直到接近一个特定的点时为止,在此点,您想要避免让从属服务器复制一个语句。举例说明,如果在主服务上执行了一个不明智的DROP TABLE语句,您可以使用UNTIL来告知从属服务器,执行到此点就停止,不要再继续了。要查找该事件是什么,需对主服务器日志或从属中继日志使用mysqlbinlog,或通过使用SHOW BINLOG EVENTS语句。

如果您正在使用UNTIL,让从属服务器成段地处理已复制的查询,则建议您使用--skip-slave-start选项来启动从属服务器,以防止当从属服务器启动时,SQL线程运行。最好在一个选项文件中使用此选项,而不是在命令行中使用,这样,如果发生了意料外的服务器重新启动,它也不会被忘记。

SHOW SLAVE STATUS语句包括了输出字段。这些字段显示了UNTIL条件的当前值。

在以前版本的MySQL中,本语句被称为SLAVE START。在MySQL 5.1中仍然接受这种用法,以便与以前版本兼容。但现在不赞成使用。

13.6.2.9. STOP SLAVE语法
 

STOP SLAVE [thread_type [, thread_type] ... ]
 
thread_type: IO_THREAD | SQL_THREAD

用于中止从属服务器线程。STOP SLAVE要求SUPER权限。

和START SLAVE相似,本语句在使用时可以加IO_THREAD和SQL_THREAD选项,指明将被中止的线程。

在以前版本的MySQL中,本语句被称为SLAVE STOP。在MySQL 5.1中仍然接受这种用法,以便与以前版本兼容。但是现在不赞成使用。

13.7. 用于预处理语句的SQL语法

MySQL 5.1对服务器一方的预制语句提供支持。如果您使用合适的客户端编程界面,则这种支持可以发挥在MySQL 4.1中实施的高效客户端/服务器二进制协议的优势。候选界面包括MySQL C API客户端库(用于C程序)、MySQL Connector/J(用于Java程序)和MySQL Connector/NET。例如,C API可以提供一套能组成预制语句API的函数调用。请参见25.2.4节,“C API预处理语句”。其它语言界面可以对使用了二进制协议(通过在C客户端库中链接)的预制语句提供支持。有一个例子是PHP 5.0中的mysqli扩展

对预制语句,还有一个SQL界面可以利用。与在整个预制语句API中使用二进制协议相比,本界面效率没有那么高,但是它不要求编程,因为在SQL层级,可以直接利用本界面:

·         当您无法利用编程界面时,您可以使用本界面。

·         有些程序允许您发送SQL语句到将被执行的服务器中,比如mysql客户端程序。您可以从这些程序中使用本界面。

·         即使客户端正在使用旧版本的客户端库,您也可以使用本界面。唯一的要求是,您能够连接到一个支持预制语句SQL语法的服务器上。

预制语句的SQL语法在以下情况下使用:

·         在编代码前,您想要测试预制语句在您的应用程序中运行得如何。或者也许一个应用程序在执行预制语句时有问题,您想要确定问题是什么。

·         您想要创建一个测试案例,该案例描述了您使用预制语句时出现的问题,以便您编制程序错误报告。

·         您需要使用预制语句,但是您无法使用支持预制语句的编程API。

预制语句的SQL语法基于三个SQL语句:

PREPARE stmt_name FROM preparable_stmt;
 
EXECUTE stmt_name [USING @var_name [, @var_name] ...];
 
{DEALLOCATE | DROP} PREPARE stmt_name;

PREPARE语句用于预备一个语句,并赋予它名称stmt_name,借此在以后引用该语句。语句名称对案例不敏感。preparable_stmt可以是一个文字字符串,也可以是一个包含了语句文本的用户变量。该文本必须展现一个单一的SQL语句,而不是多个语句。使用本语句,‘?’字符可以被用于制作参数,以指示当您执行查询时,数据值在哪里与查询结合在一起。‘?’字符不应加引号,即使您想要把它们与字符串值结合在一起,也不要加引号。参数制作符只能被用于数据值应该出现的地方,不用于SQL关键词和标识符等。

如果带有此名称的预制语句已经存在,则在新的语言被预备以前,它会被隐含地解除分配。这意味着,如果新语句包含一个错误并且不能被预备,则会返回一个错误,并且不存在带有给定名称语句。

预制语句的范围是客户端会话。在此会话内,语句被创建。其它客户端看不到它。

在预备了一个语句后,您可使用一个EXECUTE语句(该语句引用了预制语句名称)来执行它。如果预制语句包含任何参数制造符,则您必须提供一个列举了用户变量(其中包含要与参数结合的值)的USING子句。参数值只能有用户变量提供,USING子句必须准确地指明用户变量。用户变量的数目与语句中的参数制造符的数量一样多。

您可以多次执行一个给定的预制语句,在每次执行前,把不同的变量传递给它,或把变量设置为不同的值。

要对一个预制语句解除分配,需使用DEALLOCATE PREPARE语句。尝试在解除分配后执行一个预制语句会导致错误。

如果您终止了一个客户端会话,同时没有对以前已预制的语句解除分配,则服务器会自动解除分配。

以下SQL语句可以被用在预制语句中:CREATE TABLE, DELETE, DO, INSERT, REPLACE, SELECT, SET, UPDATE和多数的SHOW语句。目前不支持其它语句。

以下例子显示了预备一个语句的两种方法。该语句用于在给定了两个边的长度时,计算三角形的斜边。

第一个例子显示如何通过使用文字字符串来创建一个预制语句,以提供语句的文本:

mysql> PREPARE stmt1 FROM 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> SET @a = 3;
mysql> SET @b = 4;
mysql> EXECUTE stmt1 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|          5 |
+------------+
mysql> DEALLOCATE PREPARE stmt1;

第二个例子是相似的,不同的是提供了语句的文本,作为一个用户变量:

mysql> SET @s = 'SELECT SQRT(POW(?,2) + POW(?,2)) AS hypotenuse';
mysql> PREPARE stmt2 FROM @s;
mysql> SET @a = 6;
mysql> SET @b = 8;
mysql> EXECUTE stmt2 USING @a, @b;
+------------+
| hypotenuse |
+------------+
|         10 |
+------------+
mysql> DEALLOCATE PREPARE stmt2;

预制语句的SQL语法不能被用于带嵌套的风格中。也就是说,被传递给PREPARE的语句本身不能是一个PREPARE, EXECUTE或DEALLOCATE PREPARE语句。

预制语句的SQL语法与使用预制语句API调用不同。例如,您不能使用mysql_stmt_prepare() C API函数来预备一个PREPARE, EXECUTE或DEALLOCATE PREPARE语句。

预制语句的SQL语法可以在已存储的过程中使用,但是不能在已存储的函数或触发程序中使用。

当使用预制语句时,可以在LIMIT子句中使用占位符。请参见13.2.7节,“SELECT语法”。

这是MySQL参考手册的翻译版本,关于MySQL参考手册,请访问dev.mysql.com。 原始参考手册为英文版,与英文版参考手册相比,本翻译版可能不是最新的。

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载