<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
<channel>
<title><![CDATA[飞鸟的天空 - 数据库资料]]></title>
<link>http://www.cmuch.com/</link>
<description><![CDATA[What you are you do not see,What you see is your shadow.]]></description>
<language>zh-cn</language>
<copyright><![CDATA[Copyright 2005 PBlog3 v2.8]]></copyright>
<webMaster><![CDATA[cn_vipus@yahoo.com.cn(cn_vipus)]]></webMaster>
<generator>PBlog2 v2.4</generator> 
<image>
	<title>飞鸟的天空</title>
	<url>http://www.cmuch.com/images/logos.gif</url>
	<link>http://www.cmuch.com/</link>
	<description>飞鸟的天空</description>
</image>

			<item>
			<link>http://www.cmuch.com/article.asp?id=254</link>
			<title><![CDATA[找不到.so动态库,解决办法]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Fri,24 Jul 2009 10:05:59 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=254</guid>
		<description><![CDATA[最近,做sphinxse与mysql结合,运行indexer的时候,提示:error while loading shared libraries: <br/>libmysqlclient.so.16: cannot open shared object file<br/><br/>原因是ld(动态装载器)找不到libmysqlclient.so.16.0.0的所在位置。<br/><br/>解决办法:<br/>建立/etc/ld.so.conf.d/mysql.conf <br/>将mysql动态库的位置写进这个文件:比如<br/>/usr/local/mysql/lib/mysql<br/><br/>执行sudo ldconfig -v]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=252</link>
			<title><![CDATA[MySQL优化经验]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Thu,16 Jul 2009 11:19:36 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=252</guid>
		<description><![CDATA[同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法，因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。<br/><br/>安装好mysql后，配制文件应该在/usr/local/mysql/share/mysql目录中，配制文件有几个，有my- huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境，当然需要有不同的配制文件了。<br/><br/>一般的情况下，my-medium.cnf这个配制文件就能满足我们的大多需要；一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了，使用mysqladmin variables extended-status –u root –p 可以看到目前的参数，有３个配置参数是最重要的，即key_buffer_size,query_cache_size,table_cache。<br/><br/>key_buffer_size只对MyISAM表起作用，<br/><br/>key_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点　这个数字是远远不够的，通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得）。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql，以下的状态值都是本人通过phpmyadmin获得的实例分析:<br/><br/>这个服务器已经运行了20天<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>key_buffer_size – 128M <br/>key_read_requests – 650759289 <br/>key_reads - 79112 <br/></div></div><br/>比例接近1:8000 健康状况非常好<br/><br/>另外一个估计key_buffer_size的办法　把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。<br/><br/>从4.0.1开始，MySQL提供了查询缓冲机制。使用查询缓冲，MySQL将Sel&#101;ct语句和查询结果存放在缓冲区中，今后对于同样的Sel&#101;ct语句（区分大小写），将直接从缓冲区中读取结果。根据MySQL用户手册，使用查询缓冲最多可以达到238%的效率。<br/><br/>通过调节以下几个参数可以知道query_cache_size设置得是否合理<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>Qcache ins&#101;rts <br/>Qcache hits <br/>Qcache lowmem prunes <br/>Qcache free blocks <br/>Qcache total blocks<br/></div></div><br/>Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况,同时Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，此时需要增加缓冲大小Qcache_hits的值不大，则表明你的查询重复率很低，这种情况下使用查询缓冲反而会影响效率，那么可以考虑不用查询缓冲。此外，在Sel&#101;ct语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。<br/><br/>Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲<br/><br/>我设置:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>query_cache_size = 32M <br/>query_cache_type= 1 <br/></div></div><br/>得到如下状态值:<br/><br/>Qcache queries in cache 12737 表明目前缓存的条数 <br/>Qcache ins&#101;rts 20649006 <br/>Qcache hits 79060095 　看来重复查询率还挺高的 <br/>Qcache lowmem prunes 617913　有这么多次出现缓存过低的情况 <br/>Qcache not cached 189896 　　 <br/>Qcache free memory 18573912　　目前剩余缓存空间 <br/>Qcache free blocks 5328 这个数字似乎有点大　碎片不少 <br/>Qcache total blocks 30953 <br/><br/>如果内存允许32M应该要往上加点<br/><br/>table_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。<br/><br/>对于有1G内存的机器，推荐值是128－256。<br/><br/>笔者设置table_cache = 256<br/><br/>得到以下状态:<br/><br/>Open tables 256 <br/>Opened tables 9046 <br/><br/>虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说,已经运行了20天，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。<br/><br/>如果你不需要记录2进制log 就把这个功能关掉，注意关掉以后就不能恢复出问题前的数据了，需要您手动备份，二进制日志包含所有更新数据的语句，其目的是在恢复数据库时用它来把数据尽可能恢复到最后的状态。另外，如果做同步复制( Replication )的话，也需要使用二进制日志传送修改情况。<br/><br/>log_bin指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。MySQL会在文件名后面自动添加数字引，每次启动服务时，都会重新生成一个新的二进制文件。此外，使用log-bin-index可以指定索引文件；使用binlog-do-db可以指定记录的数据库；使用binlog-ignore-db可以指定不记录的数据库。注意的是：binlog-do-db和binlog-ignore-db一次只指定一个数据库，指定多个数据库需要多个语句。而且，MySQL会将所有的数据库名称改成小写，在指定数据库时必须全部使用小写名字，否则不会起作用。<br/><br/>关掉这个功能只需要在他前面加上#号<br/><br/>#log-bin <br/><br/>开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询，如果需要，还可以记录不使用索引的记录。下面是一个慢查询日志的例子：<br/><br/>开启慢查询日志，需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。<br/><br/>log_slow_queries指定日志文件，如果不提供文件名，MySQL将自己产生缺省文件名。long_query_times指定慢查询的阈值，缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数，它指示记录不使用索引的查询。笔者设置long_query_time=10<br/><br/>笔者设置:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>sort_buffer_size = 1M <br/>max_connections=120 <br/>wait_timeout =120 <br/>back_log=100 <br/>read_buffer_size = 1M <br/>thread_cache=32 <br/>interactive_timeout=120 <br/>thread_concurrency = 4 <br/></div></div><br/>参数说明:<br/><br/>back_log<br/><br/>要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求，这就起作用，然后主线程花些时间(尽管很短) 检查连接并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接，你需要增加它，换句话说，这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效的。<br/><br/>max_connections<br/><br/>并发连接数目最大，120 超过这个值就会自动恢复，出了问题能自动解决<br/><br/>thread_cache<br/><br/>没找到具体说明，不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的<br/><br/>thread_concurrency<br/><br/>#设置为你的cpu数目x2,例如，只有一个cpu,那么thread_concurrency=2 <br/>#有2个cpu,那么thread_concurrency=4 <br/>skip-innodb <br/>#去掉innodb支持<br/><br/>代码:<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/># Example MySQL config file for medium systems. <br/># <br/># This is for a system with little memory (32M - 64M) wh&#101;re MySQL plays <br/># an important part, o&#114; systems up to 128M wh&#101;re MySQL is used together with <br/># other programs (such as a web server) <br/># <br/># You can copy this file to <br/># /etc/my.cnf to set global options, <br/># mysql-data-dir/my.cnf to set server-specific options (in this <br/># installation this directory is /var/lib/mysql) o&#114; <br/># ~/.my.cnf to set user-specific options. <br/># <br/># In this file, you can use all long options that a program supports. <br/># If you want to know which options a program supports, run the program <br/># with the &#34;--help&#34; option. <br/><br/><br/># The following options will be passed to all MySQL clients <br/>[client] <br/>#password = your_password <br/>port = 3306 <br/>socket = /tmp/mysql.sock <br/>#socket = /var/lib/mysql/mysql.sock <br/># Here follows entries for some specific programs <br/><br/><br/># The MySQL server <br/>[mysqld] <br/>port = 3306 <br/>socket = /tmp/mysql.sock <br/>#socket = /var/lib/mysql/mysql.sock <br/>skip-locking <br/>key_buffer = 128M <br/>max_allowed_packet = 1M <br/>table_cache = 256 <br/>sort_buffer_size = 1M <br/>net_buffer_length = 16K <br/>myisam_sort_buffer_size = 1M <br/>max_connections=120 <br/>#addnew config <br/>wait_timeout =120 <br/>back_log=100 <br/>read_buffer_size = 1M <br/>thread_cache=32 <br/>skip-innodb <br/>skip-bdb <br/>skip-name-resolve <br/>join_buffer_size=512k <br/>query_cache_size = 32M <br/>interactive_timeout=120 <br/>long_query_time=10 <br/>log_slow_queries= /usr/local/mysql4/logs/slow_query.log <br/>query_cache_type= 1 <br/># Try number of CPU&#39;s*2 for thread_concurrency <br/>thread_concurrency = 4 <br/><br/><br/>#end new config <br/># Don&#39;t listen on a TCP/IP port at all. This can be a security enhancement, <br/># if all processes that need to connect to mysqld run on the same host. <br/># All interaction with mysqld must be made via Unix sockets o&#114; named pipes. <br/># Note that using this option without enabling named pipes on Windows <br/># (via the &#34;enable-named-pipe&#34; option) will render mysqld useless! <br/># <br/>#skip-networking <br/><br/><br/># Replication Master Server (default) <br/># binary logging is required for replication <br/>#log-bin <br/><br/><br/># required unique id between 1 and 2^32 - 1 <br/># defaults to 1 if master-host is not set <br/># but will not function as a master if omitted <br/>server-id = 1 <br/><br/><br/># Replication Slave (comment out master section to use this) <br/># <br/># To configure this host as a replication slave, you can choose between <br/># two methods : <br/># <br/># 1) Use the CHANGE MASTER TO command (fully described in our manual) - <br/># the syntax is: <br/># <br/># CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=, <br/># MASTER_USER=, MASTER_PASSWORD= ; <br/># <br/># wh&#101;re you replace , , by quoted strings and <br/># by the master&#39;s port number (3306 by default). <br/># <br/># Example: <br/># <br/># CHANGE MASTER TO MASTER_HOST=&#39;125.564.12.1&#39;, MASTER_PORT=3306, <br/># MASTER_USER=&#39;joe&#39;, MASTER_PASSWORD=&#39;secret&#39;; <br/># <br/># o&#114; <br/># <br/># 2) Set the variables below. However, in case you choose this method, then <br/># start replication for the first time (even unsuccessfully, for example <br/># if you mistyped the password in master-password and the slave fails to <br/># connect), the slave will cr&#101;ate a master.info file, and any later <br/># change in this file to the variables&#39; values below will be ignored and <br/># overridden by the content of the master.info file, unless you shutdown <br/># the slave server, del&#101;te master.info and restart the slaver server. <br/># For that reason, you may want to leave the lines below untouched <br/># (commented) and instead use CHANGE MASTER TO (see above) <br/># <br/># required unique id between 2 and 2^32 - 1 <br/># (and different from the master) <br/># defaults to 2 if master-host is set <br/># but will not function as a slave if omitted <br/>#server-id = 2 <br/># <br/># The replication master for this slave - required <br/>#master-host = <br/># <br/># The username the slave will use for authentication when connecting <br/># to the master - required <br/>#master-user = <br/># <br/># The password the slave will authenticate with when connecting to <br/># the master - required <br/>#master-password = <br/># <br/># The port the master is listening on. <br/># optional - defaults to 3306 <br/>#master-port = <br/># <br/># binary logging - not required for slaves, but recommended <br/>#log-bin <br/><br/><br/># Point the following paths to different dedicated disks <br/>#tmpdir = /tmp/ <br/>#log-up&#100;ate = /path-to-dedicated-directory/hostname <br/><br/><br/># Uncomment the following if you are using BDB tables <br/>#bdb_cache_size = 4M <br/>#bdb_max_lock = 10000 <br/><br/><br/># Uncomment the following if you are using InnoDB tables <br/>#innodb_data_home_dir = /var/lib/mysql/ <br/>#innodb_data_file_path = ibdata1:10M:autoextend <br/>#innodb_log_group_home_dir = /var/lib/mysql/ <br/>#innodb_log_arch_dir = /var/lib/mysql/ <br/># You can set .._buffer_pool_size up to 50 - 80 % <br/># of RAM but beware of setting memory usage too high <br/>#innodb_buffer_pool_size = 16M <br/>#innodb_additional_mem_pool_size = 2M <br/># Set .._log_file_size to 25 % of buffer pool size <br/>#innodb_log_file_size = 5M <br/>#innodb_log_buffer_size = 8M <br/>#innodb_flush_log_at_trx_commit = 1 <br/>#innodb_lock_wait_timeout = 50 <br/><br/><br/>[mysqldump] <br/>quick <br/>max_allowed_packet = 16M <br/><br/><br/>[mysql] <br/>no-auto-rehash <br/># Remove the next comment character if you are not familiar with SQL <br/>#safe-up&#100;ates <br/><br/><br/>[isamchk] <br/>key_buffer = 20M <br/>sort_buffer_size = 20M <br/>read_buffer = 2M <br/>write_buffer = 2M <br/><br/><br/>[myisamchk] <br/>key_buffer = 20M <br/>sort_buffer_size = 20M <br/>read_buffer = 2M <br/>write_buffer = 2M <br/><br/><br/>[mysqlhotcopy] <br/>interactive-timeout<br/></div></div><br/>补充<br/><br/>优化table_cachetable_cache指定表高速缓存的大小。每当MySQL访问一个表时，如果在表缓冲区中还有空间，该表就被打开并放入其中，这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables，可以决定是否需要增加 table_cache的值。如果你发现open_tables等于table_cache，并且opened_tables在不断增长，那么你就需要增加table_cache的值了（上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得）。注意，不能盲目地把table_cache设置成很大的值。如果设置得太高，可能会造成文件描述符不足，从而造成性能不稳定或者连接失败。对于有1G内存的机器，推荐值是128－256。<br/><br/>案例1：该案例来自一个不是特别繁忙的服务器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间，打开表的数目比table_cache要少得多。<br/><br/>案例2：该案例来自一台开发服务器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)虽然open_tables已经等于table_cache，但是相对于服务器运行时间来说，opened_tables的值也非常低。因此，增加table_cache的值应该用处不大。案例3：该案例来自一个upderperforming的服务器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时，open_tables达到了最大值，opened_tables的值也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小，它决定索引处理的速度，尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads，可以知道key_buffer_size 设置是否合理。比例key_reads / key_read_requests应该尽可能的低，至少是1:100，1:1000更好（上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得）。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表，但是内部的临时磁盘表是 MyISAM表，也要使用该值。可以使用检查状态值cr&#101;ated_tmp_disk_tables得知详情。对于1G内存的机器，如果不使用 MyISAM表，推荐值是16M（8-64M）。<br/><br/>案例1：健康状况key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2：警报状态key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000，是健康的情况；案例2中比例达到1:11，警报已经拉响。 ]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=251</link>
			<title><![CDATA[phpMyAdmin #2002 - 服务器没有响应]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Mon,29 Jun 2009 17:04:58 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=251</guid>
		<description><![CDATA[部分这类问题是由于 mysql 做了 ip 绑定（bind-address =<br/>127.0.0.1）造成的。这里只需要将 $cfg[&#39;Servers&#39;][$i][&#39;host&#39;] = &#39;localhost&#39; 改为<br/>&#39;127.0.0.1&#39; 就可以了。或者改成localhost.localdomain，这样改的依据是more<br/>/etc/hosts，可以看到localhost和localhost.localdomain被解析为127.0.0.1的，而mysql的<br/>my.cnf里面大家都加了bind-address =<br/>127.0.0.1，所以要修改$cfg[&#39;Servers&#39;][$i][&#39;host&#39;]。<br/><br/>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=240</link>
			<title><![CDATA[Can&#39;t cr&#101;ate/write to file &#39;/tmp&#39;]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Wed,14 Jan 2009 11:28:20 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=240</guid>
		<description><![CDATA[<span style="font-size:10pt"><br/>REMARK :<br/>Don&#39;t do this :<br/>1. mkdir /var/lib/mysql/tmp<br/>2. chmod mysql:mysql /var/lib/mysql/tmp<br/>3. Add the following line into the [mysqld] section: tmpdir = /var/lib/mysql/tmp<br/>4. Restart the server<br/><br/>But do :<br/>1. mkdir /tmp/mysql<br/>2. chmod 777 /tmp/mysql<br/>3. chown mysql:mysql /tmp/mysql<br/>4. vi /etc/my.cnf and add in [mysqld section] : tmpdir = /tmp/mysql<br/>5. /etc/init.d/mysql restart o&#114; /etc/init.d/mysqld restart to restart mysql-server<br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=230</link>
			<title><![CDATA[MySQL性能优化]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Wed,17 Dec 2008 17:26:11 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=230</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/>在Apache, PHP, MySQL的体系架构中，MySQL对于性能的影响最大，也是关键的核心部分。对于Discuz!论坛程序也是如此，MySQL的设置是否合理优化，直接影响到论坛的速度和承载量！同时，MySQL也是优化难度最大的一个部分，不但需要理解一些MySQL专业知识，同时还需要长时间的观察统计并且根据经验进行判断，然后设置合理的参数。<br/><br/>下面我们了解一下MySQL优化的一些基础，MySQL的优化我分为两个部分，一是服务器物理硬件的优化；二是MySQL自身(my.cnf)的优化。<br/><br/><br/>(1) 服务器硬件对MySQL性能的影响<br/><br/>a) 磁盘寻道能力（磁盘I/O）,以目前高转速SCSI硬盘(7200转/秒)为例，这种硬盘理论上每秒寻道7200次，这是物理特性决定的，没有办法改变。 MySQL每秒钟都在进行大量、复杂的查询操作，对磁盘的读写量可想而知。所以，通常认为磁盘I/O是制约MySQL性能的最大因素之一，对于日均访问量在100万PV以上的Discuz!论坛，由于磁盘I/O的制约，MySQL的性能会非常低下！解决这一制约因素可以考虑以下几种解决方案：<br/><br/>使用RAID-0+1磁盘阵列，注意不要尝试使用RAID-5，MySQL在RAID-5磁盘阵列上的效率不会像你期待的那样快； 抛弃传统的硬盘，使用速度更快的闪存式存储设备。经过Discuz!公司技术工程的测试，使用闪存式存储设备可比传统硬盘速度高出6－10倍左右。<br/><br/>b) CPU 对于MySQL应用，推荐使用S.M.P.架构的多路对称CPU，例如：可以使用两颗Intel Xeon 3.6GHz的CPU。<br/><br/>c) 物理内存对于一台使用MySQL的Database Server来说，服务器内存建议不要小于2GB，推荐使用4GB以上的物理内存。<br/><br/><br/>(2) MySQL自身因素当解决了上述服务器硬件制约因素后，让我们看看MySQL自身的优化是如何操作的。对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。下面我们介绍一些对性能影响较大的参数。<br/><br/>由于my.cnf文件的优化设置是与服务器硬件配置息息相关的，因而我们指定一个假想的服务器硬件环境：<br/><br/>CPU: 2颗Intel Xeon 2.4GHz<br/><br/>内存: 4GB DDR<br/><br/>硬盘: SCSI 73GB<br/><br/>下面，我们根据以上硬件配置结合一份已经优化好的my.cnf进行说明：<br/><br/># vi /etc/my.cnf<br/><br/>以下只列出my.cnf文件中[mysqld]段落中的内容，其他段落内容对MySQL运行性能影响甚微，因而姑且忽略。<br/><br/>&nbsp;&nbsp;[mysqld]<br/>&nbsp;&nbsp;port = 3306<br/>&nbsp;&nbsp;serverid = 1 <br/>&nbsp;&nbsp;socket = /tmp/mysql.sock<br/>&nbsp;&nbsp;skip-locking<br/>&nbsp;&nbsp;# 避免MySQL的外部锁定，减少出错几率增强稳定性。<br/>&nbsp;&nbsp;skip-name-resolve<br/><br/>禁止MySQL对外部连接进行DNS解析，使用这一选项可以消除MySQL进行DNS解析的时间。但需要注意，如果开启该选项，则所有远程主机连接授权都要使用IP地址方式，否则MySQL将无法正常处理连接请求！<br/><br/>back_log = 384<br/><br/>指定MySQL可能的连接数量。当MySQL主线程在很短的时间内接收到非常多的连接请求，该参数生效，主线程花费很短的时间检查连接并且启动一个新线程。<br/><br/>back_log参数的值指出在MySQL暂时停止响应新请求之前的短时间内多少个请求可以被存在堆栈中。如果系统在一个短时间内有很多连接，则需要增大该参数的值，该参数值指定到来的TCP/IP连接的侦听队列的大小。不同的操作系统在这个队列大小上有它自己的限制。<br/><br/>试图设定back_log高于你的操作系统的限制将是无效的。默认值为50。对于Linux系统推荐设置为小于512的整数。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; key_buffer_size = 256M<br/>&nbsp;&nbsp;# key_buffer_size指定用于索引的缓冲区大小，增加它可得到更好的索引处理性能。<br/>&nbsp;&nbsp;&nbsp;&nbsp;对于内存在4GB左右的服务器该参数可设置为256M或384M。<br/>&nbsp;&nbsp;注意：该参数值设置的过大反而会是服务器整体效率降低！ <br/>&nbsp;&nbsp;&nbsp;&nbsp; max_allowed_packet = 4M<br/>&nbsp;&nbsp;&nbsp;&nbsp;thread_stack = 256K<br/>&nbsp;&nbsp;&nbsp;&nbsp;table_cache = 128K<br/>&nbsp;&nbsp;&nbsp;&nbsp;sort_buffer_size = 6M<br/><br/>查询排序时所能使用的缓冲区大小。注意：该参数对应的分配内存是每连接独占！如果有100个连接，那么实际分配的总共排序缓冲区大小为100 × 6 ＝ 600MB。所以，对于内存在4GB左右的服务器推荐设置为6-8M。<br/><br/> read_buffer_size = 4M<br/><br/>读查询操作所能使用的缓冲区大小。和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！<br/><br/>join_buffer_size = 8M<br/><br/>联合查询操作所能使用的缓冲区大小，和sort_buffer_size一样，该参数对应的分配内存也是每连接独享！<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; myisam_sort_buffer_size = 64M<br/>&nbsp;&nbsp;&nbsp;&nbsp;table_cache = 512<br/>&nbsp;&nbsp;&nbsp;&nbsp;thread_cache_size = 64<br/>&nbsp;&nbsp;&nbsp;&nbsp;query_cache_size = 64M<br/><br/>指定MySQL查询缓冲区的大小。可以通过在MySQL控制台执行以下命令观察：<br/><br/> # &gt; SHOW VARIABLES LIKE &#39;%query_cache%&#39;;<br/> # &gt; SHOW STATUS LIKE &#39;Qcache%&#39;;<br/> # 如果Qcache_lowmem_prunes的值非常大，则表明经常出现缓冲不够的情况；<br/><br/>如果Qcache_hits的值非常大，则表明查询缓冲使用非常频繁，如果该值较小反而会影响效率，那么可以考虑不用查询缓冲；Qcache_free_blocks，如果该值非常大，则表明缓冲区中碎片很多。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; tmp_table_size = 256M<br/>&nbsp;&nbsp;&nbsp;&nbsp;max_connections = 768<br/><br/>指定MySQL允许的最大连接进程数。如果在访问论坛时经常出现Too Many Connections的错误提 示，则需要增大该参数值。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; max_connect_errors = 10000000<br/>&nbsp;&nbsp;&nbsp;&nbsp;wait_timeout = 10<br/><br/>指定一个请求的最大连接时间，对于4GB左右内存的服务器可以设置为5-10。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp; thread_concurrency = 8<br/><br/>该参数取值为服务器逻辑CPU数量×2，在本例中，服务器有2颗物理CPU，而每颗物理CPU又支持H.T超线程，所以实际取值为4 × 2 ＝ 8<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;skip-networking<br/><br/>开启该选项可以彻底关闭MySQL的TCP/IP连接方式，如果WEB服务器是以远程连接的方式访问MySQL数据库服务器则不要开启该选项！否则将无法正常连接！ <br/><br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>[mysqld]<br/>port = 3306<br/>serverid = 1<br/>socket = /tmp/mysql.sock<br/>skip-locking<br/>skip-name-resolve<br/>back_log = 384<br/>key_buffer_size = 256M<br/>max_allowed_packet = 4M<br/>thread_stack = 256K<br/>table_cache = 128K<br/>sort_buffer_size = 6M<br/>read_buffer_size = 4M<br/>join_buffer_size = 8M<br/>myisam_sort_buffer_size = 64M<br/>table_cache = 512<br/>thread_cache_size = 64<br/>query_cache_size = 64M<br/>tmp_table_size = 256M<br/>max_connections = 768<br/>max_connect_errors = 10000000<br/>wait_timeout = 10<br/>thread_concurrency = 8<br/>skip-networking<br/></div></div><br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=228</link>
			<title><![CDATA[mysql-my.cnf配置中文详解]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Wed,12 Nov 2008 13:43:35 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=228</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/>MYSQL--my.cnf配置中文详解 ZZ2007年08月16日 星期四 15:53mysqld程序--目录和文件<br/>引用<br/>basedir = path&nbsp;&nbsp; 使用给定目录作为根目录(安装目录)。<br/>character-sets-dir = path&nbsp;&nbsp; 给出存放着字符集的目录。<br/>datadir = path&nbsp;&nbsp; 从给定目录读取数据库文件。<br/>pid-file = filename&nbsp;&nbsp; 为mysqld程序指定一个存放进程ID的文件(仅适用于UNIX/Linux系统); Init-V脚本需要使用这个文件里的进程ID结束mysqld进程。<br/>socket = filename&nbsp;&nbsp; 为MySQL客户程序与服务器之间的本地通信指定一个套接字文件(仅适用于UNIX/Linux系统; 默认设置一般是/var/lib/mysql/mysql.sock文件)。在Windows环境下，如果MySQL客户与服务器是通过命名管道进行通信的，--sock选项给出的将是该命名管道的名字(默认设置是MySQL)。<br/>lower_case_table_name = 1/0&nbsp;&nbsp; 新目录和数据表的名字是否只允许使用小写字母; 这个选项在Windows环境下的默认设置是1(只允许使用小写字母)。<br/><br/>mysqld程序--语言设置<br/>引用<br/>character-sets-server = name&nbsp;&nbsp; 新数据库或数据表的默认字符集。为了与MySQL的早期版本保持兼容，这个字符集也可以用--default-character-set选项给出; 但这个选项已经显得有点过时了。<br/>collation-server = name&nbsp;&nbsp; 新数据库或数据表的默认排序方式。<br/>lanuage = name&nbsp;&nbsp; 用指定的语言显示出错信息。<br/><br/>mysqld程序--通信、网络、信息安全<br/>引用<br/>enable-named-pipes&nbsp;&nbsp; 允许Windows 2000/XP环境下的客户和服务器使用命名管道(named pipe)进行通信。这个命名管道的默认名字是MySQL，但可以用--socket选项来改变。<br/>local-infile [=0]&nbsp;&nbsp; 允许/禁止使用LOAD DATA LOCAL语句来处理本地文件。<br/>myisam-recover [=opt1, opt2, ...]&nbsp;&nbsp; 在启动时自动修复所有受损的MyISAM数据表。这个选项的可取值有4种:DEFAULT、BACKUP、QUICK和FORCE; 它们与myisamchk程序的同名选项作用相同。<br/>old-passwords&nbsp;&nbsp; 使用MySQL 3.23和4.0版本中的老算法来加密mysql数据库里的密码(默认使用MySQL 4.1版本开始引入的新加密算法)。<br/>port = n&nbsp;&nbsp; 为MySQL程序指定一个TCP/IP通信端口(通常是3306端口)。<br/>safe-user-cr&#101;ate&nbsp;&nbsp; 只有在mysql.user数据库表上拥有Ins&#101;rt权限的用户才能使用GRANT命令; 这是一种双保险机制(此用户还必须具备GRANT权限才能执行GRANT命令)。<br/>shared-memory&nbsp;&nbsp; 允许使用内存(shared memory)进行通信(仅适用于Windows)。<br/>shared-memory-base-name = name&nbsp;&nbsp; 给共享内存块起一个名字(默认的名字是MySQL)。<br/>skip-grant-tables&nbsp;&nbsp; 不使用mysql数据库里的信息来进行访问控制(警告:这将允许用户任何用户去修改任何数据库)。<br/>skip-host-cache&nbsp;&nbsp; 不使用高速缓存区来存放主机名和IP地址的对应关系。<br/>skip-name-resovle&nbsp;&nbsp; 不把IP地址解析为主机名; 与访问控制(mysql.user数据表)有关的检查全部通过IP地址行进。<br/>skip-networking&nbsp;&nbsp; 只允许通过一个套接字文件(Unix/Linux系统)或通过命名管道(Windows系统)进行本地连接，不允许ICP/IP连接; 这提高了安全性，但阻断了来自网络的外部连接和所有的Java客户程序(Java客户即使在本地连接里也使用TCP/IP)。<br/>user = name&nbsp;&nbsp; mysqld程序在启动后将在给定UNIX/Linux账户下执行; mysqld必须从root账户启动才能在启动后切换到另一个账户下执行; mysqld_safe脚本将默认使用--user=mysql选项来启动mysqld程序。<br/><br/>mysqld程序--内存管理、优化、查询缓存区<br/>引用<br/>bulk_ins&#101;rt_buffer_size = n&nbsp;&nbsp; 为一次插入多条新记录的Ins&#101;rt命令分配的缓存区长度(默认设置是8M)。<br/>key_buffer_size = n&nbsp;&nbsp; 用来存放索引区块的RMA值(默认设置是8M)。<br/>join_buffer_size = n&nbsp;&nbsp; 在参加JOIN操作的数据列没有索引时为JOIN操作分配的缓存区长度(默认设置是128K)。<br/>max_heap_table_size = n&nbsp;&nbsp; HEAP数据表的最大长度(默认设置是16M); 超过这个长度的HEAP数据表将被存入一个临时文件而不是驻留在内存里。<br/>max_connections = n&nbsp;&nbsp; MySQL服务器同时处理的数据库连接的最大数量(默认设置是100)。<br/>query_cache_limit = n&nbsp;&nbsp; 允许临时存放在查询缓存区里的查询结果的最大长度(默认设置是1M)。<br/>query_cache_size = n&nbsp;&nbsp; 查询缓存区的最大长度(默认设置是0，不开辟查询缓存区)。<br/>query_cache_type = 0/1/2&nbsp;&nbsp; 查询缓存区的工作模式:0, 禁用查询缓存区; 1，启用查询缓存区(默认设置); 2，&#34;按需分配&#34;模式，只响应Sel&#101;ct SQL_CACHE命令。<br/>read_buffer_size = n&nbsp;&nbsp; 为从数据表顺序读取数据的读操作保留的缓存区的长度(默认设置是128KB); 这个选项的设置值在必要时可以用SQL命令SET SESSION read_buffer_size = n命令加以改变。<br/>read_rnd_buffer_size = n&nbsp;&nbsp; 类似于read_buffer_size选项，但针对的是按某种特定顺序(比如使用了ORDER BY子句的查询)输出的查询结果(默认设置是256K)。<br/>sore_buffer = n&nbsp;&nbsp; 为排序操作分配的缓存区的长度(默认设置是2M); 如果这个缓存区太小，则必须创建一个临时文件来进行排序。<br/>table_cache = n&nbsp;&nbsp; 同时打开的数据表的数量(默认设置是64)。<br/>tmp_table_size = n&nbsp;&nbsp; 临时HEAP数据表的最大长度(默认设置是32M); 超过这个长度的临时数据表将被转换为MyISAM数据表并存入一个临时文件。<br/><br/>mysqld程序--日志<br/>引用<br/>log [= file]&nbsp;&nbsp; 把所有的连接以及所有的SQL命令记入日志(通用查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname.log文件作为这种日志文件(hostname是服务器的主机名)。<br/>log-slow-queries [= file]&nbsp;&nbsp; 把执行用时超过long_query_time变量值的查询命令记入日志(慢查询日志); 如果没有给出file参数，MySQL将在数据库目录里创建一个hostname-slow.log文件作为这种日志文件(hostname是服务器主机名)。<br/>long_query_time = n&nbsp;&nbsp; 慢查询的执行用时上限(默认设置是10s)。<br/>long_queries_not_using_indexs&nbsp;&nbsp; 把慢查询以及执行时没有使用索引的查询命令全都记入日志(其余同--log-slow-queries选项)。<br/>log-bin [= filename]&nbsp;&nbsp; 把对数据进行修改的所有SQL命令(也就是Ins&#101;rt、Up&#100;ate和Del&#101;te命令)以二进制格式记入日志(二进制变更日志，binary up&#100;ate log)。这种日志的文件名是filename.n或默认的hostname.n，其中n是一个6位数字的整数(日志文件按顺序编号)。<br/>log-bin-index = filename&nbsp;&nbsp; 二进制日志功能的索引文件名。在默认情况下，这个索引文件与二进制日志文件的名字相同，但后缀名是.index而不是.nnnnnn。<br/>max_binlog_size = n&nbsp;&nbsp; 二进制日志文件的最大长度(默认设置是1GB)。在前一个二进制日志文件里的信息量超过这个最大长度之前，MySQL服务器会自动提供一个新的二进制日志文件接续上。<br/>binlog-do-db = dbname&nbsp;&nbsp; 只把给定数据库里的变化情况记入二进制日志文件，其他数据库里的变化情况不记载。如果需要记载多个数据库里的变化情况，就必须在配置文件使用多个本选项来设置，每个数据库一行。<br/>binlog-ignore-db = dbname&nbsp;&nbsp; 不把给定数据库里的变化情况记入二进制日志文件。<br/>sync_binlog = n&nbsp;&nbsp; 每经过n次日志写操作就把日志文件写入硬盘一次(对日志信息进行一次同步)。n=1是最安全的做法，但效率最低。默认设置是n=0，意思是由操作系统来负责二进制日志文件的同步工作。<br/>log-up&#100;ate [= file]&nbsp;&nbsp; 记载出错情况的日志文件名(出错日志)。这种日志功能无法禁用。如果没有给出file参数，MySQL会使用hostname.err作为种日志文件的名字。<br/><br/>mysqld程序--镜像(主控镜像服务器)<br/>引用<br/>server-id = n&nbsp;&nbsp; 给服务器分配一个独一无二的ID编号; n的取值范围是1~2的32次方启用二进制日志功能。<br/>log-bin = name&nbsp;&nbsp; 启用二进制日志功能。这种日志的文件名是filename.n或默认的hostname.n，其中的n是一个6位数字的整数(日志文件顺序编号)。<br/>binlog-do/ignore-db = dbname&nbsp;&nbsp; 只把给定数据库里的变化情况记入二进制日志文件/不把给定的数据库里的变化记入二进制日志文件。<br/><br/>mysqld程序--镜像(从属镜像服务器)<br/>引用<br/>server-id = n&nbsp;&nbsp; 给服务器分配一个唯一的ID编号<br/>log-slave-up&#100;ates&nbsp;&nbsp; 启用从属服务器上的日志功能，使这台计算机可以用来构成一个镜像链(A-&gt;B-&gt;C)。<br/>master-host = hostname&nbsp;&nbsp; 主控服务器的主机名或IP地址。如果从属服务器上存在mater.info文件(镜像关系定义文件)，它将忽略此选项。<br/>master-user = replicusername&nbsp;&nbsp; 从属服务器用来连接主控服务器的用户名。如果从属服务器上存在mater.info文件，它将忽略此选项。<br/>master-password = passwd&nbsp;&nbsp; 从属服务器用来连接主控服务器的密码。如果从属服务器上存在mater.info文件，它将忽略此选项。<br/>master-port = n&nbsp;&nbsp; 从属服务器用来连接主控服务器的TCP/IP端口(默认设置是3306端口)。<br/>master-connect-retry = n&nbsp;&nbsp; 如果与主控服务器的连接没有成功，则等待n秒(s)后再进行管理方式(默认设置是60s)。如果从属服务器存在mater.info文件，它将忽略此选项。<br/>master-ssl-xxx = xxx&nbsp;&nbsp; 对主、从服务器之间的SSL通信进行配置。<br/>read-only = 0/1&nbsp;&nbsp; 0: 允许从属服务器独立地执行SQL命令(默认设置); 1: 从属服务器只能执行来自主控服务器的SQL命令。<br/>read-log-purge = 0/1&nbsp;&nbsp; 1: 把处理完的SQL命令立刻从中继日志文件里删除(默认设置); 0: 不把处理完的SQL命令立刻从中继日志文件里删除。<br/>replicate-do-table = dbname.tablename&nbsp;&nbsp; 与--replicate-do-table选项的含义和用法相同，但数据库和数据库表名字里允许出现通配符&#34;%&#34; (例如: test%.%--对名字以&#34;test&#34;开头的所有数据库里的所以数据库表进行镜像处理)。<br/>replicate-do-db = name&nbsp;&nbsp; 只对这个数据库进行镜像处理。<br/>replicate-ignore-table = dbname.tablename&nbsp;&nbsp; 不对这个数据表进行镜像处理。<br/>replicate-wild-ignore-table = dbn.tablen&nbsp;&nbsp; 不对这些数据表进行镜像处理。<br/>replicate-ignore-db = dbname&nbsp;&nbsp; 不对这个数据库进行镜像处理。<br/>replicate-rewrite-db = db1name &gt; db2name&nbsp;&nbsp; 把主控数据库上的db1name数据库镜像处理为从属服务器上的db2name数据库。<br/>report-host = hostname&nbsp;&nbsp; 从属服务器的主机名; 这项信息只与SHOW SLAVE HOSTS命令有关--主控服务器可以用这条命令生成一份从属服务器的名单。<br/>slave-compressed-protocol = 1&nbsp;&nbsp; 主、从服务器使用压缩格式进行通信--如果它们都支持这么做的话。<br/>slave-skip-errors = n1, n2, ...或all&nbsp;&nbsp; 即使发生出错代码为n1、n2等的错误，镜像处理工作也继续进行(即不管发生什么错误，镜像处理工作也继续进行)。如果配置得当，从属服务器不应该在执行 SQL命令时发生错误(在主控服务器上执行出错的SQL命令不会被发送到从属服务器上做镜像处理); 如果不使用slave-skip-errors选项，从属服务器上的镜像工作就可能因为发生错误而中断，中断后需要有人工参与才能继续进行。<br/><br/>mysqld--InnoDB--基本设置、表空间文件<br/>引用<br/>skip-innodb&nbsp;&nbsp; 不加载InnoDB数据表驱动程序--如果用不着InnoDB数据表，可以用这个选项节省一些内存。<br/>innodb-file-per-table&nbsp;&nbsp; 为每一个新数据表创建一个表空间文件而不是把数据表都集中保存在中央表空间里(后者是默认设置)。该选项始见于MySQL 4.1。<br/>innodb-open-file = n&nbsp;&nbsp; InnoDB数据表驱动程序最多可以同时打开的文件数(默认设置是300)。如果使用了<br/>innodb-file-per-table选项并且需要同时打开很多数据表的话，这个数字很可能需要加大。<br/>innodb_data_home_dir = p&nbsp;&nbsp; InnoDB主目录，所有与InnoDB数据表有关的目录或文件路径都相对于这个路径。在默认的情况下，这个主目录就是MySQL的数据目录。<br/>innodb_data_file_path = ts&nbsp;&nbsp; 用来容纳InnoDB为数据表的表空间: 可能涉及一个以上的文件; 每一个表空间文件的最大长度都必须以字节(B)、兆字节(MB)或千兆字节(GB)为单位给出; 表空间文件的名字必须以分号隔开; 最后一个表空间文件还可以带一个autoextend属性和一个最大长度(max:n)。例如，ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空间文件ibdata1的最大长度是1GB，ibdata2的最大长度也是1G，但允许它扩充到2GB。除文件名外，还可以用硬盘分区的设置名来定义表空间，此时必须给表空间的最大初始长度值加上newraw关键字做后缀，给表空间的最大扩充长度值加上raw关键字做后缀(例如/dev/hdb1: 20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默认设置是ibdata1:10M:autoextend。<br/>innodb_autoextend_increment = n&nbsp;&nbsp; 带有autoextend属性的表空间文件每次加大多少兆字节(默认设置是8MB)。这个属性不涉及具体的数据表文件，那些文件的增大速度相对是比较小的。<br/>innodb_lock_wait_timeout = n&nbsp;&nbsp; 如果某个事务在等待n秒(s)后还没有获得所需要的资源，就使用ROLLBACK命令放弃这个事务。这项设置对于发现和处理未能被InnoDB数据表驱动程序识别出来的死锁条件有着重要的意义。这个选项的默认设置是50s。<br/>innodb_fast_shutdown 0/1&nbsp;&nbsp; 是否以最快的速度关闭InnoDB，默认设置是1，意思是不把缓存在Ins&#101;rt缓存区的数据写入数据表，那些数据将在MySQL服务器下次启动时再写入 (这么做没有什么风险，因为Ins&#101;rt缓存区是表空间的一个组成部分，数据不会丢失)。把这个选项设置为0反面危险，因为在计算机关闭时，InnoDB 驱动程序很可能没有足够的时间完成它的数据同步工作，操作系统也许会在它完成数据同步工作之前强行结束InnoDB，而这会导致数据不完整。<br/><br/>mysqld程序--InnoDB--日志<br/>引用<br/>innodb_log_group_home_dir = p&nbsp;&nbsp; 用来存放InnoDB日志文件的目录路径(如ib_logfile0、ib_logfile1等)。在默认的情况下，InnoDB驱动程序将使用MySQL数据目录作为自己保存日志文件的位置。&nbsp;&nbsp;<br/>innodb_log_files_in_group = n&nbsp;&nbsp; 使用多少个日志文件(默认设置是2)。InnoDB数据表驱动程序将以轮转方式依次填写这些文件; 当所有的日志文件都写满以后，之后的日志信息将写入第一个日志文件的最大长度(默认设置是5MB)。这个长度必须以MB(兆字节)或GB(千兆字节)为单位进行设置。<br/>innodb_flush_log_at_trx_commit = 0/1/2&nbsp;&nbsp; 这个选项决定着什么时候把日志信息写入日志文件以及什么时候把这些文件物理地写(术语称为&#34;同步&#34;)到硬盘上。设置值0的意思是每隔一秒写一次日志并进行同步，这可以减少硬盘写操作次数，但可能造成数据丢失; 设置值1(设置设置)的意思是在每执行完一条COMMIT命令就写一次日志并进行同步，这可以防止数据丢失，但硬盘写操作可能会很频繁; 设置值2是一般折衷的办法，即每执行完一条COMMIT命令写一次日志，每隔一秒进行一次同步。<br/>innodb_flush_method = x&nbsp;&nbsp; InnoDB日志文件的同步办法(仅适用于UNIX/Linux系统)。这个选项的可取值有两种: fdatasync，用fsync()函数进行同步; O_DSYNC，用O_SYNC()函数进行同步。<br/>innodb_log_archive = 1&nbsp;&nbsp; 启用InnoDB驱动程序的archive(档案)日志功能，把日志信息写入ib_arch_log_n文件。启用这种日志功能在InnoDB与 MySQL一起使用时没有多大意义(启用MySQL服务器的二进制日志功能就足够用了)。<br/><br/>mysqld程序--InnoDB--缓存区的设置和优化<br/>引用<br/>innodb_log_buffer_pool_size = n&nbsp;&nbsp; 为InnoDB数据表及其索引而保留的RAM内存量(默认设置是8MB)。这个参数对速度有着相当大的影响，如果计算机上只运行有 MySQL/InnoDB数据库服务器，就应该把全部内存的80%用于这个用途。<br/>innodb_log_buffer_size = n&nbsp;&nbsp; 事务日志文件写操作缓存区的最大长度(默认设置是1MB)。<br/>innodb_additional_men_pool_size = n&nbsp;&nbsp; 为用于内部管理的各种数据结构分配的缓存区最大长度(默认设置是1MB)。<br/>innodb_file_io_threads = n&nbsp;&nbsp; I/O操作(硬盘写操作)的最大线程个数(默认设置是4)。<br/>innodb_thread_concurrency = n&nbsp;&nbsp; InnoDB驱动程序能够同时使用的最大线程个数(默认设置是8)。<br/><br/>mysqld程序--其它选项<br/>引用<br/>bind-address = ipaddr&nbsp;&nbsp; MySQL服务器的IP地址。如果MySQL服务器所在的计算机有多个IP地址，这个选项将非常重要。<br/>default-storage-engine = type&nbsp;&nbsp; 新数据表的默认数据表类型(默认设置是MyISAM)。这项设置还可以通过--default-table-type选项来设置。<br/>default-timezone = name&nbsp;&nbsp; 为MySQL服务器设置一个地理时区(如果它与本地计算机的地理时区不一样)。<br/>ft_min_word_len = n&nbsp;&nbsp; 全文索引的最小单词长度工。这个选项的默认设置是4，意思是在创建全文索引时不考虑那些由3个或更少的字符构建单词。<br/>Max-allowed-packet = n&nbsp;&nbsp; 客户与服务器之间交换的数据包的最大长度，这个数字至少应该大于客户程序将要处理的最大BLOB块的长度。这个选项的默认设置是1MB。<br/>Sql-mode = model1, mode2, ...&nbsp;&nbsp; MySQL将运行在哪一种SQL模式下。这个选项的作用是让MySQL与其他的数据库系统保持最大程度的兼容。这个选项的可取值包括ansi、db2、 o&#114;acle、no_zero_date、pipes_as_concat。<br/><br/>注意：如果在配置文件里给出的某个选项是mysqld无法识别的，MySQL服务器将不启动。<br/><br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=227</link>
			<title><![CDATA[在同一台机运行多个Mysql服务 &amp; 多个主/从在同一主机]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Thu,23 Oct 2008 14:54:18 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=227</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/>**********************************************************<br/>第一部分,　在一台服务器构建多mysql 服务.<br/>**********************************************************<br/><br/>一，绪言<br/>在Mysql中有一mysqld_multi命令，可用于在一台物理服务器运行多个Mysql服务，今天参考一些文档，亲自测试并通过,真高兴，现将操作过程共享给大家!<br/>操作系统:Linux 2.6.13 (Slackware),其它版的Linux应该也差不多.<br/>数据库:Mysql&nbsp;&nbsp;4.0.17 源程序安装(相信最新的5.1.*也差不多，过些天再试试)<br/>规划:运行4个mysql服务:<br/>假设服务器名:db-app&nbsp;&nbsp;(IP为192.168.0.100),<br/>假设服务器名:db-app2&nbsp;&nbsp;(IP为192.168.0.101),<br/>下文直到第二部分,均为讲述db-app中的mysql,<br/><br/><br/>二,准备<br/>用mysql源程序安装,假设在安装时用的configura选择项氯?<br/><br/>./configure --prefix=/usr/local/mysql&nbsp;&nbsp; --datadir=/usr/local/mysql/data1 --sysconfdir=/etc<br/>备注:--prefix将MYSQL安装到/usr/local/mysql, <br/>--datadir将数据库生成/usr/local/mysql/data1<br/>sysconfdir是指定mysql使用到的my.cnf配置文件的搜索路径为/etc<br/>其他mysql安装过程略.<br/><br/>根据Mysql管理手册中提到:每个Mysql的服务都可为独立的，所以它都调用一个my.cnf中各自不同的启动选项--就是下文中将提到的GNR值,使用不同的端口,生成各自的套接文件,服务的数据库都是独立的(更多可查阅mysql官方网站的英文管理手册).<br/><br/>mysqld_multi是管理多个mysqld的服务进程，这些服务进程程序不同的unix socket或是监听于不同的端口。他可以启动、停止和监控当前的服务状态。<br/><br/>----程序在my.cnf(或是在--config-file自定义的配置文件)中搜索[mysqld#]段，&#34;#&#34;可以是任意的正整数。这个正整数就是在下面提及的段序列，即GNR。段的序号做为mysqld_multi的参数，来区别不同的段，这样你就可以控制特定mysqld进程的启动、停止或得到他的报告信息。这些组里的参数就像启动一个mysqld所需要的组的参数一样。但是，如果使用多服务，必须为每个服务指定一个 unix socket或端口(摘自<a href="http://mifor.4dian.org" target="_blank" rel="external">http://mifor.4dian.org</a>中的使用mysqld_multi程序管理多个MySQL服务 )。<br/><br/>从上述文字可看到多Mysql服务中最重要的就是my.cnf配置文件了.<br/>现我贴出我的my.cnf文件.-----------------------<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>[mysqld_multi]<br/>mysqld = /usr/local/mysql/bin/mysqld_safe<br/>mysqladmin = /usr/local/mysql/bin/mysqladmin<br/>user = mysql&nbsp;&nbsp; (用一个帐号来启动所有的mysql服务器,因为是用一相同的帐号。那个么这帐号必须都是每个mysql服务都要用的帐号,最好是管理帐号,下面的口令与相同)<br/>password = mypaswd<br/><br/><br/>[mysqld1]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3306<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock1<br/>pid-file=/usr/local/mysql/data1/db-app1.pid<br/>log=/usr/local/mysql/data1/db-app.log<br/>datadir = /usr/local/mysql/data<br/>user = mysql<br/><br/>[mysqld2]<br/>port = 3307<br/>socket = /tmp/mysql.sock2<br/>pid-file = /usr/local/mysql/data2/db-app2.pid<br/>datadir = /usr/local/mysql/data2<br/>log=/usr/local/mysql/data2/db-app.log<br/>user = mysql<br/><br/><br/>[mysqld3]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3308<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock3<br/>pid-file = /usr/local/mysql/data3/db-app3.pid3<br/>datadir = /usr/local/mysql/data3<br/>log=/usr/local/mysql/data3/db-app.log<br/>user = mysql<br/><br/>[mysqld4]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3309<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock4<br/>pid-file = /usr/local/mysql/data3/db-app4.pid<br/>datadir = /usr/local/mysql/data4<br/>log=/usr/local/mysql/data4/db-app.log<br/>user = mysql<br/><br/>[mysqldump]<br/>quick<br/>max_allowed_packet = 16M<br/><br/>[mysql]<br/>no-auto-rehash<br/><br/><br/>[isamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[myisamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[mysqlhotcopy]<br/>interactive-timeout<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/></div></div><br/>我的配置文件中有mysqld1,mysqld2,mysqld3,mysqld4。就是说我将启动4个mysql服务在同一服务器的不同端口 ——3306-3309，每datadir所指定的数据库文件路径都是不相同的，都有各自不同的日志文件。其它一些设置可用my.cnf 原来的内容.<br/><br/>ok, 重要的my.cnf编好的，现在为配置中不同mysql 服务建立各自文件夹和初始数据库等.<br/>[mysqld1]是一个默认的,在我们安装mysql时已经有了，所以不用管它.<br/><br/>[mysqld2],只要根据配置就的路径为它建立一个目录就可以了.将把该目录改为mysql管理权<br/><br/>db-app:/ #&nbsp;&nbsp;mkdir /usr/local/mysql/data2<br/><br/>建数据库,我们可以把默认的mysql数据库复制过来，以利用其它的mysql帐号,其它数据库根据应用再建立.<br/><br/>db-app:/ # cp /usr/local/mysql/data1/mysql&nbsp;&nbsp;/usr/local/mysql/data2 -R<br/>db-app:/ #&nbsp;&nbsp;chmod mysql.mysql /usr/local/mysql/data2 -R<br/><br/>[mysqld3],[mysqld4], 相同.<br/><br/><br/>我们可能看看这些目录是否都存在.<br/>db-app:/ # ls -l /usr/local/mysql/<br/><br/>drwxr-xr-x&nbsp;&nbsp; 6 mysql mysql&nbsp;&nbsp; 4096 Apr&nbsp;&nbsp;9 17:54 data4<br/>drwxr-x---&nbsp;&nbsp; 2 mysql mysql&nbsp;&nbsp; 4096 Apr&nbsp;&nbsp;9 17:14 data1<br/>drwxr-xr-x&nbsp;&nbsp; 3 mysql mysql&nbsp;&nbsp; 4096 Apr&nbsp;&nbsp;9 17:54 data2<br/>drwxr-xr-x&nbsp;&nbsp; 3 mysql mysql&nbsp;&nbsp; 4096 Apr&nbsp;&nbsp;9 17:54 data3<br/><br/>现在可以通过mysqld_multi启动了。<br/><br/>三,mysqld_multi命令.<br/>使用如下参数来启动mysqld_multi: (注:该命令在mysql的bin目录中,根据上面所提到./configure --prefix=/usr/local/mysql ,所以该文件应该在 /usr/local/mysq/bin, 这得根据你安装时所指定的路径 )<br/>db-app:/ #&nbsp;&nbsp;mysqld_multi [options] {start|stop|report} [GNR[,GNR]...]<br/><br/>start,stop和report是指你想到执行的操作。你可以在单独的服务或是多服务上指定一个操作，区别于选项后面的GNR列表。如果没有指定GNR列表，那么mysqld_multi将在所有的服务中根据选项文件进行操作。<br/><br/>每一个GNR的值是组的序列号或是一个组的序列号范围。此项的值必须是组名字最后的数字，比如说如果组名为mysqld17，那么此项的值则为 17.如果指定一个范围，使用&#34;-&#34;(破折号)来连接二个数字。如GNR的值为10-13,则指组mysqld10到组mysqld13。多个组或是组范围可以在命令行中指定，使用&#34;,&#34;(逗号)隔开。不能有空白的字符(如空格或tab)，在空白字符后面的参数将会被忽略。 (注:GNR值就是我们定义 my.cnf中mysqld#中的值,我这里只有1-4).<br/><br/><br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi --config-file=/etc/my.cnf start 1&nbsp;&nbsp;只启动 第一个mysql服务,相关文件由my.cnf中mysql1设定.<br/><br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp;--config-file=/etc/my.cnf stop 1&nbsp;&nbsp;启止 第一个mysql服务 <br/><br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp; --config-file=/etc/my.cnf start 1-4, 启动 第1至4mysql服务,其实就是我这里的全部.<br/><br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp; --config-file=/etc/my.cnf report&nbsp;&nbsp;1-4<br/><br/>查看启动:<br/><br/>db-app:/ #&nbsp;&nbsp;ps aux <br/><br/>root&nbsp;&nbsp;&nbsp;&nbsp; 10467&nbsp;&nbsp;0.0&nbsp;&nbsp;0.2&nbsp;&nbsp; 2712&nbsp;&nbsp;1300 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;18:59&nbsp;&nbsp; 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3306 --socket=/tmp/mysql.sock1<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 10475&nbsp;&nbsp;0.0&nbsp;&nbsp;0.2&nbsp;&nbsp; 2712&nbsp;&nbsp;1300 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;18:59&nbsp;&nbsp; 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3307 --socket=/tmp/mysql.sock2 <br/>root&nbsp;&nbsp;&nbsp;&nbsp; 10482&nbsp;&nbsp;0.0&nbsp;&nbsp;0.2&nbsp;&nbsp; 2716&nbsp;&nbsp;1300 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;18:59&nbsp;&nbsp; 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3308 --socket=/tmp/mysql.sock3<br/>root&nbsp;&nbsp;&nbsp;&nbsp; 10487&nbsp;&nbsp;0.0&nbsp;&nbsp;0.2&nbsp;&nbsp; 2716&nbsp;&nbsp;1300 pts/0&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;18:59&nbsp;&nbsp; 0:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --port=3309 --socket=/tmp/mysql.sock4<br/>.............................................<br/><br/>四,客户端访问<br/>任何客户端访问都需要指定访问端口.方才能进入指定数据库服务.否则将使用到Mysql默认的端口（3306）所服务的MYSQL。<br/><br/>**********************************************************<br/>第二部分,　在一台服务器构建多mysql主 服务.<br/>**********************************************************<br/><br/>提示:建立一个帐号,专门用于下面主从复制,本例用的的帐号repl, 口令为:&#39;1234567890&#39;, 可让其拥有 sel&#101;ct_priv, reload_priv,process_priv,grant_priv,super_priv,repl_slave_priv,repl_client_priv 权限，并能通过任何客户进行访问,即访问客户为&#39;%&#39;。<br/>主要是修改my.cnf中的内容,让每个mysql生成自己的bin-log文件及各自的运行环境，现贴上我的my.cnf全部内容,相关参数与请参考mysql 官文手册.<br/><br/>#[client]<br/>#password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = your_password<br/>#port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 3306<br/>#socket&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = /tmp/mysql.sock<br/><br/><br/>[mysqld_multi]<br/>mysqld = /usr/local/mysql/bin/mysqld_safe<br/>mysqladmin = /usr/local/mysql/bin/mysqladmin<br/>user = mysql<br/>password = mypasswd<br/>[mysqld1]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3306<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock1<br/>skip-locking<br/>pid-file=/usr/local/mysql/data/net-app1a.pid<br/>datadir = /usr/local/mysql/data<br/>log=/usr/local/mysql/data/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data/slowquery.log<br/>long_query_time = 2<br/>key_buffer = 256M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 2M<br/>read_buffer_size = 2M<br/>myisam_sort_buffer_size = 64M<br/>thread_cache = 32<br/>query_cache_size = 32M<br/>thread_concurrency = 2<br/>max_connections=500<br/>log-bin<br/>log-bin=/usr/local/mysql/data/app-net1_1-bin<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1<br/><br/>[mysqld2]<br/>port = 3307<br/>socket = /tmp/mysql.sock2<br/>pid-file = /usr/local/mysql/data2/net-app1b.pid<br/>datadir = /usr/local/mysql/data2<br/>log=/usr/local/mysql/data2/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data2/slowquery.log<br/>long_query_time = 10<br/>key_buffer = 128M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 1M<br/>read_buffer_size = 1M<br/>myisam_sort_buffer_size = 32M<br/>thread_cache = 32<br/>query_cache_size = 16M<br/>thread_concurrency = 2<br/>max_connections=300<br/>log-bin<br/>log-bin=/usr/local/mysql/data2/app-net1_2-bin<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1<br/><br/>[mysqld3]<br/>port = 3308<br/>socket = /tmp/mysql.sock3<br/>skip-locking<br/>pid-file = /usr/local/mysql/data3/net-app1c.pid<br/>datadir = /usr/local/mysql/data3<br/>log=/usr/local/mysql/data3/net-app1.log<br/>user = mysql<br/>log-bin<br/>log-bin=/usr/local/mysql/data3/app-net1_3-bin<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 1<br/><br/>[mysqld4]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3309<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock4<br/>skip-locking<br/>pid-file = /usr/local/mysql/data1/app-net1d.pid<br/>datadir = /usr/local/mysql/data1<br/>log=/usr/local/mysql/data1/net-app1.log<br/>user = mysql<br/>log-bin<br/>log-bin=/usr/local/mysql/data1/app-net1_4-bin<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 1<br/><br/><br/><br/>[mysqldump]<br/>quick<br/>max_allowed_packet = 16M<br/><br/>[mysql]<br/>no-auto-rehash<br/># Remove the next comment character if you are not familiar with SQL<br/>#safe-up&#100;ates<br/><br/>[isamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[myisamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[mysqlhotcopy]<br/>interactive-timeout<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>**********************<br/><br/>启动多mysql服务都是相同的,<br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp; --config-file=/etc/my.cnf start 1-4<br/><br/>**********************************************************<br/>第三部分,&nbsp;&nbsp;在一台服务器构建多mysql 从服务.<br/>**********************************************************<br/>构建从服务器的预选准备: 建议用mysqld_multi&nbsp;&nbsp; 把主服务器的mysql全部停掉.删除数据目录中的所有除数据库目录以外的任何文件(此文中的数据目录库有４个,datadir = /usr/local/mysql/中的 data1 --&nbsp;&nbsp;data1)．建主从都用相同的数据目录路径．<br/>用Tar 命令把每数据库封装起来，并通过sftp命令put/get到从服务器(db-app1&nbsp;&nbsp;192.168.0.101).<br/><br/>下列操作供参考:<br/>在db-app主机上的操作<br/>db-app:/ #&nbsp;&nbsp;tar -cf data1.tar&nbsp;&nbsp; /usr/local/mysql/data1<br/>db-app:/ #&nbsp;&nbsp;tar -cf data2.tar&nbsp;&nbsp; /usr/local/mysql/data2<br/>db-app:/ #&nbsp;&nbsp;tar -cf data3.tar&nbsp;&nbsp; /usr/local/mysql/data3<br/>db-app:/ #&nbsp;&nbsp;tar -cf data4.tar&nbsp;&nbsp; /usr/local/mysql/data4<br/><br/>在db-app1主机上的操作<br/><br/>db-app1:/ #&nbsp;&nbsp;tar xvf data1.tar&nbsp;&nbsp; <br/>db-app1:/ #&nbsp;&nbsp;tar xvf data2.tar&nbsp;&nbsp; <br/>db-app1:/ #&nbsp;&nbsp;tar xvf data3.tar&nbsp;&nbsp; <br/>db-app1:/ #&nbsp;&nbsp;tar xvf data4.tar&nbsp;&nbsp; <br/><br/>同时，请确认系统帐号mysql是否对主/从服务器的中的mysql数据目录都有操作权限，如果无法确认，你直接更修改这些目录的所有权即可。<br/>在db-app主机上的操作<br/>db-app:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data1 -R<br/>db-app:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data2 -R<br/>db-app:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data3 -R<br/>db-app:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data4 -R<br/><br/>在db-app1主机上的操作<br/>db-app1:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data1 -R<br/>db-app2:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data2 -R<br/>db-app3:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data3 -R<br/>db-app4:/ #&nbsp;&nbsp;chown mysql.mysql&nbsp;&nbsp;&nbsp;&nbsp;/usr/local/mysql/data4 -R<br/><br/>下面就是从服务器上/etc/my.cnf的全部内容.<br/>提示:下面的my.cnf中将会提到一个帐号:repl, 口令为:&#39;1234567890&#39;, 这个帐号就是上面专门建立的。<br/>其实都一样,主要是修改my.cnf中的内容,让每个从mysql通过主mysql的不同的端口,去获取各自bin-log来更新自生的数据库内容．现贴上我的my.cnf全部内容(从服务器),相关参数与请参考mysql 官文手册.<br/><br/><br/>#[client]<br/>#password&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = your_password<br/>#port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 3306<br/>#socket&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = /tmp/mysql.sock<br/><br/>[mysqld_multi]<br/>mysqld = /usr/local/mysql/bin/mysqld_safe<br/>mysqladmin = /usr/local/mysql/bin/mysqladmin<br/>user = mysql<br/>password = netmoniit<br/>[mysqld1]<br/>port&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 3306<br/>socket&nbsp;&nbsp;&nbsp;&nbsp;= /tmp/mysql.sock1<br/>skip-locking<br/>pid-file=/usr/local/mysql/data/net-app1a.pid<br/>datadir = /usr/local/mysql/data<br/>log=/usr/local/mysql/data/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data/slowquery.log<br/>long_query_time = 2<br/>key_buffer = 256M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 2M<br/>read_buffer_size = 2M<br/>myisam_sort_buffer_size = 64M<br/>thread_cache = 32<br/>query_cache_size = 32M<br/>thread_concurrency = 2<br/>max_connections=500<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2<br/>master-host&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; 192.168.0.100<br/>master-user&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; &#39;repl&#39;<br/>master-password =&nbsp;&nbsp; &#39;1234567890&#39;<br/>master-port&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;3309<br/>report-host = net-app1<br/>master-connect-retry = 30<br/>log-bin<br/>log-slave-up&#100;ates<br/><br/><br/>[mysqld2]<br/>port = 3307<br/>socket = /tmp/mysql.sock2<br/>pid-file = /usr/local/mysql/data2/net-app1b.pid<br/>datadir = /usr/local/mysql/data2<br/>log=/usr/local/mysql/data2/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data2/slowquery.log<br/>long_query_time = 10<br/>key_buffer = 128M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 1M<br/>read_buffer_size = 1M<br/>myisam_sort_buffer_size = 32M<br/>thread_cache = 32<br/>query_cache_size = 16M<br/>thread_concurrency = 2<br/>max_connections=300<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2<br/>master-host&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; 192.168.0.100<br/>master-user&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; &#39;repl&#39;<br/>master-password =&nbsp;&nbsp; &#39;1234567890&#39;<br/>master-port&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;3309<br/>report-host = net-app1<br/>master-connect-retry = 30<br/>log-bin<br/>log-slave-up&#100;ates<br/><br/><br/>[mysqld3]<br/>port = 3308<br/>socket = /tmp/mysql.sock3<br/>pid-file = /usr/local/mysql/data3/net-app1c.pid<br/>datadir = /usr/local/mysql/data3<br/>log=/usr/local/mysql/data3/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data3/slowquery.log<br/>long_query_time = 10<br/>key_buffer = 128M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 1M<br/>read_buffer_size = 1M<br/>myisam_sort_buffer_size = 32M<br/>thread_cache = 32<br/>query_cache_size = 16M<br/>thread_concurrency = 2<br/>max_connections=300<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2<br/>master-host&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; 192.168.0.100<br/>master-user&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; &#39;repl&#39;<br/>master-password =&nbsp;&nbsp; &#39;1234567890&#39;<br/>master-port&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;3309<br/>report-host = net-app1<br/>master-connect-retry = 30<br/>log-bin<br/>log-slave-up&#100;ates<br/><br/>[mysqld3]<br/>port = 3308<br/>socket = /tmp/mysql.sock4<br/>pid-file = /usr/local/mysql/data4/net-app1d.pid<br/>datadir = /usr/local/mysql/data4<br/>log=/usr/local/mysql/data4/net-app1.log<br/>user = mysql<br/>log-slow-queries=/usr/local/mysql/data4/slowquery.log<br/>long_query_time = 10<br/>key_buffer = 128M<br/>max_allowed_packet = 1M<br/>table_cache = 512<br/>sort_buffer_size = 1M<br/>read_buffer_size = 1M<br/>myisam_sort_buffer_size = 32M<br/>thread_cache = 32<br/>query_cache_size = 16M<br/>thread_concurrency = 2<br/>max_connections=300<br/>server-id&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; = 2<br/>master-host&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; 192.168.0.100<br/>master-user&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp; &#39;repl&#39;<br/>master-password =&nbsp;&nbsp; &#39;1234567890&#39;<br/>master-port&nbsp;&nbsp;&nbsp;&nbsp; =&nbsp;&nbsp;3309<br/>report-host = net-app1<br/>master-connect-retry = 30<br/>log-bin<br/>log-slave-up&#100;ates<br/><br/><br/>[mysqldump]<br/>quick<br/>max_allowed_packet = 16M<br/><br/>[mysql]<br/>no-auto-rehash<br/># Remove the next comment character if you are not familiar with SQL<br/>#safe-up&#100;ates<br/><br/>[isamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[myisamchk]<br/>key_buffer = 128M<br/>sort_buffer_size = 128M<br/>read_buffer = 2M<br/>write_buffer = 2M<br/><br/>[mysqlhotcopy]<br/>interactive-timeout<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/><br/>****************************************<br/>大功告成,现在分别启动两台主机上的多mysql服务。这样，每个主服务的 mysql都有变化，会自动复制／更新到从服务器对应的数据库中。<br/><br/>db-app:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp; --config-file=/etc/my.cnf start 1-4<br/>db-app1:/ # /usr/local/mysq/bin/mysqld_multi&nbsp;&nbsp; --config-file=/etc/my.cnf start 1-4<br/><br/><br/>********************<br/><br/><br/><br/><br/>五,未来测试,<br/>接下来我想做一个多主一从的Mysql服务器复制解决方案!　那位可以给点意见啊!结构如下．<br/>就是有主服务器Server A , Server B和从服务器 Server C, A 和 B运行着不同的数据库应用, 假设数据库名都不同。Server C（假设这三台ＰＣ上都只运行了一个mysql服务），包括了Ａ了Ｂ服务器的所有Mysql 用户及相同的访问权限, 并集成在一个 Mysql服务中. C通过主/从方式复制Ａ和Ｂ的数据库。<br/><br/>就是差不就是把两个主服务器的mysql合并到一个从服务器中. <br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=220</link>
			<title><![CDATA[mysql 正则表达式]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Wed,04 Jun 2008 10:05:02 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=220</guid>
		<description><![CDATA[<span style="font-size:12pt"><br/>正则表达式是为复杂搜索指定模式的强大方式。<br/><br/>MySQL采用Henry Spencer的正则表达式实施，其目标是符合POSIX 1003.2。请参见附录C：感谢。MySQL采用了扩展的版本，以支持在SQL语句中与REGEXP操作符一起使用的模式匹配操作。请参见3.3.4.7节，“模式匹配”。<br/><br/>在本附录中，归纳了在MySQL中可用于REGEXP操作的特殊字符和结构，并给出了一些示例。本附录未包含可在Henry Spencer的regex(7)手册页面中发现的所有细节。该手册页面包含在MySQL源码分发版中，位于regex目录下的regex.7文件中。<br/><br/>正则表达式描述了一组字符串。最简单的正则表达式是不含任何特殊字符的正则表达式。例如，正则表达式hello匹配hello。<br/><br/>非平凡的正则表达式采用了特殊的特定结构，从而使得它们能够与1个以上的字符串匹配。例如，正则表达式hello|word匹配字符串hello或字符串word。<br/><br/>作为一个更为复杂的示例，正则表达式B[an]*s匹配下述字符串中的任何一个：Bananas，Baaaaas，Bs，以及以B开始、以s结束、并在其中包含任意数目a或n字符的任何其他字符串。<br/><br/>对于REGEXP操作符，正则表达式可以使用任何下述特殊字符和结构：<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ^<br/><br/>匹配字符串的开始部分。<br/><br/>mysql&gt; Sel&#101;ct &#39;fo\nfo&#39; REGEXP &#39;^fo$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;fofo&#39; REGEXP &#39;^fo&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $<br/><br/>匹配字符串的结束部分。<br/><br/>mysql&gt; Sel&#101;ct &#39;fo\no&#39; REGEXP &#39;^fo\no$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;fo\no&#39; REGEXP &#39;^fo$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .<br/><br/>匹配任何字符（包括回车和新行）。<br/><br/>mysql&gt; Sel&#101;ct &#39;fofo&#39; REGEXP &#39;^f.*$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;fo\r\nfo&#39; REGEXP &#39;^f.*$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a*<br/><br/>匹配0或多个a字符的任何序列。<br/><br/>mysql&gt; Sel&#101;ct &#39;Ban&#39; REGEXP &#39;^Ba*n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;Baaan&#39; REGEXP &#39;^Ba*n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;Bn&#39; REGEXP &#39;^Ba*n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a+<br/><br/>匹配1个或多个a字符的任何序列。<br/><br/>mysql&gt; Sel&#101;ct &#39;Ban&#39; REGEXP &#39;^Ba+n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;Bn&#39; REGEXP &#39;^Ba+n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; a?<br/><br/>匹配0个或1个a字符。<br/><br/>mysql&gt; Sel&#101;ct &#39;Bn&#39; REGEXP &#39;^Ba?n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;Ban&#39; REGEXP &#39;^Ba?n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;Baan&#39; REGEXP &#39;^Ba?n&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; de|abc<br/><br/>匹配序列de或abc。<br/><br/>mysql&gt; Sel&#101;ct &#39;pi&#39; REGEXP &#39;pi|apa&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;axe&#39; REGEXP &#39;pi|apa&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;apa&#39; REGEXP &#39;pi|apa&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;apa&#39; REGEXP &#39;^(pi|apa)$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;pi&#39; REGEXP &#39;^(pi|apa)$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;pix&#39; REGEXP &#39;^(pi|apa)$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (abc)*<br/><br/>匹配序列abc的0个或多个实例。<br/><br/>mysql&gt; Sel&#101;ct &#39;pi&#39; REGEXP &#39;^(pi)*$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;pip&#39; REGEXP &#39;^(pi)*$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;pipi&#39; REGEXP &#39;^(pi)*$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {1}, {2,3}<br/><br/>{n}或{m,n}符号提供了编写正则表达式的更通用方式，能够匹配模式的很多前述原子（或“部分”）。m和n均为整数。<br/><br/>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a*<br/><br/>可被写入为a{0,}。<br/><br/>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a+<br/><br/>可被写入为a{1,}。<br/><br/>o&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a?<br/><br/>可被写入为a{0,1}。<br/><br/>更准确地讲，a{n}与a的n个实例准确匹配。a{n,}匹配a的n个或更多实例。a{m,n}匹配a的m～n个实例，包含m和n。<br/><br/>m和n必须位于0～RE_DUP_MAX（默认为255）的范围内，包含0和RE_DUP_MAX。如果同时给定了m和n，m必须小于或等于n。<br/><br/>mysql&gt; Sel&#101;ct &#39;abcde&#39; REGEXP &#39;a[bcd]{2}e&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;abcde&#39; REGEXP &#39;a[bcd]{3}e&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;abcde&#39; REGEXP &#39;a[bcd]{1,10}e&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [a-dX], [^a-dX]<br/><br/>匹配任何是（或不是，如果使用^的话）a、b、c、d或X的字符。两个其他字符之间的“-”字符构成一个范围，与从第1个字符开始到第2个字符之间的所有字符匹配。例如，[0-9]匹配任何十进制数字 。要想包含文字字符“]”，它必须紧跟在开括号“[”之后。要想包含文字字符“-”，它必须首先或最后写入。对于[]对内未定义任何特殊含义的任何字符，仅与其本身匹配。<br/><br/>mysql&gt; Sel&#101;ct &#39;aXbc&#39; REGEXP &#39;[a-dXYZ]&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;aXbc&#39; REGEXP &#39;^[a-dXYZ]$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;aXbc&#39; REGEXP &#39;^[a-dXYZ]+$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;aXbc&#39; REGEXP &#39;^[^a-dXYZ]+$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;gheis&#39; REGEXP &#39;^[^a-dXYZ]+$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;gheisa&#39; REGEXP &#39;^[^a-dXYZ]+$&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [.characters.]<br/><br/>在括号表达式中（使用[和]），匹配用于校对元素的字符序列。字符为单个字符或诸如新行等字符名。在文件regexp/cname.h中，可找到字符名称的完整列表。<br/><br/>mysql&gt; Sel&#101;ct &#39;~&#39; REGEXP &#39;[[.~.]]&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;~&#39; REGEXP &#39;[[.tilde.]]&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [=character_class=]<br/><br/>在括号表达式中（使用[和]），[=character_class=]表示等同类。它与具有相同校对值的所有字符匹配，包括它本身，例如，如果o和(+)均是等同类的成员，那么[[=o=]]、[[=(+)=]]和[o(+)]是同义词。等同类不得用作范围的端点。<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [:character_class:]<br/><br/>在括号表达式中（使用[和]），[:character_class:]表示与术语类的所有字符匹配的字符类。标准的类名称是：<br/><br/>alnum<br/>&#160;&#160;&#160;&#160;<br/><br/>文字数字字符<br/><br/>alpha<br/>&#160;&#160;&#160;&#160;<br/><br/>文字字符<br/><br/>blank<br/>&#160;&#160;&#160;&#160;<br/><br/>空白字符<br/><br/>cntrl<br/>&#160;&#160;&#160;&#160;<br/><br/>控制字符<br/><br/>digit<br/>&#160;&#160;&#160;&#160;<br/><br/>数字字符<br/><br/>graph<br/>&#160;&#160;&#160;&#160;<br/><br/>图形字符<br/><br/>lower<br/>&#160;&#160;&#160;&#160;<br/><br/>小写文字字符<br/><br/>print<br/>&#160;&#160;&#160;&#160;<br/><br/>图形或空格字符<br/><br/>punct<br/>&#160;&#160;&#160;&#160;<br/><br/>标点字符<br/><br/>space<br/>&#160;&#160;&#160;&#160;<br/><br/>空格、制表符、新行、和回车<br/><br/>upper<br/>&#160;&#160;&#160;&#160;<br/><br/>大写文字字符<br/><br/>xdigit<br/>&#160;&#160;&#160;&#160;<br/><br/>十六进制数字字符<br/><br/>它们代表在ctype(3)手册页面中定义的字符类。特定地区可能会提供其他类名。字符类不得用作范围的端点。<br/><br/>mysql&gt; Sel&#101;ct &#39;justalnums&#39; REGEXP &#39;[[:alnum:]]+&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;!!&#39; REGEXP &#39;[[:alnum:]]+&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>·&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [[:&lt;:]], [[:&gt;:]]<br/><br/>这些标记表示word边界。它们分别与word的开始和结束匹配。word是一系列字字符，其前面和后面均没有字字符。字字符是alnum类中的字母数字字符或下划线(_)。<br/><br/>mysql&gt; Sel&#101;ct &#39;a word a&#39; REGEXP &#39;[[:&lt;:]]word[[:&gt;:]]&#39;;&nbsp;&nbsp; -&gt; 1<br/><br/>mysql&gt; Sel&#101;ct &#39;a xword a&#39; REGEXP &#39;[[:&lt;:]]word[[:&gt;:]]&#39;;&nbsp;&nbsp;-&gt; 0<br/><br/>要想在正则表达式中使用特殊字符的文字实例，应在其前面加上2个反斜杠“\”字符。MySQL解析程序负责解释其中一个，正则表达式库负责解释另一个。例如，要想与包含特殊字符“+”的字符串“1+2”匹配，在下面的正则表达式中，只有最后一个是正确的：<br/><br/>mysql&gt; Sel&#101;ct &#39;1+2&#39; REGEXP &#39;1+2&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;1+2&#39; REGEXP &#39;1\+2&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-&gt; 0<br/><br/>mysql&gt; Sel&#101;ct &#39;1+2&#39; REGEXP &#39;1\\+2&#39;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -&gt; 1<br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=218</link>
			<title><![CDATA[如何导入导出MySQL数据库----*.sql文件操作]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Fri,18 Apr 2008 09:55:33 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=218</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/>如何导入导出MySQL数据库----*.sql文件操作<br/><br/>1. 概述<br/>MySQL数据库的导入，有两种方法：<br/>1) 先导出数据库SQL脚本，再导入；<br/>2) 直接拷贝数据库目录和文件。<br/>在不同操作系统或MySQL版本情况下，直接拷贝文件的方法可能会有不兼容的情况发生。<br/>所以一般推荐用SQL脚本形式导入。下面分别介绍两种方法。<br/><br/>Linux下：<br/>2. 方法一 SQL脚本形式<br/>操作步骤如下：<br/>2.1. 导出SQL脚本<br/>在原数据库服务器上，可以用phpMyAdmin工具，或者mysqldump(mysqldump命令位于mysql/bin/目录中)命令行，导出SQL脚本。<br/>2.1.1 用phpMyAdmin工具<br/>导出选项中，选择导出“结构”和“数据”，不要添加“Dro&#112; DATABASE”和“Dro&#112; TABLE”选项。<br/>选中“另存为文件”选项，如果数据比较多，可以选中“gzipped”选项。<br/>将导出的SQL文件保存下来。<br/>2.1.2 用mysqldump命令行<br/>命令格式<br/>mysqldump -u用户名 -p 数据库名 &gt; 数据库名.sql<br/>范例：<br/>mysqldump -uroot -p abc &gt; abc.sql<br/>（导出数据库abc到abc.sql文件）<br/>提示输入密码时，输入该数据库用户名的密码。<br/>2.2. 创建空的数据库<br/>通过主控界面/控制面板，创建一个数据库。假设数据库名为abc，数据库全权用户为abc_f。<br/>2.3. 将SQL脚本导入执行<br/>同样是两种方法，一种用phpMyAdmin（mysql数据库管理）工具，或者mysql命令行。<br/>2.3.1 用phpMyAdmin工具<br/>从控制面板，选择创建的空数据库，点“管理”，进入管理工具页面。<br/>在&#34;SQL&#34;菜单中，浏览选择刚才导出的SQL文件，点击“执行”以上载并执行。<br/>注意：phpMyAdmin对上载的文件大小有限制，php本身对上载文件大小也有限制，如果原始sql文件<br/>比较大，可以先用gzip对它进行压缩，对于sql文件这样的文本文件，可获得1:5或更高的压缩率。<br/>gzip使用方法：<br/># gzip xxxxx.sql<br/>得到<br/>xxxxx.sql.gz文件。<br/>2.3.2 用mysql命令行<br/>命令格式<br/>mysql -u用户名 -p 数据库名 &lt; 数据库名.sql<br/>范例：<br/>mysql -uabc_f -p abc &lt; abc.sql<br/>（导入数据库abc从abc.sql文件）<br/>提示输入密码时，输入该数据库用户名的密码。<br/><br/>3 方法二 直接拷贝<br/>如果数据库比较大，可以考虑用直接拷贝的方法，但不同版本和操作系统之间可能不兼容，要慎用。<br/>3.1 准备原始文件<br/>用tar打包为一个文件<br/>3.2 创建空数据库<br/>3.3 解压<br/>在临时目录中解压，如：<br/>cd /tmp<br/>tar zxf mydb.tar.gz<br/>3.4 拷贝<br/>将解压后的数据库文件拷贝到相关目录<br/>cd mydb/<br/>cp * /var/lib/mysql/mydb/<br/>对于FreeBSD:<br/>cp * /var/db/mysql/mydb/<br/>3.5 权限设置<br/>将拷贝过去的文件的属主改为mysql:mysql，权限改为660<br/>chown mysql:mysql /var/lib/mysql/mydb/*<br/>chmod 660 /var/lib/mysql/mydb/*<br/>把mysqldump出来的数据修改一下。除了要把表增加上) TYPE=MyISAM CHARACTER SET gbk;以外，在下面再增加一句SET NAMES GBK;<br/>这样，数据就可以平滑的导入4.1了，而不必怕出现乱码。<br/><br/><br/><br/>Windows下：<br/>DOS　窗口<br/>开始－＞运行－＞　cmd<br/>导出为：　mysqldump -u 用户名 -p&nbsp;&nbsp;--opt&nbsp;&nbsp;数据库用户名 &gt; 数据库名.sql<br/>输入你的数据库密码!<br/>导入为：mysql -u 用户名 -p 数据库用户名 &lt; 数据库名.sql （要在当前目录下操作）<br/></span>]]></description>
		</item>
		
			<item>
			<link>http://www.cmuch.com/article.asp?id=217</link>
			<title><![CDATA[在MySQL查询结果集中得到记录行号]]></title>
			<author>cn_vipus@yahoo.com.cn(cn_vipus)</author>
			<category><![CDATA[数据库资料]]></category>
			<pubDate>Fri,18 Apr 2008 09:19:45 +0800</pubDate>
			<guid>http://www.cmuch.com/default.asp?id=217</guid>
		<description><![CDATA[<span style="font-size:11pt"><br/><br/><br/><br/>如果需要在查询语句返回的列中包含一列表示该条记录在整个结果集中的行号， ISO SQL:2003 标准提出的方法是提供 ROW_NUMBER() / RANK() 函数。 o&#114;acle 中可以使用标准方法（8i版本以上），也可以使用非标准的 ROWNUM ； MS SQL Server 则在 2005 版本中提供了 ROW_NUMBER() 函数；但在 MySQL 中似乎还没有这样的系统自带功能。虽然 LIMIT 可以很方便的对返回的结果集数量和位置进行过滤，但过滤出来的记录的行号却没办法被 Sel&#101;ct 到。据说 MySQL 是早就想增加这个功能了，但我是还没找到。<br/><br/>解决方法是通过预定义用户变量来实现：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>set @mycnt = 0;<br/>sel&#101;ct (@mycnt := @mycnt + 1) as ROWNUM , othercol from tblname o&#114;der by othercol;<br/></div></div><br/>这样查询出来的结果集中 ROWNUM 就保存了行编号信息。这个行编号信息的某种用途在于当你需要根据需要对数据按照某种规则排序并取出排序之后的某一行数据，并且希望知道这行数据在之前排序中的位置时就用得着了。比如：<br/><div class="UBBPanel codePanel"><div class="UBBTitle"><img src="http://www.cmuch.com/images/code.gif" style="margin:0px 2px -3px 0px" alt="程序代码"/> 程序代码</div><div class="UBBContent"><br/>set @mycnt = 0;<br/>sel&#101;ct * from (<br/>&nbsp;&nbsp;&nbsp;&nbsp;sel&#101;ct (@mycnt := @mycnt + 1) as ROWNUM , othercol<br/>&nbsp;&nbsp;&nbsp;&nbsp; from tblname o&#114;der by othercol<br/>) as A wh&#101;re othercol=OneKeyID;<br/></div></div><br/>当然你也可以通过创建临时表的方法把查询结果写到某个拥有 auto_increment 字段的临时表中再做查询，但考虑到临时表在 MySQL master / slave 模式下可能产生的问题，用这样临时用户定义变量的方式来计算查询结果集每一行对应的行号还是更为简洁 -- 除非你愿意在 PHP 或其他语言脚本中对返回的整个结果集再作处理。<br/><br/><br/></span>]]></description>
		</item>
		
</channel>
</rss>
