免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: luren04
打印 上一主题 下一主题

【申请加精】MySQL 5.1参考手册  关闭 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2008-04-15 13:02 |只看该作者
在BDB表下可以激活的最大锁数(默认为10,000)。如果当你执行长事务或当mysqld必须检查许多行来计算查询时出现下面的错误,你应增加该值:

bdb: Lock table is out of available locksGot error 12 from ...·         bdb_shared_data

如果你正使用--bdb-shared-data应为ON。

·         bdb_tmpdir

--bdb-tmpdir选项的值。



·         binlog_cache_size

在事务过程中容纳二进制日志SQL语句的缓存大小。二进制日志缓存是服务器支持事务存储引擎并且服务器启用了二进制日志(--log-bin选项)的前提下为每个客户端分配的内存。如果你经常使用大的,多语句事务,你可以增加该值以获得更有的性能。Binlog_cache_use和Binlog_cache_disk_use状态变量可以用来调整该变量的大小。参见5.11.3节,“二进制日志”。

·         bulk_insert_buffer_size

MyISAM 使用专用树状缓存来使INSERT ... SELECT、INSERT ... VALUES (...)、(...)、 ...和LOAD DATA INFILE的大块插入更快。该变量用每线程的字节数限制缓存树的大小。将它设置为0禁用优化。注释:只有向非空表添加数据时才使用该缓存。 默认值是8MB。

·         character_set_client

来自客户端的语句的字符集。

·         character_set_connection

用于没有字符集导入符的文字和数字-字符串转换。

·         character_set_database

默认数据库使用的字符集。当默认数据库更改时,服务器则设置该变量。如果没有默认数据库,变量的值同character_set_server。

·         character_set_results

用于向客户端返回查询结果的字符集。

·         character_set_ server

服务器的默认字符集。

·         character_set_system

服务器用来保存识别符的字符集。该值一定是utf8。

·         character_sets_dir

字符集安装目录。

·         collation_connection

连接字符集的校对规则。

·         collation_database

默认数据库使用的校对规则。当默认数据库改变时服务器则设置该变量。如果没有默认数据库,变量的值同collation_server。

·         collation_server

服务器的默认校对规则。

·         completion_type

事务结束类型:

o        如果该值为0(默认),COMMIT和ROLLBACK不受影响。

o        如果该值为1,COMMIT和ROLLBACK分别等同于COMMIT AND CHAIN和ROLLBACK AND CHAIN。(新事务用刚刚结束的事务相同的间隔等级立即启动)。

o        如果该值为2,COMMIT和ROLLBACK分别等同于COMM它RELEASE和ROLLBACK RELEASE。(事务终止后,服务器断开)。

·         concurrent_insert

如果为ON(默认值),MySQL允许INSERT和SELECT语句在中间没有空数据块的MyISAM表中并行运行。你可以用--safe或--skip-new启动mysqld关闭该选项。

该变量为整数,有3个值:


描述

0


1
(默认)在没有空数据块的MyISAM表中启用并行插入

2
为所有MyISAM表启用并行插入。如果表有空记录或正被另一线程使用,新行将插入到表的最后。如果表未使用,MySQL将进行普通读锁定并将新行插入空记录。


·         connect_timeout

mysqld服务器用Bad handshake响应前等待连接包的秒数。

·         datadir

MySQL数据目录。可以用--datadir选项设置该变量。

·         date_format

该变量未使用。

·         datetime_format

该变量未使用。

·         default_week_format

WEEK() 函数使用的默认模式。

·         delay_key_write

该选项只适用MyISAM表。它具有下述值可以影响CREATE TABLE语句使用的DELAY_KEY_WRITE表选项的处理。

选项
描述

OFF
DELAY_KEY_WRITE被忽略。

ON
MySQL在CREATE TABLE中用DELAY_KEY_WRITE选项。这是 默认值。

ALL
用启用DELAY_KEY_WRITE选项创建表的相同方法对所有新打开表的进行处理。


如果启用了DELAY_KEY_WRITE,说明使用该项的表的键缓冲区在每次更新索引时不被清空,只有关闭表时才清空。遮掩盖可以大大加快键的写操作,但如果你使用该特性,你应用--myisam-recover选项启动服务器,为所有MyISAM表添加自动检查(例如,--myisam-recover=BACKUP,FORCE)。参见5.3.1节,“mysqld命令行选项”和15.1.1节,“MyISAM启动选项”。

请注意--external-locking不为使用延迟键写入的表提供索引破坏保护。

·         delayed_insert_limit

插入delayed_insert_limit 延迟行后,INSERT DELAYED 处理器线程检查是否有挂起的SELECT语句。如果有,在继续插入延迟的行之前,允许它们先执行。

·         delayed_insert_timeout

INSERT DELAYED处理器线程终止前应等待INSERT语句的时间。

·         delayed_queue_size

这是各个表中处理INSERT DELAYED语句时队列中行的数量限制。如果队列满了,执行INSERT DELAYED语句的客户端应等待直到队列内再有空间。

·         div_precision_increment

该变量说明用/操作符执行除操作的结果可增加的精确度的位数。 默认值是4。最小和最大值分别为0和30。下面的示例说明了增加 默认值的结果。

mysql> SELECT 1/7;+--------+| 1/7    |+--------+| 0.1429 |+--------+mysql> SET div_precision_increment = 12;mysql> SELECT 1/7;+----------------+| 1/7            |+----------------+| 0.142857142857 |+----------------+·         engine_condition_pushdown

该变量适用于NDB。默认值为0(OFF):如果你执行类似查询SELECT * FROM t WHERE mycol = 42,其中mycol为没有索引的列,当满了的表扫描每个NDB节点时,执行该查询。每个节点使用WHERE条件将每一行发送给MySQL服务器。如果engine_condition_pushdown被设置为1(ON),该条件“pushed down”给存储引擎并发送给NDB节点。每个节点都执行扫描,并只向MySQL服务器发送回匹配条件的行。

·         expire_logs_days

二进制日志自动删除的天数。默认值为0,表示“没有自动删除”。启动时和二进制日志循环时可能删除。

·         flush

如果用--flush选项启动mysqld该值为ON。

·         flush_time

如果设为非零值,每隔flush_time秒则关闭所有表以释放硬盘资源并同步未清空的数据。我们建议只在Windows 9x或Me,或有最小资源的系统中使用该选项。

·         ft_boolean_syntax

使用IN BOOLEAN MODE执行的布尔全文搜索支持的操作符系列。参见12.7.1节,“布尔全文搜索”。

默认变量值为 '+ -><()~*:""&|'。更改这些值的规则是:

o        操作符函数由其在字符串内的位置决定。

o        替换值必须是14个字符。

o        每个字符必须为ASCII码非文字数字字符。

o        第1个或第2个字符必须为空格。

o        除非语句在第11个字符和第12个字符处引用了操作符,否则不允许复制。这两个字符可以不相同,但这是唯一可能的两个。

o        位置10、13和14(默认设置为‘:’、‘&’和‘|’)保留用于将来扩展。

·         ft_max_word_len

FULLTEXT索引中所包含的字的最大长度。

注释:更改该变量后必须重建FULLTEXT索引。应使用REPAIR TABLE tbl_name QUICK。

·         ft_min_word_len

FULLTEXT索引中所包含的字的最小长度。

注释:更改该变量后必须重建FULLTEXT索引。应使用REPAIR TABLE tbl_name QUICK。

·         ft_query_expansion_limit

使用WITH QUERY EXPANSION进行全文搜索的最大匹配数。

·         ft_stopword_file

用于读取全文搜索的停止字清单的文件。该文件中的所有字都会用到;注释不重要。默认情况下,使用内嵌式停止字清单(如myisam/ft_static.c文件中所定义)。将该变量设置为空字符串('')则禁用停止字过滤。

注释:更改该变量或停止字文件的内容后必须重建FULLTEXT索引。应使用REPAIR TABLE tbl_name QUICK。

·         group_concat_max_len

允许的GROUP_CONCAT()函数结果的最大长度。

·         have_archive

如果mysqld支持ARCHIVE表则为YES,否则为NO。

·         have_bdb

如果mysqld支持BDB表则为YES。如果使用--skip-bdb则为DISABLED。

·         have_blackhole_engine

如果mysqld支持BLACKHOLE表则为YES,否则为NO。

·         have_compress

是否zlib压缩库适合该服务器。如果不适合,不能使用COMPRESS()和UNCOMPRESS()函数。

·         have_crypt

是否crypt()系统调用适合该服务器。如果不适合,不能使用CRYPT()函数。

·         have_csv

如果mysqld支持ARCHIVE表则为YES,否则为NO。

·         have_example_engine

如果mysqld支持EXAMPLE表则为YES,否则为NO。

have_federated_engine

如果mysqld支持FEDERATED表则为YES,否则为NO。

·         have_geometry

是否服务器支持空间数据类型。

·         have_innodb

如果mysqld支持InnoDB表则为YES。如果使用--skip-innodb则为DISABLED。

·         have_isam

在MySQL 5.1中,只是为了向后兼容显示该值,并且总是NO,因为不再支持ISAM表。

·         have_ndbcluster

如果mysqld支持NDB CLUSTER表则为YES。如果使用了--skip-ndbcluster则为DISABLED。

·         have_partition_engine

如果mysqld支持分区则为YES。在MySQL 5.1.1中加入。

·         have_openssl

如果mysqld支持客户端/服务器协议的SSL(加密)则为YES。

·         have_query_cache

如果mysqld支持查询缓存则为YES。

·         have_raid

如果mysqld支持RAID选项则为YES。

·         have_rtree_keys

RTREE索引是否可用。(用于MyISAM表的空间索引)。

·         have_symlink

是否启用符号链接支持。在Unix中需要用于支持DATA DIRECTORY和INDEX DIRECTORY表选项。

·         init_connect

服务器为每个连接的客户端执行的字符串。字符串由一个或多个SQL语句组成。要想指定多个语句,用分号间隔开。例如,每个客户端开始时默认启用autocommit模式。没有全局服务器变量可以规定autocommit默认情况下应禁用,但可以用init_connect来获得相同的效果:

SET GLOBAL init_connect='SET AUTOCOMMIT=0';还可以在命令行或选项文件中设置该变量。要想使用选项文件设置变量,应包括下述行:

[mysqld]init_connect='SET AUTOCOMMIT=0'请注意init_connect的内容并不为拥有SUPER权限的用户执行;实际是内容设置错误(包含错误查询,例如语法错误),这样使所有连接失败。不为SUPER用户执行,使SUPER用户可以打开连接并固定init_connect。

·         init_file

启动服务器时用--init-file选项指定的文件名。文件中包含服务器启动时要执行的SQL语句。每个语句必须在同一行中并且不能包括注释。

·         init_slave

该变量类似init_connect,但是每次SQL线程启动时从服务器应执行该字符串。该字符串的格式与init_connect变量相同。

·         innodb_xxx

InnoDB系统变量列入15.2.4节,“InnoDB启动选项”。

·         interactive_timeout

服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。又见wait_timeout。

·         join_buffer_size

用于完全联接的缓冲区的大小(当不使用索引的时候使用联接操作)。一般情况获得快速联接的最好方法是添加索引。当增加索引时不可能通过增加join_buffer_size值来获得快速完全联接。将为两个表之间的每个完全联接分配联接缓冲区。对于多个表之间不使用索引的复杂联接,需要多联接缓冲区。

·         key_buffer_size

MyISAM表的索引块分配了缓冲区,由所有线程共享。key_buffer_size是索引块缓冲区的大小。键值缓冲区即为键值缓存。

key_buffer_size的最大允许设定值为4GB。有效最大值可以更小,取决于可用物理RAM和操作系统或硬件平台强加的每个进程的RAM限制。

增加该值,达到你可以提供的更好的索引处理(所有读和多个写操作)。通常为主要运行MySQL的机器内存的25%。但是,如果你将该值设得过大(例如,大于总内存的50%),系统将转换为页并变得极慢。MySQL依赖操作系统来执行数据读取时的文件系统缓存,因此你必须为文件系统缓存留一些空间。

同时写多行时要想速度更快,应使用LOCK TABLES。参见13.4.5节,“LOCK TABLES和UNLOCK TABLES语法”。

你可以通过执行SHOW STATUS语句并检查Key_read_requests、Key_reads、Key_write_requests和Key_writes状态变量来检查键值缓冲区的性能。参见13.5.4节,“SHOW语法”。

Key_reads/Key_read_requests比例一般应小于0.01。如果你使用更新和删除,Key_writes/Key_write_requests比例通常接近1,但如果你更新时会同时影响到多行或如果你正使用DELAY_KEY_WRITE表选项,可能小得多。

用key_buffer_size结合Key_blocks_unused状态变量和缓冲区块大小,可以确定使用的键值缓冲区的比例。从key_cache_block_size服务器变量可以获得缓冲区块大小。使用的缓冲区的比例为:

1 - ((Key_blocks_unused * key_cache_block_size) / key_buffer_size)该值为约数,因为键值缓冲区的部分空间被分配用作内部管理结构。

可以创建多个MyISAM键值缓存。4GB限制可以适合每个缓存,而不是一个组。参见7.4.6节,“MyISAM键高速缓冲”。

·         key_cache_age_threshold

该值控制将缓冲区从键值缓存热子链(sub-chain)降级到温子链(sub-chain)。如果值更低,则降级更快。最小值为100。 默认值是300。参见7.4.6节,“MyISAM键高速缓冲”。

·         key_cache_block_size

键值缓存内块的字节大小。默认值是1024。参见7.4.6节,“MyISAM键高速缓冲”。

·         key_cache_division_limit

键值缓存缓冲区链热子链和温子链的划分点。该值为缓冲区链用于温子链的百分比。允许的值的范围为1到100。 默认值是100。参见7.4.6节,“MyISAM键高速缓冲”。

·         language

错误消息所用语言。

·          large_file_support

mysqld编译时是否使用了大文件支持选项。

·         large_pages

说明是否启用了大页面支持。

·         license

服务器的许可类型。

·         local_infile

是否LOCAL支持LOAD DATA INFILE语句。

·         locked_in_memory

是否用–memlock将mysqld锁在内存中。

·         log

是否启用将所有查询记录到常规查询日志中。参见5.11.2节,“通用查询日志”。

·         log_bin

是否启用二进制日志。参见5.11.3节,“二进制日志”。

·         log_bin_trust_routine_creators

若启用了二进制记录,则该变量适用。它控制是否可以信任保存的程序的作者不会创建向二进制日志写入不安全事件的程序。如果设置为0(默认情况),不允许用户创建或修改保存的程序,除非他们不仅拥有CREATE ROUTINE或ALTER ROUTINE权限还拥有SUPER权限。

设置为0还强制限制,程序必须用DETERMINISTIC 特征或用READS SQL DATA或NO SQL特征声明。如果变量设置为1,MySQL不对保存程序的创建强加限制。

参见20.4节,“存储子程序和触发程序的二进制日志功能”。

·         log_error

错误日志的位置。

·         log_slave_updates

是否从服务器从主服务器收到的更新应记入从服务器自己的二进制日志。要想生效,必须启用从服务器的二进制记录。参见6.8节,“复制启动选项”。

·         log_slow_queries

是否记录慢查询。用long_query_time变量的值来确定“慢查询”。参见5.11.4节,“慢速查询日志”。

·         log_warnings

是否产生其它警告消息。默认情况下启用。放弃的连接不记入错误日志,除非值大于1。

·         long_query_time

如果查询时间超过该值,则增加Slow_queries状态变量。如果你正使用--log-slow-queries选项,则查询记入慢查询日志文件。用实际时间测量该值,而不是CPU时间,因此低于轻负载系统阈值的查询可能超过重负载系统的阈值。参见5.11.4节,“慢速查询日志”。

·         low_priority_updates

如果设置为1,所有INSERT、UPDATE、DELETE和LOCK TABLE WRITE语句将等待直到受影响的表没有挂起的SELECT或LOCK TABLE READ。该变量以前叫做sql_low_priority_updates。

·         lower_case_file_system

该变量说明是否数据目录所在的文件系统对文件名的大小写敏感。ON说明对文件名的大小写不敏感,OFF表示敏感。

·           lower_case_table_names

论坛徽章:
0
82 [报告]
发表于 2008-04-15 13:02 |只看该作者
如果设置为1,表名用小写保存到硬盘上,并且表名比较时不对大小写敏感。如果设置为2,按照指定的保存表名,但按照小写来比较。该选项还适合数据库名和表的别名。参见9.2.2节,“识别符大小写敏感性”。

如果你正使用InnoDB表,你应在所有平台上将该变量设置为1,强制将名字转换为小写。

如果运行MySQL的系统对文件名的大小写不敏感(例如Windows或Mac OS X),你不应将该变量设置为0。如果启动时没有设置该变量,并且数据目录所在文件系统对文件名的大小写不敏感,MySQL自动将lower_case_table_names设置为2。

·         max_allowed_packet

包或任何生成的/中间字符串的最大大小。

包消息缓冲区初始化为net_buffer_length字节,但需要时可以增长到max_allowed_packet字节。该值默认很小,以捕获大的(可能是错误的)数据包。

如果你使用大的BLOB 列或长字符串,你必须增加该值。应同你想要使用的最大的BLOB一样大。max_allowed_packet的协议限制为1GB。

·         max_binlog_cache_size

如果多语句事务需要更大的内存,你会得到错误Multi-statement transaction required more than 'max_binlog_cache_size' bytes of storage。

·         max_binlog_size

如果二进制日志写入的内容超出给定值,日志就会发生滚动。你不能将该变量设置为大于1GB或小于4096字节。 默认值是1GB。

请注意如果你正使用事务:事务以一个块写入二进制日志,因此不不能被几个二进制日志拆分。因此,如果你有大的事务,二进制日志可能会大于max_binlog_size。

如果max_relay_log_size为0, max_binlog_size的值也适用于中继日志。

·         max_connect_errors

如果中断的与主机的连接超过该数目,该主机则阻塞后面的连接。你可以用 FLUSH HOSTS语句解锁锁定的主机。

·         max_connections

允许的并行客户端连接数目。增大该值则增加mysqld 需要的文件描述符的数量。关于文件描述符限制的注释参见7.4.9节,“MySQL如何打开和关闭表”。还可参见A.2.6节,“连接数过多”。

·         max_delayed_threads

不要启动大于该数目的线程来处理INSERT DELAYED语句。如果所有INSERT DELAYED线程已经在使用,你想在新表中插入数据,行 插入时好像未指定DELAYED属性。如果你将该值设置为0,MySQL不会创建线程来处理DELAYED行;其结果是完全禁用了DELAYED。

·         max_error_count

保存由SHOW ERRORS或SHOW WARNINGS显示的错误、警告和注解的最大数目。

·         max_heap_table_size

该变量设置MEMORY (HEAP)表可以增长到的最大空间大小。该变量用来计算MEMORY表的MAX_ROWS值。在已有的MEMORY表上设置该变量没有效果,除非用CREATE TABLE或TRUNCATE TABLE等语句重新创建表。

·         max_insert_delayed_threads

该变量为max_delayed_threads的同义词。

·         max_join_size

不允许可能需要检查多于max_join_size行(为单个表语句)或行组合(为多个表语句)或可能执行大于max_join_size次硬盘查询的SELECT语句。通过设置该值,你可以捕获键使用不正确并可能花很长时间的SELECT语句。如果用户想要执行没有WHERE子句的花较长时间或返回数百万行的联接,则设置它。

将该变量设置为DEFAULT之外的值,将SQL_BIG_SELECTS的值重设为0。如果你重新设置SQL_BIG_SELECTS值,max_join_size变量被忽略。

如果查询结果位于查询缓存中,则不检查结果大小,因为前面已经计算了结果,不会要求服务器将它发送给客户端。

该变量以前叫做sql_max_join_size。

·         max_length_for_sort_data

确定使用的filesort算法的索引值大小的限值。参见7.2.12节,“MySQL如何优化ORDER BY”。

·         max_relay_log_size

如果复制从服务器写入中继日志时超出给定值,则滚动中继日志。通过该变量你可以对中继日志和二进制日志设置不同的限制。但是,将该变量设置为0,MySQL可以对二进制日志和中继日志使用max_binlog_size。max_relay_log_size必须设置在4096字节和1GB(包括)之间,或为0。 默认值是0。参见6.3节,“复制实施细节”。

·         max_seeks_for_key

限制根据键值寻找行时的最大搜索数。MySQL优化器假定当用扫描键在表内搜索匹配的行时,不需要超过该数量的键值搜索,而不管键的实际基数是什么(参见13.5.4.11节,“SHOW INDEX语法”)。将该值设置为较低的值(100?),你可以强制MySQL选择键值而不选择表扫描。

·         max_sort_length

当排序BLOB或TEXT值时使用的字节数。只使用每个值的前max_sort_length字节;其它的被忽略。

·         max_tmp_tables

客户端可以同时打开的临时表的最大数。(但该选项还未生效)。

·         max_user_connections

任何给定的MySQL账户允许的最大同时连接数。0值表示“没有限制”。

该变量具有全局范围和(只读)会话范围。会话变量的的值与全局变量的值相同,除非当前账户具有非零MAX_USER_CONNECTIONS资源限制。在这种情况下,会话值反应了账户限制。

·         max_write_lock_count

超过写锁定限制后,允许部分读锁定。

·         myisam_data_pointer_size

默认指针大小,单位是字节,当未指定MAX_ROWS选项时,CREATE TABLE使用该变量创建MyISAM表。该变量不能小于2或大于7。 默认值是6。参见A.2.11节,“表已满”。

·         (DEPRECATED) myisam_max_extra_sort_file_size

注释:MySQL 5.1不支持该变量。详细信息参见MySQL 5.0 参考手册。

·         myisam_max_sort_file_size

重建MyISAM索引(在REPAIR TABLE、ALTER TABLE或LOAD DATA INFILE过程中)时,允许MySQL使用的临时文件的最大空间大小。如果文件的大小超过该值,则使用键值缓存创建索引,要慢得多。该值的单位为字节。

·         myisam_recover_options

--myisam-recover选项的值。

·         myisam_repair_threads

如果该值大于1,在Repair by sorting过程中并行创建MyISAM表索引(每个索引在自己的线程内)。 默认值是1。注释:多线程维护仍然是alpha 编码。

·         myisam_sort_buffer_size

当在REPAIR TABLE或用CREATE INDEX创建索引或ALTER TABLE过程中排序 MyISAM索引分配的缓冲区。

·         myisam_stats_method

当为MyISAM表搜集关于索引值分发的统计信息时服务器如何处理NULL值。该变量有两个可能的值,nulls_equal和nulls_unequal。对于nulls_equal,认为所有NULL索引值时相等的,并形成一个数值组,其空间大小等于NULL值的数。对于nulls_unequal,NULL值认为是不相等的,每个NULL形成一个数值组,大小为1。

方法用于生成表统计信息,影响优化器如何选择索引来执行查询,详细描述见7.4.7节,“MyISAM索引统计集合”。

·         multi_read_range

指定范围选择过程中发送到存储引擎的范围的最大值。默认值是256。向引擎发送多个范围可以大大改进某些选择的性能,特别是对NDBCLUSTER。该引擎需要向所有节点发送范围请求,同时发送许多请求可以大大降低通信成本。

·         named_pipe

(只适用Windows)说明服务器是否支持命名管道连接。

·         net_buffer_length

在查询之间将通信缓冲区重设为该值。一般情况不应改变,但如果内存很小,可以将它设置为期望的客户端发送的SQL语句的长度。如果语句超出该长度,缓冲区自动扩大,直到max_allowed_packet字节。

·         net_read_timeout

中断读前等待连接的其它数据的秒数。当服务器从客户端读数时,net_read_timeout指控制何时中断的超时值。当服务器向客户端写时,net_write_timeout指控制何时中断的超时值。又见slave_net_timeout。

·         net_retry_count

如果某个通信端口的读操作中断了,在放弃前重试多次。在FreeBSD中该值应设得很高,因为内部中断将发送至所有线程。

·         net_write_timeout

中断写之前等待块写入连接的秒数。又见net_read_timeout。

·         new

在MySQL 4.0中使用该变量来打开4.1中的一些行为,并用于向后兼容性。在MySQL 5.1中,它的值一直是OFF.

·         old_passwords

是否服务器应为MySQL用户账户使用pre-4.1-style密码。参见A.2.3节,“客户端不支持鉴定协议”。

·         one_shot

这不是一个变量,但当设置变量是可以使用它。其描述见13.5.3节,“SET语法”。

·         one_shot

这不是一个变量,但当设置变量是可以使用它。其描述见13.5.3节,“SET语法”。

·         open_files_limit

操作系统允许mysqld打开的文件的数量。这是系统允许的实际值,可能与你在启动选项中赋给mysqld的值不同。若在系统中MySQL不能更改打开的文件的数量,则该值为0。

·         optimizer_prune_level

在查询优化从优化器搜索空间裁减低希望局部计划中使用的控制方法。0值禁用该方法,以便优化器进行穷举搜索。值为1使优化器根据中间方案中得出的行数来裁减方案。

·         optimizer_search_depth

查询优化器进行的搜索的最大深度。如果值大于查询中的关系数则查询方案比较佳,但生成查询执行方案需要的时间更长。值大于查询中的关系数则返回的执行方案更快,但方案远没有优化。如果设置为0, 系统自动选择合理的值。如果设置为查询中使用的表的最大数加2,优化器转换为MySQL 5.0.0(和以前的版本)中使用的算法并搜索。

·         pid_file

进程ID (PID)文件的路径名。可以用--pid-file选项设置该变量。

·         plugin_dir

插件目录的路径。在MySQL 5.1.2中加入了该变量。

·         port

服务器帧听TCP/IP连接所用端口。可以用--port选项设置该变量。

·         preload_buffer_size

重载索引时分配的缓冲区大小。

·         protocol_version

MySQL服务器使用的客户端/服务器协议的版本。

·         query_alloc_block_size

为查询分析和执行过程中创建的对象分配的内存块大小。如果内存分段过程中遇到问题,将该变量增加一位会有帮助。

·         query_cache_limit

不要缓存大于该值的结果。默认值是1048576(1MB)。

·         query_cache_min_res_unit

查询缓存分配的最小块的大小(字节)。 默认值是4096(4KB)。关于该变量的调节信息参见5.13.3节,“查询高速缓冲配置”。

·         query_cache_size

为缓存查询结果分配的内存的数量。默认值是0,即禁用查询缓存。请注意即使query_cache_type设置为0也将分配此数量的内存。详细信息参见5.13.3节,“查询高速缓冲配置”。

·         query_cache_type

设置查询缓存类型。设置GLOBAL值可以设置后面的所有客户端连接的类型。客户端可以设置SESSION值以影响他们自己对查询缓存的使用。下面的表显示了可能的值:

选项
描述

0或OFF
不要缓存或查询结果。请注意这样不会取消分配的查询缓存区。要想取消,你应将query_cache_size设置为0。

1或ON
缓存除了以SELECT SQL_NO_CACHE开头的所有查询结果。

2或DEMAND
只缓存以SELECT SQL_NO_CACHE开头的查询结果。


该变量默认设为ON。

·         query_cache_wlock_invalidate

一般情况,当客户端对MyISAM表进行WRITE锁定时,如果查询结果位于查询缓存中,则其它客户端未被锁定,可以对该表进行查询。将该变量设置为1,则可以对表进行WRITE锁定,使查询缓存内所有对该表进行的查询变得非法。这样当锁定生效时,可以强制其它试图访问表的客户端来等待。

·         query_prealloc_size

用于查询分析和执行的固定缓冲区的大小。在查询之间该缓冲区不释放。如果你执行复杂查询,分配更大的query_prealloc_size值可以帮助提高性能,因为它可以降低查询过程中服务器分配内存的需求。

·         range_alloc_block_size

范围优化时分配的块的大小。

·         read_buffer_size

每个线程连续扫描时为扫描的每个表分配的缓冲区的大小(字节)。如果进行多次连续扫描,可能需要增加该值, 默认值为131072。

·         read_only

当变量对复制从服务器设置为ON时,从服务器不允许更新,除非通过从服务器的线程或用户拥有SUPER权限。可以确保从服务器不接受客户端的更新命令。

·         relay_log_purge

当不再需要中继日志时禁用或启用自动清空中继日志。默认值是1(启用)。

·         read_rnd_buffer_size

当排序后按排序后的顺序读取行时,则通过该缓冲区读取行,避免搜索硬盘。将该变量设置为较大的值可以大大改进ORDER BY的性能。但是,这是为每个客户端分配的缓冲区,因此你不应将全局变量设置为较大的值。相反,只为需要运行大查询的客户端更改会话变量。

·         secure_auth

如果用--secure-auth选项启动了MySQL服务器,它将阻塞有旧格式(4.1之前)密码的所有账户所发起的连接。在这种情况下,该变量的值为ON,否则为OFF。

如果你想要防止使用旧格式的密码(致使网络通信不安全),你应启用该选项。

如果启用该选项并且授权表为pre-4.1格式,服务器启动失败并且会出现错误。参见A.2.3节,“客户端不支持鉴定协议”。

当用于客户端选项时,如果服务器需要该客户端账户的旧格式的密码,则客户端拒绝连接该服务器。

·         server_id

--server-id选项的值。用于主复制服务器和从复制服务器。

·         shared_memory

(只用于Windows)服务器是否允许共享内存连接。

·         shared_memory_base_name

(只用于Windows)说明服务器是否允许共享内存连接,并为共享内存设置识别符。当在单台机器上运行多个MySQL实例时很有用。

·         skip_external_locking

如果mysqld使用外部锁定,该值为OFF。

·         skip_networking

如果服务器只允许本地(非TCP/IP)连接,该值为ON。在Unix中,本地连接使用Unix套接字文件。在Windows中,本地连接使用命名管道或共享内存。在NetWare中,只支持TCP/IP连接,因此不要将该变量设置为ON。

·         skip_show_database

防止不具有SHOW DATABASES权限的人们使用SHOW DATABASES语句。如果你担心用户能够看见属于其它用户的数据库,这样设置可以提高安全性。其效果取决于SHOW DATABASES权限:如果变量值为ON,只允许具有SHOW DATABASES权限的人们使用SHOW DATABASES 语句,并且该语句将显示所有数据库名。如果值为OFF,允许所有用户执行SHOW DATABASES,但只显示用户具有SHOW DATABASES或其它权限的数据库的名称。

·         slave_compressed_protocol

如果主、从服务器均支持,确定是否使用从/主压缩协议。

·         slave_load_tmpdir

从服务器为复制LOAD DATA INFILE语句创建临时文件的目录名。

·         slave_net_timeout

放弃读操作前等待主/从连接的更多数据的等待秒数。

·         slave_skip_errors

从服务器应跳过(忽视)的复制错误。

论坛徽章:
0
83 [报告]
发表于 2008-04-15 13:03 |只看该作者
slave_transaction_retries

如果由于ofInnoDB死锁或超过InnoDB的innodb_lock_wait_timeout或NDBCLUSTER的TransactionDeadlockDetectionTimeout或TransactionInactiveTimeout,复制从服务器SQL线程未能执行事务,在提示错误并停止前它自动重复slave_transaction_retries次。 默认值是10。

·         slow_launch_time

如果创建线程的时间超过该秒数,服务器增加Slow_launch_threads状态变量。

·         socket

Unix平台:用于本地客户端连接的套接字文件。默认为/var/lib/mysql/mysql.sock。

Windows:用于本地客户端连接的命名管道名。默认为mysql。

·         sort_buffer_size

每个排序线程分配的缓冲区的大小。增加该值可以加快ORDER BY或GROUP BY操作。参见A.4.4节,“MySQL将临时文件储存在哪里”。

·         sql_mode

当前的服务器SQL模式,可以动态设置。参见5.3.2节,“SQL服务器模式”。

·         sql_slave_skip_counter

从服务器应跳过的来自主服务器的事件数。

·         storage_engine

该变量是table_typeis的同义词。在MySQL 5.1中,首选storage_engine。

·         sync_binlog

如果为正,当每个sync_binlog'th写入该二进制日志后,MySQL服务器将它的二进制日志同步到硬盘上(fdatasync())。请注意如果在autocommit模式,每执行一个语句向二进制日志写入一次,否则每个事务写入一次。 默认值是0,不与硬盘同步。值为1是最安全的选择,因为崩溃时,你最多丢掉二进制日志中的一个语句/事务;但是,这是最慢的选择(除非硬盘有电池备份缓存,从而使同步工作较快)。

·         sync_frm

如果该变量设为1,当创建非临时表时它的.frm文件被同步到硬盘上(fdatasync());这样较慢但出现崩溃时较安全。 默认值为1。

·         system_time_zone

服务器系统时区。当 服务器开始执行时,它继承机器默认时区设置值,可以由运行服务器的账户或在启动脚本中进行修改。该值用来设置system_time_zone。典型情况用TZ环境变量来指定时区。还可以用mysqld_safe脚本的--timez选项来指定。

·         table_cache

所有线程打开的表的数目。增大该值可以增加mysqld需要的文件描述符的数量。你可以检查Opened_tables状态变量来检查你是否需要增加表缓存。参见5.3.4节,“服务器状态变量”。如果Opened_tables值较大,并且多次执行FLUSH TABLES(只是强制关闭所有表并重新),则应增加table_cache变量的值。

关于表缓存的详细信息,参见7.4.9节,“MySQL如何打开和关闭表”。

·         table_type

默认表类型(存储引擎)。要想在服务器启动时设置表类型,使用--default-table-type选项。参见5.3.1节,“mysqld命令行选项”。

·         thread_cache_size

服务器应缓存多少线程以便重新使用。当客户端断开连接时,如果线程少于thread_cache_size,则客户端的线程被放入缓存。当请求线程时如果允许可以从缓存中重新利用线程,并且只有当缓存空了时才会创建新线程。如果新连接很多,可以增加该变量以提高性能。(一般情况,如果线程执行得很好,性能提高不明显)。检查Connections和Threads_created状态变量的差(详见5.3.4节,“服务器状态变量”),你可以看见线程缓存的效率。

·         thread_concurrency

在Solaris中,mysqld用该值调用thr_setconcurrency()。该函数使应用程序向线程系统提供需要同时运行的期望的线程数目的提示。

·         thread_stack

每个线程的堆栈大小。用crash-me测试检测出的许多限制取决于该值。 默认值足够大,可以满足普通操作。参见7.1.4节,“MySQL基准套件”。

·         time_format

该变量为使用。

·         time_zone

当前的时区。初使值是'SYSTEM'(使用system_time_zone的值),但可以用--default-time-zone选项在服务器启动时显式指定。

·         tmp_table_size

如果内存内的临时表超过该值,MySQL自动将它转换为硬盘上的MyISAM表。如果你执行许多高级GROUP BY查询并且有大量内存,则可以增加tmp_table_size的值。

·         tmpdir

保存临时文件和临时表的目录。该变量可以设置为几个路径,按round-robin模式使用。在Unix中应该用冒号(‘:’)间隔开路径,在Windows、NetWare和OS/2中用分号(‘;’)。

用来将负荷分散到几个物理硬盘上。如果MySQL服务器为复制从服务器,你不应将tmpdir设置为指向基于内存的文件系统上的目录或当服务器主机重启时声明的目录。复制从服务器需要部分临时文件来在机器重启后仍可用,以便它可以复制临时表或执行LOAD DATA INFILE操作。如果服务器重启时临时文件夹中的文件丢失了,则复制失败。但是,如果你使用MySQL 4.0.0或更新版本,你可以使用 slave_load_tmpdir变量设置从服务器的临时目录。在这种情况下,从服务器不再使用常规tmpdir,说明你可以将tmpdir设置到一个非固定位置。

·         transaction_alloc_block_size

为保存将保存到二进制日志中的事务的查询而分配的内存块的大小(字节)。

·         transaction_prealloc_size

为transaction_alloc_blocks分配的固定缓冲区的大小(字节),在两次查询之间不会释放。使该值足够大,将所有查询固定到一个事务中,可以避免多次malloc()调用。

·         tx_isolation

默认事务隔离级别。默认值为REPEATABLE-READ。

·         updatable_views_with_limit

该变量控制如果更新包含LIMIT子句,是否可以在当前表中使用不包含主关键字的视图进行更新。(通常用GUI工具生成这类更新)。更新指UPDATE或DELETE语句。这儿主关键字指PRIMARY KEY,或一个UNIQUE索引,其中任何列不可以包含NULL。

该变量有两个值:

o        1或YES:只发出警告(没有错误消息)。这是 默认值。

o        0或NO:禁止更新。

·         version

服务器版本号。

·         version_bdb

BDB存储引擎版本。

·         version_comment

configure脚本有一个--with-comment选项,当构建MySQL时可以进行注释。该变量包含注释值。

·         version_compile_machine

MySQL构建的机器或架构的类型。

·         version_compile_os

MySQL构建的操作系统的类型。

·         wait_timeout

服务器关闭非交互连接之前等待活动的秒数。

在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。又见interactive_timeout。

论坛徽章:
0
84 [报告]
发表于 2008-04-15 13:05 |只看该作者
5.3.3.1. 动态系统变量
许多服务器系统变量是动态的,可以使用SET GLOBAL或SET SESSION在运行时设置。你还可以使用SELECT获得它们的值。参见9.4节,“系统变量”。

下面的表列出了所有动态系统变量。最后1列说明每个变量是否适用GLOBAL或SESSION(或二者)。

变量名
值类型
类型

autocommit
boolean
SESSION

big_tables
boolean
SESSION

binlog_cache_size
numeric
GLOBAL

bulk_insert_buffer_size
numeric
GLOBAL | SESSION

character_set_client
string
GLOBAL | SESSION

character_set_connection
string
GLOBAL | SESSION

character_set_results
string
GLOBAL | SESSION

character_set_server
string
GLOBAL | SESSION

collation_connection
string
GLOBAL | SESSION

collation_server
string
GLOBAL | SESSION

completion_type
numeric
GLOBAL | SESSION

concurrent_insert
boolean
GLOBAL

connect_timeout
numeric
GLOBAL

convert_character_set
string
GLOBAL | SESSION

default_week_format
numeric
GLOBAL | SESSION

delay_key_write
OFF | ON | ALL
GLOBAL

delayed_insert_limit
numeric
GLOBAL

delayed_insert_timeout
numeric
GLOBAL

delayed_queue_size
numeric
GLOBAL

div_precision_increment
numeric
GLOBAL | SESSION

engine_condition_pushdown
boolean
GLOBAL | SESSION

error_count
numeric
SESSION

expire_logs_days
numeric
GLOBAL

flush
boolean
GLOBAL

flush_time
numeric
GLOBAL

foreign_key_checks
boolean
SESSION

ft_boolean_syntax
numeric
GLOBAL

group_concat_max_len
numeric
GLOBAL | SESSION

identity
numeric
SESSION

innodb_autoextend_increment
numeric
GLOBAL

innodb_concurrency_tickets
numeric
GLOBAL

innodb_max_dirty_pages_pct
numeric
GLOBAL

innodb_max_purge_lag
numeric
GLOBAL

innodb_support_xa
boolean
GLOBAL | SESSION

innodb_sync_spin_loops
numeric
GLOBAL

innodb_table_locks
boolean
GLOBAL | SESSION

innodb_thread_concurrency
numeric GLOBAL
  

innodb_thread_sleep_delay
numeric GLOBAL
  

insert_id
boolean
SESSION

interactive_timeout
numeric
GLOBAL | SESSION

join_buffer_size
numeric
GLOBAL | SESSION

key_buffer_size
numeric
GLOBAL

last_insert_id
numeric
SESSION

local_infile
boolean
GLOBAL

log_warnings
numeric
GLOBAL

long_query_time
numeric
GLOBAL | SESSION

low_priority_updates
boolean
GLOBAL | SESSION

max_allowed_packet
numeric
GLOBAL | SESSION

max_binlog_cache_size
numeric
GLOBAL

max_binlog_size
numeric
GLOBAL

max_connect_errors
numeric
GLOBAL

max_connections
numeric
GLOBAL

max_delayed_threads
numeric
GLOBAL

max_error_count
numeric
GLOBAL | SESSION

max_heap_table_size
numeric
GLOBAL | SESSION

max_insert_delayed_threads
numeric
GLOBAL

max_join_size
numeric
GLOBAL | SESSION

max_relay_log_size
numeric
GLOBAL

max_seeks_for_key
numeric
GLOBAL | SESSION

max_sort_length
numeric
GLOBAL | SESSION

max_tmp_tables
numeric
GLOBAL | SESSION

max_user_connections
numeric
GLOBAL

max_write_lock_count
numeric
GLOBAL

myisam_stats_method
enum
GLOBAL | SESSION

multi_read_range
numeric
GLOBAL | SESSION

myisam_data_pointer_size
numeric
GLOBAL

log_bin_trust_routine_creators
boolean
GLOBAL

myisam_max_sort_file_size
numeric
GLOBAL | SESSION

myisam_repair_threads
numeric
GLOBAL | SESSION

myisam_sort_buffer_size
numeric
GLOBAL | SESSION

net_buffer_length
numeric
GLOBAL | SESSION

net_read_timeout
numeric
GLOBAL | SESSION

net_retry_count
numeric
GLOBAL | SESSION

net_write_timeout
numeric
GLOBAL | SESSION

old_passwords
numeric
GLOBAL | SESSION

optimizer_prune_level
numeric
GLOBAL | SESSION

optimizer_search_depth
numeric
GLOBAL | SESSION

preload_buffer_size
numeric
GLOBAL | SESSION

query_alloc_block_size
numeric
GLOBAL | SESSION

query_cache_limit
numeric
GLOBAL

query_cache_size
numeric
GLOBAL

query_cache_type
enumeration
GLOBAL | SESSION

query_cache_wlock_invalidate
boolean
GLOBAL | SESSION

query_prealloc_size
numeric
GLOBAL | SESSION

range_alloc_block_size
numeric
GLOBAL | SESSION

read_buffer_size
numeric
GLOBAL | SESSION

read_only
numeric
GLOBAL

read_rnd_buffer_size
numeric
GLOBAL | SESSION

rpl_recovery_rank
numeric
GLOBAL

safe_show_database
boolean
GLOBAL

secure_auth
boolean
GLOBAL

server_id
numeric
GLOBAL

slave_compressed_protocol
boolean
GLOBAL

slave_net_timeout
numeric
GLOBAL

slave_transaction_retries
numeric
GLOBAL

slow_launch_time
numeric
GLOBAL

sort_buffer_size
numeric
GLOBAL | SESSION

sql_auto_is_null
boolean
SESSION

sql_big_selects
boolean
SESSION

sql_big_tables
boolean
SESSION

sql_buffer_result
boolean
SESSION

sql_log_bin
boolean
SESSION

sql_log_off
boolean
SESSION

sql_log_update
boolean
SESSION

sql_low_priority_updates
boolean
GLOBAL | SESSION

sql_max_join_size
numeric
GLOBAL | SESSION

sql_mode
enumeration
GLOBAL | SESSION

sql_notes
boolean
SESSION

sql_quote_show_create
boolean
SESSION

sql_safe_updates
boolean
SESSION

sql_select_limit
numeric
SESSION

sql_slave_skip_counter
numeric
GLOBAL

updatable_views_with_limit
enumeration
GLOBAL | SESSION

sql_warnings
boolean
SESSION

sync_binlog
numeric
GLOBAL

sync_frm
boolean
GLOBAL

storage_engine
enumeration
GLOBAL | SESSION

table_cache
numeric
GLOBAL

table_type
enumeration
GLOBAL | SESSION

thread_cache_size
numeric
GLOBAL

time_zone
string
GLOBAL | SESSION

timestamp
boolean
SESSION

tmp_table_size
enumeration
GLOBAL | SESSION

transaction_alloc_block_size
numeric
GLOBAL | SESSION

transaction_prealloc_size
numeric
GLOBAL | SESSION

tx_isolation
enumeration
GLOBAL | SESSION

unique_checks
boolean
SESSION

wait_timeout
numeric
GLOBAL | SESSION

warning_count
numeric
SESSION


标记为string的变量采用字符串值。标记为numeric的变量采用数字值。标记为boolean的变量可以设置为0、1、ON或OFF。标记为enumeration的变量一般情况应设置为该变量的某个可用值,但还可以设置为对应期望的枚举值的数字。对于枚举系统变量,第1个枚举值应对应0。这不同于ENUM列,第1个枚举值对应1。

论坛徽章:
0
85 [报告]
发表于 2008-04-15 13:06 |只看该作者
5.3.4. 服务器状态变量
服务器维护许多提供操作相关信息的状态变量。你可以通过SHOW STATUS语句查看这些变量和它们的值:

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_files                 | 3          || Created_tmp_tables                | 2          | … | Threads_created                   | 217        || Threads_running                   | 88         || Uptime                            | 1389872    |+-----------------------------------+------------+ 用FLUSH STATUS语句可以将许多状态变量重设为0。

状态变量有以下含义。没有指示版本的变量在MySQL 5.1之前已经出现。关于它们的使用历史,参见MySQL 5.0参考手册。

·         Aborted_clients

由于客户端没有正确关闭连接导致客户端终止而中断的连接数。参见A.2.10节,“通信错误和失效连接”。

·         Aborted_connects

试图连接到MySQL服务器而失败的连接数。参见A.2.10节,“通信错误和失效连接”。

·         Binlog_cache_disk_use

使用临时二进制日志缓存但超过binlog_cache_size值并使用临时文件来保存事务中的语句的事务数量。

·         Binlog_cache_use

使用临时二进制日志缓存的事务数量。

·         Bytes_received

从所有客户端接收到的字节数。

·         Bytes_sent

发送给所有客户端的字节数。

·         Com_xxx

Com_xxx 语句计数变量表示每个xxx 语句执行的次数。每类语句有一个状态变量。例如,Com_delete和Com_insert分别统计DELETE 和INSERT语句执行的次数。

Com_stmt_xxx状态变量为:

o        Com_stmt_prepare

o        Com_stmt_execute

o        Com_stmt_fetch

o        Com_stmt_send_long_data

o        Com_stmt_reset

o        Com_stmt_close

这些变量代表准备好的语句命令。它们的名字对应网络层使用的COM_xxx 命令系列;换句话说:当准备好的语句API调用如mysql_stmt_prepare()、mysql_stmt_执行()并执行时,它们的值增加。但是,当执行下面的SQL语句时,Com_stmt_prepare, Com_stmt_execute和Com_stmt_close也增加:PREPARE、EXECUTE或DEALLOCATE PREPARE。此外,旧(从MySQL 4.1.3起可用)语句计数变量Com_prepare_sql、Com_execute_sql和Com_dealloc_sql的值也随PREPARE、EXECUTE和DEALLOCATE PREPARE语句增加。Com_stmt_fetch代表通过光标获取的网络round-trips的总数量。

所有Com_stmt_xxx变量将增加,即使语句参数未知或执行过程中出现错误。换句话说,它们的值对应发出的请求数,而不是成功完成的请求数。

·         Connections

试图连接到(不管是否成功)MySQL服务器的连接数。

·         Created_tmp_disk_tables

服务器执行语句时在硬盘上自动创建的临时表的数量。

·         Created_tmp_files

mysqld已经创建的临时文件的数量。

·         Created_tmp_files

服务器执行语句时自动创建的内存中的临时表的数量。如果Created_tmp_disk_tables较大,你可能要增加tmp_table_size值使临时 表基于内存而不基于硬盘。

·         Delayed_errors

用INSERT DELAYED写的出现错误的行数(可能为duplicate key)。

·         Delayed_insert_threads

使用的INSERT DELAYED处理器线程数。

·         Delayed_writes

写入的INSERT DELAYED行数。

·         Flush_commands

执行的FLUSH语句数。

·         Handler_commit

内部提交语句数。

·         Handler_discover

MySQL服务器可以问NDB CLUSTER存储引擎是否知道某一名字的表。这被称作发现。Handler_discover说明通过该方法发现的次数。

·         Handler_delete

行从表中删除的次数。

·         Handler_read_first

索引中第一条被读的次数。如果较高,它建议服务器正执行大量全索引扫描;例如,SELECT col1 FROM foo,假定col1有索引。

·         Handler_read_key

根据键读一行的请求数。如果较高,说明查询和表的索引正确。

·         Handler_read_next

按照键顺序读下一行的请求数。如果你用范围约束或如果执行索引扫描来查询索引列,该值增加。

·         Handler_read_prev

按照键顺序读前一行的请求数。该读方法主要用于优化ORDER BY ... DESC。

·         Handler_read_rnd

根据固定位置读一行的请求数。如果你正执行大量查询并需要对结果进行排序该值较高。你可能使用了大量需要MySQL扫描整个表的查询或你的连接没有正确使用键。

·         Handler_read_rnd_next

在数据文件中读下一行的请求数。如果你正进行大量的表扫描,该值较高。通常说明你的表索引不正确或写入的查询没有利用索引。

·         Handler_rollback

内部ROLLBACK语句的数量。

·         Handler_update

在表内更新一行的请求数。

·         Handler_write

在表内插入一行的请求数。

·         Innodb_buffer_pool_pages_data

包含数据的页数(脏或干净)。

·         Innodb_buffer_pool_pages_dirty

当前的脏页数。

·         Innodb_buffer_pool_pages_flushed

要求清空的缓冲池页数。

·         Innodb_buffer_pool_pages_free

空页数。

·         Innodb_buffer_pool_pages_latched

在InnoDB缓冲池中锁定的页数。这是当前正读或写或由于其它原因不能清空或删除的页数。

·           Innodb_buffer_pool_pages_misc

忙的页数,因为它们已经被分配优先用作管理,例如行锁定或适用的哈希索引。该值还可以计算为Innodb_buffer_pool_pages_total - Innodb_buffer_pool_pages_free - Innodb_buffer_pool_pages_data。

·         Innodb_buffer_pool_pages_total

缓冲池总大小(页数)。

·         Innodb_buffer_pool_read_ahead_rnd

InnoDB初始化的“随机”read-aheads数。当查询以随机顺序扫描表的一大部分时发生。

·         Innodb_buffer_pool_read_ahead_seq

InnoDB初始化的顺序read-aheads数。当InnoDB执行顺序全表扫描时发生。

·         Innodb_buffer_pool_read_requests

InnoDB已经完成的逻辑读请求数。

·         Innodb_buffer_pool_reads

不能满足InnoDB必须单页读取的缓冲池中的逻辑读数量。

·         Innodb_buffer_pool_wait_free

一般情况,通过后台向InnoDB缓冲池写。但是,如果需要读或创建页,并且没有干净的页可用,则它还需要先等待页面清空。该计数器对等待实例进行记数。如果已经适当设置缓冲池大小,该值应小。

·         Innodb_buffer_pool_write_requests

向InnoDB缓冲池的写数量。

·         Innodb_data_fsyncs

fsync()操作数。

·         Innodb_data_pending_fsyncs

当前挂起的fsync()操作数。

·         Innodb_data_pending_reads

当前挂起的读数。

·         Innodb_data_pending_writes

当前挂起的写数。

·         Innodb_data_read

至此已经读取的数据数量(字节)。

·         Innodb_data_reads

数据读总数量。

·         Innodb_data_writes

数据写总数量。

·         Innodb_data_written

至此已经写入的数据量(字节)。

·         Innodb_dblwr_writes, Innodb_dblwr_pages_written

已经执行的双写操作数量和为此目的已经写好的页数。参见15.2.14.1节,“磁盘I/O”。

·         Innodb_log_waits

我们必须等待的时间,因为日志缓冲区太小,我们在继续前必须先等待对它清空。

·         Innodb_log_write_requests

日志写请求数。

·         Innodb_log_writes

向日志文件的物理写数量。

·         Innodb_os_log_fsyncs

向日志文件完成的fsync()写数量。

·         Innodb_os_log_pending_fsyncs

挂起的日志文件fsync()操作数量。

·         Innodb_os_log_pending_writes

挂起的日志文件写操作。

·         Innodb_os_log_written

写入日志文件的字节数。

·         Innodb_page_size

编译的InnoDB页大小(默认16KB)。许多值用页来记数;页的大小很容易转换为字节。

·         Innodb_pages_created

创建的页数。

·         Innodb_pages_read

读取的页数。

·         Innodb_pages_written

写入的页数。

·         Innodb_row_lock_current_waits

当前等待的待锁定的行数。

·         Innodb_row_lock_time

行锁定花费的总时间,单位毫秒。

·         Innodb_row_lock_time_avg

行锁定的平均时间,单位毫秒。

·         Innodb_row_lock_time_max

行锁定的最长时间,单位毫秒。

·         Innodb_row_lock_waits

一行锁定必须等待的时间数。

·         Innodb_rows_deleted

从InnoDB表删除的行数。

·         Innodb_rows_inserted

插入到InnoDB表的行数。

·         Innodb_rows_read

从InnoDB表读取的行数。

·         Innodb_rows_updated

InnoDB表内更新的行数。

·         Key_blocks_not_flushed

键缓存内已经更改但还没有清空到硬盘上的键的数据块数量。

·         Key_blocks_unused

键缓存内未使用的块数量。你可以使用该值来确定使用了多少键缓存;参见5.3.3节,“服务器系统变量”中Key_buffer_size的讨论。

·         Key_blocks_used

键缓存内使用的块数量。该值为高水平线标记,说明已经同时最多使用了多少块。

·         Key_read_requests

从缓存读键的数据块的请求数。

·         Key_reads

从硬盘读取键的数据块的次数。如果Key_reads较大,则Key_buffer_size值可能太小。可以用Key_reads/Key_read_requests计算缓存损失率。

·         Key_write_requests

将键的数据块写入缓存的请求数。

·         Key_writes

向硬盘写入将键的数据块的物理写操作的次数。

·         Last_query_cost

用查询优化器计算的最后编译的查询的总成本。用于对比同一查询的不同查询方案的成本。默认值0表示还没有编译查询。 默认值是0。Last_query_cost具有会话范围。

·         Max_used_connections

服务器启动后已经同时使用的连接的最大数量。

·         Not_flushed_delayed_rows

等待写入INSERT DELAY队列的行数。

·         Open_files

打开的文件的数目。

·         Open_streams

打开的流的数量(主要用于记录)。

·         Open_tables

当前打开的表的数量。

·         Opened_tables

已经打开的表的数量。如果Opened_tables较大,table_cache 值可能太小。

·         QCACHE_free_blocks

查询缓存内自由内存块的数量。

·         QCACHE_free_memory

用于查询缓存的自由内存的数量。

·         QCACHE_hits

查询缓存被访问的次数。

·         QCACHE_inserts

加入到缓存的查询数量。

·         QCACHE_lowmem_prunes

由于内存较少从缓存删除的查询数量。

·         QCACHE_not_cached

非缓存查询数(不可缓存,或由于query_cache_type设定值未缓存)。

·         Qcache_queries_in_cache

登记到缓存内的查询的数量。

·         Qcache_total_blocks

查询缓存内的总块数。

·         Questions

已经发送给服务器的查询的个数。

·         Rpl_status

失败安全复制状态(还未使用)。

·         Select_full_join

没有使用索引的联接的数量。如果该值不为0,你应仔细检查表的索引。

·         Select_full_range_join

在引用的表中使用范围搜索的联接的数量。

·         Select_range

在第一个表中使用范围的联接的数量。一般情况不是关键问题,即使该值相当大。

·         Select_range_check

在每一行数据后对键值进行检查的不带键值的联接的数量。如果不为0,你应仔细检查表的索引。

·         Select_scan

对第一个表进行完全扫描的联接的数量。

·         Slave_open_temp_tables

当前由从SQL线程打开的临时表的数量。

·         Slave_running

如果该服务器是连接到主服务器的从服务器,则该值为ON。

·         Slave_retried_transactions

启动后复制从服务器SQL线程尝试事务的总次数。

·         Slow_launch_threads

创建时间超过slow_launch_time秒的线程数。

·         Slow_queries

查询时间超过long_query_time秒的查询的个数。参见5.11.4节,“慢速查询日志”。

·         Sort_merge_passes

排序算法已经执行的合并的数量。如果这个变量值较大,应考虑增加sort_buffer_size系统变量的值。

·         Sort_range

在范围内执行的排序的数量。

·         Sort_rows

已经排序的行数。

·         Sort_scan

通过扫描表完成的排序的数量。

·         Ssl_xxx

用于SSL连接的变量。

·         Table_locks_immediate

立即获得的表的锁的次数。

·         Table_locks_waited

不能立即获得的表的锁的次数。如果该值较高,并且有性能问题,你应首先优化查询,然后拆分表或使用复制。

·         Threads_cached

线程缓存内的线程的数量。

·         Threads_connected

当前打开的连接的数量。

·         Threads_created

创建用来处理连接的线程数。如果Threads_created较大,你可能要增加thread_cache_size值。缓存访问率的计算方法Threads_created/Connections。

·           Threads_running

激活的(非睡眠状态)线程数。

·         Uptime

服务器已经运行的时间(以秒为单位)。

论坛徽章:
0
86 [报告]
发表于 2008-04-15 13:06 |只看该作者

5.4. mysql_fix_privilege_tables:升级MySQL系统表

一些MySQL发布对mysql数据库中的系统表的结构进行了更改,添加了新权限或特性。当你更新到新版本MySQL,你应同时更新系统表,以确保它们的结构最新。首先备份mysql数据库,然后按照下面的程序操作。
在Unix或Unix类系统中,运行mysql_fix_privilege_tables脚本来更新系统表:

shell> mysql_fix_privilege_tables你必须在服务器运行时执行该脚本。它试图连接本机上用root运行的服务器。如果root账户需要密码,在命令行中按下述方法给出密码:

shell> mysql_fix_privilege_tables--password=root_passwordmysql_fix_privilege_tables脚本可以执行将系统表转换为当前格式的任何动作。运行时你可能会看见一些Duplicate column name警告;你可以忽略它们。

运行完脚本后,停止服务器并重启。

在Windows系统中,MySQL分发包括mysql_fix_privilege_tables.sql SQL脚本,你可以用mysql客户端来运行。例如,如果MySQL安装到C:\Program Files\MySQL\MySQL Server 5.1,命令应为:

C:\> C:\Program Files\MySQL\MySQL Server 5.1\bin\mysql -u root -p mysqlmysql> SOURCE C:/Program Files/MySQL/MySQL Server 5.1/scripts/mysql_fix_privilege_tables.sql如果安装到其它目录,相应地更改路径名。

mysql命令将提示输入root密码;按照提示输入密码。

在Unix中,当mysql处理mysql_fix_privilege_tables.sql script脚本中的语句时,你可能会看见一些Duplicate column name警告;你可以忽略它们。

运行完脚本后,停止服务器并重启。

论坛徽章:
0
87 [报告]
发表于 2008-04-15 13:07 |只看该作者

5.5. MySQL服务器关机进程

服务器关闭进程可以概括为:
1.    启动关闭进程

2.    服务器根据需要创建关闭线程

3.    服务器停止接收新连接

4.    服务器终止当前的活动

5.    存储引擎被停掉或关闭

6.    服务器退出

下面是更详细的描述:

1.    启动关闭进程。

可以用多种方法启动服务器的关闭。例如,拥有SHUTDOWN权限的用户可以执行mysqladmin shutdown命令。mysqladmin可以用于所有支持MySQL的平台上。其它操作系统相关的关闭开始方法还可能有:在Unix中,当接收到SIGTERM信号后,服务器关闭。对于在Windows中作为服务运行的服务器,当服务管理器让它关闭时,则关闭。

2.    服务器根据需要创建关闭线程。

根据开始关闭的方式,服务器可以创建线程来处理关闭进程。如果客户端需要关闭,则创建关闭线程。如果收到SIGTERM信号后关闭,信号线程可以自己关闭,或者创建单独的线程来完成。如果服务器尝试创建关闭线程而不能创建(例如,如果内存被耗尽),它在错误日志中给出诊断消息:

Error: Can't create thread to kill server3.    服务器停止接收新连接。

在关闭过程中要想防止启动新活动,服务器停止接收新的客户端连接。它将关闭它帧听的网络连接:TCP/IP端口、Unix套接字文件、Windows命名管道和在Windows中的共享内存。

4.    服务器终止当前的活动。

对于每个与客户端连接相关的线程,与客户端的连接被中断,线程被标记为“杀掉的”。当线程注意到此类标记后则线程终止。空闲连接的线程很快终止。当前正处理查询的线程定期检查它们的状态,终止的时间较长。关于线程终止的详细信息,参见13.5.5.3节,“KILL语法”,特别是关于对MyISAM表的杀掉的REPAIR TABLE或OPTIMIZE TABLE操作。

对于有打开事务的线程,事务被回滚。请注意如果某个线程正在更新非事务表,多行UPDATE或INSERT等操作会使表部分更新,因为操作在完成前会终止。

如果服务器是主复制服务器,与当前连接的从服务器相关的线程的处理方式同其它客户端线程。即每个线程被标记为杀掉的,在下次检查他的状态后会退出。

如果服务器是从复制服务器,在客户端线程标记为杀掉的之前,激活的I/O和SQL线程被停止。SQL线程允许先结束它当前的语句(以避免造成复制问题)然后停止。如果此时SQL线程正位于事务中部,事务则 回滚。

5.    存储引擎被停掉或关闭。

在该阶段,表缓存被清空,所有打开的表被关闭。

每个存储引擎执行它管理的表需要的任何动作。例如,MyISAM清空任何挂起的表索引写操作。InnoDB将它的缓冲池清空到硬盘上(除非innodb_fast_shutdown为2),将当前的LSN写入表内,并终止自己的内部线程。

6.    服务器退出。

论坛徽章:
0
88 [报告]
发表于 2008-04-15 13:07 |只看该作者

5.6. 一般安全问题

本节描述一些常见的需要注意的安全问题,以及一些可以使你的MySQL安装更加安全以防止黑客和误用的措施。关于MySQL用于设置用户账户并检查数据库访问的访问控制系统的具体信息,参见5.7节,“MySQL访问权限系统”。

5.6.1. 通用安全指南
任何在与Internet联网的计算机上使用MySQL的用户都应仔细阅读本节,以避免最常见的安全问题。

讨论安全时,我们强调必须完全保护整个服务器主机的安全(而不只是MySQL服务器)防范各种类型的可能的攻击:偷听、修改、重放和拒绝服务。我们在这里不能覆盖各方面的内容和措施。

MySQL根据访问控制列表(ACL)对所有连接、查询和其它用户尝试执行的操作进行安全管理。MySQL客户端和服务器之间还支持SSL-加密连接。这儿讨论的许多概念并不是MySQL专有的;该思想几乎同样适合所有应用程序。

运行MySQL时,应尽量遵从下面的指导:

·         不要让任何人(除了MySQL root账户)访问mysql数据库中的user表!这很关键。加密的密码才是MySQL中的真正的密码。知道user表中所列的密码并且能访问该账户客访问的主机的人可以很容易地用该用户登录。

·         学习MySQL访问权限系统。用GRANT和REVOKE语句来控制对MySQL的访问。不要授予超过需求的权限。决不能为所有主机授权。

检查清单:

o        试试mysql -u root。如果你能够成功连接服务器而没有要任何密码,则说明有问题。任何人可以作为MySQLroot用户用它的全部权限来连接MySQL服务器!查阅MySQL安装说明,应特别注意关于设置root密码的信息。参见2.9.3节,“使初始MySQL账户安全”。

o        通过SHOW GRANTS语句检查查看谁已经访问了什么。然后使用REVOKE语句删除不再需要的权限。

·         不要将纯文本密码保存到数据库中。如果你的计算机有安全危险,入侵者可以获得所有的密码并使用它们。相反,应使用MD5()、SHA1()或单向哈希函数。

·         不要从词典中选择密码。有专门的程序可以破解它们。即使象“xfish98”这样的密码也很差。而“duag98”要好得多,虽然包含了相同的字“fish”,但从标准QWERTY键盘向左输入。另一种方法是使用“Mhall”,来自句子“Mary had a little lamb.”中每个字的第一个字符。这样很容易记住并输入,但是不知道的人很难猜出来。

·         购买防火墙。这样可以保护你防范各种软件中至少50%的各种类型的攻击。把MySQL放到防火墙后或隔离区(DMZ)。

检查清单:

o        试试从Internet使用nmap工具扫描端口。MySQL默认使用端口3306。不应从不可信任主机访问该端口。另一种检查是否MySQL端口打开的简单方式是从远程机器试试下面的命令,其中server_host是MySQL服务器运行的主机:

o                     shell> telnet server_host 3306如果得到连接并得到一些垃圾字符,则端口打开着,则应从防火墙或路由器上关闭,除非你有合理的理由让它开着。如果telnet挂起或连接被拒绝,则端口被阻塞,这是你所希望的。

不要信任应用程序的用户输入的任何数据。它们可以用Web形式、URL或构建的应用程序输入特殊或逃溢字符序列来尝试欺骗你的代码。如果某个用户输入“; DROP DATABASE mysql;”等内容,应确保你的应用程序保持安全。这是特例,但当黑客使用类似技术时,如果你没有做好准备,结果可能会出现大的安全漏洞和数据丢失。

一个常见的错误是只保护字符串数据值。一定要记住还应检查数字数据。如果当用户输入值234时,应用程序生成查询SELECT * FROM table WHERE ID=234,用户可以输入值234 OR 1=1使应用程序生成查询SELECT * FROM table WHERE ID=234 OR 1=1。结果是服务器查找表内的每个记录。这样会暴露每个记录并造成过多的服务器负载。保护防范这类攻击的最简单的方法是使用单引号将数字常量引起来:SELECT * FROM table WHERE ID='234'。如果用户输入其它信息,均变为字符串的一部分。在数字部分,MySQL自动将字符串转换为数字并剥离字符串包含的附加的非数字字符。

有时候人们会认为如果数据库只包含供公共使用的数据,则不需要保护。这是不正确的。即使允许显示数据库中的任何记录,你仍然应保护防范拒绝服务攻击(例如,基于前面段落中所述的技术的攻击,会使服务器浪费资源)。否则,你的服务器不再响应合法用户。

检查清单:

o        试试用Web形式输入单引号和双引号(‘'’和‘"’)。如果得到任何形式的MySQL错误,立即分析原因。

o        试试修改动态URL,可以在其中添加%22(‘"’)、%23(‘#’)和%27(‘'’)。

o        试试在动态URL中修改数据类型,使用前面示例中的字符,包括数字和字符类型。你的应用程序应足够安全,可以防范此类修改和类似攻击。

o        试试输入字符、空格和特殊符号,不要输入数值字段的数字。你的应用程序应在将它们传递到MySQL之前将它们删除或生成错误。将未经过检查的值传递给MySQL是很危险的!

o        将数据传给MySQL之前先检查其大小。

o        用管理账户之外的用户名将应用程序连接到数据库。不要给应用程序任何不需要的访问权限。

·         许多应用程序编程接口提供了措施逃逸数据值中的特殊字符。如果使用正确,可以防止应用程序用户输入使应用程序生成不期望的效果的语句的数值:

o        MySQL C API:使用mysql_real_escape_string() API调用。

o        MySQL++:查询流使用escape和quote修订符。

o        PHP:使用mysql_escape_string()函数基于MySQL C API中的同名函数。(在PHP 4.0.3之前,使用addslashes())。在PHP 5中,可以使用mysqli扩展名,它支持改进的MySQL鉴定协议和密码,以及用占位符编写的语句。

o        Perl DBI:使用quote()方法或使用占位符。

o        Java JDBC:使用一个PreparedStatement对象和占位符。

其它编程接口有类似的功能。

·         不要通过Internet传送明文(未加密的)数据。该信息可以被有足够时间和能力来截取它并用于个人目的的任何人访问。相反,应使用加密协议,例如SSL或SSH。MySQL支持内部SSL连接,例如版本 4.0.0。可以使用SSH端口映射为通信创建加密(并压缩)的隧道。

·         学会使用tcpdump和strings工具。在大多数情况下,你可以使用下面的命令检查是否MySQL数据流未加密:

·                shell> tcpdump -l -i eth0 -w - src or dst port 3306 | strings(该命令在Linux中可以工作,在其它系统中经过小小的修改后应可以工作)。 警告:如果你没有看见明文数据,并不一定说明信息实际上被加密了。如果你需要较高级别的安全,你应咨询安全专家。

论坛徽章:
0
89 [报告]
发表于 2008-04-15 13:08 |只看该作者
5.6.2. 使MySQL在攻击者面前保持安全
当你连接到MySQL服务器时,你应使用一个密码。密码不以明文在上传输。客户端连接序列中的密码处理在MySQL 4.1.1中已经升级,很安全。如果你仍然使用pre-4.1.1-风格的密码,加密算法不如新算法强;通过一些工作,可以窃取客户端和服务器之间的通信的聪明的攻击者可以破解密码。(关于不同的密码处理方法的讨论参见5.7.9节,“MySQL 4.1中的密码哈希处理”)。 如果客户端和服务器之间的连接通过不可信任网络,你应使用SSH隧道来加密通信。

所有其它信息以文本传送,可以被可以看到连接的任何人读取。如果你担心这个,你可以使用压缩协议来使通信更难以解密。要想使连接更加安全,你应使用SSH来获得加密的MySQL服务器和MySQL客户端之间的TCP/IP连接。你可以从http://www.openssh.org/找到开放源码SSH 客户端,并可以从http://www.ssh.com/获得商业SSH客户端。

你还可以使用MySQL内部OpenSSL支持。参见5.8.7节,“使用安全连接”。

为了使MySQL系统安全,强烈要求你考虑下列建议:

·         对所有MySQL用户使用密码。客户端程序不需要知道运行它的人员的身份。对于客户端/服务器应用程序,用户可以指定客户端程序的用户名。例如,如果other_user没有密码,任何人可以简单地用mysql -u other_user db_name冒充他人调用mysql程序进行连接。如果所有用户有密码,使用其它用户的账户进行连接要困难得多。

要想更改用户的密码,应使用SET PASSWORD语句。还可以直接更新mysql数据库中的user表。例如,要更改所有root用户的MySQL账户的密码,应:

shell> mysql -u rootmysql> UPDATE mysql.user SET Password=PASSWORD('newpwd')    -> WHERE User='root';mysql> FLUSH PRIVILEGES;·         绝对不要作为Unix的root用户运行MySQL服务器。这样做非常危险,因为任何具有FILE权限的用户能够用root创建文件(例如,~root/.bashrc)。为了防止,mysqld拒绝用root运行,除非使用--user=root选项明显指定。

应可以(并且应该)用普通非特权用户运行mysqld。你可以创建独立的Unix中的mysql账户来以便使所有内容更加安全。该账户只用于管理MySQL。要想用其它Unix用户启动mysqld,增加user选项指定/etc/my.cnf选项文件或服务器数据目录的my.cnf选项文件中的[mysqld]组的用户名。例如:

[mysqld]user=mysql该命令使服务器用指定的用户来启动,无论你手动启动或通过mysqld_safe或mysql.server启动。详细信息参见A.3.2节,“如何以普通用户身份运行MySQL”。

作为其它Unix用户而不用root运行mysqld,你不需要更改user表中的root用户名,因为MySQL账户的用户名与Unix账户的用户名无关。

·         不要允许使用表的符号链接。(可以用--skip-symbolic-links选项禁用)。如果你用root运行mysqld则特别重要,因为任何对服务器的数据目录有写访问权限的人则能够删除系统中的任何文件!参见7.6.1.2节,“在Unix平台上使用表的符号链接”。

·         确保mysqld运行时,只使用对数据库目录具有读或写权限的Unix用户来运行。

·         不要将PROCESS或SUPER权限授给非管理用户。mysqladmin processlist的输出显示出当前执行的查询正文,如果另外的用户发出一个UPDATE user SET password=PASSWORD('not_secure')查询,被允许执行那个命令的任何用户可能看得到。

mysqld为有SUPER权限的用户专门保留一个额外的连接,因此即使所有普通连接被占用,MySQL root用户仍可以登录并检查服务器的活动。

可以使用SUPER权限来终止客户端连接,通过更改系统变量的值更改服务的器操作,并控制复制服务器。

·         不要向非管理用户授予FILE权限。有这权限的任何用户能在拥有mysqld守护进程权限的文件系统那里写一个文件!为了更加安全,由SELECT ... INTO OUTFILE生成的所有文件对每个人是可写的,并且你不能覆盖已经存在的文件。

file权限也可以被用来读取任何作为运行服务器的Unix用户可读取或访问的文件。使用该权限,你可以将任何文件读入数据库表。这可能被滥用,例如,通过使用LOAD DATA装载“/etc/passwd”进一个数据库表,然后能用SELECT显示它。

·         如果你不信任你的DNS,你应该在授权表中使用IP数字而不是主机名。在任何情况下,你应该非常小心地使用包含通配符的主机名来创建 授权表条目!

·         如果你想要限制单个账户允许的连接数量,你可以设置mysqld中的max_user_connections变量来完成。GRANT语句也可以支持 资源控制选项来限制服务器对一个账户允许的使用范围。参见13.5.1.3节,“GRANT和REVOKE语法”。

5.6.3. Mysqld安全相关启动选项
下列mysqld选项影响安全:

·         --allow-suspicious-udfs

该选项控制是否可以载入主函数只有xxx符的用户定义函数。默认情况下,该选项被关闭,并且只能载入至少有辅助符的UDF。这样可以防止从未包含合法UDF的共享对象文件载入函数。参见27.2.3.6节,“用户定义函数安全注意事项”。

·         --local-infile[={0|1}]

如果用--local-infile=0启动服务器,则客户端不能使用LOCAL in LOAD DATA语句。参见5.6.4节,“LOAD DATA LOCAL安全问题”。

·         --old-passwords

强制服务器为新密码生成短(pre-4.1)密码哈希。当服务器必须支持旧版本客户端程序时,为了保证兼容性这很有用。参见5.7.9节,“MySQL 4.1中的密码哈希处理”。

·         (OBSOLETE) --safe-show-database

在以前版本的MySQL中,该选项使SHOW DATABASES语句只显示用户具有部分权限的数据库名。在MySQL 5.1中,该选项不再作为现在的 默认行为使用,有一个SHOW DATABASES权限可以用来控制每个账户对数据库名的访问。参见13.5.1.3节,“GRANT和REVOKE语法”。

·         --safe-user-create

如果启用,用户不能用GRANT语句创建新用户,除非用户有mysql.user表的INSERT权限。如果你想让用户具有授权权限来创建新用户,你应给用户授予下面的权限:

mysql> GRANT INSERT(user) ON mysql.user TO 'user_name'@'host_name';这样确保用户不能直接更改权限列,必须使用GRANT语句给其它用户授予该权限。

·         --secure-auth

不允许鉴定有旧(pre-4.1)密码的账户。

·         --skip-grant-tables

这个选项导致服务器根本不使用权限系统。这给每个人以完全访问所有的数据库的权力!(通过执行mysqladmin flush-privileges或mysqladmin reload命令,或执行FLUSH PRIVILEGES语句,你能告诉一个正在运行的服务器再次开始使用授权表。)  

·         --skip-name-resolve

主机名不被解析。所有在授权表的Host的列值必须是IP号或localhost。

·         --skip-networking

在网络上不允许TCP/IP连接。所有到mysqld的连接必须经由Unix套接字进行。

·         --skip-show-database

使用该选项,只允许有SHOW DATABASES权限的用户执行SHOW DATABASES语句,该语句显示所有数据库名。不使用该选项,允许所有用户执行SHOW DATABASES,但只显示用户有SHOW DATABASES权限或部分数据库权限的数据库名。请注意全局权限指数据库的权限。

5.6.4. LOAD DATA LOCAL安全问题
LOAD DATA语句可以装载服务器主机上的文件,若指定LOCAL关键字,可以装载客户端文件。

支持LOCAL版本的LOAD DATA语句有两个可能的安全问题:

·         由MySQL服务器启动文件从客户端向服务器主机的传输。理论上,打过补丁的服务器可以告诉客户端程序传输服务器选择的文件,而不是客户用LOAD DATA语句指定的文件。这样服务器可以访问客户端上客户有读访问权限的任何文件。

·         在Web环境中,客户从Web服务器连接,用户可以使用LOAD DATA LOCAL来读取Web服务器进程有读访问权限的任何文件(假定用户可以运行SQL服务器的任何命令)。在这种环境中,MySQL服务器的客户实际上是Web服务器,而不是连接Web服务器的用户运行的程序。

要处理这些问题,我们更改了MySQL 3.23.49和MySQL 4.0.2(Windows中的4.0.13)中的LOAD DATA LOCAL的处理方法:

·         默认情况下,现在所有二进制分中的发MySQL客户端和库是用--enable-local-infile选项编译,以便与MySQL 3.23.48和以前的版本兼容。

·         如果你从源码构建MySQL但没有使用--enable-local-infile选项来进行configure,则客户不能使用LOAD DATA LOCAL,除非显式调用mysql_options (...MYSQL_OPT_本地_INFILE,0)。参见25.2.3.48节,“mysql_options()”。

·         你可以用--local-infile=0选项启动mysqld从服务器端禁用所有LOAD DATA LOCAL命令。

·         对于mysql命令行客户端,可以通过指定--local-infile[=1]选项启用LOAD DATA LOCAL,或通过--local-infile=0选项禁用。类似地,对于mysqlimport,--local or -L选项启用本地数据文件装载。在任何情况下,成功进行本地装载需要服务器启用相关选项。

·         如果你使用LOAD DATA LOCAL Perl脚本或其它读选项文件中的[client]组的程序,你可以在组内添加local-infile=1选项。但是,为了便面不理解local-infile的程序产生问题,则规定使用loose- prefix:

·                [client]·                loose-local-infile=1·         如果LOAD DATA LOCAL INFILE在服务器或客户端被禁用,试图执行该语句的客户端将收到下面的错误消息:

ERROR 1148: The used command is not allowed with this MySQL version

论坛徽章:
0
90 [报告]
发表于 2008-04-15 13:09 |只看该作者

5.7. MySQL访问权限系统

MySQL有先进但非标准的安全/权限系统。本节描述它的工作原理。
5.7.1. 权限系统的作用
MySQL权限系统的主要功能是证实连接到一台给定主机的用户,并且赋予该用户在数据库上的SELECT、INSERT、UPDATE和DELETE权限。
附加的功能包括有匿名的用户并对于MySQL特定的功能例如LOAD DATA INFILE进行授权及管理操作的能力。

5.7.2. 权限系统工作原理
MySQL权限系统保证所有的用户只执行允许做的事情。当你连接MySQL服务器时,你的身份由你从那儿连接的主机和你指定的用户名来决定。连接后发出请求后,系统根据你的身份和你想做什么来授予权限。

MySQL在认定身份中考虑你的主机名和用户名字,是因为几乎没有原因假定一个给定的用户在因特网上属于同一个人。例如,从office.com连接的用户joe不一定和从elsewhere.com连接的joe是同一个人。MySQL通过允许你区分在不同的主机上碰巧有同样名字的用户来处理它:你可以对joe从office.com进行的连接授与一个权限集,而为joe从elsewhere.com的连接授予一个不同的权限集。

MySQL存取控制包含2个阶段:

阶段1:服务器检查是否允许你连接。
阶段2:假定你能连接,服务器检查你发出的每个请求。看你是否有足够的权限实施它。例如,如果你从数据库表中选择(select)行或从数据库删除表,服务器确定你对表有SELECT权限或对数据库有DROP权限。
如果连接时你的权限被更改了(通过你和其它人),这些更改不一定立即对你发出的下一个语句生效。详情参见5.7.7节,“权限更改何时生效”。

服务器在mysql数据库的 授权表中保存权限信息(即在mysql数据库中)。当MySQL服务器启动时将这些表的内容读入内存,在5.7.7节,“权限更改何时生效”的环境下重新读取它们。访问控制决策取决于内存中的 授权表的份数。

一般情况,你通过GRANT和REVOKE语句间接来操作 授权表的内容,设置账户并控制个人的权限。参见13.5.1.3节,“GRANT和REVOKE语法”。下面讨论了 授权表的结构以及服务器与客户端交互操作时如何使用其内容。

服务器在存取控制的两个阶段使用mysql数据库中的user、db和host表,这些授权表中的列如下:

表名
user
db
host

列范围
Host
Host
Host


User
Db
Db


Password
User
  

权限列
Select_priv
Select_priv
Select_priv


Insert_priv
Insert_priv
Insert_priv


Update_priv
Update_priv
Update_priv


Delete_priv
Delete_priv
Delete_priv


Index_priv
Index_priv
Index_priv


Alter_priv
Alter_priv
Alter_priv


Create_priv
Create_priv
Create_priv


Drop_priv
Drop_priv
Drop_priv


Grant_priv
Grant_priv
Grant_priv


Create_view_priv
Create_view_priv
Create_view_priv


Show_view_priv
Show_view_priv
Show_view_priv


Create_routine_priv
Create_routine_priv
  


Alter_routine_priv
Alter_routine_priv
  


References_priv
References_priv
References_priv


Reload_priv
  
  


Shutdown_priv
  
  


Process_priv
  
  


File_priv
  
  


Show_db_priv
  
  


Super_priv
  
  


Create_tmp_table_priv
Create_tmp_table_priv
Create_tmp_table_priv


Lock_tables_priv
Lock_tables_priv
Lock_tables_priv


Execute_priv
  
  


Repl_slave_priv
  
  


Repl_client_priv
  
  

安全列
ssl_type
  
  


ssl_cipher
  
  


x509_issuer
  
  


x509_subject
  
  

资源控制列
max_questions
  
  


max_updates
  
  


max_connections
  
  


max_user_connections
  
  


对存取控制的第二阶段(请求证实),服务器执行请求验证以确保每个客户端有充分的权限满足各需求。除了user、db和host授权表,如果请求涉及表,服务器可以另外参考tables_priv和columns_priv表。tables_priv和columns_priv表可以对表和列提供更精确的权限控制。这些表的列如下:

表名
tables_priv
columns_priv

范围列
Host
Host


Db
Db


User
User


Table_name
Table_name


  
Column_name

权限列
Table_priv
Column_priv


Column_priv
  

其它列
Timestamp
Timestamp


Grantor
  


Timestamp和Grantor列当前还未使用,这儿不再进一步讨论。

为了对涉及保存程序的请求进行验证,服务器将查阅procs_priv表。该表具有以下列:

表名
procs_priv

范围列
Host


Db


User


Routine_name


Routine_type

权限列
Proc_priv

其它列
Timestamp


Grantor


Routine_type列为ENUM列,值为'FUNCTION'或'PROCEDURE',表示行所指的程序类型。该列允许为同名函数和程序单独授权。

Timestamp和Grantor列当前还未使用,这儿不再进一步讨论。

每个授权表包含范围列和权限列:

l        范围列决定表中每个条目(行)的范围,即,行适用的上下文。例如, 一个user表行的Host和User值为'thomas.loc.gov'和'bob',将被用于证实来自主机thomas.loc.gov的bob对服务器的连接。同样,一个db表行的Host、User和Db列的值是'thomas.loc.gov'、'bob'和'reports'将用在bob从主机thomas.loc.gov联接访问reports数据库的时候。tables_priv和columns_priv表包含范围列,指出每个行适用的表或表/列的组合。procs_priv范围列指出每个行适用的保存程序。

对于检查存取的用途,比较Host值是忽略大小写的。User、Password、Db和Table_name值是区分大小写的。Column_name值在MySQL3.22.12或以后版本是忽略大小写的。

l        权限列指出由一个表行授予的权限,即,可实施什么操作。服务器组合各种的授权表的信息形成一个用户权限的完整描述。为此使用的规则在5.7.6节,“访问控制, 阶段2:请求核实”描述。

范围列包含字符串,如下所述;每个列的默认值是空字符串:

列名
类型

Host
CHAR(60)

User
CHAR(16)

Password
CHAR(16)

Db
CHAR(64)

Table_name
CHAR(64)

Column_name
CHAR(64)

Routine_name
CHAR(64)


为了访问检查目的,Host值的比较对大小写不敏感。User、Password、Db和Table_name值对大小写敏感。Column_name值对大小写不敏感。

在user、db和host表中,所有权限列于单独的列内,被声明为ENUM('N','Y') DEFAULT 'N'。换句话说,每一个权限都可以被禁用和启用,并且 默认是禁用。

在tables_priv、columns_priv和procs_priv表中,权限列被声明为SET列。这些列的值可以包含该表控制的权限的组合:

表名
列名
可能的设置元素

tables_priv
Table_priv
'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'

tables_priv
Column_priv
'Select', 'Insert', 'Update', 'References'

columns_priv
Column_priv
'Select', 'Insert', 'Update', 'References'

procs_priv
Proc_priv
'Execute', 'Alter Routine', 'Grant'


简单地说,服务器使用这样的授权表:

·         user表范围列决定是否允许或拒绝到来的连接。对于允许的连接,user表授予的权限指出用户的全局(超级用户)权限。这些权限适用于服务器上的all数据库。

·         db表范围列决定用户能从哪个主机存取哪个数据库。权限列决定允许哪个操作。授予的数据库级别的权限适用于数据库和它的表。

·         当你想要一个给定的db表行应用于若干主机时,db和host表一起使用。例如,如果你想要一个用户能在你的网络从若干主机使用一个数据库,在用户的db表行的Host值设为空值,然后将那些主机的每一个移入host表。这个机制详细描述在5.7.6节,“访问控制, 阶段2:请求核实”。

注释:host表不受GRANT和REVOKE语句的影响。大多数MySQL安装根本不需要使用该表。

·         tables_priv和columns_priv表类似于db表,但是更精致:它们在表和列级应用而非在数据库级。授予表级别的权限适用于表和所有它的列。授予列级别的权限只适用于专用列。

·         procs_priv表适用于保存的程序。授予程序级别的权限只适用于单个程序。

管理权限(例如RELOAD或SHUTDOWN等等)仅在user表中被指定。这是因为管理性操作是服务器本身的操作并且不是特定数据库,因此没有理由在其他授权表中列出这样的权限。事实上,只需要查询user表来决定你是否执行一个管理操作。

FILE权限也仅在user表中指定。它不是管理性权限,但你在服务器主机上读或写文件的能力与你正在存取的数据库无关。

当mysqld服务器启动时,将授权表的内容读入到内存中。你可以通过FLUSH PRIVILEGES语句或执行mysqladmin flush-privileges或mysqladmin reload命令让它重新读取表。对授权表的更改生效在5.7.7节,“权限更改何时生效”描述。

当你修改授权表的内容时,确保你按你想要的方式更改权限设置是一个好主意。要检查给定账户的权限,使用SHOW GRANTS语句。例如,要检查Host和User值分别为pc84.example.com和bob的账户所授予的权限,应通过语句:



mysql> SHOW GRANTS FOR 'bob'@'pc84.example.com';

一个有用的诊断工具是mysqlaccess脚本,由Carlier Yves 提供给MySQL分发。使用--help选项调用mysqlaccess查明它怎样工作。注意:mysqlaccess仅用user、db和host表检查存取。它不检查tables_priv、columns_priv或procs_priv表中指定的表、列和程序级权限。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP