<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>温室小花.技术.博客 --纯粹的unix技术博客 &#187; mysql</title>
	<atom:link href="http://www.evanjiang.net.cn/archives/category/database/mysql/feed" rel="self" type="application/rss+xml" />
	<link>http://www.evanjiang.net.cn</link>
	<description>红颜弹指老，刹那芳华，与其天涯思君，恋恋不舍，莫若相忘于江湖！</description>
	<lastBuildDate>Sun, 05 Sep 2010 14:51:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>MySQL数据的切分与应用方案</title>
		<link>http://www.evanjiang.net.cn/archives/1466.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1466.html#comments</comments>
		<pubDate>Sun, 11 Apr 2010 03:17:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1466</guid>
		<description><![CDATA[<p>


 <p>数据的切分分为两种模式，一种是按照不同的表(或者schema)来切分到不同的数据库(主机)上，这种切分可以称之为垂直（纵向）切分；另外一种是根据数据的逻辑关系，将同一个表中的数据按照某种条件拆分到多台数据库（主机）上，这种切分称之为数据的水平（横向）切分。</p>
<p>一个架构较好的应用系统，其总体功能肯定是由多个功能模块所组成的，而每一个功能模块所需要的数据对应到数据库中就是一个或多个表。而在架构设计中，各个功能模块相互之间的交互点越统一，越少，系统的耦合度就越低，系统各个模块的维护性及扩展性就越好。这样的系统，实现数据的垂直切分也就越容易。</p>
<p>数据的垂直切分基本上可以简单地理解为按照表或模块来切分数据，而水平切分则不同。一般来说，简单的水平切分主要是将某个访问及其平凡的表再按照某个字段的某种规则分散到多个表中，每个表包含一部分数据。就是将表中的某些行切分到一个数据库，而另外的某些行又切分到其他数据库中。为了容易地判定各行数据被切分到哪个数据库了，切分总是要按照某种特定的规则来进行的：如根据某个数据类型字段基于特定数据取模，某个时间类型字段的范围

方案一
________________________________________</p>
<p>水平切分，比如按照用户id进行切分，把不同用户的数据分散到不同的表或不同的数据库或不同的数据库服务器上，然后进行主从复制数据



a.一个Mysql集群(这儿所说的集群就是Mysql的Master/Slave方式，不是Mysql Cluster),所有用户的各种数据(bbs,blog,user)保存于某一台服务器的某一个数据库上，下面的n表示子表的数据(用户所在的子表根据用户id % n计算出来，这个可以根据需要定一个值例如10，如果以后发现数据量过大，可以增大n的值比如20，此时则需要进行数据迁移，因为n的值已经变了，用户所在子表的值也随之发生了变化，所以必须进行数据移动，数据迁移前停止网站的各种服务，备份mysql的数据，然后进行数据迁移，其实写一个脚本就可以了，也不是很复杂。



Master  Slave(Slave服务器数量可以根据需要进行适当的扩充)
sns(数据库名称)
bbs0
bbs1
&#8230;
bbsn
blog0
blog1
&#8230;
blogn
user0
user1
&#8230;
usern</p>
<p>b.多个Mysql集群，不同用户的数据保存到不同的数据库服务器上



假如一共有3个节点，散列算法是用户ID模以服务器节点数，假设有三个用户id分别为1,3,5，则保存数据的服务器节点为1,0,2
用户3的数据保存在Master0
master0 slave0
sns(数据库名称)
bbs
blog
user</p>
<p>用户1的数据保存在master1
master1 slave1
sns(数据库名称)
bbs
blog
user</p>
<p>用户5的数据保存在master2
master2 slave2
sns(数据库名称)
bbs
blog
user</p>
<p>方案二
________________________________________

垂直切分，就是按照网站的功能来进行切分，某个SNS网站，按照用户数据、博客数据、照片数据、标签数据等每个模块一个独立的数据库或数据库服务器，此种方案可以根据情况来看是否要做Master/Slave复制



其实下面的例子是垂直切分加上水平切分，这种切分方式的缺点就是如果需要进行关联查询时要跨数据库进行操作，非常的麻烦
db server1
sns(数据库名称)
user0
&#8230;
usern</p>
<p>db server2
sns(数据库名称)
blog0
&#8230;
blogn</p>
<p>db server3
sns(数据库名称)
photo0
&#8230;
photon</p>
<p>垂直切分及水平切分的缺点
________________________________________




由于采用了垂直切分或水平切分，数据分散在不同节点机器上，无法进行全局查找和统计。解决方案一是对主要的基础数据存储在全局表中(或者将全局数据保存在Memcache、BerkeleyDB中)，便于查找和统计，但这类数据不宜太多，部分核心数据。




</p>
]]></description>
			<content:encoded><![CDATA[<p style="float: left;margin: 4px;"><script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 160x600, 创建于 10-2-7 */
google_ad_slot = "8970910006";
google_ad_width = 160;
google_ad_height = 600;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p> <p>数据的切分分为两种模式，一种是按照不同的表(或者schema)来切分到不同的数据库(主机)上，这种切分可以称之为垂直（纵向）切分；另外一种是根据数据的逻辑关系，将同一个表中的数据按照某种条件拆分到多台数据库（主机）上，这种切分称之为数据的水平（横向）切分。</p>
<p>一个架构较好的应用系统，其总体功能肯定是由多个功能模块所组成的，而每一个功能模块所需要的数据对应到数据库中就是一个或多个表。而在架构设计中，各个功能模块相互之间的交互点越统一，越少，系统的耦合度就越低，系统各个模块的维护性及扩展性就越好。这样的系统，实现数据的垂直切分也就越容易。</p>
<p>数据的垂直切分基本上可以简单地理解为按照表或模块来切分数据，而水平切分则不同。一般来说，简单的水平切分主要是将某个访问及其平凡的表再按照某个字段的某种规则分散到多个表中，每个表包含一部分数据。就是将表中的某些行切分到一个数据库，而另外的某些行又切分到其他数据库中。为了容易地判定各行数据被切分到哪个数据库了，切分总是要按照某种特定的规则来进行的：如根据某个数据类型字段基于特定数据取模，某个时间类型字段的范围<br />
<span id="more-1466"></span><br />
方案一<br />
________________________________________</p>
<p>水平切分，比如按照用户id进行切分，把不同用户的数据分散到不同的表或不同的数据库或不同的数据库服务器上，然后进行主从复制数据<br />
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x15, 创建于 10-3-23 */
google_ad_slot = "9129041183";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>a.一个Mysql集群(这儿所说的集群就是Mysql的Master/Slave方式，不是Mysql Cluster),所有用户的各种数据(bbs,blog,user)保存于某一台服务器的某一个数据库上，下面的n表示子表的数据(用户所在的子表根据用户id % n计算出来，这个可以根据需要定一个值例如10，如果以后发现数据量过大，可以增大n的值比如20，此时则需要进行数据迁移，因为n的值已经变了，用户所在子表的值也随之发生了变化，所以必须进行数据移动，数据迁移前停止网站的各种服务，备份mysql的数据，然后进行数据迁移，其实写一个脚本就可以了，也不是很复杂。<br />
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, 创建于 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>Master  Slave(Slave服务器数量可以根据需要进行适当的扩充)<br />
sns(数据库名称)<br />
bbs0<br />
bbs1<br />
&#8230;<br />
bbsn<br />
blog0<br />
blog1<br />
&#8230;<br />
blogn<br />
user0<br />
user1<br />
&#8230;<br />
usern</p>
<p>b.多个Mysql集群，不同用户的数据保存到不同的数据库服务器上<br />
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x15, 创建于 10-3-23 */
google_ad_slot = "9129041183";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>假如一共有3个节点，散列算法是用户ID模以服务器节点数，假设有三个用户id分别为1,3,5，则保存数据的服务器节点为1,0,2<br />
用户3的数据保存在Master0<br />
master0 slave0<br />
sns(数据库名称)<br />
bbs<br />
blog<br />
user</p>
<p>用户1的数据保存在master1<br />
master1 slave1<br />
sns(数据库名称)<br />
bbs<br />
blog<br />
user</p>
<p>用户5的数据保存在master2<br />
master2 slave2<br />
sns(数据库名称)<br />
bbs<br />
blog<br />
user</p>
<p>方案二<br />
________________________________________<br />
<a href="http://ad.zanox.com/ppc/?15139536C65181673T"><img src="http://ad.zanox.com/ppv/?15139536C65181673" align="bottom" width="728" height="90" border="0" hspace="1" alt="bookair b008 728x90"></a><br />
垂直切分，就是按照网站的功能来进行切分，某个SNS网站，按照用户数据、博客数据、照片数据、标签数据等每个模块一个独立的数据库或数据库服务器，此种方案可以根据情况来看是否要做Master/Slave复制<br />
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, 创建于 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>其实下面的例子是垂直切分加上水平切分，这种切分方式的缺点就是如果需要进行关联查询时要跨数据库进行操作，非常的麻烦<br />
db server1<br />
sns(数据库名称)<br />
user0<br />
&#8230;<br />
usern</p>
<p>db server2<br />
sns(数据库名称)<br />
blog0<br />
&#8230;<br />
blogn</p>
<p>db server3<br />
sns(数据库名称)<br />
photo0<br />
&#8230;<br />
photon</p>
<p>垂直切分及水平切分的缺点<br />
________________________________________<br />
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x15, 创建于 10-3-23 */
google_ad_slot = "9129041183";
google_ad_width = 728;
google_ad_height = 15;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script><br />
由于采用了垂直切分或水平切分，数据分散在不同节点机器上，无法进行全局查找和统计。解决方案一是对主要的基础数据存储在全局表中(或者将全局数据保存在Memcache、BerkeleyDB中)，便于查找和统计，但这类数据不宜太多，部分核心数据。<br />
<script type="text/javascript"><!--
  google_ad_client = "pub-8438729971248494";
  google_ad_format = "js_sdo";
  google_cts_mode ="rs";
  google_num_cts = "8";
  google_searchbox_color_border = "0066CC";
  google_searchbox_width = 585;
  google_searchbox_height = 26;
  google_link_target = 2;
  google_logo_pos = "left";
  google_rs_pos = "below";
  google_ad_height = 90;
  google_ad_width = 728;
//-->
</script>
<script type="text/javascript"
  src="http://pagead2.googlesyndication.com/pagead/show_sdo.js">
</script>
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1466.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL数据库在Linux下二进制日志恢复方法</title>
		<link>http://www.evanjiang.net.cn/archives/1374.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1374.html#comments</comments>
		<pubDate>Thu, 03 Dec 2009 03:27:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1374</guid>
		<description><![CDATA[<p style="float: right;margin: 4px;">


</p> <p>如果MySQL服务器启用了二进制日志，你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如，从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog：用于处理二进制日志文件的实用工具”。</p>
<p>　　要想从二进制日志恢复数据，你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini，取决于你的系统)中找到路径。如果未包含在选项文件中，当服务器启动时，可以在命令行中以选项的形式给出。启用二进制日志的选项为&#8211; log-bin。要想确定当前的二进制日志文件的文件名，输入下面的MySQL语句：</p>
<p>　　SHOW BINLOG EVENTS \G</p>
<p>　　你还可以从命令行输入下面的内容：</p>
<p>　　mysql &#8211;user=root -pmy_pwd -e &#8216;SHOW BINLOG EVENTS \G&#8217;</p>
<p>　　将密码my_pwd替换为服务器的root密码。</p>
<p>　　1. 指定恢复时间</p>
<p>　　对于MySQL 4.1.4，可以在mysqlbinlog语句中通过&#8211;start-date和&#8211;stop-date选项指定DATETIME格式的起止时间。举例说明，假设在今天上午10:00(今天是2005年4月20日)，执行SQL语句来删除一个大表。要想恢复表和数据，你可以恢复前晚上的备份，并输入：</p>
<p>　　mysqlbinlog &#8211;stop-date=&#8221;2005-04-20 9:59:59&#8243; /var/log/mysql/bin.123456 \
　　&#124; mysql -u root -pmypwd</p>
<p>
　　该命令将恢复截止到在&#8211;stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句，可能你想要恢复后面发生的活动。根据这些，你可以用起使日期和时间再次运行mysqlbinlog：</p>
<p>　　mysqlbinlog &#8211;start-date=&#8221;2005-04-20 10:01:00&#8243; /var/log/mysql/bin.123456 \
　　&#124; mysql -u root -pmypwd \</p>
<p>　　在该行中，从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。</p>
<p>　　2. 指定恢复位置</p>
<p>　　也可以不指定日期和时间，而使用mysqlbinlog的选项&#8211;start-position和&#8211;stop-position来指定日志位置。它们的作用与起止日选项相同，不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法，特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号，可以运行mysqlbinlog寻找执行了不期望的事务的时间范围，但应将结果重新指向文本文件以便进行检查。操作方法为：</p>
<p>　　mysqlbinlog &#8211;start-date=&#8221;2005-04-20 9:55:00&#8243; &#8211;stop-date=&#8221;2005-04-20 10:05:00&#8243; \
　　/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql</p>
<p>　　该命令将在/tmp目录创建小的文本文件，将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件，寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作，应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后，你应从命令行输入下面内容：</p>
<p>　　mysqlbinlog &#8211;stop-position=&#8221;368312&#8243; /var/log/mysql/bin.123456 \
　　&#124; mysql -u root -pmypwd
　　mysqlbinlog &#8211;start-position=&#8221;368315&#8243; /var/log/mysql/bin.123456 [...]]]></description>
			<content:encoded><![CDATA[<p>如果MySQL服务器启用了二进制日志，你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如，从你最后一次备份)直到现在或另一个指定的时间点的数据。“mysqlbinlog：用于处理二进制日志文件的实用工具”。</p>
<p>　　要想从二进制日志恢复数据，你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini，取决于你的系统)中找到路径。如果未包含在选项文件中，当服务器启动时，可以在命令行中以选项的形式给出。启用二进制日志的选项为&#8211; log-bin。要想确定当前的二进制日志文件的文件名，输入下面的MySQL语句：</p>
<p>　　SHOW BINLOG EVENTS \G</p>
<p>　　你还可以从命令行输入下面的内容：</p>
<p>　　mysql &#8211;user=root -pmy_pwd -e &#8216;SHOW BINLOG EVENTS \G&#8217;</p>
<p>　　将密码my_pwd替换为服务器的root密码。</p>
<p>　　1. 指定恢复时间</p>
<p>　　对于MySQL 4.1.4，可以在mysqlbinlog语句中通过&#8211;start-date和&#8211;stop-date选项指定DATETIME格式的起止时间。举例说明，假设在今天上午10:00(今天是2005年4月20日)，执行SQL语句来删除一个大表。要想恢复表和数据，你可以恢复前晚上的备份，并输入：</p>
<p>　　mysqlbinlog &#8211;stop-date=&#8221;2005-04-20 9:59:59&#8243; /var/log/mysql/bin.123456 \<br />
　　| mysql -u root -pmypwd</p>
<p><span id="more-1374"></span><br />
　　该命令将恢复截止到在&#8211;stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句，可能你想要恢复后面发生的活动。根据这些，你可以用起使日期和时间再次运行mysqlbinlog：</p>
<p>　　mysqlbinlog &#8211;start-date=&#8221;2005-04-20 10:01:00&#8243; /var/log/mysql/bin.123456 \<br />
　　| mysql -u root -pmypwd \</p>
<p>　　在该行中，从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。</p>
<p>　　2. 指定恢复位置</p>
<p>　　也可以不指定日期和时间，而使用mysqlbinlog的选项&#8211;start-position和&#8211;stop-position来指定日志位置。它们的作用与起止日选项相同，不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法，特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号，可以运行mysqlbinlog寻找执行了不期望的事务的时间范围，但应将结果重新指向文本文件以便进行检查。操作方法为：</p>
<p>　　mysqlbinlog &#8211;start-date=&#8221;2005-04-20 9:55:00&#8243; &#8211;stop-date=&#8221;2005-04-20 10:05:00&#8243; \<br />
　　/var/log/mysql/bin.123456 > /tmp/mysql_restore.sql</p>
<p>　　该命令将在/tmp目录创建小的文本文件，将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件，寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作，应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后，你应从命令行输入下面内容：</p>
<p>　　mysqlbinlog &#8211;stop-position=&#8221;368312&#8243; /var/log/mysql/bin.123456 \<br />
　　| mysql -u root -pmypwd<br />
　　mysqlbinlog &#8211;start-position=&#8221;368315&#8243; /var/log/mysql/bin.123456 \<br />
　　| mysql -u root -pmypwd \</p>
<p>　　上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句，恢复的数据和相关MySQL日志将反应事务执行的原时间。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1374.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL允许远程连接的设置总结</title>
		<link>http://www.evanjiang.net.cn/archives/1363.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1363.html#comments</comments>
		<pubDate>Wed, 25 Nov 2009 02:45:34 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1363</guid>
		<description><![CDATA[<p>1.修改MySQL配置文件（/etc/mysql/my.cnf），注释以下行：
#bind-address = 127.0.0.1</p>
<p>2.重启mysql数据库，对于Ubuntu系统，执行如下命令
sudo /etc/init.d/mysql restart</p>
<p>3.以root用户登录mysql后，执行如下命令：
grant all privileges on *.* to root@’允许登录的远程机器ip’
identified by ‘密码’</p>
<p>其中，*.*表示该主机中所有数据库的所有表。（数据库.表）
“给某IP地址上登录的root用户授予访问所有数据库中的所有表的所有权限”　 </p>
]]></description>
			<content:encoded><![CDATA[<p>1.修改MySQL配置文件（/etc/mysql/my.cnf），注释以下行：<br />
#bind-address = 127.0.0.1</p>
<p>2.重启mysql数据库，对于Ubuntu系统，执行如下命令<br />
sudo /etc/init.d/mysql restart</p>
<p>3.以root用户登录mysql后，执行如下命令：<br />
grant all privileges on *.* to root@’允许登录的远程机器ip’<br />
identified by ‘密码’</p>
<p>其中，*.*表示该主机中所有数据库的所有表。（数据库.表）<br />
“给某IP地址上登录的root用户授予访问所有数据库中的所有表的所有权限”　 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1363.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MYSQL修改密码的几种方式</title>
		<link>http://www.evanjiang.net.cn/archives/1352.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1352.html#comments</comments>
		<pubDate>Sat, 17 Oct 2009 07:49:05 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1352</guid>
		<description><![CDATA[<p>方法一:</p>
<p>(适用于管理员或者有全局权限的用户重设其它用户的密码)
进入命令行模式
mysql -u root mysql
mysql> UPDATE user SET password=PASSWORD(&#8220;new password&#8221;) WHERE user=&#8217;name&#8217;;
　　mysql> FLUSH PRIVILEGES;
　　mysql> QUIT </p>
<p>方法二:
(应用同上,只是方法不同)
 mysql -u root mysql
　　mysql> SET PASSWORD FOR name=PASSWORD(&#8216;new password&#8217;);
　　mysql> QUIT </p>
<p>(以上两种方法我不常用,如果是管理员,我会用其它如phpmyadmin或者MYSQL-front 等工具来管理用户权限,比较直观又方便)

最后必杀技:</p>
<p>mysqladmin -u root &#8220;old password&#8221; &#8220;new password&#8221; </p>
<p>解:以上有name的,请用你的用户名来替代.有new password请输入你想要设置的密码.</p>
<p>如果 MySQL 正在运行，
首先杀之： killall -TERM mysqld(如果是windows,直接调出进程管理器,结束之)
以安全模式启动 MySQL ：
/usr/bin/safe_mysqld &#8211;skip-grant-tables &#038;
(windows 下 mysql安装所以盘/mysql/bin/safe_mysqld &#8211;skip-grant-tables )
就可以不需要密码就进入 MySQL 了。
然后就是
>use mysql
>update user set password=password(&#8220;new_pass&#8221;) where [...]]]></description>
			<content:encoded><![CDATA[<p>方法一:</p>
<p>(适用于管理员或者有全局权限的用户重设其它用户的密码)<br />
进入命令行模式<br />
mysql -u root mysql<br />
mysql> UPDATE user SET password=PASSWORD(&#8220;new password&#8221;) WHERE user=&#8217;name&#8217;;<br />
　　mysql> FLUSH PRIVILEGES;<br />
　　mysql> QUIT </p>
<p>方法二:<br />
(应用同上,只是方法不同)<br />
 mysql -u root mysql<br />
　　mysql> SET PASSWORD FOR name=PASSWORD(&#8216;new password&#8217;);<br />
　　mysql> QUIT </p>
<p>(以上两种方法我不常用,如果是管理员,我会用其它如phpmyadmin或者MYSQL-front 等工具来管理用户权限,比较直观又方便)<br />
<span id="more-1352"></span><br />
最后必杀技:</p>
<p>mysqladmin -u root &#8220;old password&#8221; &#8220;new password&#8221; </p>
<p>解:以上有name的,请用你的用户名来替代.有new password请输入你想要设置的密码.</p>
<p>如果 MySQL 正在运行，<br />
首先杀之： killall -TERM mysqld(如果是windows,直接调出进程管理器,结束之)<br />
以安全模式启动 MySQL ：<br />
/usr/bin/safe_mysqld &#8211;skip-grant-tables &#038;<br />
(windows 下 mysql安装所以盘/mysql/bin/safe_mysqld &#8211;skip-grant-tables )<br />
就可以不需要密码就进入 MySQL 了。<br />
然后就是<br />
>use mysql<br />
>update user set password=password(&#8220;new_pass&#8221;) where user=&#8221;root&#8221;;<br />
>flush privileges;<br />
重新杀 MySQL ，用正常方法启动 MySQL 。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1352.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL配置文件my.cnf中文版</title>
		<link>http://www.evanjiang.net.cn/archives/1342.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1342.html#comments</comments>
		<pubDate>Sat, 17 Oct 2009 07:45:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1342</guid>
		<description><![CDATA[<p>#BEGIN CONFIG INFO
#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大
#TYPE: SYSTEM
#END CONFIG INFO</p>
<p>#
# 此mysql配置文件例子针对4G内存
# 主要使用INNODB
#处理复杂队列并且连接数量较少的mysql服务器
#
# 将此文件复制到/etc/my.cnf 作为全局设置,
# mysql-data-dir/my.cnf 作为服务器指定设置
# (@localstatedir@ for this installation) 或者放入
# ~/.my.cnf 作为用户设置.
#
# 在此配置文件中, 你可以使用所有程序支持的长选项.
# 如果想获悉程序支持的所有选项
# 请在程序后加上&#8221;&#8211;help&#8221;参数运行程序.
#
# 关于独立选项更多的细节信息可以在手册内找到
#</p>
<p>#
# 以下选项会被MySQL客户端应用读取.
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.
# 如果你想你自己的MySQL应用程序获取这些值
# 需要在MySQL客户端库初始化的时候指定这些选项</p>
<p>#
[client]
#password = [your_password]
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@</p>
<p># *** 应用定制选项 ***</p>
<p>#
#  MySQL 服务端
#
[mysqld]</p>
<p># 一般配置选项
port = @MYSQL_TCP_PORT@
socket = @MYSQL_UNIX_ADDR@</p>
<p># back_log 是操作系统在监听队列中所能保持的连接数,
# 队列保存了在MySQL连接管理器线程处理之前的连接.
# 如果你有非常高的连接率并且出现&#8221;connection [...]]]></description>
			<content:encoded><![CDATA[<p>#BEGIN CONFIG INFO<br />
#DESCR: 4GB RAM, 只使用InnoDB, ACID, 少量的连接, 队列负载大<br />
#TYPE: SYSTEM<br />
#END CONFIG INFO</p>
<p>#<br />
# 此mysql配置文件例子针对4G内存<br />
# 主要使用INNODB<br />
#处理复杂队列并且连接数量较少的mysql服务器<br />
#<br />
# 将此文件复制到/etc/my.cnf 作为全局设置,<br />
# mysql-data-dir/my.cnf 作为服务器指定设置<br />
# (@localstatedir@ for this installation) 或者放入<br />
# ~/.my.cnf 作为用户设置.<br />
#<br />
# 在此配置文件中, 你可以使用所有程序支持的长选项.<br />
# 如果想获悉程序支持的所有选项<br />
# 请在程序后加上&#8221;&#8211;help&#8221;参数运行程序.<br />
#<br />
# 关于独立选项更多的细节信息可以在手册内找到<br />
#</p>
<p>#<br />
# 以下选项会被MySQL客户端应用读取.<br />
# 注意只有MySQL附带的客户端应用程序保证可以读取这段内容.<br />
# 如果你想你自己的MySQL应用程序获取这些值<br />
# 需要在MySQL客户端库初始化的时候指定这些选项</p>
<p>#<br />
[client]<br />
#password = [your_password]<br />
port = @MYSQL_TCP_PORT@<br />
socket = @MYSQL_UNIX_ADDR@</p>
<p># *** 应用定制选项 ***</p>
<p>#<br />
#  MySQL 服务端<br />
#<br />
[mysqld]</p>
<p># 一般配置选项<br />
port = @MYSQL_TCP_PORT@<br />
socket = @MYSQL_UNIX_ADDR@</p>
<p># back_log 是操作系统在监听队列中所能保持的连接数,<br />
# 队列保存了在MySQL连接管理器线程处理之前的连接.<br />
# 如果你有非常高的连接率并且出现&#8221;connection refused&#8221; 报错,<br />
# 你就应该增加此处的值.<br />
# 检查你的操作系统文档来获取这个变量的最大值.<br />
# 如果将back_log设定到比你操作系统限制更高的值,将会没有效果<br />
back_log = 50<br />
<span id="more-1342"></span><br />
# 不在TCP/IP端口上进行监听.<br />
# 如果所有的进程都是在同一台服务器连接到本地的mysqld,<br />
# 这样设置将是增强安全的方法<br />
# 所有mysqld的连接都是通过Unix sockets 或者命名管道进行的.<br />
# 注意在windows下如果没有打开命名管道选项而只是用此项<br />
# (通过 &#8220;enable-named-pipe&#8221; 选项) 将会导致mysql服务没有任何作用!<br />
#skip-networking</p>
<p># MySQL 服务所允许的同时会话数的上限<br />
# 其中一个连接将被SUPER权限保留作为管理员登录.<br />
# 即便已经达到了连接数的上限.<br />
max_connections = 100</p>
<p># 每个客户端连接最大的错误允许数量,如果达到了此限制.<br />
# 这个客户端将会被MySQL服务阻止直到执行了&#8221;FLUSH HOSTS&#8221; 或者服务重启<br />
# 非法的密码以及其他在链接时的错误会增加此值.<br />
# 查看 &#8220;Aborted_connects&#8221; 状态来获取全局计数器.<br />
max_connect_errors = 10</p>
<p># 所有线程所打开表的数量.<br />
# 增加此值就增加了mysqld所需要的文件描述符的数量<br />
# 这样你需要确认在[mysqld_safe]中 &#8220;open-files-limit&#8221; 变量设置打开文件数量允许至少4096<br />
table_cache = 2048</p>
<p># 允许外部文件级别的锁. 打开文件锁会对性能造成负面影响<br />
# 所以只有在你在同样的文件上运行多个数据库实例时才使用此选项(注意仍会有其他约束!)<br />
# 或者你在文件层面上使用了其他一些软件依赖来锁定MyISAM表<br />
#external-locking</p>
<p># 服务所能处理的请求包的最大大小以及服务所能处理的最大的请求大小(当与大的BLOB字段一起工作时相当必要)<br />
# 每个连接独立的大小.大小动态增加<br />
max_allowed_packet = 16M</p>
<p># 在一个事务中binlog为了记录SQL状态所持有的cache大小<br />
# 如果你经常使用大的,多声明的事务,你可以增加此值来获取更大的性能.<br />
# 所有从事务来的状态都将被缓冲在binlog缓冲中然后在提交后一次性写入到binlog中<br />
# 如果事务比此值大, 会使用磁盘上的临时文件来替代.<br />
# 此缓冲在每个连接的事务第一次更新状态时被创建<br />
binlog_cache_size = 1M</p>
<p># 独立的内存表所允许的最大容量.<br />
# 此选项为了防止意外创建一个超大的内存表导致永尽所有的内存资源.<br />
max_heap_table_size = 64M</p>
<p># 排序缓冲被用来处理类似ORDER BY以及GROUP BY队列所引起的排序<br />
# 如果排序后的数据无法放入排序缓冲,<br />
# 一个用来替代的基于磁盘的合并分类会被使用<br />
# 查看 &#8220;Sort_merge_passes&#8221; 状态变量.<br />
# 在排序发生时由每个线程分配<br />
sort_buffer_size = 8M</p>
<p># 此缓冲被使用来优化全联合(full JOINs 不带索引的联合).<br />
# 类似的联合在极大多数情况下有非常糟糕的性能表现,<br />
# 但是将此值设大能够减轻性能影响.<br />
# 通过 &#8220;Select_full_join&#8221; 状态变量查看全联合的数量<br />
# 当全联合发生时,在每个线程中分配<br />
join_buffer_size = 8M</p>
<p># 我们在cache中保留多少线程用于重用<br />
# 当一个客户端断开连接后,如果cache中的线程还少于thread_cache_size,<br />
# 则客户端线程被放入cache中.<br />
# 这可以在你需要大量新连接的时候极大的减少线程创建的开销<br />
# (一般来说如果你有好的线程模型的话,这不会有明显的性能提升.)<br />
thread_cache_size = 8</p>
<p># 此允许应用程序给予线程系统一个提示在同一时间给予渴望被运行的线程的数量.<br />
# 此值只对于支持 thread_concurrency() 函数的系统有意义( 例如Sun Solaris).<br />
# 你可可以尝试使用 [CPU数量]*(2..4) 来作为thread_concurrency的值<br />
thread_concurrency = 8</p>
<p># 查询缓冲常被用来缓冲 SELECT 的结果并且在下一次同样查询的时候不再执行直接返回结果.<br />
# 打开查询缓冲可以极大的提高服务器速度, 如果你有大量的相同的查询并且很少修改表.<br />
# 查看 &#8220;Qcache_lowmem_prunes&#8221; 状态变量来检查是否当前值对于你的负载来说是否足够高.<br />
# 注意: 在你表经常变化的情况下或者如果你的查询原文每次都不同,<br />
# 查询缓冲也许引起性能下降而不是性能提升.<br />
query_cache_size = 64M</p>
<p># 只有小于此设定值的结果才会被缓冲<br />
# 此设置用来保护查询缓冲,防止一个极大的结果集将其他所有的查询结果都覆盖.<br />
query_cache_limit = 2M</p>
<p># 被全文检索索引的最小的字长.<br />
# 你也许希望减少它,如果你需要搜索更短字的时候.<br />
# 注意在你修改此值之后,<br />
# 你需要重建你的 FULLTEXT 索引<br />
ft_min_word_len = 4</p>
<p># 如果你的系统支持 memlock() 函数,你也许希望打开此选项用以让运行中的mysql在在内存高度紧张的时候,数据在内存中保持锁定并且防止可能被swapping out<br />
# 此选项对于性能有益<br />
#memlock</p>
<p># 当创建新表时作为默认使用的表类型,<br />
# 如果在创建表示没有特别执行表类型,将会使用此值<br />
default_table_type = MYISAM</p>
<p># 线程使用的堆大小. 此容量的内存在每次连接时被预留.<br />
# MySQL 本身常不会需要超过64K的内存<br />
# 如果你使用你自己的需要大量堆的UDF函数<br />
# 或者你的操作系统对于某些操作需要更多的堆,<br />
# 你也许需要将其设置的更高一点.<br />
thread_stack = 192K</p>
<p># 设定默认的事务隔离级别.可用的级别如下:<br />
# READ-UNCOMMITTED, READ-COMMITTED, REPEATABLE-READ, SERIALIZABLE<br />
transaction_isolation = REPEATABLE-READ</p>
<p># 内部(内存中)临时表的最大大小<br />
# 如果一个表增长到比此值更大,将会自动转换为基于磁盘的表.<br />
# 此限制是针对单个表的,而不是总和.<br />
tmp_table_size = 64M</p>
<p># 打开二进制日志功能.<br />
# 在复制(replication)配置中,作为MASTER主服务器必须打开此项<br />
# 如果你需要从你最后的备份中做基于时间点的恢复,你也同样需要二进制日志.<br />
log-bin=mysql-bin</p>
<p># 如果你在使用链式从服务器结构的复制模式 (A->B->C),<br />
# 你需要在服务器B上打开此项.<br />
# 此选项打开在从线程上重做过的更新的日志,<br />
# 并将其写入从服务器的二进制日志.<br />
#log_slave_updates</p>
<p># 打开全查询日志. 所有的由服务器接收到的查询 (甚至对于一个错误语法的查询)<br />
# 都会被记录下来. 这对于调试非常有用, 在生产环境中常常关闭此项.<br />
#log</p>
<p># 将警告打印输出到错误log文件.  如果你对于MySQL有任何问题<br />
# 你应该打开警告log并且仔细审查错误日志,查出可能的原因.<br />
#log_warnings</p>
<p># 记录慢速查询. 慢速查询是指消耗了比 &#8220;long_query_time&#8221; 定义的更多时间的查询.<br />
# 如果 log_long_format 被打开,那些没有使用索引的查询也会被记录.<br />
# 如果你经常增加新查询到已有的系统内的话. 一般来说这是一个好主意,<br />
log_slow_queries</p>
<p># 所有的使用了比这个时间(以秒为单位)更多的查询会被认为是慢速查询.<br />
# 不要在这里使用&#8221;1&#8243;, 否则会导致所有的查询,甚至非常快的查询页被记录下来(由于MySQL 目前时间的精确度只能达到秒的级别).<br />
long_query_time = 2</p>
<p># 在慢速日志中记录更多的信息.<br />
# 一般此项最好打开.<br />
# 打开此项会记录使得那些没有使用索引的查询也被作为到慢速查询附加到慢速日志里<br />
log_long_format</p>
<p># 此目录被MySQL用来保存临时文件.例如,<br />
# 它被用来处理基于磁盘的大型排序,和内部排序一样.<br />
# 以及简单的临时表.<br />
# 如果你不创建非常大的临时文件,将其放置到 swapfs/tmpfs 文件系统上也许比较好<br />
# 另一种选择是你也可以将其放置在独立的磁盘上.<br />
# 你可以使用&#8221;;&#8221;来放置多个路径<br />
# 他们会按照roud-robin方法被轮询使用.<br />
#tmpdir = /tmp</p>
<p># ***  复制有关的设置</p>
<p># 唯一的服务辨识号,数值位于 1 到 2^32-1之间.<br />
# 此值在master和slave上都需要设置.<br />
# 如果 &#8220;master-host&#8221; 没有被设置,则默认为1, 但是如果忽略此选项,MySQL不会作为master生效.<br />
server-id = 1</p>
<p># 复制的Slave (去掉master段的注释来使其生效)<br />
#<br />
# 为了配置此主机作为复制的slave服务器,你可以选择两种方法:<br />
#<br />
# 1) 使用 CHANGE MASTER TO 命令 (在我们的手册中有完整描述) -<br />
#    语法如下:<br />
#<br />
#    CHANGE MASTER TO MASTER_HOST=<host>, MASTER_PORT=
<port>,<br />
#    MASTER_USER=<user>, MASTER_PASSWORD=
<password> ;<br />
#<br />
#    你需要替换掉 <host>, <user>,
<password> 等被尖括号包围的字段以及使用master的端口号替换
<port> (默认3306).<br />
#<br />
#    例子:<br />
#<br />
#    CHANGE MASTER TO MASTER_HOST=&#8217;125.564.12.1&#8242;, MASTER_PORT=3306,<br />
#    MASTER_USER=&#8217;joe&#8217;, MASTER_PASSWORD=&#8217;secret&#8217;;<br />
#<br />
# 或者<br />
#<br />
# 2) 设置以下的变量. 不论如何, 在你选择这种方法的情况下, 然后第一次启动复制(甚至不成功的情况下,<br />
#     例如如果你输入错密码在master-password字段并且slave无法连接),<br />
#    slave会创建一个 master.info 文件,并且之后任何对于包含在此文件内的参数的变化都会被忽略<br />
#    并且由 master.info 文件内的内容覆盖, 除非你关闭slave服务, 删除 master.info 并且重启slave 服务.<br />
#    由于这个原因,你也许不想碰一下的配置(注释掉的) 并且使用 CHANGE MASTER TO (查看上面) 来代替<br />
#<br />
# 所需要的唯一id号位于 2 和 2^32 &#8211; 1之间<br />
# (并且和master不同)<br />
# 如果master-host被设置了.则默认值是2<br />
# 但是如果省略,则不会生效<br />
#server-id = 2<br />
#<br />
# 复制结构中的master &#8211; 必须<br />
#master-host = <hostname><br />
#<br />
# 当连接到master上时slave所用来认证的用户名 &#8211; 必须<br />
#master-user = <username><br />
#<br />
# 当连接到master上时slave所用来认证的密码 &#8211; 必须<br />
#master-password =
<password>
#<br />
# master监听的端口.<br />
# 可选 &#8211; 默认是3306<br />
#master-port =
<port>
<p># 使得slave只读.只有用户拥有SUPER权限和在上面的slave线程能够修改数据.<br />
# 你可以使用此项去保证没有应用程序会意外的修改slave而不是master上的数据<br />
#read_only</p>
<p>#*** MyISAM 相关选项</p>
<p># 关键词缓冲的大小, 一般用来缓冲MyISAM表的索引块.<br />
# 不要将其设置大于你可用内存的30%,<br />
# 因为一部分内存同样被OS用来缓冲行数据<br />
# 甚至在你并不使用MyISAM 表的情况下, 你也需要仍旧设置起 8-64M 内存由于它同样会被内部临时磁盘表使用.<br />
key_buffer_size = 32M</p>
<p># 用来做MyISAM表全表扫描的缓冲大小.<br />
# 当全表扫描需要时,在对应线程中分配.<br />
read_buffer_size = 2M</p>
<p># 当在排序之后,从一个已经排序好的序列中读取行时,行数据将从这个缓冲中读取来防止磁盘寻道.<br />
# 如果你增高此值,可以提高很多ORDER BY的性能.<br />
# 当需要时由每个线程分配<br />
read_rnd_buffer_size = 16M</p>
<p># MyISAM 使用特殊的类似树的cache来使得突发插入<br />
# (这些插入是,INSERT &#8230; SELECT, INSERT &#8230; VALUES (&#8230;), (&#8230;), &#8230;, 以及 LOAD DATA<br />
# INFILE) 更快. 此变量限制每个进程中缓冲树的字节数.<br />
# 设置为 0 会关闭此优化.<br />
# 为了最优化不要将此值设置大于 &#8220;key_buffer_size&#8221;.<br />
# 当突发插入被检测到时此缓冲将被分配.<br />
bulk_insert_buffer_size = 64M</p>
<p># 此缓冲当MySQL需要在 REPAIR, OPTIMIZE, ALTER 以及 LOAD DATA INFILE 到一个空表中引起重建索引时被分配.<br />
# 这在每个线程中被分配.所以在设置大值时需要小心.<br />
myisam_sort_buffer_size = 128M</p>
<p># MySQL重建索引时所允许的最大临时文件的大小 (当 REPAIR, ALTER TABLE 或者 LOAD DATA INFILE).<br />
# 如果文件大小比此值更大,索引会通过键值缓冲创建(更慢)<br />
myisam_max_sort_file_size = 10G</p>
<p># 如果被用来更快的索引创建索引所使用临时文件大于制定的值,那就使用键值缓冲方法.<br />
# 这主要用来强制在大表中长字串键去使用慢速的键值缓冲方法来创建索引.<br />
myisam_max_extra_sort_file_size = 10G</p>
<p># 如果一个表拥有超过一个索引, MyISAM 可以通过并行排序使用超过一个线程去修复他们.<br />
# 这对于拥有多个CPU以及大量内存情况的用户,是一个很好的选择.<br />
myisam_repair_threads = 1</p>
<p># 自动检查和修复没有适当关闭的 MyISAM 表.<br />
myisam_recover</p>
<p># 默认关闭 Federated<br />
skip-federated</p>
<p># *** BDB 相关选项 ***</p>
<p># 如果你运行的MySQL服务有BDB支持但是你不准备使用的时候使用此选项. 这会节省内存并且可能加速一些事.<br />
skip-bdb</p>
<p># *** INNODB 相关选项 ***</p>
<p># 如果你的MySQL服务包含InnoDB支持但是并不打算使用的话,<br />
# 使用此选项会节省内存以及磁盘空间,并且加速某些部分<br />
#skip-innodb</p>
<p># 附加的内存池被InnoDB用来保存 metadata 信息<br />
# 如果InnoDB为此目的需要更多的内存,它会开始从OS这里申请内存.<br />
# 由于这个操作在大多数现代操作系统上已经足够快, 你一般不需要修改此值.<br />
# SHOW INNODB STATUS 命令会显示当先使用的数量.<br />
innodb_additional_mem_pool_size = 16M</p>
<p># InnoDB使用一个缓冲池来保存索引和原始数据, 不像 MyISAM.<br />
# 这里你设置越大,你在存取表里面数据时所需要的磁盘I/O越少.<br />
# 在一个独立使用的数据库服务器上,你可以设置这个变量到服务器物理内存大小的80%<br />
# 不要设置过大,否则,由于物理内存的竞争可能导致操作系统的换页颠簸.<br />
# 注意在32位系统上你每个进程可能被限制在 2-3.5G 用户层面内存限制,<br />
# 所以不要设置的太高.<br />
innodb_buffer_pool_size = 2G</p>
<p># InnoDB 将数据保存在一个或者多个数据文件中成为表空间.<br />
# 如果你只有单个逻辑驱动保存你的数据,一个单个的自增文件就足够好了.<br />
# 其他情况下.每个设备一个文件一般都是个好的选择.<br />
# 你也可以配置InnoDB来使用裸盘分区 &#8211; 请参考手册来获取更多相关内容<br />
innodb_data_file_path = ibdata1:10M:autoextend</p>
<p># 设置此选项如果你希望InnoDB表空间文件被保存在其他分区.<br />
# 默认保存在MySQL的datadir中.<br />
#innodb_data_home_dir = <directory></p>
<p># 用来同步IO操作的IO线程的数量. This value is<br />
# 此值在Unix下被硬编码为4,但是在Windows磁盘I/O可能在一个大数值下表现的更好.<br />
innodb_file_io_threads = 4</p>
<p># 如果你发现InnoDB表空间损坏, 设置此值为一个非零值可能帮助你导出你的表.<br />
# 从1开始并且增加此值知道你能够成功的导出表.<br />
#innodb_force_recovery=1</p>
<p># 在InnoDb核心内的允许线程数量.<br />
# 最优值依赖于应用程序,硬件以及操作系统的调度方式.<br />
# 过高的值可能导致线程的互斥颠簸.<br />
innodb_thread_concurrency = 16</p>
<p># 如果设置为1 ,InnoDB会在每次提交后刷新(fsync)事务日志到磁盘上,<br />
# 这提供了完整的ACID行为.<br />
# 如果你愿意对事务安全折衷, 并且你正在运行一个小的食物, 你可以设置此值到0或者2来减少由事务日志引起的磁盘I/O<br />
# 0代表日志只大约每秒写入日志文件并且日志文件刷新到磁盘.<br />
# 2代表日志写入日志文件在每次提交后,但是日志文件只有大约每秒才会刷新到磁盘上.<br />
innodb_flush_log_at_trx_commit = 1</p>
<p># 加速InnoDB的关闭. 这会阻止InnoDB在关闭时做全清除以及插入缓冲合并.<br />
# 这可能极大增加关机时间, 但是取而代之的是InnoDB可能在下次启动时做这些操作.<br />
#innodb_fast_shutdown</p>
<p># 用来缓冲日志数据的缓冲区的大小.<br />
# 当此值快满时, InnoDB将必须刷新数据到磁盘上.<br />
# 由于基本上每秒都会刷新一次,所以没有必要将此值设置的太大(甚至对于长事务而言)</p>
<p>innodb_log_buffer_size = 8M</p>
<p># 在日志组中每个日志文件的大小.<br />
# 你应该设置日志文件总合大小到你缓冲池大小的25%~100%<br />
# 来避免在日志文件覆写上不必要的缓冲池刷新行为.<br />
# 不论如何, 请注意一个大的日志文件大小会增加恢复进程所需要的时间.<br />
innodb_log_file_size = 256M</p>
<p># 在日志组中的文件总数.<br />
# 通常来说2~3是比较好的.<br />
innodb_log_files_in_group = 3</p>
<p># InnoDB的日志文件所在位置. 默认是MySQL的datadir.<br />
# 你可以将其指定到一个独立的硬盘上或者一个RAID1卷上来提高其性能<br />
#innodb_log_group_home_dir</p>
<p># 在InnoDB缓冲池中最大允许的脏页面的比例.<br />
# 如果达到限额, InnoDB会开始刷新他们防止他们妨碍到干净数据页面.<br />
# 这是一个软限制,不被保证绝对执行.<br />
innodb_max_dirty_pages_pct = 90</p>
<p># InnoDB用来刷新日志的方法.<br />
# 表空间总是使用双重写入刷新方法<br />
# 默认值是 &#8220;fdatasync&#8221;, 另一个是 &#8220;O_DSYNC&#8221;.<br />
#innodb_flush_method=O_DSYNC</p>
<p># 在被回滚前,一个InnoDB的事务应该等待一个锁被批准多久.<br />
# InnoDB在其拥有的锁表中自动检测事务死锁并且回滚事务.<br />
# 如果你使用 LOCK TABLES 指令, 或者在同样事务中使用除了InnoDB以外的其他事务安全的存储引擎<br />
# 那么一个死锁可能发生而InnoDB无法注意到.<br />
# 这种情况下这个timeout值对于解决这种问题就非常有帮助.<br />
innodb_lock_wait_timeout = 120</p>
<p>[mysqldump]<br />
# 不要在将内存中的整个结果写入磁盘之前缓存. 在导出非常巨大的表时需要此项<br />
quick</p>
<p>max_allowed_packet = 16M</p>
<p>[mysql]<br />
no-auto-rehash</p>
<p># 仅仅允许使用键值的 UPDATEs 和 DELETEs .<br />
#safe-updates</p>
<p>[isamchk]<br />
key_buffer = 512M<br />
sort_buffer_size = 512M<br />
read_buffer = 8M<br />
write_buffer = 8M</p>
<p>[myisamchk]<br />
key_buffer = 512M<br />
sort_buffer_size = 512M<br />
read_buffer = 8M<br />
write_buffer = 8M</p>
<p>[mysqlhotcopy]<br />
interactive-timeout</p>
<p>[mysqld_safe]<br />
# 增加每个进程的可打开文件数量.<br />
# 警告: 确认你已经将全系统限制设定的足够高!<br />
# 打开大量表需要将此值设高<br />
open-files-limit = 8192 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1342.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL 数据库的备份和恢复</title>
		<link>http://www.evanjiang.net.cn/archives/1347.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1347.html#comments</comments>
		<pubDate>Sat, 17 Oct 2009 07:43:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1347</guid>
		<description><![CDATA[<p>本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：MyISAM 和 Innodb，文中设计的 MySQL 版本为 5.0.22。</p>
<p>目前 MySQL 支持的免费备份工具有：mysqldump、mysqlhotcopy，还可以用 SQL 语法进行备份：BACKUP TABLE 或者 SELECT INTO OUTFILE，又或者备份二进制日志（binlog），还可以是直接拷贝数据文件和相关的配置文件。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。Innodb 所有的表都保存在同一个数据文件 ibdata1 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是拷贝数据文件、备份 binlog，或者用 mysqldump。</p>
<p>1、mysqldump
1.1 备份
mysqldump 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。现在来讲一下 mysqldump 的一些主要参数：</p>
<p>&#8211;compatible=name
它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。

&#8211;complete-insert，-c
导出的数据采用包含字段名的完整 INSERT 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。 </p>
<p>&#8211;default-character-set=charset
指定导出数据时采用何种字符集，如果数据表不是采用默认的 latin1 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。</p>
<p>&#8211;disable-keys
告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 [...]]]></description>
			<content:encoded><![CDATA[<p>本文讨论 MySQL 的备份和恢复机制，以及如何维护数据表，包括最主要的两种表类型：MyISAM 和 Innodb，文中设计的 MySQL 版本为 5.0.22。</p>
<p>目前 MySQL 支持的免费备份工具有：mysqldump、mysqlhotcopy，还可以用 SQL 语法进行备份：BACKUP TABLE 或者 SELECT INTO OUTFILE，又或者备份二进制日志（binlog），还可以是直接拷贝数据文件和相关的配置文件。MyISAM 表是保存成文件的形式，因此相对比较容易备份，上面提到的几种方法都可以使用。Innodb 所有的表都保存在同一个数据文件 ibdata1 中（也可能是多个文件，或者是独立的表空间文件），相对来说比较不好备份，免费的方案可以是拷贝数据文件、备份 binlog，或者用 mysqldump。</p>
<p>1、mysqldump<br />
1.1 备份<br />
mysqldump 是采用SQL级别的备份机制，它将数据表导成 SQL 脚本文件，在不同的 MySQL 版本之间升级时相对比较合适，这也是最常用的备份方法。现在来讲一下 mysqldump 的一些主要参数：</p>
<p>&#8211;compatible=name<br />
它告诉 mysqldump，导出的数据将和哪种数据库或哪个旧版本的 MySQL 服务器相兼容。值可以为 ansi、mysql323、mysql40、postgresql、oracle、mssql、db2、maxdb、no_key_options、no_tables_options、no_field_options 等，要使用几个值，用逗号将它们隔开。当然了，它并不保证能完全兼容，而是尽量兼容。<br />
<span id="more-1347"></span><br />
&#8211;complete-insert，-c<br />
导出的数据采用包含字段名的完整 INSERT 方式，也就是把所有的值都写在一行。这么做能提高插入效率，但是可能会受到 max_allowed_packet 参数的影响而导致插入失败。因此，需要谨慎使用该参数，至少我不推荐。 </p>
<p>&#8211;default-character-set=charset<br />
指定导出数据时采用何种字符集，如果数据表不是采用默认的 latin1 字符集的话，那么导出时必须指定该选项，否则再次导入数据后将产生乱码问题。</p>
<p>&#8211;disable-keys<br />
告诉 mysqldump 在 INSERT 语句的开头和结尾增加 /*!40000 ALTER TABLE table DISABLE KEYS */; 和 /*!40000 ALTER TABLE table ENABLE KEYS */; 语句，这能大大提高插入语句的速度，因为它是在插入完所有数据后才重建索引的。该选项只适合 MyISAM 表。</p>
<p>&#8211;extended-insert = true|false<br />
默认情况下，mysqldump 开启 &#8211;complete-insert 模式，因此不想用它的的话，就使用本选项，设定它的值为 false 即可。 </p>
<p>&#8211;hex-blob<br />
使用十六进制格式导出二进制字符串字段。如果有二进制数据就必须使用本选项。影响到的字段类型有 BINARY、VARBINARY、BLOB。</p>
<p>&#8211;lock-all-tables，-x<br />
在开始导出之前，提交请求锁定所有数据库中的所有表，以保证数据的一致性。这是一个全局读锁，并且自动关闭 &#8211;single-transaction 和 &#8211;lock-tables 选项。</p>
<p>&#8211;lock-tables<br />
它和 &#8211;lock-all-tables 类似，不过是锁定当前导出的数据表，而不是一下子锁定全部库下的表。本选项只适用于 MyISAM 表，如果是 Innodb 表可以用 &#8211;single-transaction 选项。</p>
<p>&#8211;no-create-info，-t<br />
只导出数据，而不添加 CREATE TABLE 语句。</p>
<p>&#8211;no-data，-d<br />
不导出任何数据，只导出数据库表结构。</p>
<p>&#8211;opt<br />
这只是一个快捷选项，等同于同时添加 &#8211;add-drop-tables &#8211;add-locking &#8211;create-option &#8211;disable-keys &#8211;extended-insert &#8211;lock-tables &#8211;quick &#8211;set-charset 选项。本选项能让 mysqldump 很快的导出数据，并且导出的数据能很快导回。该选项默认开启，但可以用 &#8211;skip-opt 禁用。注意，如果运行 mysqldump 没有指定 &#8211;quick 或 &#8211;opt 选项，则会将整个结果集放在内存中。如果导出大数据库的话可能会出现问题。</p>
<p>&#8211;quick，-q<br />
该选项在导出大表时很有用，它强制 mysqldump 从服务器查询取得记录直接输出而不是取得所有记录后将它们缓存到内存中。</p>
<p>&#8211;routines，-R<br />
导出存储过程以及自定义函数。</p>
<p>&#8211;single-transaction<br />
该选项在导出数据之前提交一个 BEGIN SQL语句，BEGIN 不会阻塞任何应用程序且能保证导出时数据库的一致性状态。它只适用于事务表，例如 InnoDB 和 BDB。本选项和 &#8211;lock-tables 选项是互斥的，因为 LOCK TABLES 会使任何挂起的事务隐含提交。要想导出大表的话，应结合使用 &#8211;quick 选项。 </p>
<p>&#8211;triggers<br />
同时导出触发器。该选项默认启用，用 &#8211;skip-triggers 禁用它。</p>
<p>其他参数详情请参考手册，我通常使用以下 SQL 来备份 MyISAM 表： </p>
<p>/usr/local/mysql/bin/mysqldump -uyejr -pyejr &#8211;default-character-set=utf8 &#8211;opt &#8211;extended-insert=false \<br />
&#8211;triggers -R &#8211;hex-blob -x db_name > db_name.sql<br />
使用以下 SQL 来备份 Innodb 表： </p>
<p>/usr/local/mysql/bin/mysqldump -uyejr -pyejr &#8211;default-character-set=utf8 &#8211;opt &#8211;extended-insert=false \<br />
&#8211;triggers -R &#8211;hex-blob &#8211;single-transaction db_name > db_name.sql</p>
<p>1.2 还原<br />
用 mysqldump 备份出来的文件是一个可以直接倒入的 SQL 脚本，有两种方法可以将数据导入。</p>
<p>直接用 mysql 客户端<br />
例如： </p>
<p>/usr/local/mysql/bin/mysql -uyejr -pyejr db_name < db_name.sql</p>
<p>用 SOURCE 语法<br />
其实这不是标准的 SQL 语法，而是 mysql 客户端提供的功能，例如： </p>
<p>SOURCE /tmp/db_name.sql;<br />
这里需要指定文件的绝对路径，并且必须是 mysqld 运行用户(例如 nobody)有权限读取的文件。 </p>
<p>2、 mysqlhotcopy<br />
2.1 备份<br />
mysqlhotcopy 是一个 PERL 程序，最初由Tim Bunce编写。它使用 LOCK TABLES、FLUSH TABLES 和 cp 或 scp 来快速备份数据库。它是备份数据库或单个表的最快的途径，但它只能运行在数据库文件（包括数据表定义文件、数据文件、索引文件）所在的机器上。mysqlhotcopy 只能用于备份 MyISAM，并且只能运行在 类Unix 和 NetWare 系统上。</p>
<p>mysqlhotcopy 支持一次性拷贝多个数据库，同时还支持正则表达。以下是几个例子： </p>
<p>root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name /tmp (把数据库目录 db_name 拷贝到 /tmp 下)<br />
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name_1 ... db_name_n /tmp<br />
root#/usr/local/mysql/bin/mysqlhotcopy -h=localhost -u=yejr -p=yejr db_name./regex/ /tmp<br />
更详细的使用方法请查看手册，或者调用下面的命令来查看 mysqlhotcopy 的帮助： </p>
<p>perldoc /usr/local/mysql/bin/mysqlhotcopy<br />
注意，想要使用 mysqlhotcopy，必须要有 SELECT、RELOAD(要执行 FLUSH TABLES) 权限，并且还必须要能够有读取 datadir/db_name 目录的权限。 </p>
<p>2.2 还原<br />
mysqlhotcopy 备份出来的是整个数据库目录，使用时可以直接拷贝到 mysqld 指定的 datadir (在这里是 /usr/local/mysql/data/)目录下即可，同时要注意权限的问题，如下例： </p>
<p>root#cp -rf db_name /usr/local/mysql/data/<br />
root#chown -R nobody:nobody /usr/local/mysql/data/ (将 db_name 目录的属主改成 mysqld 运行用户)</p>
<p>3、 SQL 语法备份<br />
3.1 备份<br />
BACKUP TABLE 语法其实和 mysqlhotcopy 的工作原理差不多，都是锁表，然后拷贝数据文件。它能实现在线备份，但是效果不理想，因此不推荐使用。它只拷贝表结构文件和数据文件，不同时拷贝索引文件，因此恢复时比较慢。例子： </p>
<p>BACK TABLE tbl_name TO '/tmp/db_name/';<br />
注意，必须要有 FILE 权限才能执行本SQL，并且目录 /tmp/db_name/ 必须能被 mysqld 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<p>SELECT INTO OUTFILE 则是把数据导出来成为普通的文本文件，可以自定义字段间隔的方式，方便处理这些数据。例子： </p>
<p>SELECT INTO OUTFILE '/tmp/db_name/tbl_name.txt' FROM tbl_name;<br />
注意，必须要有 FILE 权限才能执行本SQL，并且文件 /tmp/db_name/tbl_name.txt 必须能被 mysqld 用户可写，导出的文件不能覆盖已经存在的文件，以避免安全问题。 </p>
<p>3.2 恢复<br />
用 BACKUP TABLE 方法备份出来的文件，可以运行 RESTORE TABLE 语句来恢复数据表。例子： </p>
<p>RESTORE TABLE FROM '/tmp/db_name/';<br />
权限要求类似上面所述。 </p>
<p>用 SELECT INTO OUTFILE 方法备份出来的文件，可以运行 LOAD DATA INFILE 语句来恢复数据表。例子： </p>
<p>LOAD DATA INFILE '/tmp/db_name/tbl_name.txt' INTO TABLE tbl_name;<br />
权限要求类似上面所述。倒入数据之前，数据表要已经存在才行。如果担心数据会发生重复，可以增加 REPLACE 关键字来替换已有记录或者用 IGNORE 关键字来忽略他们。 </p>
<p>补充:</p>
<p>shell> mysqldump &#8211;quick db_name | gzip > db_name.contents.gz(该例子中创建的文件是压缩格式）。</p>
<p>恢复/转移到另一台的命令如下:</p>
<p>shell> gunzip < db_name.contents.gz | mysql db_name以上命令,适用于*nix 操作系统的机器</p>
<p>4、 启用二进制日志(binlog)<br />
采用 binlog 的方法相对来说更灵活，省心省力，而且还可以支持增量备份。</p>
<p>启用 binlog 时必须要重启 mysqld。首先，关闭 mysqld，打开 my.cnf，加入以下几行： </p>
<p>server-id	= 1<br />
log-bin		= binlog<br />
log-bin-index	= binlog.index<br />
然后启动 mysqld 就可以了。运行过程中会产生 binlog.000001 以及 binlog.index，前面的文件是 mysqld 记录所有对数据的更新操作，后面的文件则是所有 binlog 的索引，都不能轻易删除。关于 binlog 的信息请查看手册。 </p>
<p>需要备份时，可以先执行一下 SQL 语句，让 mysqld 终止对当前 binlog 的写入，就可以把文件直接备份，这样的话就能达到增量备份的目的了： </p>
<p>FLUSH LOGS;如果是备份复制系统中的从服务器，还应该备份 master.info 和 relay-log.info 文件。 </p>
<p>备份出来的 binlog 文件可以用 MySQL 提供的工具 mysqlbinlog 来查看，如： </p>
<p>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001<br />
该工具允许你显示指定的数据库下的所有 SQL 语句，并且还可以限定时间范围，相当的方便，详细的请查看手册。 </p>
<p>恢复时，可以采用类似以下语句来做到： </p>
<p>/usr/local/mysql/bin/mysqlbinlog /tmp/binlog.000001 | mysql -uyejr -pyejr db_name<br />
把 mysqlbinlog 输出的 SQL 语句直接作为输入来执行它。 </p>
<p>如果你有空闲的机器，不妨采用这种方式来备份。由于作为 slave 的机器性能要求相对不是那么高，因此成本低，用低成本就能实现增量备份而且还能分担一部分数据查询压力，何乐而不为呢？</p>
<p>5、 直接备份数据文件<br />
相较前几种方法，备份数据文件最为直接、快速、方便，缺点是基本上不能实现增量备份。为了保证数据的一致性，需要在靠背文件前，执行以下 SQL 语句： </p>
<p>FLUSH TABLES WITH READ LOCK;也就是把内存中的数据都刷新到磁盘中，同时锁定数据表，以保证拷贝过程中不会有新的数据写入。这种方法备份出来的数据恢复也很简单，直接拷贝回原来的数据库目录下即可。 </p>
<p>注意，对于 Innodb 类型表来说，还需要备份其日志文件，即 ib_logfile* 文件。因为当 Innodb 表损坏时，就可以依靠这些日志文件来恢复。</p>
<p>6、 备份策略<br />
对于中等级别业务量的系统来说，备份策略可以这么定：第一次全量备份，每天一次增量备份，每周再做一次全量备份，如此一直重复。而对于重要的且繁忙的系统来说，则可能需要每天一次全量备份，每小时一次增量备份，甚至更频繁。为了不影响线上业务，实现在线备份，并且能增量备份，最好的办法就是采用主从复制机制(replication)，在 slave 机器上做备份。</p>
<p>7、 数据维护和灾难恢复<br />
作为一名DBA(我目前还不是，呵呵)，最重要的工作内容之一是保证数据表能安全、稳定、高速使用。因此，需要定期维护你的数据表。以下 SQL 语句就很有用： </p>
<p>CHECK TABLE 或 REPAIR TABLE，检查或维护 MyISAM 表<br />
OPTIMIZE TABLE，优化 MyISAM 表<br />
ANALYZE TABLE，分析 MyISAM 表<br />
当然了，上面这些命令起始都可以通过工具 myisamchk 来完成，在这里不作详述。 </p>
<p>Innodb 表则可以通过执行以下语句来整理碎片，提高索引速度： </p>
<p>ALTER TABLE tbl_name ENGINE = Innodb;<br />
这其实是一个 NULL 操作，表面上看什么也不做，实际上重新整理碎片了。 </p>
<p>通常使用的 MyISAM 表可以用上面提到的恢复方法来完成。如果是索引坏了，可以用 myisamchk 工具来重建索引。而对于 Innodb 表来说，就没这么直接了，因为它把所有的表都保存在一个表空间了。不过 Innodb 有一个检查机制叫 模糊检查点，只要保存了日志文件，就能根据日志文件来修复错误。可以在 my.cnf 文件中，增加以下参数，让 mysqld 在启动时自动检查日志文件： </p>
<p>innodb_force_recovery	= 4<br />
关于该参数的信息请查看手册。 </p>
<p>8、 总结<br />
做好数据备份，定只好合适的备份策略，这是一个DBA所做事情的一小部分，万事开头难，就从现在开始吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1347.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>利用mysqlbinlog工具恢复MySQL数据库</title>
		<link>http://www.evanjiang.net.cn/archives/1343.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1343.html#comments</comments>
		<pubDate>Sat, 17 Oct 2009 07:38:16 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1343</guid>
		<description><![CDATA[<p>如果MySQL服务器启用了二进制日志，你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如，从你最后一次备份)直到现在或另一个指定的时间点的数据。关于启用二进制日志的信息，参见5.11.3节，“二进制日志”。对于 mysqlbinlog的详细信息，参见mysql手册8.6节，“mysqlbinlog：用于处理二进制日志文件的实用工具”。 </p>
<p>要想从二进制日志恢复数据，你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini，取决于你的系统)中找到路径。如果未包含在选项文件中，当服务器启动时，可以在命令行中以选项的形式给出。启用二进制日志的选项为&#8211; log-bin。要想确定当前的二进制日志文件的文件名，输入下面的MySQL语句： </p>
<p>SHOW BINLOG EVENTS G</p>
<p>你还可以从命令行输入下面的内容： </p>
<p>mysql &#8211;user=root -pmy_pwd -e &#8216;SHOW BINLOG EVENTS G&#8217;</p>
<p>
将密码my_pwd替换为服务器的root密码。 </p>
<p>1. 指定恢复时间 </p>
<p>对于MySQL 4.1.4，可以在mysqlbinlog语句中通过&#8211;start-date和&#8211;stop-date选项指定DATETIME格式的起止时间。举例说明，假设在今天上午10:00(今天是2005年4月20日)，执行SQL语句来删除一个大表。要想恢复表和数据，你可以恢复前晚上的备份，并输入： </p>
<p>mysqlbinlog &#8211;stop-date=&#8221;2005-04-20 9:59:59&#8243; /var/log/mysql/bin.123456
  &#124; mysql -u root -pmypwd</p>
<p>该命令将恢复截止到在&#8211;stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句，可能你想要恢复后面发生的活动。根据这些，你可以用起使日期和时间再次运行mysqlbinlog： </p>
<p>mysqlbinlog &#8211;start-date=&#8221;2005-04-20 10:01:00&#8243; /var/log/mysql/bin.123456
  &#124; mysql -u root -pmypwd </p>
<p>在该行中，从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。 </p>
<p>2. 指定恢复位置 </p>
<p>也可以不指定日期和时间，而使用mysqlbinlog的选项&#8211;start-position和&#8211;stop-position来指定日志位置。它们的作用与起止日选项相同，不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法，特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号，可以运行mysqlbinlog寻找执行了不期望的事务的时间范围，但应将结果重新指向文本文件以便进行检查。操作方法为： </p>
<p>mysqlbinlog &#8211;start-date=&#8221;2005-04-20 9:55:00&#8243; &#8211;stop-date=&#8221;2005-04-20 10:05:00&#8243;
  /var/log/mysql/bin.123456 > [...]]]></description>
			<content:encoded><![CDATA[<p>如果MySQL服务器启用了二进制日志，你可以使用mysqlbinlog工具来恢复从指定的时间点开始 (例如，从你最后一次备份)直到现在或另一个指定的时间点的数据。关于启用二进制日志的信息，参见5.11.3节，“二进制日志”。对于 mysqlbinlog的详细信息，参见mysql手册8.6节，“mysqlbinlog：用于处理二进制日志文件的实用工具”。 </p>
<p>要想从二进制日志恢复数据，你需要知道当前二进制日志文件的路径和文件名。一般可以从选项文件(即my.cnf or my.ini，取决于你的系统)中找到路径。如果未包含在选项文件中，当服务器启动时，可以在命令行中以选项的形式给出。启用二进制日志的选项为&#8211; log-bin。要想确定当前的二进制日志文件的文件名，输入下面的MySQL语句： </p>
<p>SHOW BINLOG EVENTS G</p>
<p>你还可以从命令行输入下面的内容： </p>
<p>mysql &#8211;user=root -pmy_pwd -e &#8216;SHOW BINLOG EVENTS G&#8217;</p>
<p><span id="more-1343"></span><br />
将密码my_pwd替换为服务器的root密码。 </p>
<p>1. 指定恢复时间 </p>
<p>对于MySQL 4.1.4，可以在mysqlbinlog语句中通过&#8211;start-date和&#8211;stop-date选项指定DATETIME格式的起止时间。举例说明，假设在今天上午10:00(今天是2005年4月20日)，执行SQL语句来删除一个大表。要想恢复表和数据，你可以恢复前晚上的备份，并输入： </p>
<p>mysqlbinlog &#8211;stop-date=&#8221;2005-04-20 9:59:59&#8243; /var/log/mysql/bin.123456<br />
  | mysql -u root -pmypwd</p>
<p>该命令将恢复截止到在&#8211;stop-date选项中以DATETIME格式给出的日期和时间的所有数据。如果你没有检测到几个小时后输入的错误的SQL语句，可能你想要恢复后面发生的活动。根据这些，你可以用起使日期和时间再次运行mysqlbinlog： </p>
<p>mysqlbinlog &#8211;start-date=&#8221;2005-04-20 10:01:00&#8243; /var/log/mysql/bin.123456<br />
  | mysql -u root -pmypwd </p>
<p>在该行中，从上午10:01登录的SQL语句将运行。组合执行前夜的转储文件和mysqlbinlog的两行可以将所有数据恢复到上午10:00前一秒钟。你应检查日志以确保时间确切。下一节介绍如何实现。 </p>
<p>2. 指定恢复位置 </p>
<p>也可以不指定日期和时间，而使用mysqlbinlog的选项&#8211;start-position和&#8211;stop-position来指定日志位置。它们的作用与起止日选项相同，不同的是给出了从日志起的位置号。使用日志位置是更准确的恢复方法，特别是当由于破坏性SQL语句同时发生许多事务的时候。要想确定位置号，可以运行mysqlbinlog寻找执行了不期望的事务的时间范围，但应将结果重新指向文本文件以便进行检查。操作方法为： </p>
<p>mysqlbinlog &#8211;start-date=&#8221;2005-04-20 9:55:00&#8243; &#8211;stop-date=&#8221;2005-04-20 10:05:00&#8243;<br />
  /var/log/mysql/bin.123456 > /tmp/mysql_restore.sql</p>
<p>该命令将在/tmp目录创建小的文本文件，将显示执行了错误的SQL语句时的SQL语句。你可以用文本编辑器打开该文件，寻找你不要想重复的语句。如果二进制日志中的位置号用于停止和继续恢复操作，应进行注释。用log_pos加一个数字来标记位置。使用位置号恢复了以前的备份文件后，你应从命令行输入下面内容： </p>
<p>mysqlbinlog &#8211;stop-position=&#8221;368312&#8243; /var/log/mysql/bin.123456<br />
 | mysql -u root -pmypwd<br />
mysqlbinlog &#8211;start-position=&#8221;368315&#8243; /var/log/mysql/bin.123456<br />
 | mysql -u root -pmypwd </p>
<p>上面的第1行将恢复到停止位置为止的所有事务。下一行将恢复从给定的起始位置直到二进制日志结束的所有事务。因为mysqlbinlog的输出包括每个SQL语句记录之前的SET TIMESTAMP语句，恢复的数据和相关MySQL日志将反应事务执行的原时间。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1343.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>centos4.2 下yum 安装apache2 mysql4 php4 笔记</title>
		<link>http://www.evanjiang.net.cn/archives/1310.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1310.html#comments</comments>
		<pubDate>Fri, 09 Oct 2009 04:13:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[redhat linux]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1310</guid>
		<description><![CDATA[<p>由于网站国庆中秋假期出了点问题，是网站服务器管理员人为因素造成的网站不能访问。俺深思之下，决定外迁网站，就跟其它相熟的网友伸请一个免费的VPS主机，空间不大那种。，但空间完全让俺管理，没有其它网站服务的。而且环境还是裸机环境，也就是除了基本系统，以及一个yum外。没有其它网络服务在运行。也就是apache mysql,php环境要自已完全搭建。在搭建apache mysql php环境虽遇到一些波折。但也学习懂得许多，也了解到更多，同时，也精进俺在linux/unix的服务器维护以及以及数据库维护持术。由于俺很久没用linux，以往也少用yum这种软件版本升级安装工具。所以，俺也借此环境搭建，熟悉了yum这种软件版本升级安装工具，以及相关命令。。。。
由于服友的vps 系统是centos 4.2 所以，也只能安装apache2,mysql4,php4 ，可能由yum源的限制，centos 4只能安装apache2,mysql4,php4 ,暂时没有找到可以在centos4.安装apache2,mysql5,php5的源。当然，俺从中也懂得如何修改yum的源。俺之前都说，俺很少用yum。这些也顺便熟悉yum源的设置与相关命令使用。。　
俺在安装apache2,mysql4,php4时，借鉴一些网上的文档，由于网上的文档千篇一律，大同小异，并且都没有什么验证过。致使俺在安装amp环境时，遇到一些疑惑或者问题，但后来都懂过经验来判断解决。。。下面就是俺的安装笔记。跟网上一些文档有些区别，算是俺的修订版吧。。。</p>
<p>
centos  用yum来管理安装Apache+PHP+Mysql的基本安装。
1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件。
yum -y install httpd php mysql mysql-server php-mysql
Yum  -y install mysql*
2. 配置开机启动服务
/sbin/chkconfig httpd on             [设置apache服务器httpd服务开机启动]
/sbin/chkconfig &#8211;add mysqld         [在服务清单中添加mysql服务]
/sbin/chkconfig mysqld [...]]]></description>
			<content:encoded><![CDATA[<p>由于网站国庆中秋假期出了点问题，是网站服务器管理员人为因素造成的网站不能访问。俺深思之下，决定外迁网站，就跟其它相熟的网友伸请一个免费的VPS主机，空间不大那种。，但空间完全让俺管理，没有其它网站服务的。而且环境还是裸机环境，也就是除了基本系统，以及一个yum外。没有其它网络服务在运行。也就是apache mysql,php环境要自已完全搭建。在搭建apache mysql php环境虽遇到一些波折。但也学习懂得许多，也了解到更多，同时，也精进俺在linux/unix的服务器维护以及以及数据库维护持术。由于俺很久没用linux，以往也少用yum这种软件版本升级安装工具。所以，俺也借此环境搭建，熟悉了yum这种软件版本升级安装工具，以及相关命令。。。。<br />
由于服友的vps 系统是centos 4.2 所以，也只能安装apache2,mysql4,php4 ，可能由yum源的限制，centos 4只能安装apache2,mysql4,php4 ,暂时没有找到可以在centos4.安装apache2,mysql5,php5的源。当然，俺从中也懂得如何修改yum的源。俺之前都说，俺很少用yum。这些也顺便熟悉yum源的设置与相关命令使用。。　<br />
俺在安装apache2,mysql4,php4时，借鉴一些网上的文档，由于网上的文档千篇一律，大同小异，并且都没有什么验证过。致使俺在安装amp环境时，遇到一些疑惑或者问题，但后来都懂过经验来判断解决。。。下面就是俺的安装笔记。跟网上一些文档有些区别，算是俺的修订版吧。。。</p>
<p><span id="more-1310"></span><br />
centos  用yum来管理安装Apache+PHP+Mysql的基本安装。<br />
1. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件。<br />
yum -y install httpd php mysql mysql-server php-mysql<br />
Yum  -y install mysql*<br />
2. 配置开机启动服务<br />
/sbin/chkconfig httpd on             [设置apache服务器httpd服务开机启动]<br />
/sbin/chkconfig &#8211;add mysqld         [在服务清单中添加mysql服务]<br />
/sbin/chkconfig mysqld on             [设置mysql服务开机启动]<br />
/sbin/service httpd start            [启动httpd服务,与开机启动无关]<br />
/sbin/service mysqld start           [启动mysql服务,与开机无关]</p>
<p>Yum 安装的mysql下自动生成my.cnf没法正常使用。致使mysql无法正常启动。必需手工编辑一个新的my.cnf 文件。<br />
但就是在这点花费大量时间去排查与查文档。查了大量文档，都没有查到，最后才在一个外国网站查到有人说，centos4　默认yum安装mysql 所产生的my.cnf有问题。所以，俺才将排查重点放在my.cnf　上面。最后，在网上顺便找一个my.cnf配置代替原有的my.cnf ，之后，mysql就启动成功。。<br />
 My.cnf内容如下：<br />
[client]<br />
#password      = your_password<br />
port            = 3306<br />
socket          = /var/lib/mysql/mysql.sock </p>
<p>[mysqld]<br />
port            = 3306<br />
socket          = /var/lib/mysql/mysql.sock<br />
skip-locking<br />
key_buffer = 16M<br />
max_allowed_packet = 1M<br />
table_cache = 64<br />
sort_buffer_size = 512K<br />
net_buffer_length = 8K<br />
read_buffer_size = 256K<br />
read_rnd_buffer_size = 512K<br />
myisam_sort_buffer_size = 8M<br />
skip-innodb </p>
<p>log-bin<br />
server-id      = 1<br />
[mysqldump]<br />
quick<br />
max_allowed_packet = 16M </p>
<p>[mysql]<br />
no-auto-rehash<br />
# Remove the next comment character if you are not familiar with SQL<br />
#safe-updates </p>
<p>[isamchk]<br />
key_buffer = 20M<br />
sort_buffer_size = 20M<br />
read_buffer = 2M<br />
write_buffer = 2M </p>
<p>[myisamchk]<br />
key_buffer = 20M<br />
sort_buffer_size = 20M<br />
read_buffer = 2M<br />
write_buffer = 2M </p>
<p>[mysqlhotcopy]<br />
interactive-timeout<br />
再运行 /sbin/service mysqld start  mysql 就运行成功。<br />
3.设置mysql数据库root帐号密码。<br />
mysqladmin -u root password &#8216;newpassword&#8217;           [引号内填密码]<br />
4. 让mysql数据库更安全<br />
mysql -u root -p<br />
mysql> DROP DATABASE test;                            [删除test数据库]<br />
mysql> DELETE FROM mysql.user WHERE user = &#8221;;        [删除匿名帐户]<br />
mysql> FLUSH PRIVILEGES;                              [重载权限]<br />
5. 按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/<br />
//安装apache扩展<br />
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql<br />
//安装php的扩展<br />
yum install php-gd<br />
yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc<br />
//安装mysql扩展<br />
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1310.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Debian 配置 LAMP (debian5.0+apache2.2+mysql5.0+php5.0 )</title>
		<link>http://www.evanjiang.net.cn/archives/1271.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1271.html#comments</comments>
		<pubDate>Sat, 08 Aug 2009 07:17:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[debian linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1271</guid>
		<description><![CDATA[<p>一、安装基本程式
~#apt-get install apache2 mysql-server php5 php5-mysql  phpmyadin pear php5-gd
#在安装过程序会提示你设置mysql的root用户密码。</p>
<p>在Debian下只要安装相关软体，无需修改任何配置文件，把网页程序上传到/var/www目录，更改权限为777，服务器就能够工作！
二、LAMP简单配置
经过前面的步骤，服务器就能够正常运行，但是有时候达不到我们的要求，所以掌握基本配置方法是很有必要的。</p>
<p>1、建立mysql数据库，并添一个仅拥有这些数据库权限的用户，以便网页程序使用，提高服务器的安全性。
~#mysql -h127.1 -uroot -pabcabc
#连接mysql服务器，其中-h是主机，-u是用户名，-p是密码。注意各参数与附值之间没有空格。
> create database lamp;
#创建数据库lamp，注意mysql内部命令必需以“;”结尾。
>show databases;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+
&#124; Database           &#124;
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+
&#124; information_schema &#124;
&#124; lamp               &#124;
&#124; mysql        [...]]]></description>
			<content:encoded><![CDATA[<p>一、安装基本程式<br />
~#apt-get install apache2 mysql-server php5 php5-mysql  phpmyadin pear php5-gd<br />
#在安装过程序会提示你设置mysql的root用户密码。</p>
<p>在Debian下只要安装相关软体，无需修改任何配置文件，把网页程序上传到/var/www目录，更改权限为777，服务器就能够工作！<br />
二、LAMP简单配置<br />
经过前面的步骤，服务器就能够正常运行，但是有时候达不到我们的要求，所以掌握基本配置方法是很有必要的。</p>
<p>1、建立mysql数据库，并添一个仅拥有这些数据库权限的用户，以便网页程序使用，提高服务器的安全性。<br />
~#mysql -h127.1 -uroot -pabcabc<br />
#连接mysql服务器，其中-h是主机，-u是用户名，-p是密码。注意各参数与附值之间没有空格。<br />
> create database lamp;<br />
#创建数据库lamp，注意mysql内部命令必需以“;”结尾。<br />
>show databases;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| Database           |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
| information_schema |<br />
| lamp               |<br />
| mysql              |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+<br />
4 rows in set (0.00 sec)<br />
#查看数据库。<br />
>grant all on lamp.* to lyb@localhost identified by &#8216;abc123&#8242;;<br />
#建立用户名lyb，只允许本地登录，密码为“abc123”，仅拥有数据库lamp的完全权限。l<br />
<span id="more-1271"></span><br />
2、apache2配置文件介绍。<br />
Debian 5.0 的apache2的配置文件全在/etc/apache2/目录下面。<br />
apache2.conf<br />
#apache的全局配置文件。<br />
envvars<br />
#定义apache的用户环境。<br />
ports.conf<br />
#定义监听端口。<br />
httpd.conf<br />
#默认为空文件，一般用户自已添加的选项写入这里。<br />
mods-available<br />
#以load文件结尾的是加载相应模块选项，以conf文件结尾的是相应模块选项。<br />
mods-enabled<br />
#都是指向mods-available下面的文件的链接文件，需要启用那些模块就在此建立相关链接即可。<br />
sites-available<br />
#虚拟主机配置文件<br />
sites-enabled<br />
#指向sites-available目录下文件的链接。<br />
conf.d<br />
#定义字符编码和其它选项。<br />
三、性能调优<br />
1、内核优化，vim /etc/sysctl.conf<br />
# Use TCP syncookies when needed<br />
net.ipv4.tcp_syncookies = 1<br />
# Enable TCP window scaling<br />
net.ipv4.tcp_window_scaling: = 1<br />
# Increase TCP max buffer size<br />
net.core.rmem_max = 16777216<br />
net.core.wmem_max = 16777216<br />
# Increase Linux autotuning TCP buffer limits<br />
net.ipv4.tcp_rmem = 4096 87380 16777216<br />
net.ipv4.tcp_wmem = 4096 65536 16777216<br />
# Increase number of ports available<br />
net.ipv4.ip_local_port_range = 1024 65000<br />
2、优化磁盘<br />
在文件系统上禁用 atime 日志记录特性。atime 是最近访问文件的时间，每当访问文件时，底层文件系统必须记录这个时间戳。因为系统管理员很少使用atime，禁用它可以减少磁盘访问时间。禁用这个特性的方法是，在 /etc/fstab 的第四列中添加 noatime 选项。<br />
例如：LABEL=/boot             /boot                   ext3    defaults,noatime        1 2<br />
3、调优Apache<br />
需要伸缩性的站点可以选择worker或event线程化的MPM，而需要稳定性和兼容性的站点可以用prefork。<br />
一个经典 worker MPM 配置：<br />
ServerLimit 128<br />
StartServers 8<br />
MaxClients 3000<br />
MinSpareThreads 128<br />
MaxSpareThreads 1024<br />
ThreadsPerChild 32<br />
一个 perfoxk MPM 配置实例：<br />
StartServers 32<br />
MinSpareServers 32<br />
MaxSpareServers 64<br />
MaxClients 1024<br />
MaxRequestsPerChild 4000</p>
<p>有效的使用选项和重写<br />
<Directory /><br />
    AllowOverride None<br />
    Options FollowSymLinks<br />
</Directory><br />
如果使用 -FollowSymLinks，该特性就会被禁用。如果禁用了 FollowSymLinks，Apache 就必须检查使用该文件名的所有组件（目录和文件本身），以确保它们不是符号连接。这会带来额外的开销（磁盘操作）。<br />
AllowOverride None 是不允许重写，这能消除 Apache 检查 .htaccess 的需求。<br />
HostnameLookups off 指令禁用 DNS 查找，因为试图反向解析连接到您的服务器的所有 IP 地址无疑是浪费资源。</p>
<p>持久连接<br />
KeepAlive On<br />
KeepAliveTimeout 5</p>
<p>关闭DNS查询<br />
HostnameLookups off</p>
<p>合理配置缓冲模块<br />
mod_cache<br />
mod_disk_cache<br />
mod_mem_cache<br />
mod_file_cache</p>
<p>4、优化 php.ini ，四个重要的控制设置 PHP 可以使用多少系统资源。<br />
max_execution_time 一个脚本可使用多少 CPU 秒，建议值 30<br />
max_input_time 一个脚本等待输入数据的时间有多长（秒），建议值 60<br />
memory_limit 在被取消之前，一个脚本可使用多少内存（字节），建议值 32M<br />
output_buffering 数据发送给客户机之前，有多少数据（字节）需要缓存，建议值 4096<br />
PHP 可执行的日志记录数是可配置的。在生产环境中，禁用除最重要的日志以外的一切日志记录能够减少磁盘写操作。如果需要使用日志来排除问题，那么可以按需启用日志记录。error_reporting = E_COMPILE_ERROR|E_ERROR|E_CORE_ERROR 将启用足够的日志记录，使您发现问题，同时从脚本中消除大量无用的内容。<br />
5、优化MySQL<br />
参考：<br />
三、应用 php 加速<br />
1、安装 XCache 或 eAccelerator<br />
下载：apt-get install php5-xcache<br />
下载：http://bart.eaccelerator.net/source/0.9.5.3/eaccelerator-0.9.5.3.tar.bz2</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1271.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD传真服务器(FreeBSD+HylaFax+Apache+php+Mysql+AvantFax)</title>
		<link>http://www.evanjiang.net.cn/archives/1180.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1180.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 14:41:45 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[freebsd unix]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[www]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1180</guid>
		<description><![CDATA[<p>以下文章也是转摘于网上。有空，俺要实际操作一下，以前，俺一直想弄个EFAX服务器，但可惜，由于文档少，以及时间上不方便，就没再深究，现在有此好文档，有机会，也要好好研究一下。。。</p>
<p>FreeBSD安装选择Minimal+Ports
域名：fax.test.org IP:192.168.1.203 新建用户:vincent 属于wheel组</p>
<p>Handbook
http://cnsnap.cn.freebsd.org/doc &#8230; ndbook/install.html</p>
<p>开启FTP服务</p>
<p>编辑/etc/inetd.conf文件去掉ftp前的注释&#8217;#'。</p>
<p>#vi /etc/inetd.conf
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l</p>
<p>启动inetd程序
#/etc/rc.d/inetd start</p>
<p>添加vincent用户，用于FTP登录上传文件
#pw useradd vincent -s /bin/csh -d /home/vincent -m -g wheel -h 0</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>使用wget加快ports软件下载</p>
<p>安装wget程序，加快软件包下载速度。
#cd /usr/ports/net/wget
#make install clean</p>
<p>编辑/etc/make.conf
#vi /etc/make.conf</p>
<p>FETCH_CMD=wget -c -t 1
DISABLE_SIZE=yes</p>
<p>MASTER_SITE_OVERRIDE= \
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/ \
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/</p>
<p>设置使用ftp.tw.freebsd.org为主下载站点，加快Package软件下载，编辑用户目录下的.cshrc文件加入</p>
<p>#vi .cshrc [...]]]></description>
			<content:encoded><![CDATA[<p>以下文章也是转摘于网上。有空，俺要实际操作一下，以前，俺一直想弄个EFAX服务器，但可惜，由于文档少，以及时间上不方便，就没再深究，现在有此好文档，有机会，也要好好研究一下。。。</p>
<p>FreeBSD安装选择Minimal+Ports<br />
域名：fax.test.org IP:192.168.1.203 新建用户:vincent 属于wheel组</p>
<p>Handbook<br />
http://cnsnap.cn.freebsd.org/doc &#8230; ndbook/install.html</p>
<p>开启FTP服务</p>
<p>编辑/etc/inetd.conf文件去掉ftp前的注释&#8217;#'。</p>
<p>#vi /etc/inetd.conf<br />
ftp     stream  tcp     nowait  root    /usr/libexec/ftpd       ftpd -l</p>
<p>启动inetd程序<br />
#/etc/rc.d/inetd start</p>
<p>添加vincent用户，用于FTP登录上传文件<br />
#pw useradd vincent -s /bin/csh -d /home/vincent -m -g wheel -h 0</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-</p>
<p>使用wget加快ports软件下载</p>
<p>安装wget程序，加快软件包下载速度。<br />
#cd /usr/ports/net/wget<br />
#make install clean</p>
<p>编辑/etc/make.conf<br />
#vi /etc/make.conf</p>
<p>FETCH_CMD=wget -c -t 1<br />
DISABLE_SIZE=yes</p>
<p>MASTER_SITE_OVERRIDE= \<br />
ftp://ftp.tw.freebsd.org/pub/FreeBSD/ports/distfiles/ \<br />
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/</p>
<p>设置使用ftp.tw.freebsd.org为主下载站点，加快Package软件下载，编辑用户目录下的.cshrc文件加入</p>
<p>#vi .cshrc     //编辑完后记得重新登录<br />
setenv PACKAGEROOT      ftp://ftp.tw.freebsd.org</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211; </p>
<p>HylaFAX    ( WebSite http://www.hylafax.org/ )</p>
<p>HylaFAX是一个基于C/S 架构,企业级的收发传真系统，高效稳固。局域网中只要有一台连接Modem的HylaFAX服务器，就能为局域网所有用户提供传真服务。</p>
<p>软件安装</p>
<p>Package方法安装<br />
#pkg_add -r hylafax</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/comms/hylafax<br />
#make install clean</p>
<p>软件设置</p>
<p>#faxsetup<br />
<span id="more-1180"></span><br />
Should an entry be added for the FaxMaster to /etc/aliases [yes]?<br />
应该在/etc/aliases中增加一个条FaxMaster记录[yes]? yes</p>
<p>Users to receive fax related mail [root]?<br />
输入接收传真相关信息的Email用户[root]? vincent</p>
<p>Are these ok [yes]?<br />
确认以上信息是否正确[yes]? yes</p>
<p>Country code [1]?<br />
国家代码[1]? 0086</p>
<p>Area code []?<br />
区号[]? 0750</p>
<p>Long distance dialing prefix [1]?<br />
长途拨号前缀 [1]? 0</p>
<p>International dialing prefix [011]?<br />
国际拨号前缀 [001]? 0750</p>
<p>Dial string rules file (relative to /var/spool/hylafax)["etc/dialrules"]?<br />
拨号规则文件( /var/spool/hylafax )["etc/dialrule"]? 按enter默认</p>
<p>Tracing during normal server operation [1]?<br />
追踪正常服务程序[1]? 1</p>
<p>Default tracing during send and receive session [0xfffffffff]?<br />
默认追查在发送和接收 session [0xfffffffff]? 按enter默认</p>
<p>Continuation cover page (relative to /var/spool/hylafax) []?<br />
传真封面页所在目录 ( /var/spool/hylafax )[]? 按enter默认</p>
<p>Timeout when converting PostScript documents (secs) [180]?<br />
转换PostScript文件逾时时间[180]? 180</p>
<p>Maximum number of concurrent jobs to a destination[1]?<br />
一个目的地最大数量的并行工作[1]? 1</p>
<p>Define a group of modems []<br />
定义一组调制解调器[] 按enter默认</p>
<p>Time of day restrictions for outbound jobs ["Any"]?<br />
一天中限制传真外发时间["Any"]? 按enter默认</p>
<p>Pathname of destination controls file (relative to /var/spool/hylafax) []?<br />
控制文件的路径( /var/spool/hylafax )[]? 按enter默认</p>
<p>Timeout before purging a stale UUCP lock file (secs) [30]<br />
超时前清除旧的UUCP锁定文件[30]？30</p>
<p>Max number of pages to permit in an outbound job [0xffffffff]?<br />
允许在出站的最大页数[0xffffffff]? 按enter默认</p>
<p>Syslog facility name for ServerTracing messages [daemon]?<br />
系统日志跟踪记录程序[daemon]? 按enter默认</p>
<p>Are these ok [yes]?<br />
确认以上信息是否正确[yes]? yes</p>
<p>Should I restart the HylaFAX process [yes]?<br />
应该重新启动HylaFAX进程[yes]? yes</p>
<p>You do not appear to have any modem configured for use. Modems are<br />
configured for use with HylaFax with the faxaddmodem command.<br />
Do you want to run faxaddmomdem to configure a modme [yes]?<br />
您似乎没有任何调制解调器配置为使用。调制解调器配置为使用HylaFax与faxaddmodem命令。<br />
你想运行faxaddmomdem配置modme[yes]? yes</p>
<p>Serial port that modem is connected to []?<br />
调制解调器连接到那个串行端口[]? ttyd0    //我的是com1,所以是ttyd0；请根据实际配置。</p>
<p>country code[1]<br />
国家代码[1]? 0086</p>
<p>Area code [415]?<br />
区号[]? 0750</p>
<p>Phone number of fax modem [+1,9999.5555.1212]?<br />
传真的电话号码[+1,9999.5555.1212]? 8607501234567</p>
<p>Local Identifications string (for TS/CIG) ["NothingEtup"]?<br />
本地传真机标识(for TS/CIG) ["NothingEtup"]? FreeBSD.org</p>
<p>Long distance dialing prefix [1]?<br />
长途拨号前缀 [1]? 0</p>
<p>International dialing prefix [011]?<br />
国际拨号前缀 [001]? 0750</p>
<p>Dial string rules file (relative to /var/spool/hylafax) [etc/dialrules]?<br />
拨号规则文件( /var/spool/hylafax )["etc/dialrule"]? 按enter默认</p>
<p>Tracing during normal server operation [1]?<br />
追踪正常服务程序[1]? 1</p>
<p>Tracing during send and receive sessions [11]?<br />
追踪发送和接收 session [11]? 按enter默认</p>
<p>Protection mode for received facsimile [0600]?<br />
收到传真的文件权限[0600]？ 0777</p>
<p>Protection mode for session logs [0600]?<br />
记录文件的档案权限[0600]? 0777</p>
<p>Protection mode for ttyd0 [0600]?<br />
端口的访问权限[0600]? 0777</p>
<p>Rings to wait before answering [1]?<br />
响铃几声后，开始接受传真[1]? 2</p>
<p>Modem speaker volume [off]?<br />
Modem的喇叭音量[off]? on</p>
<p>Command line arguments to getty program ["-h %l dx_%s"]?<br />
接收传真的命令行参数["-h %l dx_%s"]? 按enter默认</p>
<p>Pathname of TSI access control list file (relative to /var/spool/hylafax)[""]?<br />
访问控制列表的TSI文件路径( /var/spool/hylafax )[""]? 按enter默认</p>
<p>Pathname of Caller-ID access control list file (relative to /var/spool/hylafax)[""]?<br />
来电Caller-ID访问控制列表文件路径( /var/spool/hylafax )[""]? 按enter默认</p>
<p>Tag line font file (relative to /var/spool/hylafax) [etc/lutRS18.pcf]?<br />
标记行字体文件( /var/spool/hylafax ) [etc/lutRS18.pcf]? 按enter默认</p>
<p>Tag line form string ["From %%1|%c|Page %%P of %%T"]?<br />
标记行字符串形式["From %%1|%c|Page %%P of %%T"]? 按enter默认</p>
<p>Time before purging a stale UUCP lock file (secs) [30]?<br />
超时前清除旧的UUCP锁定文件[30]？30</p>
<p>Hold UUCP lockfile during inbound data calls [Yes]?<br />
当传真进来时，保留UUCP 设定文件[Yes]? yes</p>
<p>Hold UUCP lockfile during inbound voice calls [Yes]?<br />
当语音进来时，保留UUCP 设定文件[Yes]? yes</p>
<p>Percent good lines to accept during copy quality checking [95]?<br />
线路好的时候，在什么百份比时进行检查[95]? 95</p>
<p>Max consecutive bad lines to accept during copy quality checking [5]?<br />
线路不好的时候，在什么百份比时进行检查[5]? 5</p>
<p>Max number of pages to accept in a received facsimile [25]?<br />
每次传真进来的最大可接收页数[25]? 25</p>
<p>Syslog faxility name for ServerTracing messages [daemon]?<br />
系统日志跟踪记录程序[daemon]? 按enter默认<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
Set UID to 0 to manipulate CLOCAL [""]?<br />
设置的UID为0操作CLOCAL[""]? 按enter默认</p>
<p>Use available priority job scheduling mechanism [""]?<br />
使用现有的优先工作调度机制[""]? 按enter默认</p>
<p>Are these ok [yes]?<br />
确认以上信息是否正确[yes]? yes</p>
<p>Probing for best speed to talk to modem：38400<br />
探索最佳速度交谈调制解调器： 38400</p>
<p>How should it be configured [1]?<br />
应如何配置[1]? 1</p>
<p>DTE-DCE flow control scheme [default]?<br />
流量控制方案[default]? 按enter默认</p>
<p>Are these ok [yes]?<br />
确认以上信息是否正确[yes]? yes</p>
<p>Do you want to run faxaddmodem to configure another modem [yes]?<br />
你想运行的另一个faxaddmodem配置调制解调器[yes]? no</p>
<p>Should I run faxmodem for each configured modem [yes]?<br />
应该为每个运行faxmodem配置调制解调器[yes]? yes</p>
<p>Done verifying system setup.<br />
完成核查系统设置。</p>
<p>编辑/etc/ttys 文件 ，查找“ttyd0&#8243;字节，修改为下面值(如果没有找，就在最后加上）</p>
<p>#vi /etc/ttys<br />
ttyd0   &#8220;/usr/local/sbin/faxgetty&#8221;      dialup  on</p>
<p>设置开机HylaFax服务自动运行</p>
<p>#cp /usr/local/etc/rc.d/hylafax.sh.sample /usr/local/etc/rc.d/hylafax.sh</p>
<p>启动HylaFax服务</p>
<p>#/usr/local/etc/rc.d/hylafax.sh start</p>
<p>HylaFax命令</p>
<p>faxstat -s （显示队列中等待发送的传真）<br />
faxstat -d （显示已发送的传真）<br />
faxstat -r （显示已接收的传真）<br />
faxrm number_of_job    (从队列中去删除一个传真)<br />
faxqclean    (清除缓冲池)<br />
faxcron        (显示统计结果)</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>AvantFAX (WebSite http://www.avantfax.com )</p>
<p>AvantFAX是一种Web应用管理传真的HylaFAX 服务器。<br />
AvantFAX允许用户在任何平台上，来查看和发送传真，而无需安装特殊的软件。它还允许管理员管理用户，他们的权限，传真线，传真类等<br />
AvantFAX可以从本地网络，并通过互联网远程使用标准的网络设备</p>
<p>安装说明: http://www.avantfax.com/install.php</p>
<p>安装AvantFAX之前要先安装以下软件：</p>
<p>HylaFAX 4.4 or HylaFAX EE 3<br />
PHP 5<br />
PHP PEAR 5 including MDB2_driver_mysql, Mail and Mail_Mime<br />
PECL FileInfo<br />
PHP mbstring &#8211; for improved UTF-8 sorting support (optional)<br />
PHP MySQL 5<br />
MySQL server 4.1.12 or better (see Important Notes below)<br />
Apache<br />
ImageMagick<br />
ghostscript<br />
libtiff<br />
netpbm-progs<br />
libungif<br />
sudo<br />
sendmail/postfix/exim/qmail or use an external SMTP server<br />
cups/lpr and psutils<br />
expect</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
apache</p>
<p>Package方法安装<br />
#pkg_add -r apache22</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/www/apache22<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
mysql51-server</p>
<p>Package方法安装<br />
#pkg_add -r mysql51-server</p>
<p>或者</p>
<p>Ports方法安装</p>
<p>#cd /usr/ports/databases/mysql51-server<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
PHP5</p>
<p>Ports方法安装<br />
#cd /usr/ports/lang/php5<br />
#make install clean<br />
//安装时记得选上第三项“APACHE Build Apache module&#8221;支持</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
PHP5-session</p>
<p>Package方法安装<br />
#pkg_add -r php5-session</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/www/php5-session<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
php5-mysql</p>
<p>Package方法安装<br />
#pkg_add -r php5-mysql</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/databases/php5-mysql<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-DB</p>
<p>Package方法安装<br />
#pkg_add -r pear-DB</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/databases/pear-DB<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-MDB2_Driver_mysql</p>
<p>Ports方法安装<br />
#cd /usr/ports/databases/pear-MDB2_Driver_mysql<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Auth</p>
<p>Package方法安装<br />
#pkg_add -r pear-Auth</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/security/pear-Auth<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Auth_SASL</p>
<p>Package方法安装<br />
#pkg_add -r pear-Auth_SASL</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/security/pear-Auth_SASL<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Net_SMTP</p>
<p>Package方法安装<br />
#pkg_add -r pear-Net_SMTP</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/net/pear-Net_SMTP<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Mail</p>
<p>Package方法安装<br />
#pkg_add -r pear-Mail</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/mail/pear-Mail<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Mail_Mime</p>
<p>Package方法安装<br />
#pkg_add -r pear-Mail_Mime</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/mail/pear-Mail_Mime<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-Mail_mimeDecode</p>
<p>Package方法安装<br />
#pkg_add -r pear-Mail_mimeDecode</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/mail/pear-Mail_mimeDecode<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-PHP_Compat</p>
<p>Package方法安装<br />
#pkg_add -r pear-PHP_Compat</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/devel/pear-PHP_Compat<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-HTML_Common</p>
<p>Ports方法安装<br />
#cd /usr/ports/devel/pear-HTML_Common<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pear-HTML_QuickForm</p>
<p>Package方法安装<br />
#pkg_add -r pear-HTML_QuickForm</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/devel/pear-HTML_QuickForm<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
pecl-fileinfo</p>
<p>Package方法安装<br />
#pkg_add -r pecl-fileinfo</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/sysutils/pecl-fileinfo<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
php5-mbstring</p>
<p>Package方法安装<br />
#pkg_add -r php5-mbstring</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/converters/php5-mbstring<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
ImageMagick</p>
<p>Package方法安装<br />
#pkg_add -r ImageMagick</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/graphics/ImageMagick<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
smarty</p>
<p>Package方法安装<br />
#pkg_add -r smarty</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/www/smarty<br />
#make install clean<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
netpbm</p>
<p>Package方法安装<br />
#pkg_add -r netpbm</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/graphics/netpbm<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
libungif</p>
<p>Package方法安装<br />
#pkg_add -r libungif</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/graphics/libungif<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
sudo</p>
<p>Package方法安装<br />
#pkg_add -r sudo</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/security/sudo<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
cups</p>
<p>Package方法安装<br />
#pkg_add -r cups</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/print/cups<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
psutils-a4</p>
<p>Package方法安装<br />
#pkg_add -r psutils-a4</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/print/psutils-a4<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
expect</p>
<p>Package方法安装<br />
#pkg_add -r expect</p>
<p>或者</p>
<p>Ports方法安装<br />
#cd /usr/ports/lang/expect<br />
#make install clean</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;</p>
<p>软件下载：http://www.avantfax.com/download.php</p>
<p>将下载到的软件包通过FTP上传到服务器的vincent目录下,解压:<br />
#cd /home/vincent<br />
#gunzip avantfax-3.1.6.tgz.gz<br />
#tar zxvf avantfax-3.1.6.tgz</p>
<p>移动avantfax Web目录:<br />
#cd avantfax-3.1.6<br />
#mv avantfax /usr/local/www/<br />
#chmod -R 777 /usr/local/www/avantfax/tmp /usr/local/www/avantfax/faxes<br />
#chown -R www:www /usr/local/www/avantfax//includes/templates</p>
<p># ln -s /usr/local/www/avantfax/includes/faxrcvd.php /var/spool/hylafax/bin/faxrcvd.php<br />
# ln -s /usr/local/www/avantfax/includes/dynconf.php /var/spool/hylafax/bin/dynconf.php<br />
# ln -s /usr/local/www/avantfax/includes/notify.php /var/spool/hylafax/bin/notify.php</p>
<p>编辑config.ttyd0 //我的是外置modem,连接电脑com1，所以是ttyd0<br />
# vi /var/spool/hylafax/etc/config.ttyd0</p>
<p>//添加<br />
#<br />
## AvantFAX configuration<br />
#<br />
FaxrcvdCmd:     bin/faxrcvd.php<br />
DynamicConfig:  bin/dynconf.php<br />
UseJobTSI:      true</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
编辑config<br />
# vi /var/spool/hylafax/etc/config</p>
<p>//添加<br />
#<br />
## AvantFAX configuration<br />
#<br />
NotifyCmd:      bin/notify.php</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
备份/替换faxcover程序<br />
#mv /usr/local/bin/faxcover /usr/local/bin/faxcover.old<br />
#ln -s /usr/local/www/avantfax/includes/faxcover.php /usr/local/bin/faxcover</p>
<p>设置HylaFax用户支持Avantfax<br />
#/usr/local/sbin/faxadduser -a pwd www<br />
#/usr/local/sbin/faxdeluser localhost<br />
#/usr/local/sbin/faxdeluser 127.0.0.1<br />
#echo 127.0.0.1 >> /var/spool/hylafax/etc/hosts.hfaxd</p>
<p>编辑Avantfax设置文件<br />
#cd /usr/local/www/avantfax/includes<br />
#cp local_config-example.php local_config.php<br />
#vi local_config.php</p>
<p>$BINARYDIR                      = &#8216;/usr/bin&#8217;;<br />
//修改为:<br />
$BINARYDIR                      = &#8216;/usr/local/bin&#8217;;  </p>
<p>$HYLAFAX_PREFIX                = &#8216;/usr&#8217;;<br />
//修改为:<br />
$HYLAFAX_PREFIX                = &#8216;/usr/local&#8217;; </p>
<p>$WWWUSER                        = &#8216;apache&#8217;;<br />
//修改为:<br />
$WWWUSER                        = &#8216;www&#8217;;</p>
<p>$dft_config_lang            = &#8216;en&#8217;;<br />
//修改为:<br />
$dft_config_lang             = &#8216;zh&#8217;;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
编辑hfaxd.conf<br />
#vi /usr/local/lib/fax/hfaxd.conf</p>
<p>#JobFmt:                &#8220;%-3j %3i %1a %6.6o %-12.12e %5P %5D %7z %.25s&#8221;<br />
//修改为:<br />
JobFmt:         &#8220;%-3j %3i %1a %15o %40M %-12.12e %5P %5D %7z %.25s&#8221;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
软件启动设置:<br />
#vi /etc/rc.conf<br />
//添加<br />
apache22_enable=&#8221;YES&#8221;<br />
mysql_enable=&#8221;YES&#8221;</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
apache22设置</p>
<p>#vi /usr/local/etc/apache22/httpd.conf</p>
<p>DirectoryIndex index.html<br />
//修改为:<br />
DirectoryIndex index.html index.php</p>
<p>//添加<br />
AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php-source .phps</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<br />
新建fax.conf<br />
#vi /usr/local/etc/apache22/Includes/fax.conf</p>
<p>//添加<br />
NameVirtualHost *:80<br />
<VirtualHost *:80><br />
    ServerName fax.test.org<br />
    DocumentRoot /usr/local/www/avantfax/</p>
<p>    <Directory "/usr/local/www"><br />
        AllowOverride None<br />
        Options None<br />
        Order allow,deny<br />
        Allow from all<br />
    </Directory></p>
<p></VirtualHost></p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
PHP程序连接<br />
#ln-s /usr/local/bin/php /usr/bin/php</p>
<p>启动apache<br />
#/usr/local/etc/rc.d/apapche start</p>
<p>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
avantfax数据导入</p>
<p>启动mysql<br />
#/usr/local/etc/rc.d/mysql start</p>
<p>导入数据<br />
#cd /home/vincent/avantfax-3.1.6<br />
#mysql -uroot < create_user.sql<br />
#mysql -uavantfax -pd58fe49 avantfax < create_tables.sql</p>
<p>--------------------------------------------------------<br />
编辑/etc/crontab<br />
# vi /etc/crontab</p>
<p>//添加<br />
# runs once an hour to update the phone book<br />
0 * * * * root /usr/local/www/avantfax/includes/phb.php<br />
# runs once a day to remove old files<br />
0 0 * * * root /usr/local/www/avantfax/includes/avantfaxcron.php -t 2</p>
<p>---------------------------------------------------------<br />
编辑/usr/local/etc/sudoers<br />
#vi /usr/local/etc/sudoers</p>
<p>//添加<br />
#Defaults    requiretty<br />
www ALL = NOPASSWD: /sbin/reboot, /sbin/halt, /usr/local/sbin/faxdeluser, /usr/local/sbin/faxadduser -u * -p * *</p>
<p>---------------------------------------------------------<br />
打开浏览器（IE/firefox/opera)，打上下面的网址：</p>
<p>http://192.168.1.203/admin/</p>
<p>username: admin<br />
password: password</p>
<p>新建 "传真分类" ---> 新建 &#8220;Modem&#8221; &#8212;> 新建 “用户”<br />
到此，服务器基本上可以使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1180.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenBSD.Nginx.MySQL.PHP环境搭建手册(网上转摘）</title>
		<link>http://www.evanjiang.net.cn/archives/1176.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1176.html#comments</comments>
		<pubDate>Mon, 08 Jun 2009 14:32:00 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[openbsd unix]]></category>
		<category><![CDATA[pf]]></category>
		<category><![CDATA[www服务]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1176</guid>
		<description><![CDATA[<p>很久没弄过OPENBSD，而且，听说现在的NGINX很红，性能比传统的APACHE要好很多倍，因而，一直想弄个NGINX服务器环境。加上，俺也想熟悉回OPENBSD，就想着弄个OPENBSD，NGINX，MYSQL，PHP的环境。。弄来玩玩，就当复习一下技术。出于习惯，俺还是在网上找了这篇文档。初步看过，好像写得不错，，就先弄过来，暂没时间实操过，待俺忙过这段时间。就再次重点研究一下俺熟悉而喜欢的UNIX服务器与数据库技术。。。</p>
<p>本手册以在OpenBSD 4.4环境下搭建Nginx、MySQL、PHP环境为例进行讲解。按照惯例，root权限。</p>
<p>=====================================================</p>
<p>目录</p>
<p>一、OpenBSD的安装及注意事项
二、系统性能调优
Ⅰ、/etc/fstab调优
Ⅱ、/etc/sysctl.conf调优</p>
<p>三、O.N.M.P.软件环境的安装
四、Nginx配置
Ⅰ、Nginx配置文件的修改
Ⅱ、Nginx日志截断</p>
<p>五、MySQL与phpMyAdmin的配置
Ⅰ、MySQL的配置
Ⅱ、phpMyAdmin的配置</p>
<p>六、强化PHP的安全
七、强化SSH的安全
Ⅰ、SSH配置文件的修改
Ⅱ、使用KEY进行验证
Ⅲ、按需启动SSH
Ⅳ、一点安全小常识</p>
<p>八、启用Packet Filter防火墙
九、系统启动脚本的修改</p>
<p>=====================================================</p>
<p>一、OpenBSD的安装及注意事项</p>
<p>OpenBSD的安装这里就不多说了，主要是安装时系统组件的选择、分区和系统服务的部分。对于系统组件部分，作为生产系统来说，偶并不推荐安装comp44.tgz这个组件。因为comp44.tgz实际就是编译器，不装这个，可以在很大程度上避免安装一些非授权的软件，从而提高远程主机的安全性。如果真的需要安装什么软件，也可以在非重要的机器上进行编译，然后使用PSFTP等软件上传到远程主机上使用。关于PSFTP软件的使用，二楼有详细的介绍。</p>
<p>系统分区时，推荐将/usr、/usr/local、/var、/var/mysql、/var/mail、/var/log、/var/nginx等分区单独分出来，也就是说，进行比较细致的分区，防止某个目录中的文件膨胀占满整个分区导致的死锁等问题。假定你有一个80G的硬盘，一个分区示例在下面：</p>
<p>/	200M
(swap)	1G
/tmp	200M
/usr	500M
/usr/local	200M
/var	100M
/var/mysql	10G
/var/mail	100M
/var/log	5G~10G
/home	200M
/var/nginx	剩余空间</p>
<p>至于系统服务部分，建议所有的服务都选择“n”，亦即不随系统启动。

二、系统性能调优</p>
<p>对于多核的机器，使用bsd.mp这个核心。</p>
<p>[Copy to clipboard] [ - ]CODE:
mv /bsd /obsd
mv /bsd.mp /bsd</p>
<p>Ⅰ、/etc/fstab调优</p>
<p>[Copy to clipboard] [ - ]CODE:
vi /etc/fstab</p>
<p>在文件系统描述符部分，加入&#8221;noatime&#8221;和&#8221;softdep&#8221;。示例如下：</p>
<p>QUOTE:
/dev/wd0a / ffs rw,noatime,softdep 1 1
/dev/wd0l /home ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0d /tmp ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0e /usr ffs rw,nodev,noatime,softdep 1 2
/dev/wd0f /usr/local ffs rw,nodev,noatime,softdep 1 2
/dev/wd0g /var ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0i /var/log ffs rw,nodev,nosuid,noatime,softdep 1 2
/dev/wd0j /var/mail ffs [...]]]></description>
			<content:encoded><![CDATA[<p>很久没弄过OPENBSD，而且，听说现在的NGINX很红，性能比传统的APACHE要好很多倍，因而，一直想弄个NGINX服务器环境。加上，俺也想熟悉回OPENBSD，就想着弄个OPENBSD，NGINX，MYSQL，PHP的环境。。弄来玩玩，就当复习一下技术。出于习惯，俺还是在网上找了这篇文档。初步看过，好像写得不错，，就先弄过来，暂没时间实操过，待俺忙过这段时间。就再次重点研究一下俺熟悉而喜欢的UNIX服务器与数据库技术。。。</p>
<p>本手册以在OpenBSD 4.4环境下搭建Nginx、MySQL、PHP环境为例进行讲解。按照惯例，root权限。</p>
<p>=====================================================</p>
<p>目录</p>
<p>一、OpenBSD的安装及注意事项<br />
二、系统性能调优<br />
Ⅰ、/etc/fstab调优<br />
Ⅱ、/etc/sysctl.conf调优</p>
<p>三、O.N.M.P.软件环境的安装<br />
四、Nginx配置<br />
Ⅰ、Nginx配置文件的修改<br />
Ⅱ、Nginx日志截断</p>
<p>五、MySQL与phpMyAdmin的配置<br />
Ⅰ、MySQL的配置<br />
Ⅱ、phpMyAdmin的配置</p>
<p>六、强化PHP的安全<br />
七、强化SSH的安全<br />
Ⅰ、SSH配置文件的修改<br />
Ⅱ、使用KEY进行验证<br />
Ⅲ、按需启动SSH<br />
Ⅳ、一点安全小常识</p>
<p>八、启用Packet Filter防火墙<br />
九、系统启动脚本的修改</p>
<p>=====================================================</p>
<p>一、OpenBSD的安装及注意事项</p>
<p>OpenBSD的安装这里就不多说了，主要是安装时系统组件的选择、分区和系统服务的部分。对于系统组件部分，作为生产系统来说，偶并不推荐安装comp44.tgz这个组件。因为comp44.tgz实际就是编译器，不装这个，可以在很大程度上避免安装一些非授权的软件，从而提高远程主机的安全性。如果真的需要安装什么软件，也可以在非重要的机器上进行编译，然后使用PSFTP等软件上传到远程主机上使用。关于PSFTP软件的使用，二楼有详细的介绍。</p>
<p>系统分区时，推荐将/usr、/usr/local、/var、/var/mysql、/var/mail、/var/log、/var/nginx等分区单独分出来，也就是说，进行比较细致的分区，防止某个目录中的文件膨胀占满整个分区导致的死锁等问题。假定你有一个80G的硬盘，一个分区示例在下面：</p>
<p>/	200M<br />
(swap)	1G<br />
/tmp	200M<br />
/usr	500M<br />
/usr/local	200M<br />
/var	100M<br />
/var/mysql	10G<br />
/var/mail	100M<br />
/var/log	5G~10G<br />
/home	200M<br />
/var/nginx	剩余空间</p>
<p>至于系统服务部分，建议所有的服务都选择“n”，亦即不随系统启动。<br />
<span id="more-1176"></span><br />
二、系统性能调优</p>
<p>对于多核的机器，使用bsd.mp这个核心。</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
mv /bsd /obsd<br />
mv /bsd.mp /bsd</p>
<p>Ⅰ、/etc/fstab调优</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/fstab</p>
<p>在文件系统描述符部分，加入&#8221;noatime&#8221;和&#8221;softdep&#8221;。示例如下：</p>
<p>QUOTE:<br />
/dev/wd0a / ffs rw,noatime,softdep 1 1<br />
/dev/wd0l /home ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0d /tmp ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0e /usr ffs rw,nodev,noatime,softdep 1 2<br />
/dev/wd0f /usr/local ffs rw,nodev,noatime,softdep 1 2<br />
/dev/wd0g /var ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0i /var/log ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0j /var/mail ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0h /var/mysql ffs rw,nodev,nosuid,noatime,softdep 1 2<br />
/dev/wd0k /var/nginx ffs rw,nodev,nosuid,noatime,softdep 1 2</p>
<p>友情提醒：softdep是一种非同步的文件系统，意外掉电可能造成数据的遗失/损坏，生产系统请谨慎使用！</p>
<p>改完后保存退出，reboot，看能不能正常启动。</p>
<p>一般情况下是没有问题的，个别机器或虚拟机可能会因为兼容性的缘故，无法启动。那么就把根目录的softdep拿掉，其他目录保留，仍然会有作用。</p>
<p>更多关于OpenBSD环境下磁盘性能调优的内容，请参看偶博客的文章，地址在下面：</p>
<p>http://blog.chinaunix.net/u2/81136/showart_1841280.html</p>
<p>Ⅱ、/etc/sysctl.conf调优</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/sysctl.conf</p>
<p>跳到最后，加入下面的内容：</p>
<p>QUOTE:<br />
# 增大文件系统缓存到1M<br />
kern.maxvnodes=131072</p>
<p># 允许最多65536个进程<br />
kern.maxproc=65536</p>
<p># 同时最多打开65536个文件<br />
kern.maxfiles=65536</p>
<p># 并发连接最大65536<br />
kern.somaxconn=65536</p>
<p># 保留的最少连接数<br />
kern.sominconn=256<br />
kern.maxclusters=32768</p>
<p># 增大TCP接收/发送缓存到64K<br />
net.inet.tcp.recvspace=65536<br />
net.inet.tcp.sendspace=65536</p>
<p># 增大UDP接收/发送缓存到64K<br />
net.inet.udp.recvspace=65536<br />
net.inet.udp.sendspace=65536</p>
<p>注意：虚拟机测试只加最上面一行kern.maxvnodes=65536即可，其他的不必加了，否则会有各种问题。独立机器的可以加上。</p>
<p>保存退出，reboot。不能正常启动的就把除kern.maxvnodes以外的数字调小或者禁用再试。</p>
<p>三、OpenBSD.Nginx.MySQL.PHP软件环境的安装</p>
<p>OpenBSD环境下软件的安装是非常简单的，因为在官方的ftp中提供了已经编译好的二进制包，需要安装的软件都在ftp中，从ftp中安装即可。</p>
<p>小提示：如果你机器比较多，你可以把需要安装的软件包都down回来，其他机器再来这里安装，速度会非常快！</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
export PKG_PATH=ftp://ftp.openbsd.org/pub/OpenBSD/4.4/packages/i386/</p>
<p>pkg_add mysql-server php5-fastcgi php5-gd-5.2.6-no_x11 phpMyAdmin lighttpd-1.4.19p3 nginx pecl-APC</p>
<p>以偶的1M ADSL小水管为例，大约也就二十分钟左右就安装完毕了！真的是非常快！和其他系统的wget源码、./configure &amp;&amp; make &amp;&amp; make install&#8230;所需要的时间相比，效率是非常高！而且，由于OpenBSD默认采用比较高的安全策略，装上的环境安全性也比其他系统要高！</p>
<p>等所需的软件都安装完成后，按提示作链接并创建PHP临时工作目录：</p>
<p>QUOTE:<br />
ln -s /var/www/conf/modules.sample/php5.conf /var/www/conf/modules<br />
ln -fs /var/www/conf/php5.sample/apc.ini /var/www/conf/php5/apc.ini<br />
ln -fs /var/www/conf/php5.sample/gd.ini /var/www/conf/php5/gd.ini<br />
ln -fs /var/www/conf/php5.sample/mbstring.ini /var/www/conf/php5/mbstring.ini<br />
ln -fs /var/www/conf/php5.sample/mcrypt.ini /var/www/conf/php5/mcrypt.ini<br />
ln -fs /var/www/conf/php5.sample/mysql.ini /var/www/conf/php5/mysql.ini<br />
mkdir /var/nginx/sesstmp<br />
chmod 0777 /var/nginx/sesstmp</p>
<p>pkg_info检查一下系统中安装了些什么软件包：</p>
<p>可以看到，所需的软件包和依赖的包都安装好了！</p>
<p>四、Nginx配置</p>
<p>Ⅰ、Nginx配置文件的修改</p>
<p>修改nginx的默认配置文件：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/nginx/nginx.conf</p>
<p>按下面的内容修改Nginx的配置文件。兰色表示需要手动修改的内容，红色表示增加的内容：</p>
<p>QUOTE:<br />
#user  nobody;</p>
<p># 指定子进程数，酌情修改<br />
worker_processes  4;</p>
<p>#error_log  logs/error.log;<br />
#error_log  logs/error.log  notice;<br />
#error_log  logs/error.log  info;</p>
<p>#pid        logs/nginx.pid;</p>
<p># 最多可打开文件数<br />
worker_rlimit_nofile 8196;</p>
<p>events {<br />
# 最大并发数<br />
worker_connections  1024;<br />
}</p>
<p>http {<br />
include       mime.types;<br />
default_type  application/octet-stream;</p>
<p># 关掉错误日志<br />
error_log       /dev/null  crit;<br />
# 如果需要错误日志，就用下面这行替换上面这行<br />
#error_log     /var/log/nginx/error.log  notice;</p>
<p># 定义日志格式，对日志使用缓存，避免频繁的磁盘I/O操作<br />
access_log   /var/log/nginx/access.log combined buffer=1m;</p>
<p>sendfile        on;<br />
tcp_nopush      on;<br />
tcp_nodelay     on;</p>
<p>keepalive_timeout  10;</p>
<p># 对静态文件和可压缩文件启用压缩，以节约网络带宽，提高访问速度<br />
gzip              on;<br />
gzip_min_length   1k;<br />
gzip_buffers      4 8k;<br />
gzip_http_version 1.1;<br />
gzip_comp_level   3;<br />
gzip_types        text/html text/css text/xml text/plain application/x-javascript application/xml application/pdf application/x-perl application/x-tcl application/msword application/rtf application/vnd.ms-excel application/vnd.ms-powerpoint application/vnd.wap.xhtml+xml image/x-ms-bmp;<br />
gzip_disable      &#8220;MSIE [1-6] \.&#8221;;<br />
gzip_vary         on;</p>
<p># 定义输出缓存大小<br />
output_buffers   4 32k;</p>
<p># 最大允许可上传文件大小<br />
client_max_body_size 20m;</p>
<p># 定义一个叫“myzone”的记录区，总容量为 10M<br />
# 和下面的limit_conn一起限制单个IP的并发连接数为10<br />
limit_zone myzone $binary_remote_addr  10m;</p>
<p>server {<br />
listen       80;<br />
server_name  localhost;</p>
<p>location / {<br />
root   /var/nginx/html;<br />
index  index.php index.html index.htm;<br />
limit_conn  myzone 10;<br />
}</p>
<p>error_page   500 502 503 504  /50x.html;</p>
<p>location = /50x.html {<br />
root   /var/nginx/html;<br />
}</p>
<p>location ~ \.php$ {<br />
root           html;<br />
fastcgi_pass   127.0.0.1:9000;<br />
fastcgi_index  index.php;<br />
fastcgi_param  SCRIPT_FILENAME  /var/nginx/html$fastcgi_script_name;<br />
include        fastcgi_params;<br />
}</p>
<p># 在浏览器本地暂存图片和静态文件，不记录日志，以节约机器资源<br />
location ~* \.(gif|png|jpg|jpeg|bmp|css|js|swf)$<br />
{<br />
root           /var/nginx/html;<br />
access_log off;<br />
expires max;<br />
}</p>
<p># 在浏览器中输入http://xxx.xxx.xxx/status可以看到Nginx的运行信息<br />
# 需要密码验证，不记录日志，限制IP访问<br />
location ~ /status<br />
{<br />
auth_basic  &#8220;O.N.M.P.&#8221;;<br />
auth_basic_user_file password;<br />
stub_status on;<br />
access_log   off;<br />
allow 192.168.0.0/24;<br />
deny all;<br />
}<br />
}</p>
<p>}</p>
<p>其他的部分请酌情修改。</p>
<p>运行下面的命令生成查看Nginx运行状态的密码文件：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
htpasswd -c /etc/nginx/password webadmin</p>
<p>按提示输入两遍密码即可。</p>
<p>在查看status的时候，输入用户名webadmin（见上面这行）和密码就能够看到Nginx的运行数据了。</p>
<p>Nginx能够流行和它的高负载能力是分不开的，在追求性能表现的场合，推荐使用Nginx+PHP-fastcgi的组合以获得强健的性能表现。而对于那些重视安全性的场合来说，可能OpenBSD内核集成的Apache更合适。OpenBSD下搭建Apache、MySQL、PHP环境的详细内容请参见偶的另篇博文，地址在下面：（博客速度可能较慢，四楼有转帖）</p>
<p>http://blog.chinaunix.net/u2/81136/showart_1860332.html</p>
<p>当然，你也可以利用Nginx内置的负载均衡功能，在前端分配访问流量，后端由Apache来运行PHP环境。Nginx负载均衡的配置可以去Nginx的主页参看相关内容，地址：http://wiki.nginx.org/Main。</p>
<p>下面为一个Nginx负载均衡的示例：</p>
<p>QUOTE:<br />
http {<br />
upstream myproject {<br />
ip_hash;<br />
server 192.168.1.1:80;<br />
server 192.168.1.2:80;<br />
server 192.168.1.3:80;<br />
server 192.168.1.4:80;<br />
}</p>
<p>server {<br />
listen 80;<br />
server_name www.domain.com;<br />
location / {<br />
proxy_pass http://myproject;<br />
}<br />
}<br />
}</p>
<p>网络拓扑示意图如下：</p>
<p>Ⅱ、Nginx日志截断</p>
<p>OpenBSD默认每天00:00会执行/etc/daily.local脚本中的内容，我们只需要把Nginx日志截断的命令加入到这个文件中即可。</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/daily.local</p>
<p>加入下面的内容：</p>
<p>QUOTE:<br />
#!/bin/sh<br />
# 对Nginx日志进行截断和压缩，以节约log分区空间<br />
# 在张宴的基础上修改，感谢！<br />
mkdir -p /var/log/nginx/$(date -d &#8220;yesterday&#8221; +&#8221;%Y&#8221;)/$(date -d &#8220;yesterday&#8221; +&#8221;%m&#8221;)/<br />
mv /var/log/nginx/access.log /var/log/nginx/$(date -d &#8220;yesterday&#8221; +&#8221;%Y&#8221;)/$(date -d &#8220;yesterday&#8221; +&#8221;%m&#8221;)/access.$(date -d &#8220;yesterday&#8221; +&#8221;%Y%m%d&#8221;).log<br />
kill -USR1 `cat /var/run/nginx.pid`<br />
sleep 1<br />
gzip /var/log/nginx/$(date -d &#8220;yesterday&#8221; +&#8221;%Y&#8221;)/$(date -d &#8220;yesterday&#8221; +&#8221;%m&#8221;)/access.$(date -d &#8220;yesterday&#8221; +&#8221;%Y%m%d&#8221;).log</p>
<p>保存退出，为/etc/daily.local加上执行权限：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
chmod 0755 /etc/daily.local</p>
<p>其他需要每天运行的命令也都可以加在这个脚本里面，各位自行处理。</p>
<p>五、MySQL与phpMyAdmin的配置</p>
<p>Ⅰ、MySQL的配置</p>
<p>安全起见，MySQL需要运行在自己的daemon下：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/login.conf</p>
<p>跳到最后，加入MySQL所需的修改：</p>
<p>QUOTE:<br />
mysql:\<br />
 <img src='http://www.evanjiang.net.cn/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> penfiles-cur=2048:\<br />
 <img src='http://www.evanjiang.net.cn/wp-includes/images/smilies/icon_surprised.gif' alt=':o' class='wp-smiley' /> penfiles-max=4096:\<br />
:tc=daemon:</p>
<p>使修改生效：<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
[Copy to clipboard] [ - ]CODE:<br />
cap_mkdb /etc/login.conf</p>
<p>初始化MySQL数据库：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
/usr/local/bin/mysql_install_db</p>
<p>MySQL自带了几个配置文件，在/usr/local/share/mysql目录中，可以拷贝为/etc/my.cnf使用。关于MySQL的配置和优化等内容，可以自行Google，这里不再赘述。<br />
MySQL安全须知<br />
不要用root身份运行数据库或PHP应用。并且，最好是数据库名和数据库用户名不同，以提高安全性。</p>
<p>例如，域名为example.net，则数据库名设为abcxyz，数据库用户名设为xyzabc。总之，关联度越低越好，数据库名和数据库用户名越复杂越难猜测越好。</p>
<p>控制权限的分配，PHP应用仅给予必要的权限。</p>
<p>例如，安装/升级Discuz!和PHPWind论坛程序，仅需要下图所示的权限即可：</p>
<p>在安装/升级完毕后，还可以把CREATE、ALTER、DROP权限去掉，不会影响论坛程序的运行，而且提高了安全性！<br />
Ⅱ、phpMyAdmin的配置</p>
<p>由于OpenBSD中的phpMyAdmin默认是安装在/var/www/phpMyAdmin目录中的，直接使用Nginx是无法访问的，我们需要把它拷贝到Nginx目录下，这样就可以通过浏览器来管理MySQL数据库了。</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
mkdir /var/nginx/html/pma/<br />
cp -rf /var/www/phpMyAdmin/* /var/nginx/html/pma/</p>
<p>修改phpMyAdmin的配置文件，使之可用。</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi +17 /var/nginx/html/pma/config.inc.php</p>
<p>将下面这行修改成：</p>
<p>QUOTE:<br />
$cfg['blowfish_secret'] = &#8216;a&#8217;; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */</p>
<p>（仅是加入了字母a而已）</p>
<p>保存退出。<br />
小提示：<br />
上面新建了/var/nginx/html/pma目录来保存phpMyAdmin的文件，目录名很简单。你可以用一个更复杂的目录名来代替，例如：pma2YAY5jRpfFfLXQVm这样的目录名，以防止黑客利用字典攻击等方法渗透你的phpMyAdmin！</p>
<p>你还可以在Nginx的配置文件中，将/var/nginx/html/pma配置成某个虚拟主机的根目录，并限定可以访问这个虚拟主机的IP。这样，就可以在很大程度上提高数据库的安全性了！一个配置示例在下面：</p>
<p>QUOTE:<br />
location / {<br />
allow   192.168.0.0/24;<br />
deny    all;<br />
}</p>
<p>假如平时只是偶尔用到phpMyAdmin，你还可以在用完后删除/var/nginx/html/pma目录，需要用的时候再拷贝过去。</p>
<p>你还可以将以上方法结合起来灵活使用，既建立一个无法被猜测的目录名，又限制IP访问，这样你的系统被黑的机会就会小了很多！<br />
六、强化PHP的安全</p>
<p>OpenBSD软件包中的PHP已经自带了suhosin这个补丁，可以在很大程度上提高PHP脚本的安全。本节主要讨论在php.ini文件中进行相关的设置，进一步提升安全性。具体来说，就是禁用某些危险函数和启用PHP安全模式。</p>
<p>偶一般是把对PHP的所有修改都放在一个单独的文件中进行，包括对PHP参数以及扩展模块的修改，都放在这个文件中一并处理，这样查找、修改和管理会方便许多：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /var/www/conf/php5/addphp.ini</p>
<p>加入下面的内容：</p>
<p>QUOTE:<br />
; 禁止动态加载模块<br />
enable_dl = Off</p>
<p>; 隐藏PHP信息<br />
expose_php = Off</p>
<p>; 限定可访问目录<br />
open_basedir = /var/nginx/html/</p>
<p>;设定session暂存目录<br />
session.save_path=/var/nginx/sesstmp</p>
<p>; 设定PHP上传文件的临时目录<br />
upload_tmp_dir=/var/nginx/tmp</p>
<p>; 禁用危险函数（注意下面的内容应该是一行，编排的原因分成了多行）<br />
disable_functions = phpinfo,com,shell,exec,system,passthru,error_log,<br />
stream_socket_server,putenv,ini_alter,ini_restore,ini_set,dl,openlog,<br />
syslog,readlink,symlink,link,leak,fsockopen,pfsockopen,proc_open,<br />
popepassthru,escapeshellcmd,escapeshellarg,chroot,scandir,<br />
chgrp,chown,shell_exec,proc_get_status,popen,shmop_close,<br />
shmop_delete,shmop_open,shmop_read,shmop_size,shmop_write</p>
<p>; 启用PHP的安全模式<br />
; PHP在安全模式下运行是用性能换安全。据简单测试，性能下降到50%左右，各位请酌情使用<br />
; 启用安全模式后，某些程序可能受到影响。例如，Discuz!将无法上传附件<br />
safe_mode = On</p>
<p>; pecl-APC只使用16M的共享内存用以加速PHP程序的运行<br />
apc.shm_size=16M</p>
<p>保存退出。<br />
七、强化SSH的安全<br />
Ⅰ、SSH配置文件的修改</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/ssh/sshd_config</p>
<p>跳到最后，加入下面的部分：</p>
<p>QUOTE:<br />
# 使用高位端口，防止黑客扫描22端口。可选范围1024~65535，推荐32768~65535。<br />
Port 58937</p>
<p># 登录时间控制在30秒内<br />
LoginGraceTime 30</p>
<p># 不允许root远程直接登录<br />
PermitRootLogin no<br />
StrictModes yes</p>
<p># 最多允许三次错误<br />
MaxAuthTries 3</p>
<p># 最多允许三个SSH线程<br />
MaxSessions 3</p>
<p># 使用SSH协议2<br />
Protocol 2</p>
<p># 不使用密码认证<br />
PasswordAuthentication no</p>
<p># 使用KEY的方式认证<br />
PubkeyAuthentication yes</p>
<p># KEY文件存放位置<br />
AuthorizedKeysFile      .ssh/authorized_keys</p>
<p>Ⅱ、使用KEY进行验证</p>
<p>下面以Windows环境下PuTTY为例讲解使用KEY验证的方法，Linux/UNIX下与此类似。</p>
<p>首先，从下面的网址下载PuTTY的安装包（Windows）：</p>
<p>http://the.earth.li/~sgtatham/putty/latest/x86/putty-0.60-installer.exe</p>
<p>下完后双击安装，不再赘述。这个软件包自带了下面几个非常实用的软件：</p>
<p>QUOTE:<br />
PuTTYgen:生成KEY；</p>
<p>Pageant:管理KEY；</p>
<p>PuTTY:SSH客户端；</p>
<p>PSFTP:使用SSH上传/下载文件。</p>
<p>下面就来实例讲解用PuTTY的这几个软件对远程主机进行KEY认证和管理的方法。假设我们要在192.168.0.132这个远程主机上使用young_king这个用户名进行KEY认证和登录。<br />
1.生成KEY</p>
<p>启动PuTTYgen，如下图：</p>
<p>在密钥长度栏输入想要的密钥长度，越大越安全。这里以最大的2048位为例，然后点“Generate”按钮，会开始生成KEY，生成过程中需要在下面的空白部分移动鼠标来生成随机数。</p>
<p>KEY生成完毕后，你可以输入一些标识信息，如下图：</p>
<p>还可以在下面的passphrase框内输入“保护码”，注意要输入两遍。“保护码”也就是密码的意思，用来保密私钥的，一定要记住这个哦！</p>
<p>都输入完毕后，点击下面的“Save public key”按钮保存公钥，如下图所示：</p>
<p>然后点击“Save private key”按钮保存私钥，如下图：</p>
<p>这个私钥最好不要保存在电脑上，我们把它拷贝到U盘上，随身带着，这就是我们的“KEY盘”。</p>
<p>要养成每月更换“保护码”的好习惯，更换“保护码”仍然要用到PuTTYgen这个软件，启动后点击“Load”，载入私钥，重新输入“保护码”，再确认一遍，然后点击“Save private key”保存即可！</p>
<p>2.启用KEY</p>
<p>上面生成了公钥和私钥，我们需要把公钥上传到远程主机的用户目录中，就要用到PSFTP这个软件了。启动它，如下图：</p>
<p>输入命令：open 192.168.0.132</p>
<p>接下来，PSFTP会列出远程主机上的RSA指纹以供识别，如下图：</p>
<p>这个指纹可以在远程主机上输入下面的命令查看：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key</p>
<p>请把这个指纹记在纸上，随身携带，和远程主机连接的时候就拿出来对比一下（这么做主要是为了防止连接被人劫持和指纹被伪造）。</p>
<p>如果上面PSFTP显示的指纹和远程主机上的不一致，那么毫无疑问是伪造的了，直接回车断开连接。如果相符，你可以输入“y”来保存这个指纹到本地计算机上（不推荐），或输入“n”只是这次连接使用。</p>
<p>随后PSFTP会让你输入登录用户名和密码，并自动进入该用户的根目录，如下图（以root为例）：</p>
<p>现在我们要把第一步生成的公钥上传到远程主机上（请把这个公钥复制到C:\Documents and Settings\Administrator目录先，如果你的Windows不是用Administrtor登录的，就替换成你登录用的用户名）。输入命令：put young_king，可以看到，公钥已经上传到/root目录了，见下图：</p>
<p>PuTTY生成的KEY并不能直接使用，需要转换一下。用PuTTY登录（此时上面修改的端口尚未启用，还是默认的22端口），以root身份执行：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
ssh-keygen -X -f /root/young_king &gt; /home/young_king/.ssh/authorized_keys</p>
<p>这就把公钥成功导入到young_king的目录中了，就可以被young_king这个用户使用了！</p>
<p>导入成功后，要删除多余的公钥：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
rm /root/young_king</p>
<p>下面介绍几个PSFTP常用的命令：</p>
<p>QUOTE:<br />
open xxx.xxx.xxx.xxx：打开远程主机（xxx.xxx.xxx.xxx为IP或域名）；</p>
<p>put xxxxxxxx：向远程主机上传文件（该文件需要事先拷贝到C:\Documents and Settings\Administrator目录）；</p>
<p>get xxxxxxxx：从远程主机下载文件（下载后保存在C:\Documents and Settings\Administrator目录）；</p>
<p>cd xxxxxx:进入远程主机的相应目录；</p>
<p>exit：退出PSFTP（也可以点右上角的叉关闭，不过不推荐这样做）。</p>
<p>更多的命令可以参看PuTTY的帮助文件，这个帮助写得不错。</p>
<p>3.使用KEY登录</p>
<p>我们上面虽然修改了SSH的配置文件（/etc/ssh/sshd_config），但还没有启用。输入下面的命令启用新的SSH配置，以便我们用KEY登录：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
kill -HUP `cat /var/run/sshd.pid`</p>
<p>PuTTY提供了一个KEY的管理程序，上面已经提到，是Pageant，我们使用这个程序来进行KEY登录。</p>
<p>启动Pageant，它会自动缩小到任务栏的通知区域，右键单击，选择“Add key”，会弹出个对话框让我们选择。插入上面制作好的“KEY盘”，并选择保存的私钥，会弹出个对话框让我们输入“保护码”，如下图：</p>
<p>如果安装PuTTY时选择了让Pageant关联.ppk文件，则双击私钥可以自动启动Pageant。</p>
<p>输入在生成KEY时输入的“保护码”，私钥就被导入到Pageant中了。再右键单击任务栏通知区的Pageant图标，选择第一项“New session”，Pageant会自动启动PuTTY，等待输入远程主机的相关信息，如下图：</p>
<p>输入IP（或域名）和端口号，点击最下面的“Open”按钮，PuTTY就会登录远程主机了。和PSFTP类似，会弹出个对话框让你确认远程主机的RSA指纹，如下图。同理，指纹不同就表示连接被劫持或指纹被伪造，点“取消”断开连接；指纹相同就点“否”，不保存主机公钥到本地计算机。</p>
<p>随后会让你输入用户名，输入“young_king”，看看，自动就登录上去了！</p>
<p>前面更改SSH配置的时候，已经禁用了root远程登录和使用密码登录，只能使用KEY才能登录进系统。想要维护系统的时候，就用这个KEY登录，再su成root。而且，需要上传/下载文件的时候，就用PSFTP，所有的操作都在SSH连接下进行，还有KEY的保护，安全性不知道提升了多少倍！黑客想要破解真是难于上青天！<br />
Ⅲ、按需启动SSH</p>
<p>我们只在必要的时候启动sshd服务，用完即停止，不给黑客扫描的机会。输入下面的命令：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
crontab -e</p>
<p>跳到最后，输入下面的内容（中间的空白部分为Tab）：</p>
<p>QUOTE:<br />
# 每天的10:30启动sshd服务<br />
30      10      *       *       *       /usr/sbin/sshd</p>
<p># 10:35即停止sshd服务，也就是说，你只有五分钟的时间可以登录进系统<br />
35      10      *       *       *       kill `cat /var/run/sshd.pid`</p>
<p>保存退出。</p>
<p>上面的时间请酌情修改。sshd服务启动的时间尽量不要太长，5~10分钟应该够了！</p>
<p>Ⅳ、一点安全小常识<br />
私钥请一定保存在安全的地方，不要保存在本地计算机上，并加上足够强度的“保护码”；</p>
<p>本地计算机不要保存远程主机的“指纹”，用一次确认一次（远程主机的指纹保存在注册表的HKEY_CURRENT_USER\Software\SimonTatham\PuTTY项下，可以手动删除）；</p>
<p>不要使用DSA密钥，据说有漏洞的；</p>
<p>不要在公用计算机上连接远程主机，有键盘记录器、木马什么的就麻烦了；</p>
<p>多个远程主机不要使用相同的公钥，最好是使用各自的公钥、私钥；</p>
<p>少用，最好是不用无线网络，加密强度太差，容易被破解；</p>
<p>M$系统下的病毒、木马太多了，推荐客户端转换到Linux/UNIX环境，安全性更高，而且仍然有PuTTY及工具可用；</p>
<p>注意清除本地机器上不必要保留的文件（例如私钥、公钥、主机RSA指纹、C:\Documents and Settings\Administrator目录下的文件等等）。</p>
<p>八、启用Packet Filter防火墙</p>
<p>Packet Filter是非常优秀的包过滤防火墙，OpenBSD核心已经集成了Packet Filter防火墙，不过默认并没有启用，下面我们来启用Packet Filter的强大功能！</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/pf.conf</p>
<p>跳到最后，加入下面的内容：</p>
<p>QUOTE:<br />
# 宏定义<br />
# 请把下面的fxp0换成你自己用的外网网卡，不知道的可以输入ifconfig查看<br />
ext_if=&#8221;fxp0&#8243;</p>
<p># 指定可以使用SSH登录的IP，支持CIDR<br />
admin_add=&#8221;192.168.0.0/24&#8243;</p>
<p># 指定SSH端口。<br />
# 注意，如果在/etc/ssh/sshd_config文件中更改了SSH端口号，这里的也需要同样修改。否则连不上了不要怪偶没有提醒！<br />
ssh_port=&#8221;58937&#8243;</p>
<p># 维持一个持久的表，里面存放的是对本机发动DDoS攻击的IP<br />
table  persist</p>
<p># 选项设定<br />
set require-order yes<br />
set block-policy drop<br />
set optimization aggressive<br />
set loginterface none<br />
set skip on lo0</p>
<p># TCP参数设定<br />
set timeout {interval 3,frag 10}<br />
set timeout {tcp.first 10,tcp.opening 2,tcp.established 600,tcp.closing 20,tcp.finwait 10,tcp.closed 10}</p>
<p># UDP、ICMP及其它参数设定<br />
set timeout {udp.first 20,udp.single 10,udp.multiple 10}<br />
set timeout {icmp.first 10,icmp.error 5}<br />
set timeout {other.first 20,other.single 10,other.multiple 20}<br />
set timeout {adaptive.start 0,adaptive.end 0}</p>
<p># 允许最多有65536个连接<br />
set limit { states 65535, frags 200, src-nodes 65536, tables 65536, table-entries 1048576 }</p>
<p># 包整形<br />
scrub in all<br />
scrub out all</p>
<p># 阻止所有不匹配的包和从DDoS主机来的包<br />
block quick from<br />
block return<br />
block in all<br />
block out all</p>
<p># 防止IP欺骗<br />
antispoof quick for {lo0,$ext_if}</p>
<p># 允许本机访问其他机器<br />
pass out quick on $ext_if inet from $ext_if to any flags S/SA keep state</p>
<p># 允许IPv4地址的客户机访问本地80（www）端口，发起过快连接（DDoS）的主机加入阻止列表。注意是一行，下同<br />
pass in quick on $ext_if inet proto tcp from any to $ext_if port 80 flags S/SA synproxy state (source-track rule,max-src-nodes 200,max-src-states 100,max-src-conn 100,max-src-conn-rate 1000/10,overload  flush global )</p>
<p># 允许IPv6地址的客户机访问本地80（www）端口，发起过快连接（DDoS）的主机加入阻止列表<br />
pass in quick on $ext_if inet6 proto tcp from any to $ext_if port 80 flags S/SA synproxy state (source-track rule,max-src-nodes 200,max-src-states 100,max-src-conn 100,max-src-conn-rate 1000/10,overload  flush global )</p>
<p># 允许管理IP远程连接本机SSH端口<br />
pass in quick on $ext_if inet proto tcp from $admin_add to $ext_if port $ssh_port flags S/SA synproxy state</p>
<p>保存退出。</p>
<p>修改系统配置，使得开机启用PF防火墙：</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/rc.conf.local</p>
<p>跳到最后，加入下面这行：</p>
<p>QUOTE:<br />
pf=YES<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
保存退出。</p>
<p>九、系统启动脚本的修改</p>
<p>修改系统启动脚本，使得MySQL、PHP(fastcgi)、Nginx可以在系统启动的时候自动启动，免去手动启动的麻烦。</p>
<p>[Copy to clipboard] [ - ]CODE:<br />
vi /etc/rc.local</p>
<p>跳到最后，加入下面的内容：</p>
<p>QUOTE:<br />
# 启动时校时。这行也可以加在/etc/daily.local文件的最前面，每天零点自动校时<br />
rdate -n 210.72.145.44<br />
# Start MySQL<br />
if [ -x /usr/local/bin/mysqld_safe ] ; then<br />
echo -n &#8216;Starting MySQL&#8230;&#8217;<br />
su -c mysql root -c &#8216;/usr/local/bin/mysqld_safe &gt;/dev/null 2&gt;&amp;1 &amp;&#8217;<br />
echo &#8220;DONE&#8221;<br />
fi<br />
# Start php-fastcgi<br />
if [ -x /usr/local/bin/spawn-fcgi ] ; then<br />
echo -n &#8216;Starting php-fastcgi&#8230;&#8217;<br />
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 6 -u www -f /usr/local/bin/php-fastcgi &gt; /var/run/fcgi.pid<br />
echo &#8220;DONE&#8221;<br />
fi<br />
# Start nginx<br />
if [ -x /usr/local/sbin/nginx ] ; then<br />
echo -n &#8216;Starting nginx&#8230;&#8217;<br />
/usr/local/sbin/nginx<br />
echo &#8220;DONE&#8221;<br />
fi</p>
<p>保存退出。</p>
<p>reboot重启，启动后输入top看看，O.N.M.P.环境已经搭建好！</p>
<p>系统启动后，还要把MySQL自带的测试数据库和匿名用户删除，防止被黑客利用。</p>
<p>默认情况下，新安装的MySQL数据库，root密码为空！同样需要第一时间进行设置，方法见下图：</p>
<p>好了，至此，O.N.M.P.环境的搭建已经结束，剩下的就看各位自行发挥了！</p>
<p>写在最后</p>
<p>其实，系统的安全是个整体工程，并不是用上了OpenBSD这个最安全的操作系统就算万事OK，还有很多事情要做。</p>
<p>更多的是需要在日常工作中积累经验，多分析系统整体的运行情况，多关注网络安全方面的内容，这样才能尽可能的打造安全的运维环境。</p>
<p>本手册只是起到抛砖引玉的作用，希望能吸引更多的人来关注系统安全，希望有更多的人能用上OpenBSD这个主动安全的操作系统，希望能推动OpenBSD在国内的更多普及。如此，则幸甚！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1176.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>具有负载均衡功能的MySQL服务器集群部署及实现</title>
		<link>http://www.evanjiang.net.cn/archives/1134.html</link>
		<comments>http://www.evanjiang.net.cn/archives/1134.html#comments</comments>
		<pubDate>Sat, 30 May 2009 17:04:01 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[freebsd unix]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=1134</guid>
		<description><![CDATA[<p>MySQL是一个高速度、高性能、多线程的关系型数据库管理系统，适用平台多，可扩展性强。在实际生产环境中，部署和实现具有一定负载均衡功能的MySQL服务器集群，对于提高用户数据库应用系统的性能、速度和稳定性具有明显的作用。本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案，并对可能出现的问题提供了相应的解决方法。</p>
<p>　1. 引言</p>
<p>　　MySQL是一个高速度、高性能、多线程、开放源代码，建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS)。它始于1979年，最初是Michael Widenius为瑞典TcX公司创建的UNIREG数据库系统，当时的UNIREG没有SQL(Structured Query Language结构化查询语言)接口，限制了它的应用。1996年5月，Widenius开发出了MySQL的最初版本，开始在Internet上公开发行。MySQL的开发人员从一开始就一直关注它的性能，为此不惜特性集，直到今天，MySQL依然保持本色，以高速度高性能为首要原则。随着时间的推移，MySQL也加入了大型数据库产品的高级特性，如存储过程、视图、触发器等，使其在企业级数据库系统中开始被部署应用[1]。2008年10 月，SUN公司收购了MySQL AB公司，开始进入开源领域。随着重量级操作系统Solaris的开源，SUN MySQL在数据库市场占有的份额将会进一步提高。因此，在生产环境中部署具有负载均衡功能的MySQL服务器集群，对于提高企业数据库应用系统的速度、稳定性及可伸缩性具有很大的现实意义，也可以有效降低应用系统的投资成本。本文将以FreeBSD 7.0-Release操作系统为例，利用MySQL数据库的复制(Replication)特性，简要介绍部署MySQL服务器集群的实现方法和相关注意事项。</p>
<p>　　2. 系统模型</p>
<p>　　本集群的结构为一个主MySQL服务器(Master)服务器与多个从属 MySQL服务器(Slave)建立复制(replication)连接，主服务器与从属服务器实现一定程度上的数据同步，多个从属服务器存储相同的数据副本，实现数据冗余，提供容错功能。部署开发应用系统时，对数据库操作代码进行优化，将写操作(如UPDATE、INSERT)定向到主服务器，把大量的查询操作(SELECT)定向到从属服务器，实现集群的负载均衡功能。如果主服务器发生故障，从属服务器将转换角色成为主服务器，使应用系统为终端用户提供不间断的网络服务;主服务器恢复运行后，将其转换为从属服务器，存储数据库副本，继续对终端用户提供数据查询检索服务。</p>
<p>　　3. 部署实现</p>
<p>　　本文以一台主服务器带三台从属服务器为例，简要介绍MySQL服务器集群的实现方案和具体方法步骤。</p>
<p>　　3.1 系统部署</p>
<p>　　由于FreeBSD系统对机器硬件要求较低，出于降低系统部署成本考虑，主服务器和从属服务器操作系统均采用FreeBSD 7.0-Release，并采用最小化定制安装，完成以后系统占用磁盘空间仅为254M(不计swap分区所占空间，它随具体机器内存容量的变化而变化)。为充分发挥系统硬件性能，MySQL数据库采用源代码编译安装。</p>
<p>　　3.1.1 安装FreeBSD系统</p>
<p>　　在主服务器和从属服务器上安装FreeBSD 7.0-Release，具体安装方法步骤不是本文主要内容，在此略过，如有疑问可以参考FreeBSD系统手册。需要说明的是为方便用户系统运行期间的维护管理，要打开系统的SSH服务功能，系统安装配置期间允许root用户远程登录，正常运行以后要关闭root用户的远程登录功能。在/etc/ssh /sshd_config配置文件中对PermitRootLogin设置为yes为允许root用户远程登录到系统，设置为no即为不允许。修改保存文件后执行kill –HUP `cat /var/run/sshd.pid`命令即可重启sshd守护进程，使设置生效[2]。上述操作需要root用户权限。

　3.1.2 编译安装MySQL</p>
<p>　　到MySQL的官方网站http://www.mysql.com下载MySQL数据库的安装源代码压缩包，本例下载的是mysql-5.1.30.tar.gz，以root用户身份登录到系统，开始安装MySQL数据库系统。</p>
<p>　　由于在对MySQL进行源代码编译安装时要求使用GNU的C编译器，而FreeBSD系统本身提供的不是该编译器，因此用户必须下载安装GNU C编译器[3]。把下载的gnumake-3.81.tar.gz解压安装，按如下步骤即可安装GNU C编译器：</p>
<p>　　[root@FreebsdMaster/softwares]# tar –zxvf gnumake-3.81.tar.gz</p>
<p>　　[root@FreebsdMaster /softwares]# cd make-3.81</p>
<p>　　[root@FreebsdMaster /softwares/make-3.81]# ./configure ; make; make install; make clean</p>
<p>　　GNU C编译器默认安装到/usr/local/bin，在安装MySQL时按绝对路径调用make命令即可，如# /usr/local/bin/make。</p>
<p>　　MySQL的编译安装比较复杂，具体操作及相关注意事项如下：</p>
<p>　　(1). 解压mysql-5.1.30.tar.gz，并进行配置</p>
<p>　　[root@FreebsdMaster /softwares]# tar –zxvf mysql-5.1.30.tar.gz</p>
<p>　　[root@FreebsdMaster /softwares]# cd mysql-5.1.30</p>
<p>　　[root@FreebsdMaster /softwares/mysql-5.1.30]# ./configure \</p>
<p>　　-–prefix=/app/mysql5 -–with-charset=gb2312</p>
<p>　　说明：MySQL默认的安装目录是/usr/local/mysql，为了增强系统部署的灵活性，紧贴用户应用系统实际情况，可以用—-prefix参数定制安装目录。&#8211;with-charset参数是使MySQL数据库支持中文gb2312字符集，如果需要支持其它字符集，使用&#8211;with- extra-charset参数，格式为—-with-extra-charset=CHARSET1,CHARSET2, [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL是一个高速度、高性能、多线程的关系型数据库管理系统，适用平台多，可扩展性强。在实际生产环境中，部署和实现具有一定负载均衡功能的MySQL服务器集群，对于提高用户数据库应用系统的性能、速度和稳定性具有明显的作用。本文简要介绍了在 FreeBSD 7.0-Release系统上部署实现MySQL服务器集群的方案，并对可能出现的问题提供了相应的解决方法。</p>
<p>　1. 引言</p>
<p>　　MySQL是一个高速度、高性能、多线程、开放源代码，建立在客户/服务器(Client /Server)结构上的关系型数据库管理系统(RDBMS)。它始于1979年，最初是Michael Widenius为瑞典TcX公司创建的UNIREG数据库系统，当时的UNIREG没有SQL(Structured Query Language结构化查询语言)接口，限制了它的应用。1996年5月，Widenius开发出了MySQL的最初版本，开始在Internet上公开发行。MySQL的开发人员从一开始就一直关注它的性能，为此不惜特性集，直到今天，MySQL依然保持本色，以高速度高性能为首要原则。随着时间的推移，MySQL也加入了大型数据库产品的高级特性，如存储过程、视图、触发器等，使其在企业级数据库系统中开始被部署应用[1]。2008年10 月，SUN公司收购了MySQL AB公司，开始进入开源领域。随着重量级操作系统Solaris的开源，SUN MySQL在数据库市场占有的份额将会进一步提高。因此，在生产环境中部署具有负载均衡功能的MySQL服务器集群，对于提高企业数据库应用系统的速度、稳定性及可伸缩性具有很大的现实意义，也可以有效降低应用系统的投资成本。本文将以FreeBSD 7.0-Release操作系统为例，利用MySQL数据库的复制(Replication)特性，简要介绍部署MySQL服务器集群的实现方法和相关注意事项。</p>
<p>　　2. 系统模型</p>
<p>　　本集群的结构为一个主MySQL服务器(Master)服务器与多个从属 MySQL服务器(Slave)建立复制(replication)连接，主服务器与从属服务器实现一定程度上的数据同步，多个从属服务器存储相同的数据副本，实现数据冗余，提供容错功能。部署开发应用系统时，对数据库操作代码进行优化，将写操作(如UPDATE、INSERT)定向到主服务器，把大量的查询操作(SELECT)定向到从属服务器，实现集群的负载均衡功能。如果主服务器发生故障，从属服务器将转换角色成为主服务器，使应用系统为终端用户提供不间断的网络服务;主服务器恢复运行后，将其转换为从属服务器，存储数据库副本，继续对终端用户提供数据查询检索服务。</p>
<p>　　3. 部署实现</p>
<p>　　本文以一台主服务器带三台从属服务器为例，简要介绍MySQL服务器集群的实现方案和具体方法步骤。</p>
<p>　　3.1 系统部署</p>
<p>　　由于FreeBSD系统对机器硬件要求较低，出于降低系统部署成本考虑，主服务器和从属服务器操作系统均采用FreeBSD 7.0-Release，并采用最小化定制安装，完成以后系统占用磁盘空间仅为254M(不计swap分区所占空间，它随具体机器内存容量的变化而变化)。为充分发挥系统硬件性能，MySQL数据库采用源代码编译安装。</p>
<p>　　3.1.1 安装FreeBSD系统</p>
<p>　　在主服务器和从属服务器上安装FreeBSD 7.0-Release，具体安装方法步骤不是本文主要内容，在此略过，如有疑问可以参考FreeBSD系统手册。需要说明的是为方便用户系统运行期间的维护管理，要打开系统的SSH服务功能，系统安装配置期间允许root用户远程登录，正常运行以后要关闭root用户的远程登录功能。在/etc/ssh /sshd_config配置文件中对PermitRootLogin设置为yes为允许root用户远程登录到系统，设置为no即为不允许。修改保存文件后执行kill –HUP `cat /var/run/sshd.pid`命令即可重启sshd守护进程，使设置生效[2]。上述操作需要root用户权限。<br />
<span id="more-1134"></span><br />
　3.1.2 编译安装MySQL</p>
<p>　　到MySQL的官方网站http://www.mysql.com下载MySQL数据库的安装源代码压缩包，本例下载的是mysql-5.1.30.tar.gz，以root用户身份登录到系统，开始安装MySQL数据库系统。</p>
<p>　　由于在对MySQL进行源代码编译安装时要求使用GNU的C编译器，而FreeBSD系统本身提供的不是该编译器，因此用户必须下载安装GNU C编译器[3]。把下载的gnumake-3.81.tar.gz解压安装，按如下步骤即可安装GNU C编译器：</p>
<p>　　[root@FreebsdMaster/softwares]# tar –zxvf gnumake-3.81.tar.gz</p>
<p>　　[root@FreebsdMaster /softwares]# cd make-3.81</p>
<p>　　[root@FreebsdMaster /softwares/make-3.81]# ./configure ; make; make install; make clean</p>
<p>　　GNU C编译器默认安装到/usr/local/bin，在安装MySQL时按绝对路径调用make命令即可，如# /usr/local/bin/make。</p>
<p>　　MySQL的编译安装比较复杂，具体操作及相关注意事项如下：</p>
<p>　　(1). 解压mysql-5.1.30.tar.gz，并进行配置</p>
<p>　　[root@FreebsdMaster /softwares]# tar –zxvf mysql-5.1.30.tar.gz</p>
<p>　　[root@FreebsdMaster /softwares]# cd mysql-5.1.30</p>
<p>　　[root@FreebsdMaster /softwares/mysql-5.1.30]# ./configure \</p>
<p>　　-–prefix=/app/mysql5 -–with-charset=gb2312</p>
<p>　　说明：MySQL默认的安装目录是/usr/local/mysql，为了增强系统部署的灵活性，紧贴用户应用系统实际情况，可以用—-prefix参数定制安装目录。&#8211;with-charset参数是使MySQL数据库支持中文gb2312字符集，如果需要支持其它字符集，使用&#8211;with- extra-charset参数，格式为—-with-extra-charset=CHARSET1,CHARSET2, … 。</p>
<p>　　(2). 编译安装MySQL</p>
<p>　　[root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make</p>
<p>　　[root@FreebsdMaster /softwares/mysql-5.1.30]# /usr/local/bin/make install</p>
<p>　　[root@FreebsdMaster /softwares/ mysql-5.1.30]# /usr/local/bin/make clean</p>
<p>　　注意一定要按绝对路径调用GNU C编译器，否则编译过程报错退出。</p>
<p>　　(3). 为系统添加mysql用户组和用户</p>
<p>　　[root@FreebsdMaster /]# pw group add mysql</p>
<p>　　[root@FreebsdMaster /]# adduser</p>
<p>　　FreeBSD系统没有groupadd命令，其添加用户组的命令是pw，添加用户命令adduser按系统提示操作即可完成。当然用 pw user add mysql命令也可以完成添加用户mysql的功能，但不如adduser命令功能完善。</p>
<p>　　(4). 更改/app/mysql5目录及文件属性</p>
<p>　　[root@FreebsdMaster /app]# chmod –R mysql mysql5</p>
<p>　　[root@FreebsdMaster /app]# chgrp –R mysql mysql5</p>
<p>　　说明：/app/mysql5为MySQL数据库系统所在目录，如果用户部署的应用系统数据量极大，可以将数据库系统目录设在大容量磁盘阵列上。磁盘阵列设置与具体机器硬件相关性很大，具体操作设置参考具体硬件系统说明和FreeBSD操作手册。不借助第三方软件，FreeBSD 7.0-Release系统可以配置RAID0、RAID1磁盘阵列。</p>
<p>　　(5). 安装MySQL系统初始数据库</p>
<p>　　[root@FreebsdMaster /softwares/ mysql-5.1.30]# ./scripts/mysql_install_db.sh &#8211;basedir=/app/mysql5 –-data-dir=/app/mysql5/data</p>
<p>　　注意：必须考虑Unix系统的文件权限特性，首先给mysql_install_db.sh脚本添加可执行属性，否则安装脚本无法执行。执行chmod +x ./scripts/mysql_install_db.sh命令即可。参数&#8211;basedir=/app/mysql5和&#8211;datadir=/app /msyql5/data为必加参数，否则脚本运行报错退出，无法安装系统初始数据库mysql和测试数据库test，mysql数据库包含系统权限设置表，没有这些表数据库服务进程mysqld将无法启动。</p>
<p>　　(6). 再次更改/app/mysql5目录及其文件属性</p>
<p>　　[root@FreebsdMaster /app]# chmod –R root mysql5<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
　　[root@FreebsdMaster /app]# chmod –R mysql mysql5/data</p>
<p>　　这样做是为了保证系统安全，防止通过MySQL系统漏洞的入侵行为。MySQL以mysql用户身份运行，对/data目录具有完全访问权限，对其它目录则只有系统管理员根据需要设置的访问权限，确保FreeBSD系统的安全。这里需要特别提醒用户注意的是要确保mysqld文件(MySQL的守护进程，位于/app/mysql5/libexec目录下)没有设置setuid标志位，如果设置了该标志位，入侵者对其它文件就具有其不应有的权限。具体原因参考关于Unix系统安全的手册，本文对这个问题不再赘述。</p>
<p>　　(7). 启动MySQL服务器</p>
<p>　　上述操作全部完成以后，输入如下命令启动MySQL数据库服务守护进程：</p>
<p>　　[root@FreebsdMaster /]# /app/mysql5/bin/mysqld_safe –user=mysql &#038;</p>
<p>　　&#8211;user参数表示以mysql用户身份运行MySQL数据库服务守护进程，“&#038;”符号表示以后台方式运行。输入 netstat –an|grep 3306命令，如果看到下面的输出则表示MySQL5.1.30已在用户系统上编译安装成功。其中，3306是MySQL数据库系统默认的监听端口号。</p>
<p>　　[root@FreebsdMaster /]# netstat –an|grep 3306</p>
<p>　　tcp4 0 0 *.3306 *.* LISTEN</p>
<p>　　按照同样方法与步骤在其它三台机器上安装FreeBSD 7.0-Release与MySQL5.1.30，为下面的MySQL服务器集群配置准备好系统平台基础。</p>
<p>　3.2 系统配置</p>
<p>　　所有系统安装完毕之后，需要对它们做一些必要的配置方可按照用户预先设计的结构模型实现具有负载均衡功能的MySQL服务器集群。</p>
<p>　　3.2.1 FreeBSD操作系统配置</p>
<p>　　(1). 调整内核参数，优化操作系统性能</p>
<p>　　因为是处于生产环境的服务器，投入正常运行之前一定要对内核参数进行必要的调整，提升系统性能，加强稳定性。简要说就是去掉不必要的硬件支持选项，使新内核占用更少的内存，加快启动速度。不同机器硬件系统差异很大，用户可根据具体系统的硬件情况不断调整试验，最终定制出最优化、最安全的FreeBSD系统。一定要屏蔽掉组合键Ctrl+Alt+Del的热重启功能，防止用户误按Ctrl+Alt+Del重启系统，引起数据库系统服务意外中断。在内核配置文件如MYKERNEL中加入：</p>
<p>　　options SC_DISABLE_REBOOT</p>
<p>　　重新编译系统内核，重启后即可屏蔽Ctrl+Alt+Del组合键的热重启功能。如何定制新内核及重新编译FreeBSD系统，用于可参考FreeBSD系统手册，此不赘述。</p>
<p>　　(2). 进行其它设置，增强系统安全性</p>
<p>　　用户可根据以下一般安全准则设置自己的FreeBSD系统。</p>
<p>　　·选择一个好的密码并予以妥善保护。</p>
<p>　　·对于敏感文件采用适当安全等级的加密算法进行加密。对于敏感级别不是很高的文件采用系统自带的crypt工具加密;对于敏感度极高的文件则使用专用加密工具，如PGP、GPG进行不对称加密，提高加密文件的防攻击能力。</p>
<p>　　·仔细设置文件访问权限，达到保护文件目的。</p>
<p>　　·保护好自己的.profile文件。恰当设置.profile文件的访问权限，确保只有自己能访问。</p>
<p>　　·仔细维护已设置setuid或setgid标志位的任何程序。</p>
<p>　　·禁止不加防范地离开已注册终端。任何时候都必须按常规正常退出系统，先执行clear清屏命令，防止其它用户看到操作痕迹，再执行exit命令退出终端。</p>
<p>　　·防范特洛伊木马程序。正确设置PATH变量的检索顺序，确保系统目录位于当前目录的前面。</p>
<p>　　·防范病毒的入侵。</p>
<p>　　·监控最近一次注册时间，确保没有他人盗用自己的帐号。</p>
<p>　　特别提示：对于生产环境的服务器，一定要保证服务器的物理安全，安全措施再完善的系统，一旦被入侵者物理接触，所有的安全措施将形同虚设!</p>
<p>　　Unix系统安全是一个很大的课题，本文只是提及了一些最肤浅的常识，具体内容用户可以参考相关书籍或网上资源。为确保Unix系统的配置具有高度的安全性，可以使用Internet安全中心(Center for Internet Security，CIS)提供的安全测试工具Benchmarks或评估工具Scoring Tools，检验和监控系统配置的安全性 [4]。</p>
<p>　　3.2.2 MySQL数据库系统配置</p>
<p>　　为了能使上述系统实现一对多的主从复制(replication)和冗余机制，还需要对以上四个MySQL服务器进行一些必要的配置。</p>
<p>　　(1). 配置主机名和IP地址</p>
<p>　　本实现方案中把MySQL服务器Master主机名设为FreebsdMaster，IP地址配置为192.168.1.100，其它三台Slave依次设为 FreebsdSlave1，192.168.1.101;FreebsdSlave2，192.168.1.102;FreebsdSlave3，IP 地址192.168.1.103。</p>
<p>　　(2). 设置root用户密码</p>
<p>　　MySQL的root用户初始密码为空，为保证系统安全必须为root用户设置密码：</p>
<p>　　[root@FreebsdMaster /]# /app/mysql5/bin/mysql –uroot –p</p>
<p>　　Enter password:</p>
<p>　　mysql>SET PASSWORD=PASSWORD(‘secret’);</p>
<p>　　同Unix系统一样，输入密码时屏幕没有任何回显，进入系统后执行SET PASSWORD SQL语句设置或修改MySQL root用户密码。为使应用系统服务器远程连接到MySQL数据库服务器，除本地root用户以外，还要设置一个能从用户内部网络其它终端登录的root 用户。具体操作如下：</p>
<p>　　mysql>USE mysql;</p>
<p>　　mysql>UPDATE user SET Host=’%’ WHERE Host=’hostname.yourdomain’ AND User=’root’;</p>
<p>　　mysql>flush privileges;</p>
<p>　　完成上述操作后应用系统服务器就可以连接到MySQL数据库服务器进行各种操作了，这个远程root用户的初始密码为空，用户需要从远程终端登录，为其设置密码。</p>
<p>　　(3). 开启MySQL服务器的二进制更新日志功能</p>
<p>　　上述MySQL服务器安装完成后，安装程序没有生成my.cnf配置文件，为此用户需要手工添加/etc/my.cnf文件。MySQL服务是由 /app/myql5/libexec/mysqld提供的，其寻找my.cnf配置文件的默认顺序为/etc/my.cnf，~/.my.cnf， /usr/local/mysql/etc/my.cnf。启动ee编辑器，# ee /etc/my.cnf，在Master机器的配置文件写入如下内容：</p>
<p>　　[mysqld]</p>
<p>　　log-bin=mysql-master-bin</p>
<p>　　server-id=1</p>
<p>　　在其它三台Slave机器的配置文件/etc/my.cnf文件写入如下内容：</p>
<p>　　[mysqld]</p>
<p>　　server-id=int</p>
<p>　　其中，int为一大于1且互不相等的正整数，如2，3，4等。务必要正确设置每个机器上的/etc/my.cnf配置文件，尤其是server-id不能有重复，这是一对多数据库复制能否成功的关键[5]!</p>
<p>　　设定好上述/etc/my.cnf文件后启动Master上的MySQL数据库服务时就自动开启了二进制更新日志功能。在Slave上启动MySQL时要加上&#8211;log-bin参数，即可开启二进制更新日志功能。在Slave机器上启动MySQL服务的命令如下：</p>
<p>　　# /app/mysql5/bin/mysqld_safe &#8211;user=mysql &#8211;log-bin &#038;</p>
<p>　　这样做的目的为了实现冗余容错功能。当主服务器Master出现故障停止服务时，在预转换角色成为Master的Slave上执行STOP SLAVE; RESET MASTER SQL语句，在其它两台Slave上执行CHANGE MASTER TO SQL语句，执行STOP SLAVE; RESET MASTER SQL语句的Slave服务器即转换成新的Master，其余两台机器则从新的Master复制数据库数据(复制的是更新UPDATE、INSERT等操作，并不是简单的copy)，从而实现冗余容错。</p>
<p>　3.3 系统实现</p>
<p>　　完成上述准备后可以开始实现MySQL数据库的一对多复制，对应用系统的数据库访问代码进行优化，使更新操作UPDATE、INSERT等SQL语句定向到Master服务器，查询检索SELECT语句定向到Slave服务器，从而实现负载均衡; 当主服务器Master出现故障停止服务时，通过服务器角色转换实现冗余容错;上述所有服务器通过高速核心交换机连接在一起，协同工作，提供集群 (Cluster)性能。下面，本文就此举一简例，具体说明实现(Implementation)步骤。</p>
<p>　　3.3.1 准备主服务器</p>
<p>　　(1). 在主服务器上创建示例数据库repl_db</p>
<p>　　从本地或远程终端登录到Master服务器，执行CREATE DATABASE repl_db;语句，创建示例数据库repl_db。建立表repl_table：</p>
<p>　　mysql>CREATE TABLE repl_table (f1 INT, f2 VARCHAR(20)) ;</p>
<p>　　向表中添加数据：</p>
<p>　　mysql>INSERT INTO repl_table (f1, f2) VALUES(1, ‘first’);</p>
<p>　　(2). 授予Slave复制(Replication)权限</p>
<p>　　授予从属服务器Slave进行复制的权限。假设从属服务器连接到主服务器复制的用户名为“repl”，密码为“g00r002b”：</p>
<p>　　mysql>GRANT REPLICATION SLAVE ON *.* TO repl@’%’ IDENTIFIED BY ‘g00r002b’;</p>
<p>　　刷新系统权限表，锁定写入语句操作：</p>
<p>　　mysql>FLUSH TABLES WITH READ LOCK;</p>
<p>　　这时所有写入操作都被锁定，包括支持事务(Transaction)特性的InnoDB类型表的提交(COMMIT)操作也被锁定，为数据库初始复制(copy)做好准备。</p>
<p>　　(3). 简单备份repl_db</p>
<p>　　在此，通过tar命令把数据库初始数据备份到/tmp目录。</p>
<p>　　# tar –cvf /tmp/mysql-data.tar /app/mysql5/data/repl_db</p>
<p>　　(4). 记录主服务器状态</p>
<p>　　执行SHOW MASTER STATUS 语句：</p>
<p>　　mysql> SHOW MASTER STATUS;</p>
<p>　　&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>　　| File | Position | Binlog_Do_DB | Binlog_Ignore_DB |</p>
<p>　　+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;+</p>
<p>　　| mysql-master-bin.000001 | 1027 | | |</p>
<p>　　+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+</p>
<p>　　记下File和Position两个参数的值，从属服务器Slave为了复制(replication)连接到主服务器Master时要用到这两个参数，如果参数与此不符将导致复制(replication)失败!</p>
<p>　　(5). 释放主服务器表级写入锁定</p>
<p>　　mysql>UNLOCK TABLES;</p>
<p>　　至此，主服务器解除写入锁定，一对多复制准备工作已全部完成，准备接受Slave的复制(replication)连接。</p>
<p>　　3.3.2 准备从属服务器</p>
<p>　　(1). 停止从属服务器的MySQL数据库服务</p>
<p>　　# /app/mysql5/bin/mysqladmin –uroot –p shutdown</p>
<p>　　Enter password:</p>
<p>　　输入MySQL系统root用户密码，MySQL服务停止。</p>
<p>　　(2). 简单copy数据库初始数据</p>
<p>　　在从属服务器上执行ftp操作，访问主服务器，下载/tmp/mysql-data.tar文件，在/app/mysql5/data目录下执行如下操作，把初始数据copy到Slave服务器：</p>
<p>　　[root@FreebsdSlave1 /app/mysql5/data]# tar –xvf /tmp/msyql-data.tar</p>
<p>　　其它两台Slave服务器执行同样操作，实现数据库初始数据的简单copy。</p>
<p>　　(3). 重启从属服务器上的MySQL数据库服务</p>
<p>　　# /app/mysql5/bin/mysqld_safe –-user=mysql –-log-bin &#038;</p>
<p>　　从属服务器已启动，同时启动二进制更新日志功能，为角色转换做好准备。</p>
<p>　　(4). 登录到从属服务器Slave的MySQL客户端</p>
<p>　　# /app/mysql/bin/msyql –uroot -p</p>
<p>　　(5). 启动从属服务器上的复制(replication)线程</p>
<p>　　mysql> CHANGE MASTER TO</p>
<p>　　-> MASTER_HOST=&#8217;192.168.1.100&#8242;,</p>
<p>　　-> MASTER_USER=&#8217;repl&#8217;,</p>
<p>　　-> MASTER_PASSWORD=&#8217;g00r002b&#8217;,</p>
<p>　　-> MASTER_LOG_FILE=&#8217; mysql-master-bin.000001&#8242;,</p>
<p>　　-> MASTER_LOG_POS=1027;</p>
<p>　　Query OK, 0 rows affected (0.00 sec)</p>
<p>　　mysql> START SLAVE;</p>
<p>　　Query OK, 0 rows affected (0.00 sec)</p>
<p>　　在所有从属服务器上执行相同的操作，自此从属服务器已连接到主服务器，开始真正意义上的replication工作。测试从属服务器的复制工作是否正常：</p>
<p>　　mysql>show slave status\G</p>
<p>　　************************** 1. row ***************************</p>
<p>　　Slave_IO_State: Waiting for master to send event</p>
<p>　　Master_Host: 192.168.1.100</p>
<p>　　Master_User: repl</p>
<p>　　Master_Port: 3306</p>
<p>　　Connect_Retry: 60</p>
<p>　　Master_Log_File: mysql-master-bin.000001</p>
<p>　　Read_Master_Log_Pos: 1027</p>
<p>　　Relay_Log_File: FreebsdSlave1-relay-bin.000005</p>
<p>　　Relay_Log_Pos: 251</p>
<p>　　Relay_Master_Log_File: mysql-master-bin.000001</p>
<p>　　Slave_IO_Running: Yes</p>
<p>　　Slave_SQL_Running: Yes</p>
<p>　　看到上述信息说明从属服务器已启动了与replication相关的线程I/O和SQL，一对多的replication已经开始工作。</p>
<p>　　(6). 功能测试</p>
<p>　　在主服务器上写入新的数据：</p>
<p>　　mysql>INSERT INTO repl_table (f1, f2) VALUES(2, ‘second’);</p>
<p>　　mysql>SELECT * FROM repl_table;</p>
<p>　　+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;+</p>
<p>　　| f1 | f2 |</p>
<p>　　+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+</p>
<p>　　| 1 | first |</p>
<p>　　| 2 | second |</p>
<p>　　+&#8212;&#8211;=&#8211;+&#8212;&#8212;&#8212;-+</p>
<p>　　2 rows in set (0.01 sec)</p>
<p>　　在Slave上执行相同的查询操作：</p>
<p>　　mysql>SELECT * FROM repl_table;</p>
<p>　　+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;+</p>
<p>　　| f1 | f2 |</p>
<p>　　+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+</p>
<p>　　| 1 | first |</p>
<p>　　| 2 | second |</p>
<p>　　+&#8212;&#8212;&#8211;+&#8212;&#8212;&#8212;-+</p>
<p>　　2 rows in set (0.01 sec)</p>
<p>　　得到相同的查询结果，说明复制(replication)机制已成功开始工作!</p>
<p>　　3.3.3 配置网络DNS服务器</p>
<p>　　在BIND DNS服务器中，为上述三台从属服务器Slave配置同一个名字，客户端的查询检索操作将由DNS服务器定向到其中的一台Slave。因此，对于同一名字，不同的客户端会定向到不同的地址，访问不同的MySQL服务器，从而达到负载均衡的目的。假设用户为三台Slave分配的DNS名字为 mysqlslave.yourdomain，DNS服务器区域文件/var/named/yourdomain.zone中应包含如下数据项[6]：</p>
<p>　　sqlmaster.yourdomain. IN A 192.168.1.100</p>
<p>　　sqlslave1.yourdomain. IN A 192.168.1.101</p>
<p>　　sqlslave2.yourdomain. IN A 192.168.1.102</p>
<p>　　sqlslave3.yourdomain. IN A 192.168.1.103</p>
<p>　　sqlslave IN CNAME sqlslave1</p>
<p>　　sqlslave IN CNAME sqlslave2</p>
<p>　　sqlslave IN CNAME sqlslave3</p>
<p>　　当客户端进行查询操作时，提交给主机sqlslave.yourdomain的请求将由DNS服务器随机定向到三台Slave中的一台，由其执行查询作业，返回结果。从而在三台Slave之间实现查询级别的负载均衡。</p>
<p>　　3.3.4 应用系统程序代码优化</p>
<p>　　实际应用中，对数据库的写入操作相对查询操作少得多，因此，优化应用程序的数据库连接代码，把写入操作定向到Master服务器，查询操作定向到 Slave服务器，提供主服务器和从属服务器之间更新、查询的负载均衡功能。本文以PHP数据库连接代码为例，简要介绍代码优化方法[7]。</p>
<p>　　(1). 准备不同的数据库连接配置文件</p>
<p>　　准备两个数据库连接文件mysql_connect_master.php和mysql_connect_slave.php，其文件内容如下：</p>
<p>　　mysql_connect_master.php文件的内容：</p>
<p>　　</p>
<p>　　// Connect to the Database Server</p>
<p>　　$linkID = @mysql_connect(&#8220;sqlmaster.yourdomain&#8221;, &#8220;user&#8221;, &#8220;password&#8221;) or die(&#8220;Sorry, could not connect to the database!&#8221;);</p>
<p>　　// Select the Database</p>
<p>　　@mysql_select_db(&#8220;repl_db&#8221;) or die(&#8220;Sorry, Could not select database!&#8221;);</p>
<p>　　?></p>
<p>　　mysql_connect_slave.php文件的内容：</p>
<p>　　</p>
<p>　　// Connect to the Database Server</p>
<p>　　$linkID = @mysql_connect(&#8220;sqlslave.yourdomain&#8221;, &#8220;user&#8221;, &#8220;password&#8221;) or die(&#8220;Sorry, could not connect to the database!&#8221;);</p>
<p>　　// Select the Database</p>
<p>　　@mysql_select_db(&#8220;repl_db&#8221;) or die(&#8220;Sorry, Could not select database!&#8221;);</p>
<p>　　?><br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
　　(2). 优化程序SQL语句代码</p>
<p>　　对应用程序中访问数据库的代码段做出如下优化：</p>
<p>　　</p>
<p>　　&#8230;</p>
<p>　　// $sql is the query string to be committed to MySQL server.</p>
<p>　　if ( stripos( $sql, &#8221; SELECT&#8221; ) )</p>
<p>　　{</p>
<p>　　include_once(&#8220;./mysql_connect_slave.php&#8221;);</p>
<p>　　&#8230;</p>
<p>　　mysql_close();</p>
<p>　　}</p>
<p>　　else</p>
<p>　　{</p>
<p>　　include_once(&#8220;./mysql_connect_master.php&#8221;);</p>
<p>　　&#8230;</p>
<p>　　mysql_close();</p>
<p>　　}</p>
<p>　　&#8230;</p>
<p>　　?></p>
<p>　　说明：每当向MySQL服务器提交数据库操作时，加入一个if-else判断语句对变量$sql进行判断定向，如果是SELECT查询操作，将其定向到从属服务器Slave中的一个;如果是其它更新语句，则将其定向到主服务器Master。此处代码段是应用系统实现负载均衡的关键，用户务必根据自己实际情况，写出准确无误的代码。每次对数据库操作完毕都要及时释放数据库连接，以免更新、查询操作分别定向失败，影响系统负载均衡功能。这样做虽然在一定程度上增加Web服务器或应用服务器的开销，但与MySQL服务器集群负载均衡功能带来的大幅性能提升及冗余容错特性相比，这个开销绝对是物超所值!</p>
<p>　　3.4 注意事项</p>
<p>　　正确部署实现具有负载均衡功能的MySQL服务器集群必须注意以下事项：</p>
<p>　　(1). MySQL数据库复制(replication)特性是核心</p>
<p>　　此处的复制不是简单的copy，从属服务器启动两个线程(thread)：I/O线程和SQL线程，I/O线程接收主服务器对参与复制数据库的更新操作事件(event)，并记入自己的中继二进制更新日志文件(hostname-relay-bin.00000n)，由SQL线程将更新操作写入自己的数据库表项。主从服务器之间复制的不是具体的数据内容，而是具体的以二进制格式记录的操作事件，因而在一定程度上实现主从服务器之间的数据同步。(这种复制类似于生物学意义上的按基因复制，在英语中replication的主要词义就是指该种复制。)</p>
<p>　　(2). 复制的复杂性</p>
<p>　　主从数据库服务器间的replication要求Master与Slave上的MySQL版本最好一致，主从服务器必须设置相同的字符集，否则很容易造成复制失败。主服务器上更新权限表内容的FLUSH语句不会被复制[8]。</p>
<p>　　(3). 按照范式化要求设计数据库</p>
<p>　　生产环境下基于MySQL服务器的应用系统要想稳定运行，按范式化设计系统数据库是基本要求，具体内容可参考相关书籍。</p>
<p>　　(4). 打开数据库服务器的远程用户连接功能</p>
<p>　　打开主从服务器的远程用户连接是实现更新、查询操作分别定向的必要条件，否则，来自应用服务器的连接请求失败，影响系统应用正常运行。</p>
<p>　　(5). 负载均衡功能的实现需要良好的团队合作</p>
<p>　　BIND DNS服务器实现了从属服务器Slave之间的负载均衡，Slave和Master之间的负载均衡则由应用系统开发人员在程序代码级实现。整个系统的性能提升和冗余容错需要网络管理和应用系统开发团队之间的良好合作，否则负载均衡功能的实现就会失败。</p>
<p>4. 常见问题</p>
<p>　　(1). 如何估算MySQL服务器集群的性能提升量?</p>
<p>　　针对本文采用的结构模式，可对应用系统整体性能提升做出大致估算。假设应用系统写操作占10%，读操作占90%，写操作耗时是读操作的2倍，系统的吞吐量(throughput)为T(用reads/s读操作次数/秒来衡量)。把写操作线性转换为读操作，则有：</p>
<p>　　T= 2Xwrites + 9Xwrites ==>writes=T/11① (不采用主从复制模式，读写操作集中到一个服务器上)</p>
<p>　　T= 2Xwrites + 9Xwrites/N ==> writes=T/(2+9/N)② (采用一对多的主从复制模式，读操作在从属服务器，写操作在主服务器)</p>
<p>　　其中，writes为系统单位时间内所能承受的最大写操作次数，N为从属服务器个数，N大于等于2。在不采用主从复制模式时，系统性能 writes=T/11;采用本文一对三的复制模式时，系统性能writes=T/5。采用负载均衡模式与不采用系统性能之比为11：5，即2.2：1，考虑到应用服务器的额外开销，系统整体性能提升了整整1倍!从②式可以看出，系统整体性能理论极限为T/2，当然在实际生产环境中不可能达到。具体部署时用户可以根据自己的实际情况估算出合理的从属服务器数量，主要影响因素是网络带宽和机器整体性能[9]。</p>
<p>　　(2). 如何应对主从服务器崩溃?</p>
<p>　　当某台从属服务器崩溃时，修复故障重启后重新连接到主服务器，根据其master.info文件更新其数据，保持与主服务器的数据同步。如果主服务器崩溃，在某一从属服务器上执行STOP SLAVES; GRANT REPLICATION SLAVE ON *.* repl_db TO ‘repl’@’%’ IDENTIFIED BY ‘g00r002b’;RESET MASTER;这三个SQL语句，由于从属服务器已启动了二进制更新日志功能，因此具备了角色转换的必要条件。更改其主机名、IP地址及server- id与Master一样，重启MySQL服务器，系统开始正常对外提供服务。其它两台从属服务器则不需执行任何操作，继续执行replication过程。BIND DNS服务器和应用程序也不需做任何调整，继续对系统用户提供不间断服务。主服务器排除故障恢复正常后，将其网络配置改为与现有Master转换角色之前一样的配置，重启MySQL服务，将其角色转换为从属服务器。也就是说，整个集群机器的角色可以相互循环转换，提高系统的冗余性和可靠性。在此需要注意的是，在应用系统调试运行正常之后，在Slave角色服务器的/etc/my.cnf文件[mysqld]段加入slave-skip- errors=all，保证集群之间复制(replication)的正常运行。</p>
<p>　　5. 结束语</p>
<p>　　部署与实现具有负载均衡功能的MySQL服务器集群是一项复杂的系统工程，需要多方面良好的协同合作才能做好。服务器的搭建配置、BIND DNS服务器的配置部署，以及应用系统程序的开发都要紧紧围绕实现MySQL服务器集群负载均衡功能这个目标。必须对主服务器的运行状态进行动态监控，如果发生故障，立即执行角色转换过程，确保为终端用户提供可靠、不间断的服务。可以针对具体系统环境写出监控脚本或程序，确保系统的可靠性与稳定性。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/1134.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to install LAMP (Apache, PHP and MySQL in Linux) using Yum</title>
		<link>http://www.evanjiang.net.cn/archives/868.html</link>
		<comments>http://www.evanjiang.net.cn/archives/868.html#comments</comments>
		<pubDate>Sun, 05 Apr 2009 13:19:58 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[redhat linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[lamp yum install]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=868</guid>
		<description><![CDATA[<p>Many friends ask me how to install LAMP (Linux, apache, php, mysql). There are many ways to install LAMP. Here i teach you the most easiest way to install LAMP using yum program in CentOS.
Below are the steps to install LAMP (Apache, PHP and MySQL in Linux) using Yum:-</p>
<p>•	Go to CentOS and download a copy [...]]]></description>
			<content:encoded><![CDATA[<p>Many friends ask me how to install LAMP (Linux, apache, php, mysql). There are many ways to install LAMP. Here i teach you the most easiest way to install LAMP using yum program in CentOS.<br />
Below are the steps to install LAMP (Apache, PHP and MySQL in Linux) using Yum:-</p>
<p>•	Go to CentOS and download a copy of CentOS Linux and install it (i’ll not go thru the how to install CentOS with you here)<br />
•	Once your CentOS is installed. Open a terminal (if you are using X-Window), and type yum install httpd and follow on screen instruction to install apache web server<br />
•	Once apache web server has been installed, type yum install php<br />
•	Once PHP installed successfully, type yum install mysql-servermysql<br />
•	Once everything finish, type service httpd start to start your apache web server, screen will show you if web server service successfully started<br />
•	type service mysqld start to start your mysql server<br />
•	Once both services is running, you can point your browser to http://localhost and you should see a welcome page from CentOS<br />
•	If you see that welcome page, you just installed everything successfull.<br />
•	To test if php is running, go to /var/www/html and create anindex.php file with the content below<br />
<?php phpinfo(); ?><br />
and refresh your browser again. If you see a purple PHP information page showing all the php configuration variables, then php is running now.<br />
•	Congratulation, you just successfully installed LAMP in your machine.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/868.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>今天解决 discuz7.0打开不正常并报错1146的问题。</title>
		<link>http://www.evanjiang.net.cn/archives/834.html</link>
		<comments>http://www.evanjiang.net.cn/archives/834.html#comments</comments>
		<pubDate>Thu, 19 Mar 2009 11:39:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[It Tips]]></category>
		<category><![CDATA[freebsd unix]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[discuz7.0 Errno.: 1146 错误]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=834</guid>
		<description><![CDATA[<p>今天，因研习代码需要，需要安装搭建一个uchome环境，于是，就在http://www.dicuz.net里的下载频道下载uchome安装包。俺图方便，不要再过多时间去处理环境的问题，就直接下载UCenter1.5.0/UCenter Home1.5/Discuz! 7.0 集成安装包下载 ，下得是这个版本：简体中文GBK（UC1.5_UCH1.5_DZ7.0_SC_GBK.zip）不知为什么，下载好几个版本，在ubuntu 用unzip -x 来解压，总是报错。无法正确解压，俺以为是版本的问题，就在google搜了搜，搜到chinaz.com也有下载，就下载china.com所提供的集成安装包，在ubuntu 下直接解压。还是报错。真是奇怪。俺想是不是操作平台的缘故。就切换系统到winxp ,在winxp 下解压同样的集成安装包，发现一点问题都没有，很顺利，真是奇怪。难道是ubuntu8.10的问题？俺不管，就在winxp 直接传到服务器空间，然后安装这集成安装包，设文件权限那不用说，在mysql数据库后台建表，建账号，也不用说。做完这些后，就直接安装这集成安装包，安装时，很顺利，输入数据库名，账户，密码，然后切换到下一个页面，继续安装，很快就安装完，安装很顺利，没任何报错。安装完，就删掉整个install目录，然后进入uchome 首页，随便点击一下，没报错，但点击到discuz时。也就是尝试訪問bbs时，就报以下错误：
Discuz! info: MySQL Query Error</p>
<p>Time: 2009-3-19 10:54am
Script: /uchome/bbs/index.php</p>
<p>SQL: SELECT type FROM [Table]usergroups WHERE groupid=&#8217;7&#8242;
Error: Table &#8216;uchome.[Table]usergroups&#8217; doesn&#8217;t exist
Errno.: 1146</p>
<p>Similar error report has beed dispatched to administrator before.</p>
<p>到 http://faq.comsenz.com 搜索此错误的解决方案</p>
<p>凭直觉与经验，俺是认为discuz7.0所用的表损坏或者建立不正确，但为何不正确，并且因什么情况不正确，但与无法知道，但现在要解决DISCUZ7.0报错的问题，就只能死马当活马医！俺打开mysql后台数据库，发觉discuz7.0所在bbs表好像没什么异常，但报错信息，是明确说有表损坏或者不存在。那只能重建discuz7.0有关的表。那俺找到bbs 所在目录下面的discuz.sql, 打开discuz.sql，将里面的建表语句，复制，然后直接在phpmyadmin 里运行。运行没提示报错。这就说明sql运行正确。 那俺再刷新，提示cache没建好，需要再次刷新。那俺再刷新。再打开，终于可以正常看到discuz7的首页面。最后，这个问题得以解决。</p>
<p>事后，总结一上这个问题，是集成包没弄好？，还是什么原因？。为什么系统集成包的安装过程会没有正常运转discuz.sql这个建表语句。</p>
]]></description>
			<content:encoded><![CDATA[<p>今天，因研习代码需要，需要安装搭建一个uchome环境，于是，就在http://www.dicuz.net里的下载频道下载uchome安装包。俺图方便，不要再过多时间去处理环境的问题，就直接下载UCenter1.5.0/UCenter Home1.5/Discuz! 7.0 集成安装包下载 ，下得是这个版本：简体中文GBK（UC1.5_UCH1.5_DZ7.0_SC_GBK.zip）不知为什么，下载好几个版本，在ubuntu 用unzip -x 来解压，总是报错。无法正确解压，俺以为是版本的问题，就在google搜了搜，搜到chinaz.com也有下载，就下载china.com所提供的集成安装包，在ubuntu 下直接解压。还是报错。真是奇怪。俺想是不是操作平台的缘故。就切换系统到winxp ,在winxp 下解压同样的集成安装包，发现一点问题都没有，很顺利，真是奇怪。难道是ubuntu8.10的问题？俺不管，就在winxp 直接传到服务器空间，然后安装这集成安装包，设文件权限那不用说，在mysql数据库后台建表，建账号，也不用说。做完这些后，就直接安装这集成安装包，安装时，很顺利，输入数据库名，账户，密码，然后切换到下一个页面，继续安装，很快就安装完，安装很顺利，没任何报错。安装完，就删掉整个install目录，然后进入uchome 首页，随便点击一下，没报错，但点击到discuz时。也就是尝试訪問bbs时，就报以下错误：<br />
Discuz! info: MySQL Query Error</p>
<p>Time: 2009-3-19 10:54am<br />
Script: /uchome/bbs/index.php</p>
<p>SQL: SELECT type FROM [Table]usergroups WHERE groupid=&#8217;7&#8242;<br />
Error: Table &#8216;uchome.[Table]usergroups&#8217; doesn&#8217;t exist<br />
Errno.: 1146</p>
<p>Similar error report has beed dispatched to administrator before.</p>
<p>到 http://faq.comsenz.com 搜索此错误的解决方案</p>
<p>凭直觉与经验，俺是认为discuz7.0所用的表损坏或者建立不正确，但为何不正确，并且因什么情况不正确，但与无法知道，但现在要解决DISCUZ7.0报错的问题，就只能死马当活马医！俺打开mysql后台数据库，发觉discuz7.0所在bbs表好像没什么异常，但报错信息，是明确说有表损坏或者不存在。那只能重建discuz7.0有关的表。那俺找到bbs 所在目录下面的discuz.sql, 打开discuz.sql，将里面的建表语句，复制，然后直接在phpmyadmin 里运行。运行没提示报错。这就说明sql运行正确。 那俺再刷新，提示cache没建好，需要再次刷新。那俺再刷新。再打开，终于可以正常看到discuz7的首页面。最后，这个问题得以解决。</p>
<p>事后，总结一上这个问题，是集成包没弄好？，还是什么原因？。为什么系统集成包的安装过程会没有正常运转discuz.sql这个建表语句。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/834.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql命令精华</title>
		<link>http://www.evanjiang.net.cn/archives/795.html</link>
		<comments>http://www.evanjiang.net.cn/archives/795.html#comments</comments>
		<pubDate>Thu, 12 Mar 2009 16:19:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql命令精华]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=795</guid>
		<description><![CDATA[<p>测试环境：mysql 5.0.45
【注：可以在mysql中通过mysql> SELECT VERSION();来查看数据库版本】</p>
<p>一、连接MYSQL。
格式： mysql -h主机地址 -u用户名 －p用户密码
1、连接到本机上的MYSQL。
首先打开DOS窗口，然后进入目录mysql\bin，再键入命令mysql -u root -p，回车后提示你输密码.注意用户名前可以有空格也可以没有空格，但是密码前必须没有空格，否则让你重新输入密码.
如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中，MYSQL的提示符是： mysql>
2、连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为345678。则键入以下命令：
mysql -h110.110.110.110 -u root -p 345678;（注:u与root之间可以不用加空格，其它也一样）
3、退出MYSQL命令： exit （回车）
二、修改密码。
格式：mysqladmin -u用户名 -p旧密码 password 新密码
1、给root加个密码345678。首先在DOS下进入目录mysql\bin，然后键入以下命令
mysqladmin -u root -password 345678
注：因为开始时root没有密码，所以-p旧密码一项就可以省略。</p>
<p>2、再将root的密码改为941340。
mysqladmin -u root -p ab12 password 941340
三、增加新用户。
（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）
格式：grant select on 数据库.* to 用户名@登录主机 identified by “密码”
1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL，然后键入以下命令：
grant select,insert,update,delete on *.* to test1@”%” Identified by “abc”;
但增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为，解决办法见2。

2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），
这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问。
grant select,insert,update,delete on mydb.* to test2@localhost identified [...]]]></description>
			<content:encoded><![CDATA[<p>测试环境：mysql 5.0.45<br />
【注：可以在mysql中通过mysql> SELECT VERSION();来查看数据库版本】</p>
<p>一、连接MYSQL。<br />
格式： mysql -h主机地址 -u用户名 －p用户密码<br />
1、连接到本机上的MYSQL。<br />
首先打开DOS窗口，然后进入目录mysql\bin，再键入命令mysql -u root -p，回车后提示你输密码.注意用户名前可以有空格也可以没有空格，但是密码前必须没有空格，否则让你重新输入密码.<br />
如果刚安装好MYSQL，超级用户root是没有密码的，故直接回车即可进入到MYSQL中，MYSQL的提示符是： mysql><br />
2、连接到远程主机上的MYSQL。假设远程主机的IP为：110.110.110.110，用户名为root,密码为345678。则键入以下命令：<br />
mysql -h110.110.110.110 -u root -p 345678;（注:u与root之间可以不用加空格，其它也一样）<br />
3、退出MYSQL命令： exit （回车）<br />
二、修改密码。<br />
格式：mysqladmin -u用户名 -p旧密码 password 新密码<br />
1、给root加个密码345678。首先在DOS下进入目录mysql\bin，然后键入以下命令<br />
mysqladmin -u root -password 345678<br />
注：因为开始时root没有密码，所以-p旧密码一项就可以省略。</p>
<p>2、再将root的密码改为941340。<br />
mysqladmin -u root -p ab12 password 941340<br />
三、增加新用户。<br />
（注意：和上面不同，下面的因为是MYSQL环境中的命令，所以后面都带一个分号作为命令结束符）<br />
格式：grant select on 数据库.* to 用户名@登录主机 identified by “密码”<br />
1、增加一个用户test1密码为abc，让他可以在任何主机上登录，并对所有数据库有查询、插入、修改、删除的权限。首先用root用户连入MYSQL，然后键入以下命令：<br />
grant select,insert,update,delete on *.* to test1@”%” Identified by “abc”;<br />
但增加的用户是十分危险的，你想如某个人知道test1的密码，那么他就可以在internet上的任何一台电脑上登录你的mysql数据库并对你的数据可以为所欲为，解决办法见2。<br />
<span id="more-795"></span><br />
2、增加一个用户test2密码为abc,让他只可以在localhost上登录，并可以对数据库mydb进行查询、插入、修改、删除的操作（localhost指本地主机，即MYSQL数据库所在的那台主机），<br />
这样用户即使用知道test2的密码，他也无法从internet上直接访问数据库，只能通过MYSQL主机上的web页来访问。<br />
grant select,insert,update,delete on mydb.* to test2@localhost identified by “abc”;<br />
如果你不想test2有密码，可以再打一个命令将密码消掉。<br />
grant select,insert,update,delete on mydb.* to test2@localhost identified by “”;<br />
下篇是MYSQL中有关数据库方面的操作。注意：你必须首先登录到MYSQL中，以下操作都是在MYSQL的提示符下进行的，而且每个命令以分号结束。</p>
<p>一、操作技巧<br />
1、如果你打命令时，回车后发现忘记加分号，你无须重打一遍命令，只要打个分号回车就可以。<br />
也就是说你可以把一个完整的命令分成几行来打，完后用分号作结束标志就OK。<br />
2、你可以使用光标上下键调出以前的命令。<br />
二、显示命令<br />
1、显示当前数据库服务器中的数据库列表：<br />
mysql> SHOW DATABASES;<br />
注意：mysql库里面有MYSQL的系统信息，我们改密码和新增用户，实际上就是用这个库进行操作。<br />
2、显示数据库中的数据表：<br />
mysql> USE 库名；<br />
mysql> SHOW TABLES;<br />
3、显示数据表的结构：<br />
mysql> DESCRIBE 表名;<br />
4、建立数据库：<br />
mysql> CREATE DATABASE 库名;<br />
5、建立数据表：<br />
mysql> USE 库名;<br />
mysql> CREATE TABLE 表名 (字段名 VARCHAR(20), 字段名 CHAR(1));<br />
6、删除数据库：<br />
mysql> DROP DATABASE 库名;<br />
7、删除数据表：<br />
mysql> DROP TABLE 表名；<br />
8、将表中记录清空：<br />
mysql> DELETE FROM 表名;<br />
9、显示表中的记录：<br />
mysql> SELECT * FROM 表名;<br />
10、往表中插入记录：<br />
mysql> INSERT INTO 表名 VALUES (”hyq”,”M”);<br />
11、更新表中数据：<br />
mysql-> UPDATE 表名 SET 字段名1=’a&#8217;,字段名2=’b’ WHERE 字段名3=’c&#8217;;<br />
12、用文本方式将数据装入数据表中：<br />
mysql> LOAD DATA LOCAL INFILE “D:/mysql.txt” INTO TABLE 表名;<br />
13、导入.sql文件命令：<br />
mysql> USE 数据库名;<br />
mysql> SOURCE d:/mysql.sql;<br />
14、命令行修改root密码：<br />
mysql> UPDATE mysql.user SET password=PASSWORD(’新密码’) WHERE User=’root’;<br />
mysql> FLUSH PRIVILEGES;<br />
15、显示use的数据库名：<br />
mysql> SELECT DATABASE();<br />
16、显示当前的user：<br />
mysql> SELECT USER();<br />
三、一个建库和建表以及插入数据的实例<br />
drop database if exists school; //如果存在SCHOOL则删除<br />
create database school; //建立库SCHOOL<br />
use school; //打开库SCHOOL<br />
create table teacher //建立表TEACHER<br />
(<br />
id int(3) auto_increment not null primary key,<br />
name char(10) not null,<br />
address varchar(50) default ‘深圳’,<br />
year date<br />
); //建表结束<br />
//以下为插入字段<br />
insert into teacher values(”,’allen’,&#8217;大连一中’,&#8217;1976-10-10′);<br />
insert into teacher values(”,’jack’,&#8217;大连二中’,&#8217;1975-12-23′);<br />
如果你在mysql提示符键入上面的命令也可以，但不方便调试。<br />
（1）你可以将以上命令原样写入一个文本文件中，假设为school.sql，然后复制到c:\\下，并在DOS状态进入目录\\mysql\\bin，然后键入以下命令：<br />
mysql -uroot -p密码 < c:\\school.sql<br />
如果成功，空出一行无任何显示；如有错误，会有提示。（以上命令已经调试，你只要将//的注释去掉即可使用）。<br />
（2）或者进入命令行后使用 mysql> source c:\\school.sql; 也可以将school.sql文件导入数据库中。<br />
四、将文本数据转到数据库中<br />
1、文本数据应符合的格式：字段数据之间用tab键隔开，null值用\\n来代替.例：<br />
3 rose 大连二中 1976-10-10<br />
4 mike 大连一中 1975-12-23<br />
假设你把这两组数据存为school.txt文件，放在c盘根目录下。<br />
2、数据传入命令 load data local infile “c:\\school.txt” into table 表名;<br />
注意：你最好将文件复制到\\mysql\\bin目录下，并且要先用use命令打表所在的库。<br />
五、备份数据库：（命令在DOS的\\mysql\\bin目录下执行）<br />
1.导出整个数据库<br />
导出文件默认是存在mysql\bin目录下<br />
mysqldump -u 用户名 -p 数据库名 > 导出的文件名<br />
mysqldump -u user_name -p123456 database_name > outfile_name.sql<br />
2.导出一个表<br />
mysqldump -u 用户名 -p 数据库名 表名> 导出的文件名<br />
mysqldump -u user_name -p database_name table_name > outfile_name.sql<br />
3.导出一个数据库结构<br />
mysqldump -u user_name -p -d –add-drop-table database_name > outfile_name.sql<br />
-d 没有数据 –add-drop-table 在每个create语句之前增加一个drop table<br />
4.带语言参数导出<br />
mysqldump -uroot -p –default-character-set=latin1 –set-charset=gbk –skip-opt database_name > outfile_name.sql</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/795.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>centos下安装jdk15+ MySQL5+Apache22(worker+ssl)+PHP5+Resin3</title>
		<link>http://www.evanjiang.net.cn/archives/759.html</link>
		<comments>http://www.evanjiang.net.cn/archives/759.html#comments</comments>
		<pubDate>Fri, 06 Mar 2009 11:02:52 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[It Tips]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[redhat linux]]></category>
		<category><![CDATA[resin]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[centos下安装jdk15+ MySQL5+Apache22(worker+ssl)+PHP5+Resin3]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=759</guid>
		<description><![CDATA[<p>系统：CentOS4.3</p>
<p>1、安装jdk1.5
修改jdk-1_5_0_07-linux-i586.bin为可执行：
#./jdk-1_5_0_07-linux-i586.bin进行安装，然后会在当前目录下解压，生成一个名为 jdk-1_5_0_07的目录
#mv jdk-1_5_0_07 /usr/local/jdk
安装ok后设置环境变量：
修改/etc/profile
增加如下内容：
JAVA_HOME=/usr/local/jdk
RESIN_HOME=/usr/local/resin
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$RESIN_HOME/lib:/usr/local/jdbc
export RESIN_HOME JAVA_HOME CLASSPATH
存盘退出。。。
source /etc/profile</p>
<p>2、安装openssl
解压openssl-0.9.8b.tar.gz
#tar zxvf openssl-0.9.8b.tar.gz
#cd openssl-0.9.8b
#./Configure
#make install

接下来安装相关应用软件：
1.MySQL5 </p>
<p>2.安装mysql5.0.18（源码包）
源码包可以在这个网址获得：</p>
<p>http://download.mysql.cn/src/2006/0208/62.html</p>
<p>所有这些操作需要root权限
安装开始：
1&#62;cd /home/ftpsite
2&#62;groupadd mysql&#8212;&#8212;&#8212;-添加mysql用户组,如果提示该组存在,则不用再加
3&#62;useradd -g mysql mysql&#8212;&#8211;加mysql用户,并把它归到mysql组,如果提示用户存在,则不用再加
4&#62;tar zxvf mysql-5.0.18.tar.tar
5&#62;cd mysql-5.0.18
6&#62;./configure &#8211;prefix=/usr/local/mysql
7&#62;make
8&#62;make install
9&#62;cp support-files/my-medium.cnf /etc/my.cnf
10&#62;cd /usr/local/mysql
11&#62;./bin/mysql_install_db
12&#62;chown -R root /usr/local/mysql
13&#62;chown -R mysql /usr/local/mysql/var
14&#62;chgrp -R root /usr/local/mysql
15&#62;./bin/mysqld_saft &#8211;user=mysql &#38;
16&#62;./bin/mysql
17&#62;mysql&#62;&#8212;&#8212;&#8212;&#8212;&#8212;经过第16步,你应该能看到mysql&#62;提示符,那么恭喜你安装初步成功</p>
<p>2.Apache22








下载httpd-2.0.55.tar.gz, php-5.0.5.tar.gz等二进制源码包
执行下列命令解压源码包
# tar -zxvf httpd-2.0.55.tar.gz
进入安装目录
# cd httpd-2.0.55
配置apache安装信息：
#./configure &#8211;enable-layout=Apache &#8211;enable-so &#8211;enable-ssl=shared &#8211;with-mpm=worker &#8211;with-ssl=/usr/share/ssl
执行make安装：
# make; make install
使用/usr/local/apache/bin/apachectl start 启动apache</p>
<p>#/usr/local/sbin/httpd -l
看看是否存在以下几个模块
core.c
worker.c
http_core.c
mod_so.c
现在是使用worker方式运行的apache。</p>
<p>OK，完成。</p>
<p>3.PHP5
安装php
tar -zxvf [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #000000;">系统：CentOS4.3</span></p>
<p><span style="color: #000000;">1、安装jdk1.5<br />
修改jdk-1_5_0_07-linux-i586.bin为可执行：<br />
#./jdk-1_5_0_07-linux-i586.bin进行安装，然后会在当前目录下解压，生成一个名为 jdk-1_5_0_07的目录<br />
#mv jdk-1_5_0_07 /usr/local/jdk<br />
安装ok后设置环境变量：<br />
修改/etc/profile<br />
增加如下内容：<br />
JAVA_HOME=/usr/local/jdk<br />
RESIN_HOME=/usr/local/resin<br />
CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$RESIN_HOME/lib:/usr/local/jdbc<br />
export RESIN_HOME JAVA_HOME CLASSPATH<br />
存盘退出。。。<br />
source /etc/profile</span></p>
<p><span style="color: #000000;">2、安装openssl<br />
解压openssl-0.9.8b.tar.gz<br />
#tar zxvf openssl-0.9.8b.tar.gz<br />
#cd openssl-0.9.8b<br />
#./Configure<br />
#make install<br />
<span id="more-759"></span><br />
接下来安装相关应用软件：<br />
1.MySQL5 </span></p>
<p><span style="color: #000000;">2.安装mysql5.0.18（源码包）<br />
源码包可以在这个网址获得：</p>
<p>http://download.mysql.cn/src/2006/0208/62.html</p>
<p>所有这些操作需要root权限<br />
安装开始：<br />
1&gt;cd /home/ftpsite<br />
2&gt;groupadd mysql&#8212;&#8212;&#8212;-添加mysql用户组,如果提示该组存在,则不用再加<br />
3&gt;useradd -g mysql mysql&#8212;&#8211;加mysql用户,并把它归到mysql组,如果提示用户存在,则不用再加<br />
4&gt;tar zxvf mysql-5.0.18.tar.tar<br />
5&gt;cd mysql-5.0.18<br />
6&gt;./configure &#8211;prefix=/usr/local/mysql<br />
7&gt;make<br />
8&gt;make install<br />
9&gt;cp support-files/my-medium.cnf /etc/my.cnf<br />
10&gt;cd /usr/local/mysql<br />
11&gt;./bin/mysql_install_db<br />
12&gt;chown -R root /usr/local/mysql<br />
13&gt;chown -R mysql /usr/local/mysql/var<br />
14&gt;chgrp -R root /usr/local/mysql<br />
15&gt;./bin/mysqld_saft &#8211;user=mysql &amp;<br />
16&gt;./bin/mysql<br />
17&gt;mysql&gt;&#8212;&#8212;&#8212;&#8212;&#8212;经过第16步,你应该能看到mysql&gt;提示符,那么恭喜你安装初步成功</span></p>
<p><span style="color: #000000;">2.Apache22<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
下载httpd-2.0.55.tar.gz, php-5.0.5.tar.gz等二进制源码包<br />
执行下列命令解压源码包<br />
# tar -zxvf httpd-2.0.55.tar.gz<br />
进入安装目录<br />
# cd httpd-2.0.55<br />
配置apache安装信息：<br />
#./configure &#8211;enable-layout=Apache &#8211;enable-so &#8211;enable-ssl=shared &#8211;with-mpm=worker &#8211;with-ssl=/usr/share/ssl<br />
执行make安装：<br />
# make; make install<br />
使用/usr/local/apache/bin/apachectl start 启动apache</span></p>
<p><span style="color: #000000;">#/usr/local/sbin/httpd -l<br />
看看是否存在以下几个模块<br />
core.c<br />
worker.c<br />
http_core.c<br />
mod_so.c<br />
现在是使用worker方式运行的apache。</span></p>
<p><span style="color: #000000;">OK，完成。</span></p>
<p><span style="color: #000000;">3.PHP5<br />
安装php<br />
tar -zxvf php-5.1.4.tar.gz<br />
cd php-5.1.4<br />
./configure &#8211;prefix=/usr/local/php5 (配置php的参数)<br />
&#8211;with-apxs2=/usr/local/apache2/bin/apxs<br />
&#8211;with-libxml-dir=/usr/local/lib<br />
&#8211;enable-sockets<br />
&#8211;with-mysql=/usr/local/mysql (mysql 的安装目录 就是那个解压后的目录)<br />
# make<br />
# make install<br />
将安装目录下的php.ini-dist文件改为php.ini存放的/usr/local/lib下。 </span></p>
<p><span style="color: #000000;">安装后修改httpd.conf文件：<br />
将httpd.conf中的loadmodule 最后一个刚加进去的php的#去掉<br />
在AddType application/x-gzip .gz .tgz后面加：<br />
AddType application/x-httpd-php .php<br />
AddType application/x-httpd-php-source .phps<br />
随后设置网站默认启动页允许为index.php，找到 DirectoryIndex这行，改为：<br />
DirectoryIndex index.html index.htm index.php</span></p>
<p><span style="color: #000000;">写一个phpinfo()测试一下就可以。 </span></p>
<p><span style="color: #000000;">4.安装phpMyAdmin</span></p>
<p><span style="color: #000000;">下面我们开始安装phpMyAdmin2.8.0.1! 这个文件应该从网上找的到！<br />
把下载好的源码放在/usr/local/www/data下面，解压！<br />
#tar xvzf phpMyAdmin.tar.gz<br />
进入phpmyadmin下的libraries 目录！<br />
修改 config.default.php:<br />
找到$cfg['PmaAbsoluteUri'] = &#8221;;<br />
修改成 $cfg['PmaAbsoluteUri'] = &#8216;http://你的IP/phpmyadmin&#8217;;<br />
找到$cfg['Servers'][$i]['auth_type'] = &#8216;config&#8217;; // Authentication method (config, http or cookie based)?<br />
$cfg['Servers'][$i]['user'] = &#8216;root&#8217;; // MySQL user<br />
$cfg['Servers'][$i]['password'] = &#8221;;<br />
写上你的Mysql用户名and密码！<br />
保存退出！<br />
然后用http://your/ IP/phpmyadmin访问！如果出现mysql管理页面，则安装成功，如果没有出现，请检查配制文件！</span></p>
<p><span style="color: #000000;">5．安装resin<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
安装resin：<br />
1）到http://www.caucho.com/下载resin-3.0.18.tar.gz，这个是目前的最新版本<br />
2）解压 生成目录 resin-3.0.18<br />
3）执行 mv resin-3.0.18 /usr/local/resin<br />
4）重新编译resin：<br />
./configure &#8211;with-apxs=/usr/local/apache2/bin/apxs &#8211;with-java-home=/usr/local/jdk/ &#8211;prefix=/usr/local/resin<br />
make &amp;&amp; make install &amp;&amp; make clean<br />
如果/etc/profile设置没有问题的话，该步骤能够正常运行</span></p>
<p><span style="color: #000000;">6．整合Apache和Resin<br />
1）修改/usr/local/apache/conf/httpd.conf<br />
增加：<br />
LoadModule caucho_module /usr/local/apache/libexec/mod_caucho.so<br />
ResinConfigServer localhost 6802<br />
CauchoStatus yes</p>
<p>SetHandler caucho-status</p>
<p>2）修改/usr/local/resin/conf/resin.conf<br />
修改以下片断：</p>
<p>3）<br />
重新启动 apache,<br />
/usr/local/apache/bin/apachectl start<br />
启动 resin<br />
/usr/local/resin/bin/httpd.sh start<br />
写一个简单的脚本可以测试，jsp执行是否成功。</span></p>
<p><span style="color: #000000;">7．Resin连接MySQL数据库</span></p>
<p><span style="color: #000000;">下载相相应的jbdc 驱动，俺下载的是:mysql-connector-java-3.1.12-bin.jar，将此文件放<br />
到/usr/local/resin/lib下!<br />
然后再写一个jsp连接mysql的jsp文件测试一下!</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/759.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apache PHP MySQL Zend GD OpenSSL vsftpd For Debian  完全编译</title>
		<link>http://www.evanjiang.net.cn/archives/720.html</link>
		<comments>http://www.evanjiang.net.cn/archives/720.html#comments</comments>
		<pubDate>Thu, 05 Mar 2009 07:28:42 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[debian linux]]></category>
		<category><![CDATA[ftp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[Apache PHP MySQL Zend GD OpenSSL vsftpd For Debian  完全编译]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=720</guid>
		<description><![CDATA[<p>系统 Debian Linux v3.1r0 (Sarge) Kernel v2.6.11 i686</p>
<p>安装方式：源码编译</p>
<p>################
##### 软件 #####
################</p>
<p>Apache v2.0.54 官方主页： http://www.apache.org
http://www.apache.org/dist/httpd/httpd-2.0.54.tar.gz  [7.16MB]</p>
<p>PHP v4.3.11 官方主页： http://www.php.net
http://cn.php.net/distributions/php-4.3.11.tar.gz  [4.64MB]</p>
<p>Zend Optimizer v2.5.10 官方主页： http://www.zend.com
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10-linux-glibc21-i386.tar.gz  [3.36MB]</p>
<p>MySQL v4.0.24 官方主页： http://www.mysql.com
http://ftp.stu.edu.tw/pub/Unix/Database/Mysql/Downloads/MySQL-4.0/mysql-4.0.24.tar.gz  [16.1MB]</p>
<p>GD Library v2.0.33 官方主页： http://www.boutell.com/gd/
http://www.boutell.com/gd/http/gd-2.0.33.tar.gz  [573KB]</p>
<p>FreeType v2.1.10 官方主页： http://www.freetype.org
http://savannah.nongnu.org/download/freetype/freetype-2.1.10.tar.gz  [1.31MB]</p>
<p>Jpeg v6b 官方主页： http://www.ijg.org
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz  [598KB]</p>
<p>LibPNG v1.2.8 官方主页： http://www.libpng.org/pub/png/
http://switch.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.8.tar.gz  [498KB]</p>
<p>OpenSSL v0.9.7g 官方主页： http://www.openssl.org
http://www.openssl.org/source/openssl-0.9.7g.tar.gz [...]]]></description>
			<content:encoded><![CDATA[<p>系统 Debian Linux v3.1r0 (Sarge) Kernel v2.6.11 i686</p>
<p>安装方式：源码编译</p>
<p>################<br />
##### 软件 #####<br />
################</p>
<p>Apache v2.0.54 官方主页： http://www.apache.org<br />
http://www.apache.org/dist/httpd/httpd-2.0.54.tar.gz  [7.16MB]</p>
<p>PHP v4.3.11 官方主页： http://www.php.net<br />
http://cn.php.net/distributions/php-4.3.11.tar.gz  [4.64MB]</p>
<p>Zend Optimizer v2.5.10 官方主页： http://www.zend.com<br />
http://downloads.zend.com/optimizer/2.5.10/ZendOptimizer-2.5.10-linux-glibc21-i386.tar.gz  [3.36MB]</p>
<p>MySQL v4.0.24 官方主页： http://www.mysql.com<br />
http://ftp.stu.edu.tw/pub/Unix/Database/Mysql/Downloads/MySQL-4.0/mysql-4.0.24.tar.gz  [16.1MB]</p>
<p>GD Library v2.0.33 官方主页： http://www.boutell.com/gd/<br />
http://www.boutell.com/gd/http/gd-2.0.33.tar.gz  [573KB]</p>
<p>FreeType v2.1.10 官方主页： http://www.freetype.org<br />
http://savannah.nongnu.org/download/freetype/freetype-2.1.10.tar.gz  [1.31MB]</p>
<p>Jpeg v6b 官方主页： http://www.ijg.org<br />
ftp://ftp.uu.net/graphics/jpeg/jpegsrc.v6b.tar.gz  [598KB]</p>
<p>LibPNG v1.2.8 官方主页： http://www.libpng.org/pub/png/<br />
http://switch.dl.sourceforge.net/sourceforge/libpng/libpng-1.2.8.tar.gz  [498KB]</p>
<p>OpenSSL v0.9.7g 官方主页： http://www.openssl.org<br />
http://www.openssl.org/source/openssl-0.9.7g.tar.gz  [2.98MB]</p>
<p>vsftpd v2.0.3 官方主页： http://vsftpd.beasts.org<br />
ftp://vsftpd.beasts.org/users/cevans/vsftpd-2.0.3.tar.gz  [149KB]</p>
<p>zlib v1.2.2 官方主页： http://www.gzip.org/zlib/<br />
http://www.zlib.net/zlib-1.2.2.tar.gz  [420KB]</p>
<p>ClibPDF v2.02-r1-1 官方网站： http://www.fastio.com<br />
http://www.fastio.com/clibpdf202r1.tar.gz  [836KB]</p>
<p>mod_limitipconn v0.22 官方网站： http://dominia.org/djao/<br />
http://dominia.org/djao/limit/mod_limitipconn-0.22.tar.gz  [6.18KB]</p>
<p>Bandwidth Module v0.6 官方网站： http://www.ivn.cl/apache/<br />
http://www.ivn.cl/apache/bw_mod-0.6.tgz  [28.5KB]</p>
<p>Apache DoS Evasive Maneuvers Module v1.10 官方网站： http://www.nuclearelephant.com/projects/dosevasive/<br />
http://www.nuclearelephant.com/projects/dosevasive/mod_dosevasive_1.10.tar.gz  [19.1KB]<br />
<span id="more-720"></span><br />
################<br />
##### 安装 #####<br />
################</p>
<p>1、解压缩，把所有源码压缩包放在一个目录中，解压缩所有 .tar.gz 压缩包<br />
for i in `ls *.gz`;do tar zxvf $i; done;</p>
<p>2、开始安装</p>
<p>##### zlib #####</p>
<p>cd zlib-1.2.2<br />
./configure<br />
make<br />
make install<br />
cd ..</p>
<p>##### OpenSSL #####</p>
<p>cd openssl-0.9.7g<br />
./config &#8211;prefix=/usr/local/ssl \<br />
&#8211;openssldir=/usr/local/ssl \<br />
shared \<br />
zlib</p>
<p>make<br />
make install<br />
ln -s /usr/local/ssl /usr/lib/ssl<br />
cd ..</p>
<p>##### MySQL #####</p>
<p>cd mysql-4.0.24</p>
<p>编辑 sql/mysqld.cc ：<br />
搜索：&#038;max_connections, 0, GET_ULONG, REQUIRED_ARG, 100, 1, 16384, 0, 1,<br />
修改：&#038;max_connections, 0, GET_ULONG, REQUIRED_ARG, 1000, 1, 16384, 0, 1,</p>
<p>groupadd mysql<br />
useradd -g mysql mysql</p>
<p>./configure \<br />
&#8211;prefix=/server/mysql \<br />
&#8211;sysconfdir=/server/mysql \<br />
&#8211;without-isam \<br />
&#8211;without-debug \<br />
&#8211;enable-assembler \<br />
&#8211;with-unix-socket-path=/tmp/mysql.sock \<br />
&#8211;with-mysqld-user=mysql \<br />
&#8211;with-extra-charset=all \<br />
&#8211;with-client-ldflags=-all-static \<br />
&#8211;with-mysqld-ldflags=-all-static \<br />
&#8211;localstatedir=/data/mysql/data</p>
<p>如果出现以下错误：<br />
checking for tgetent in -ltermcap&#8230; no<br />
checking for termcap functions library&#8230; configure: error: No curses/termcap library found<br />
说明 curses/termcap 库没有安装<br />
apt-cache search curses | grep lib<br />
安装 libncurses5-dev ，然后重新运行配置</p>
<p>mkdir /data<br />
mkdir /data/mysql<br />
mkdir /data/mysql/data</p>
<p>make<br />
make install</p>
<p>/server/mysql/bin/mysql_install_db &#8211;user=mysql</p>
<p>chown -R mysql /data/mysql<br />
chgrp -R mysql /data/mysql<br />
chown -R root /server/mysql<br />
chgrp -R mysql /server/mysql<br />
cp /server/mysql/share/mysql/my-medium.cnf /server/mysql/my.cnf</p>
<p>/server/mysql/share/mysql/mysql.server start<br />
/server/mysql/bin/mysqladmin -u root password 123456789<br />
cd ..<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
</p>
<p>##### Apache2 #####</p>
<p>cd httpd-2.0.54</p>
<p>./configure &#8211;prefix=/server/httpd \<br />
&#8211;enable-so \<br />
&#8211;with-mysql=/server/mysqld \<br />
&#8211;enable-cgi \<br />
&#8211;with-config-file-path=/server/httpd/conf \<br />
&#8211;enable-track-vars \<br />
&#8211;enable-mods-shared=all \<br />
&#8211;enable-cache \<br />
&#8211;enable-disk-cache \<br />
&#8211;enable-mem-cache \<br />
&#8211;enable-rewrite \<br />
&#8211;with-mpm=worker \<br />
&#8211;with-ssl=/usr/local/ssl \<br />
&#8211;enable-ssl</p>
<p>make<br />
make install<br />
cd ..</p>
<p>##### mod_deflate #####</p>
<p>cd httpd-2.0.54/modules/filters</p>
<p>/server/httpd/bin/apxs -i -c -a mod_deflate.c</p>
<p>修改 Apache 配置文件 /server/httpd/conf/httpd.conf ：<br />
添加：<br />
<Location />;<br />
# Insert filter<br />
SetOutputFilter DEFLATE</p>
<p># Netscape 4.x has some problems&#8230;<br />
BrowserMatch ^Mozilla/4 gzip-only-text/html</p>
<p># Netscape 4.06-4.08 have some more problems<br />
BrowserMatch ^Mozilla/4\.0[678] no-gzip</p>
<p># MSIE masquerades as Netscape, but it is fine<br />
# BrowserMatch \bMSIE !no-gzip !gzip-only-text/html</p>
<p># NOTE: Due to a bug in mod_setenvif up to Apache 2.0.48<br />
# the above regex won&#8217;t work. You can use the following<br />
# workaround to get the desired effect:<br />
BrowserMatch \bMSI[E] !no-gzip !gzip-only-text/html</p>
<p># Don&#8217;t compress images<br />
SetEnvIfNoCase Request_URI \<br />
\.(?:gif|jpe?g|png|ico)$ no-gzip dont-vary</p>
<p># Make sure proxies don&#8217;t deliver the wrong content<br />
#Header append Vary User-Agent env=!dont-vary<br />
</Location>;</p>
<p>DeflateFilterNote ratio<br />
LogFormat &#8216;&#8221;%v %h %l %u %t &#8220;%r&#8221; %>;s %b &#8220;%{Referer}i&#8221; &#8220;%{User-Agent}i&#8221;" (%{ratio}n)&#8217; deflate</p>
<p>CustomLog logs/deflate_log deflate</p>
<p>然后<br />
cd ../../../</p>
<p>##### FreeType #####</p>
<p>cd freetype-2.1.10</p>
<p>./configure &#8211;prefix=/usr/local/freetype</p>
<p>make<br />
make install<br />
cd ..</p>
<p>##### LibPNG #####</p>
<p>cd libpng-1.2.8</p>
<p>cp scripts/makefile.linux makefile</p>
<p>make test<br />
make install<br />
cd ..</p>
<p>##### Jpeg #####</p>
<p>cd jpeg-6b</p>
<p>mkdir /usr/local/jpeg<br />
mkdir /usr/local/jpeg/bin<br />
mkdir /usr/local/jpeg/lib<br />
mkdir /usr/local/jpeg/include<br />
mkdir /usr/local/jpeg/man<br />
mkdir /usr/local/jpeg/man/man1<br />
./configure &#8211;prefix=/usr/local/jpeg &#8211;enable-shared &#8211;enable-static</p>
<p>make<br />
make install<br />
cd ..</p>
<p>##### GD Library #####</p>
<p>cd gd-2.0.33</p>
<p>./configure &#8211;prefix=/usr/local/gd \<br />
&#8211;with-jpeg=/usr/local/jpeg \<br />
&#8211;with-freetype=/usr/local/freetype \<br />
&#8211;with-png \<br />
&#8211;with-zlib</p>
<p>make<br />
make install<br />
cd ..</p>
<p>##### ClibPDF #####</p>
<p>cd ClibPDF/source<br />
cp Makefile.Linux makefile<br />
make<br />
make install<br />
cd ..</p>
<p>##### PHP #####</p>
<p>cd php-4.3.11</p>
<p>./configure &#8211;prefix=/server/php \<br />
&#8211;with-apxs2=/server/httpd/bin/apxs \<br />
&#8211;with-gd=/usr/local/gd \<br />
&#8211;enable-gd \<br />
&#8211;enable-gd-native-ttf \<br />
&#8211;with-jpeg-dir=/usr/local/jpeg \<br />
&#8211;with-png \<br />
&#8211;with-ttf \<br />
&#8211;with-zlib \<br />
&#8211;with-freetype-dir=/usr/local/freetype \<br />
&#8211;enable-magic-quotes \<br />
&#8211;with-mysql=/server/mysql \<br />
&#8211;with-mysql-sock=/tmp/mysql.sock \<br />
&#8211;with-iconv \<br />
&#8211;with-mbstring \<br />
&#8211;enable-mbstring \<br />
&#8211;enable-track-vars \<br />
&#8211;enable-force-cgi-redirect \<br />
&#8211;enable-ftp \<br />
&#8211;with-config-file-path=/server/httpd/conf \<br />
&#8211;with-openssl=/usr/local/ssl \<br />
&#8211;with-openssl-dir=/usr/local/ssl \<br />
&#8211;with-cpdflib=/usr/local \<br />
&#8211;with-pear=/server/php/pear</p>
<p>make<br />
make install</p>
<p>cp php.ini-dist /server/httpd/conf/php.ini<br />
cd ..</p>
<p>
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
##### Zend Optimizer #####</p>
<p>cd ZendOptimizer-2.5.10-linux-glibc21-i386</p>
<p>./install</p>
<p>操作 [OK] [EXIT] [YES] [/server/zend] [/server/httpd/conf] [YES] [/server/httpd/bin/apachectl] [OK] [OK] [NO]</p>
<p>cd ..</p>
<p>##### mod_limitipconn #####</p>
<p>cd mod_limitipconn-0.22</p>
<p>/server/httpd/bin/apxs -i -c -a mod_limitipconn.c</p>
<p>修改 Apache 配置文件 /server/httpd/conf/httpd.conf：<br />
查找：#ExtendedStatus On ，去掉注释&#8221;#&#8221;<br />
查找：CustomLog logs/access_log common ，修改成 CustomLog logs/access_log common env=!LIMITIP<br />
添加：<br />
<IfModule mod_limitipconn.c>;<br />
    <Location />;<br />
        MaxConnPerIP 5<br />
        NoIPLimit image/*<br />
    </Location>;</p>
<p>    <Location /mp3>;<br />
        MaxConnPerIP 2<br />
        OnlyIPLimit audio/mpeg video<br />
    </Location>;<br />
</IfModule>;</p>
<p>然后<br />
cd ..</p>
<p>##### Bandwidth Module #####</p>
<p>cd bw_mod-0.6</p>
<p>/server/httpd/bin/apxs -i -c -a bw_mod-0.6.c</p>
<p>cd ..</p>
<p>带宽限制在虚拟主机中设置</p>
<p>##### Apache DoS Evasive Maneuvers Module #####</p>
<p>cd mod_dosevasive</p>
<p>/server/httpd/bin/apxs -i -c -a mod_dosevasive20.c</p>
<p>cd ..</p>
<p>等一下启动 Apache2 后可以测试<br />
perl test.pl</p>
<p>###############################################################################################</p>
<p>现在，WEB 服务已经安装完毕！<br />
测试 WEB 服务：</p>
<p>mkdir /data/vhosts<br />
mkdir /data/vhosts/localhost</p>
<p>启动 Apache2<br />
/server/httpd/bin/apachectl start<br />
如果出错请参考下一贴中的 httpd.conf 和 虚拟主机配置文件示例</p>
<p>MySQL 服务前面已经启动，密码是：123456789</p>
<p>编辑一个 info.php 放在 /data/vhosts/localhost 下面，内容如下：</p>
<p><?php<br />
phpinfo();<br />
?>;</p>
<p>测试： http://localhost/info.php<br />
OK，看到 PHP 信息吧 </p>
<p>##### 开机自动启动服务 #####</p>
<p>cp /server/httpd/bin/apachectl /etc/init.d/httpd<br />
cp /server/mysql/share/mysql/mysql.server /etc/init.d/mysql<br />
recconf<br />
配置，已经有 httpd 和 mysql 选项，选中，OK</p>
<p>如果没有 rcconf ，用 apt-get install rcconf 安装</p>
<p>#######################<br />
##### 使 SSL 工作 #####<br />
#######################</p>
<p>mkdir /server/ssl<br />
cd /server/ssl</p>
<p>##### 手工签署证书 #####<br />
/usr/local/ssl/bin/openssl genrsa -des3 \<br />
-rand 任意大文件1:任意大文件2 \<br />
-out server.key 1024</p>
<p>输入密码<br />
重复密码</p>
<p>/usr/local/ssl/bin/openssl req -new -key server.key -out server.csr</p>
<p>Enter pass phrase for localhost.key:  #<&#8211;## 输入密码<br />
You are about to be asked to enter information that will be incorporated<br />
into your certificate request.<br />
What you are about to enter is what is called a Distinguished Name or a DN.<br />
There are quite a few fields but you can leave some blank<br />
For some fields there will be a default value,<br />
If you enter &#8216;.&#8217;, the field will be left blank.<br />
&#8212;&#8211;<br />
Country Name (2 letter code) [AU]:CN  #<&#8211;## 国家代码<br />
State or Province Name (full name) [Some-State]N  #<&#8211;## 省或州<br />
Locality Name (eg, city) []:SY  #<&#8211;## 城市<br />
Organization Name (eg, company) [Internet Widgits Pty Ltd]:micronsky.net  #<&#8211;## 组织名称<br />
Organizational Unit Name (eg, section) []:root  #<&#8211;## 部门<br />
Common Name (eg, YOUR name) []:keelort  #<&#8211;## 名字<br />
Email Address []:keelort@gmail.com  #<&#8211;## 电子邮件</p>
<p>Please enter the following &#8216;extra&#8217; attributes<br />
to be sent with your certificate request<br />
A challenge password []:  #<&#8211;## 直接回车就可以<br />
An optional company name []:  #<&#8211;## 直接回车就可以</p>
<p>/usr/local/ssl/bin/openssl x509 -req \<br />
-days 3650 \<br />
-in server.csr \<br />
-signkey server.key \<br />
-out server.crt</p>
<p>&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;&#8230;..</p>
<p>注意：SSL 部分目前还不是很明白，apachectl startssl 启动后 http:// 不能用，只能用 https:// 连接，<br />
不知道怎么回事请高手指教，暂时没有写全</p>
<p>###############################################################################################</p>
<p>##### vsftpd #####</p>
<p>cd vsftpd-2.0.3</p>
<p>编辑 builddefs.h ：<br />
#define VSF_BUILD_PAM<br />
修改为<br />
#undef VSF_BUILD_PAM</p>
<p>编辑 defs.h ：<br />
#define VSFTP_DEFAULT_CONFIG    &#8220;/etc/vsftpd.conf&#8221;<br />
修改为<br />
#define VSFTP_DEFAULT_CONFIG    &#8220;/server/vsftpd/conf/vsftpd.conf&#8221;</p>
<p>make</p>
<p>useradd nobody<br />
mkdir /usr/share/empty<br />
mkdir /data/ftp<br />
useradd -d /data/ftp ftp<br />
chown root:root /data/ftp<br />
chmod og-w /data/ftp</p>
<p>install -m 755 vsftpd /server/vsftpd/vsftpd<br />
install -m 644 vsftpd.8 /usr/share/man/man8<br />
install -m 644 vsftpd.conf.5 /usr/share/man/man5<br />
mkdir /server/vsftpd/conf<br />
install -m 644 vsftpd.conf /server/vsftpd/conf/vsftpd.conf</p>
<p>使 vsftpd 以 standalone 方式启动：<br />
编写名为 vsftpd 的启动脚本：</p>
<p>CODE:<br />
[Copy to clipboard]<br />
#!/bin/sh<br />
# /etc/init.d/vsftpd<br />
#</p>
<p>set -e</p>
<p># Exit if vsftpd.conf doesn&#8217;t have listen=yes or listen_ipv6=yes<br />
# (mandatory for standalone operation)<br />
if [ -f /server/vsftpd/conf/vsftpd.conf ] &#038;&#038; ! egrep -iq &#8220;^ *listen(_ipv6)? *= *yes&#8221; </p>
<p>/server/vsftpd/conf/vsftpd.conf; then<br />
    exit 0<br />
fi</p>
<p>DAEMON=/server/vsftpd/vsftpd<br />
NAME=vsftpd</p>
<p>test -x $DAEMON || exit 0</p>
<p>case &#8220;$1&#8243; in<br />
  start)<br />
    echo -n &#8220;Starting FTP server: $NAME&#8221;<br />
    start-stop-daemon &#8211;start &#8211;background -m &#8211;pidfile /tmp/vsftpd.pid &#8211;exec $DAEMON<br />
    echo &#8220;.&#8221;<br />
    ;;<br />
  stop)<br />
    echo -n &#8220;Stopping FTP server: $NAME&#8221;<br />
    start-stop-daemon &#8211;stop &#8211;pidfile /tmp/vsftpd.pid &#8211;oknodo &#8211;exec $DAEMON<br />
    echo &#8220;.&#8221;<br />
      ;;<br />
  restart)<br />
    echo -n &#8220;Restarting FTP server: $NAME&#8221;<br />
    start-stop-daemon &#8211;stop &#8211;pidfile /tmp/vsftpd.pid &#8211;oknodo &#8211;exec $DAEMON<br />
    start-stop-daemon &#8211;start &#8211;background -m &#8211;pidfile /tmp/vsftpd.pid &#8211;exec $DAEMON<br />
    echo &#8220;.&#8221;<br />
    ;;<br />
  reload|force-reload)<br />
    echo &#8220;Reloading $NAME configuration files&#8221;<br />
    start-stop-daemon &#8211;stop &#8211;pidfile /tmp/vsftpd.pid &#8211;signal 1 &#8211;exec $DAEMON<br />
    echo &#8220;.&#8221;<br />
    ;;<br />
  *)<br />
    echo &#8220;Usage: /etc/init.d/$NAME {start|stop|restart|reload}&#8221;<br />
    exit 1<br />
    ;;<br />
esac</p>
<p>exit 0<br />
运行 rcconf 选中 vsftpd ，确定</p>
<p>重新启动，试试试不是所有的服务都启动，呵呵&#8230;</p>
<p>全文完</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/720.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql备份脚本</title>
		<link>http://www.evanjiang.net.cn/archives/682.html</link>
		<comments>http://www.evanjiang.net.cn/archives/682.html#comments</comments>
		<pubDate>Wed, 04 Mar 2009 10:10:12 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[shell]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=682</guid>
		<description><![CDATA[<p>#!/bin/sh
#
# Copyright (C), 2008 bug All Rights Reserved
# Title       : Database Backup Script
# Author      : BUG
# File        : db_bak.sh
# Version     : 1.1.0
# Date        :
# Email  [...]]]></description>
			<content:encoded><![CDATA[<p>#!/bin/sh<br />
#<br />
# Copyright (C), 2008 bug All Rights Reserved<br />
# Title       : Database Backup Script<br />
# Author      : BUG<br />
# File        : db_bak.sh<br />
# Version     : 1.1.0<br />
# Date        :<br />
# Email       :<br />
# License     : General Public License (GPL) v2<br />
# Description : Database Backup Script<br />
#</p>
<p>initial() {<br />
    echo -en &#8220;\33[2J"<br />
    echo -en "\33[0;0H"<br />
    echo -en "\33[32m"<br />
    echo "------------------------------------------------------------"<br />
    echo "---                Database Backup Script                ---"<br />
    echo "------------------------------------------------------------"<br />
    echo -en "\33[37m"<br />
    stty -echo<br />
    umask 077<br />
    mysqln=`echo 'show databases;' | /usr/local/mysql/bin/mysql -psjldafhkg | sed -n '3,$p'`<br />
    mysqlu="root"<br />
    mysqlp="********"<br />
    binpath="/usr/local/mysql/bin"<br />
    dstpath="/pri/bak/sql_bak/"<br />
    runuser=`ps aux | grep $$ | sed -n "1p" | awk '{ print $1 }'`<br />
    mkdir -p $dstpath/`date +%y%m%d`<br />
    exec 3>>$dstpath/`date +%y%m%d`/db_bak.log<br />
}</p>
<p>initial</p>
<p>echo -e "\n[`date +%y/%m/%d\ %H:%M:%S`] Database Backup Script start by $runuser PID:$$&#8221; >&#038;3</p>
<p>if [ -f "$dstpath/`date +%y%m%d`/lock" ]<br />
then<br />
    echo -e &#8220;\33[33mIt's has completed by `cat $dstpath/\`date +%y%m%d\`/lock`!!!\33[37m"<br />
    echo "[`date +%y/%m/%d\ %H:%M:%S`] It&#8217;s has completed by `cat $dstpath/\`date +%y%m%d\`/lock`!!!&#8221; >&#038;3<br />
else<br />
    echo -e &#8220;Database\tExport\tCompress\tSql\tTgz\tRate&#8221;<br />
    echo -e &#8220;\33[32m------------------------------------------------------------\33[37m"<br />
    cd $dstpath/`date +%y%m%d`<br />
    for db in $mysqln<br />
    do<br />
    echo -n "$db"<br />
    $binpath/mysqldump --opt -u$mysqlu -p$mysqlp $db > $dstpath/`date +%y%m%d`/$db.sql 2> /dev/null<br />
    RETVAL1=$?<br />
    if [ $RETVAL1 -eq 0 ]<br />
    then<br />
    sqlsize=`du -k $db.sql | cut -f1`<br />
    echo -n &#8220;[`date +%y/%m/%d\ %H:%M:%S`]&#8221; >&#038;3<br />
    echo -n &#8220;$db&#8221; | awk &#8216;{printf &#8221; %-17s&#8221;, $1}&#8217; >&#038;3<br />
    echo -n &#8220;OK  &#8221; >&#038;3<br />
    echo -en &#8220;\r\t\t  \33[32mOK\33[37m\t"<br />
    tar -czvf $db.tgz $db.sql > /dev/null 2>&#038;1<br />
        RETVAL2=$?<br />
        if [ $RETVAL2 -eq 0 ]<br />
        then<br />
        tgzsize=`du -k $db.tgz | cut -f1`<br />
        echo &#8220;OK&#8221; >&#038;3<br />
        rm -f $dstpath/`date +%y%m%d`/$db.sql<br />
        echo -en &#8221;   \33[32mOK\33[37m"<br />
        echo -en "\33[33m"<br />
        echo -en "$sqlsize" | awk '{printf "%12sKB", $1}'<br />
        echo -en "$tgzsize" | awk '{printf "%6sKB", $1}'<br />
        echo "$sqlsize $tgzsize" | awk '{printf "%8.0f%",$2/$1*100}'<br />
        echo -e "\33[37m"<br />
        else<br />
        echo "Compress fail return $RETVAL2" >&#038;3<br />
        echo -e "  \33[31mfail\33[37m"<br />
        fi<br />
    else<br />
    echo -n "[`date +%y/%m/%d\ %H:%M:%S`]&#8221; >&#038;3<br />
    echo -n &#8220;$db&#8221; | awk &#8216;{printf &#8221; %-17s &#8220;, $1}&#8217; >&#038;3<br />
    echo &#8220;Export fail return $RETVAL1&#8243; >&#038;3<br />
    echo -en &#8220;\r\t\t   \33[31mfail\33[37m&#8221;<br />
    fi<br />
    done<br />
    echo &#8220;`date +%H:%M:%S`&#8221;>$dstpath/`date +%y%m%d`/lock<br />
fi</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/682.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL-Cluster集群研究</title>
		<link>http://www.evanjiang.net.cn/archives/674.html</link>
		<comments>http://www.evanjiang.net.cn/archives/674.html#comments</comments>
		<pubDate>Wed, 04 Mar 2009 10:02:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[MySQL-Cluster 集群研究]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=674</guid>
		<description><![CDATA[<p>一、介绍
这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。
注意！
虽然这是基于2台服务器的MySQL集群，但也必须有额外的第三台服务器作为管理节点，但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群，但是这样的架构，一旦一台服务器宕机之后集群就无法继续正常工作，这样也就失去集群的意义。出于这个原因，就需要有第三台服务器作为管理节点运行。
另外，可能很多朋友都没有3台服务器的实际环境，可以考虑在VMWare或其他虚拟机中进行实验。
下面假设这3台服务的情况：
 Server1: mysql1.vmtest.net 192.168.0.1
 Server2: mysql2.vmtest.net 192.168.0.2
 Server3: mysql3.vmtest.net 192.168.0.3
Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低，只需对Server3的系统进行很小的调整并且无需安装MySQL，Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。</p>
<p>二、在Server1和Server2上安装MySQL
从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
注意：必须是max版本的MySQL，Standard版本不支持集群部署！
以下步骤需要在Server1和Server2上各做一次
 # mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/
 # cd /usr/local/
 # groupadd mysql
 # useradd -g mysql mysql
 # tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
 # rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz
 # mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql
 # cd mysql
 # scripts/mysql_install_db &#8211;user=mysql
 # chown -R root  .
 # chown -R mysql data
 # [...]]]></description>
			<content:encoded><![CDATA[<p>一、介绍<br />
这篇文档旨在介绍如何安装配置基于2台服务器的MySQL集群。并且实现任意一台服务器出现问题或宕机时MySQL依然能够继续运行。<br />
注意！<br />
虽然这是基于2台服务器的MySQL集群，但也必须有额外的第三台服务器作为管理节点，但这台服务器可以在集群启动完成后关闭。同时需要注意的是并不推荐在集群启动完成后关闭作为管理节点的服务器。尽管理论上可以建立基于只有2台服务器的MySQL集群，但是这样的架构，一旦一台服务器宕机之后集群就无法继续正常工作，这样也就失去集群的意义。出于这个原因，就需要有第三台服务器作为管理节点运行。<br />
另外，可能很多朋友都没有3台服务器的实际环境，可以考虑在VMWare或其他虚拟机中进行实验。<br />
下面假设这3台服务的情况：<br />
 Server1: mysql1.vmtest.net 192.168.0.1<br />
 Server2: mysql2.vmtest.net 192.168.0.2<br />
 Server3: mysql3.vmtest.net 192.168.0.3<br />
Servers1和Server2作为实际配置MySQL集群的服务器。对于作为管理节点的Server3则要求较低，只需对Server3的系统进行很小的调整并且无需安装MySQL，Server3可以使用一台配置较低的计算机并且可以在Server3同时运行其他服务。</p>
<p>二、在Server1和Server2上安装MySQL<br />
从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
注意：必须是max版本的MySQL，Standard版本不支持集群部署！<br />
以下步骤需要在Server1和Server2上各做一次<br />
 # mv mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz /usr/local/<br />
 # cd /usr/local/<br />
 # groupadd mysql<br />
 # useradd -g mysql mysql<br />
 # tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
 # rm -f mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
 # mv mysql-max-4.1.9-pc-linux-gnu-i686 mysql<br />
 # cd mysql<br />
 # scripts/mysql_install_db &#8211;user=mysql<br />
 # chown -R root  .<br />
 # chown -R mysql data<br />
 # chgrp -R mysql .<br />
 # cp support-files/mysql.server /etc/rc.d/init.d/mysqld<br />
 # chmod +x /etc/rc.d/init.d/mysqld<br />
 # chkconfig &#8211;add mysqld<br />
此时不要启动MySQL！<br />
<span id="more-674"></span><br />
三、安装并配置管理节点服务器(Server3)<br />
作为管理节点服务器，Server3需要ndb_mgm和ndb_mgmd两个文件：<br />
从http://www.mysql.com上下载mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
 # mkdir /usr/src/mysql-mgm<br />
 # cd /usr/src/mysql-mgm<br />
 # tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
 # rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
 # cd mysql-max-4.1.9-pc-linux-gnu-i686<br />
 # mv bin/ndb_mgm .<br />
 # mv bin/ndb_mgmd .<br />
 # chmod +x ndb_mg*<br />
 # mv ndb_mg* /usr/bin/<br />
 # cd<br />
 # rm -rf /usr/src/mysql-mgm<br />
现在开始为这台管理节点服务器建立配置文件：<br />
 # mkdir /var/lib/mysql-cluster<br />
 # cd /var/lib/mysql-cluster<br />
 # vi config.ini<br />
在config.ini中添加如下内容：<br />
 [NDBD DEFAULT]<br />
 NoOfReplicas=2<br />
 [MYSQLD DEFAULT]<br />
 [NDB_MGMD DEFAULT]<br />
 [TCP DEFAULT]<br />
 # Managment Server<br />
 [NDB_MGMD]<br />
 HostName=192.168.0.3 #管理节点服务器Server3的IP地址<br />
 # Storage Engines<br />
 [NDBD]<br />
 HostName=192.168.0.1 #MySQL集群Server1的IP地址<br />
 DataDir= /var/lib/mysql-cluster<br />
 [NDBD]<br />
 HostName=192.168.0.2 #MySQL集群Server2的IP地址<br />
 DataDir=/var/lib/mysql-cluster<br />
 # 以下2个[MYSQLD]可以填写Server1和Server2的主机名。<br />
 # 但为能够更快的更换集群中的服务器，推荐留空，否则更换服务器后必须对这个配置进行更改。<br />
 [MYSQLD]<br />
 [MYSQLD]<br />
保存退出后，启动管理节点服务器Server3：<br />
 # ndb_mgmd<br />
启动管理节点后应该注意，这只是管理节点服务，并不是管理终端。因而你看不到任何关于启动后的输出信息。<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
四、配置集群服务器并启动MySQL<br />
在Server1和Server2中都需要进行如下改动：<br />
 # vi /etc/my.cnf<br />
 [mysqld]<br />
 ndbcluster<br />
 ndb-connectstring=192.168.0.3 #Server3的IP地址<br />
 [mysql_cluster]<br />
 ndb-connectstring=192.168.0.3 #Server3的IP地址<br />
保存退出后，建立数据目录并启动MySQL：<br />
 # mkdir /var/lib/mysql-cluster<br />
 # cd /var/lib/mysql-cluster<br />
 # /usr/local/mysql/bin/ndbd &#8211;initial<br />
 # /etc/rc.d/init.d/mysqld start<br />
可以把/usr/local/mysql/bin/ndbd加到/etc/rc.local中实现开机启动。<br />
注意：只有在第一次启动ndbd时或者对Server3的config.ini进行改动后才需要使用&#8211;initial参数！</p>
<p>[编辑]<br />
五、检查工作状态<br />
回到管理节点服务器Server3上，并启动管理终端：<br />
 # /usr/bin/ndb_mgm<br />
键入show命令查看当前工作状态：（下面是一个状态输出示例）<br />
 [root@mysql3 root]# /usr/bin/ndb_mgm<br />
 &#8212; NDB Cluster &#8212; Management Client &#8211;<br />
 ndb_mgm> show<br />
 Connected to Management Server at: localhost:1186<br />
 Cluster Configuration<br />
 &#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
 [ndbd(NDB)]     2 node(s)<br />
 id=2    @192.168.0.1  (Version: 4.1.9, Nodegroup: 0, Master)<br />
 id=3    @192.168.0.2  (Version: 4.1.9, Nodegroup: 0)<br />
 [ndb_mgmd(MGM)] 1 node(s)<br />
 id=1    @192.168.0.3  (Version: 4.1.9)<br />
 [mysqld(API)]   2 node(s)<br />
 id=4   (Version: 4.1.9)<br />
 id=5   (Version: 4.1.9)<br />
 ndb_mgm><br />
如果上面没有问题，现在开始测试MySQL：<br />
注意，这篇文档对于MySQL并没有设置root密码，推荐你自己设置Server1和Server2的MySQL root密码。<br />
在Server1中：<br />
 # /usr/local/mysql/bin/mysql -u root -p<br />
 > use test;<br />
 > CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;<br />
 > INSERT INTO ctest () VALUES (1);<br />
 > SELECT * FROM ctest;<br />
应该可以看到1 row returned信息（返回数值1）。<br />
如果上述正常，则换到Server2上重复上面的测试，观察效果。如果成功，则在Server2中执行INSERT再换回到Server1观察是否工作正常。<br />
如果都没有问题，那么恭喜成功！<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
六、破坏性测试<br />
将Server1或Server2的网线拔掉，观察另外一台集群服务器工作是否正常（可以使用SELECT查询测试）。测试完毕后，重新插入网线即可。<br />
如果你接触不到物理服务器，也就是说不能拔掉网线，那也可以这样测试：在Server1或Server2上：<br />
 # ps aux | grep ndbd<br />
将会看到所有ndbd进程信息：<br />
 root      5578  0.0  0.3  6220 1964 ?        S    03:14   0:00 ndbd<br />
 root      5579  0.0 20.4 492072 102828 ?     R    03:14   0:04 ndbd<br />
 root     23532  0.0  0.1  3680  684 pts/1    S    07:59   0:00 grep ndbd<br />
然后杀掉一个ndbd进程以达到破坏MySQL集群服务器的目的：<br />
 # kill -9 5578 5579<br />
之后在另一台集群服务器上使用SELECT查询测试。并且在管理节点服务器的管理终端中执行show命令会看到被破坏的那台服务器的状态。<br />
测试完成后，只需要重新启动被破坏服务器的ndbd进程即可：<br />
 # ndbd<br />
注意！前面说过，此时是不用加&#8211;inital参数的！<br />
至此，MySQL集群就配置完成！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/674.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>apache2.0.x+mysql4.0.x+php5.0.x+solaris 9.0+proftpd1.2.x</title>
		<link>http://www.evanjiang.net.cn/archives/646.html</link>
		<comments>http://www.evanjiang.net.cn/archives/646.html#comments</comments>
		<pubDate>Mon, 02 Mar 2009 10:39:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[ftp]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[sun unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[soaris 安装 apache mysql php proftpd]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=646</guid>
		<description><![CDATA[<p>solaris下提供一个pkgadd的工具，它特别容易安装，对菜鸟来说非常方便，所谓AMPSP就是apache2.0.x+mysql4.0.x+php5.0.x+solaris 9.0+proftpd1.2.x.
首先当然有一个solaris9.0的系统，安装solaris就不用说吧，我装的是u7，安装时候用root安装，我用的是SUN的默认sh.
# uname -a
SunOS bad.com 5.9 Generic_117171-07 sun4u sparc SUNW,Ultra-5_10
看一下root的环境变量，如果不是下面的，可以在/etc/profile下面进行修改
# env
HOME=/
HZ=100
LOGNAME=root
MAIL=/var/mail/root
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/etc:/usr/local/bin:/usr/local/sbin
SHELL=/sbin/sh
TERM=ansi
TZ=PRC
在安装AMPSP前，必须安装一些EIS，下面的软件可以在www.sunfreeware.com的网站上可以下到，按你的系统下载安装包，我的系统是sparc的，所以下的也是for sparc的安装包，我们先建一个backup的目录，将下来的软件放到这个目录下，软件列表如下：
gcc-3.4.2-sol9-sparc-local.gz
db-4.2.52.NC-sol9-sparc-local.gz
expat-1.95.5-sol9-sparc-local.gz
libgcc-3.3-sol9-sparc-local.gz
libiconv-1.8-sol9-sparc-local.gz
libxml2-2.6.16-sol9-sparc-local.gz
libxslt-1.1.2-sol9-sparc-local.gz
ncurses-5.4-sol9-sparc-local.gz
zlib-1.2.2-sol9-sparc-local.gz
pcre-4.5-sol9-sparc-local.gz
在安装AMPSP前先安装这些，一点要注意的，gcc和libgcc这两个包的版本号不要太高，我在安装的时候，版本太高装不，用pkgadd命令安装：
#gunzip gcc-3.4.2-sol9-sparc-local.gz
#pkgadd –d gcc-3.4.2-sol9-sparc-local
安完以上的，接下来就可以安装AMPSP，下载并CP到/backup下：
apache-2.0.53-sol9-sparc-local.gz
mysql-4.0.21-sol9-sparc-local.gz
php-5.0.2-sol9-sparc-local.gz
proftpd-1.2.10rc1-sol9-sparc-local.gz

MYSQL的安装
创建运行mysql的用户
#cd /backup
# groupadd mysql
# useradd -g mysql mysql
安装mysql的安装包
#gunzip mysql-4.0.21-sol9-sparc-local.gz
#pkgadd –d mysql-4.0.21-sol9-sparc-local
安装完后，在/usr/local/下多一个mysql的目录，我们对它进行设置
#cd /usr/local/mysql
#cd scripts
#./mysql_install_db –user=mysql
#chown –R root /usr/local/mysql
#chgrp –R mysql /usr/local/mysql
#cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf
试运行一个mysql服务；
#cd /usr/local/mysql/bin
#./mysqld_safe –user=mysql&#038;
如果没出错误错的话，就说明成功，如果出现：
Starting mysqld daemon with databases from /usr/local/mysql/var
STOPPING server from pid file /usr/local/mysql/var/bad.com.pid
050407 01:44:15 mysqld ended
说明没有成功，看/usr/local/mysql/var/bad.com.err,这个错误可以用
#chown mysql:mysql /usr/local/mysql/var/mysql解决（我刚开的时候就是因为这个，弄半天没装好。








试一个mysql是不是可用
# ./mysql [...]]]></description>
			<content:encoded><![CDATA[<p>solaris下提供一个pkgadd的工具，它特别容易安装，对菜鸟来说非常方便，所谓AMPSP就是apache2.0.x+mysql4.0.x+php5.0.x+solaris 9.0+proftpd1.2.x.<br />
首先当然有一个solaris9.0的系统，安装solaris就不用说吧，我装的是u7，安装时候用root安装，我用的是SUN的默认sh.<br />
# uname -a<br />
SunOS bad.com 5.9 Generic_117171-07 sun4u sparc SUNW,Ultra-5_10<br />
看一下root的环境变量，如果不是下面的，可以在/etc/profile下面进行修改<br />
# env<br />
HOME=/<br />
HZ=100<br />
LOGNAME=root<br />
MAIL=/var/mail/root<br />
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/etc:/usr/local/bin:/usr/local/sbin<br />
SHELL=/sbin/sh<br />
TERM=ansi<br />
TZ=PRC<br />
在安装AMPSP前，必须安装一些EIS，下面的软件可以在www.sunfreeware.com的网站上可以下到，按你的系统下载安装包，我的系统是sparc的，所以下的也是for sparc的安装包，我们先建一个backup的目录，将下来的软件放到这个目录下，软件列表如下：<br />
gcc-3.4.2-sol9-sparc-local.gz<br />
db-4.2.52.NC-sol9-sparc-local.gz<br />
expat-1.95.5-sol9-sparc-local.gz<br />
libgcc-3.3-sol9-sparc-local.gz<br />
libiconv-1.8-sol9-sparc-local.gz<br />
libxml2-2.6.16-sol9-sparc-local.gz<br />
libxslt-1.1.2-sol9-sparc-local.gz<br />
ncurses-5.4-sol9-sparc-local.gz<br />
zlib-1.2.2-sol9-sparc-local.gz<br />
pcre-4.5-sol9-sparc-local.gz<br />
在安装AMPSP前先安装这些，一点要注意的，gcc和libgcc这两个包的版本号不要太高，我在安装的时候，版本太高装不，用pkgadd命令安装：<br />
#gunzip gcc-3.4.2-sol9-sparc-local.gz<br />
#pkgadd –d gcc-3.4.2-sol9-sparc-local<br />
安完以上的，接下来就可以安装AMPSP，下载并CP到/backup下：<br />
apache-2.0.53-sol9-sparc-local.gz<br />
mysql-4.0.21-sol9-sparc-local.gz<br />
php-5.0.2-sol9-sparc-local.gz<br />
proftpd-1.2.10rc1-sol9-sparc-local.gz<br />
<span id="more-646"></span><br />
MYSQL的安装<br />
创建运行mysql的用户<br />
#cd /backup<br />
# groupadd mysql<br />
# useradd -g mysql mysql<br />
安装mysql的安装包<br />
#gunzip mysql-4.0.21-sol9-sparc-local.gz<br />
#pkgadd –d mysql-4.0.21-sol9-sparc-local<br />
安装完后，在/usr/local/下多一个mysql的目录，我们对它进行设置<br />
#cd /usr/local/mysql<br />
#cd scripts<br />
#./mysql_install_db –user=mysql<br />
#chown –R root /usr/local/mysql<br />
#chgrp –R mysql /usr/local/mysql<br />
#cp /usr/local/mysql/share/mysql/my-medium.cnf /etc/my.cnf<br />
试运行一个mysql服务；<br />
#cd /usr/local/mysql/bin<br />
#./mysqld_safe –user=mysql&#038;<br />
如果没出错误错的话，就说明成功，如果出现：<br />
Starting mysqld daemon with databases from /usr/local/mysql/var<br />
STOPPING server from pid file /usr/local/mysql/var/bad.com.pid<br />
050407 01:44:15 mysqld ended<br />
说明没有成功，看/usr/local/mysql/var/bad.com.err,这个错误可以用<br />
#chown mysql:mysql /usr/local/mysql/var/mysql解决（我刚开的时候就是因为这个，弄半天没装好。<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
试一个mysql是不是可用<br />
# ./mysql -u root -p<br />
Enter password 密码为空)<br />
Welcome to the MySQL monitor.  Commands end with ; or \g.<br />
Your MySQL connection id is 1 to server version: 4.0.21-log</p>
<p>Type &#8216;help;&#8217; or &#8216;\h&#8217; for help. Type &#8216;\c&#8217; to clear the buffer.</p>
<p>mysql>; show databases;<br />
+&#8212;&#8212;&#8212;-+<br />
| Database |<br />
+&#8212;&#8212;&#8212;-+<br />
| mysql    |<br />
| test     |<br />
+&#8212;&#8212;&#8212;-+<br />
2 rows in set (0.06 sec)</p>
<p>mysql>;quit<br />
Bye<br />
#<br />
如果想让mysql开机自动运行，可以如下设置：<br />
#cp /usr/local/mysql/share/mysql/mysql.server  /etc/init.d/mysql<br />
#ln /etc/init.d/mysql /etc/rc3.d/S99mysql<br />
#ln /etc/init.d/mysql /etc/rc3.d/K01mysql</p>
<p>APACHE的安装</p>
<p>Apache的安装<br />
#cd /backup<br />
#gunzip apache-2.0.53-sol9-sparc-local.gz<br />
#pkgadd –d apache-2.0.53-sol9-sparc-local<br />
这样就安装好，接下来修改apache的配置文件<br />
#cd /usr/local/apache2<br />
#cd conf<br />
#vi httpd.conf<br />
这里没有什么改的，，只要将：<br />
Group #-1<br />
改成：<br />
Group nobody</p>
<p>测试服务器<br />
#/usr/local/apache2/bin/apachectl start<br />
这个你就可以在IE里防问，http://IP</p>
<p>设置自起动，和mysql差不多：<br />
#cp /usr/local/apache2/bin/apachectl /etc/init.d/httpd<br />
#ln /etc/init.d/httpd /etc/rc3.d/S99httpd<br />
#ln /etc/init.d/httpd /etc/rc3.d/K01httpd</p>
<p>安装PHP</p>
<p>安装PHP<br />
#cd /backup<br />
#gunzip php-5.0.2-sol9-sparc-local.gz<br />
#pkgadd –d php-5.0.2-sol9-sparc-local<br />
#cp /usr/local/php/doc/php/php.ini-dist /usr/local/lib/php.ini</p>
<p>修改apache，使它支持php<br />
#cd /usr/local/apache2/conf<br />
#vi httpd.conf<br />
在AddType后面加入：<br />
AddType application/x-httpd-php .php<br />
在loadModule后面加入：<br />
LoadModule php5_module modules/libphp5.so<br />
然后保存关退出其不意<br />
再测试一个apache是否可用<br />
#/usr/local/apache2/bin/apachectl restart</p>
<p>PROFTPD安装</p>
<p>因为solaris自带的ftp不怎么好用，，所以改用proftp来代替，proftp安装；<br />
#cd /backup<br />
#gunzip proftpd-1.2.10rc1-sol9-sparc-local.gz<br />
#pkgadd –d proftpd-1.2.10rc1-sol9-sparc-local</p>
<p>配置proftp</p>
<p>新建用户和用户组，给proftp使用<br />
#groupadd –g 100 webmaster<br />
#useradd –u 1234 –g webmaster –d /usr/local/apache2/htdocs –s /bin/false webmaster<br />
#cd /usr/local/etc<br />
#vi proftpd.conf<br />
我们去掉一些不必要，，然后就行，我将我的FTP设置给大家看看，<br />
# cat proftpd.conf<br />
ServerName      &#8220;bad&#8217;s server!&#8221;   //ftp的名字<br />
ServerType      standalone   //ftp是独立运行，<br />
DefaultServer   on<br />
Port    21<br />
Umask   022<br />
MaxInstances    30<br />
User    webmaster                //只允许webmaster<br />
Group   webmaster<br />
MaxLoginAttempts       10<br />
MaxClientsPerHost       2<br />
MaxClients      20             //最大用户数<br />
DirFakeUser On webmaster<br />
DirFakeGroup On webmaster<br />
DisplayLogin welcome.msg<br />
DeferWelcome On<br />
SystemLog /var/log/proftpd.log     //proftpd的目志文件<br />
ServerIdent OFF<br />
RequireValidShell off    //没用shell的用户可以进入<br />
AllowRetrieveRestart on   //支持继传功能<br />
AllowStoreRestart on<br />
TimeoutIdle 300</p>
<p>DefaultRoot ~ webmaster</p>
<p><Directory /usr/local/apache2/htdocs >;   //webmaster对/usr/local/apache2/htdocs有管理权限<br />
  <Limit WRITE>;<br />
  Order deny,allow<br />
  AllowUser webmaster<br />
  </Limit>;<br />
</Directory>;</p>
<p>Proftp自起动<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
Proftp没有自带的起动文件，，可以自己写一个，内空如下：<br />
# cat proftpd</p>
<p>#!/sbin/sh<br />
#<br />
#Copyringht badb0y<br />
#All rights reserved.<br />
#<br />
if [ -x /usr/local/sbin/proftpd ]; then<br />
/usr/local/sbin/proftpd<br />
echo &#8220;proftpd startup..&#8221;<br />
fi</p>
<p>#cp proftpd /etc/init.d/proftpd<br />
#chmod 777 /etc/init.d/proftpd<br />
#ln /etc/init.d/proftpd /etc/rc3.d/S99proftdd<br />
#ln /etc/init.d/proftpd /etc/rc3.d/K01proftpd</p>
<p>到这里AMPSP就安装完成，，mysql的管理可以用phpMyAdmin实现.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/646.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubuntu8.10常用桌面应用软件以及网站开发应用环境</title>
		<link>http://www.evanjiang.net.cn/archives/584.html</link>
		<comments>http://www.evanjiang.net.cn/archives/584.html#comments</comments>
		<pubDate>Wed, 25 Feb 2009 14:05:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[debian linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[utunbu8.10 常用应用软件 网站开发应用环境  开发]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=584</guid>
		<description><![CDATA[<p>一、基础系统配置</p>
<p>1.安装ubuntu8.10就不讲，网上太多资料</p>
<p>2.配置源（我在杭州当然也就用杭州的源）</p>
<p>sudo cp /etc/apt/sources.list ~</p>
<p>sudo gedit /etc/apt/sources.list</p>
<p>把你要用的源考进去，保存即可</p>
<p>3.更新软件包列表</p>
<p>sudo apt-get update</p>
<p>4.安装系统更新 </p>
<p>打开“系统->系统管理->更新管理器”，安装更新。完成后若系统提示重新启动，请重新启动系统。

5.设置中文环境</p>
<p>单击主菜单中的“系统(System) &#8211;> 系统管理(Administration) &#8211;> 语言支持(language support)”。</p>
<p>在“支持的语言”列表中找到“汉语（Chinese）”，在右端打上勾。同时将默认语言修改为“汉语 （Chinese）”并勾选“启用复杂字符输入支持（Enable support to enter complex characters）”， 点击确定按钮。</p>
<p>Ubuntu 这时会下载并安装语言包。安装完毕之后，你注销重新登录后，界面变为中文。

6.设置文档查看器 Evince 的中文支持</p>
<p>sudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional poppler-data</p>
<p>7.安装硬件驱动</p>
<p>打开 “系统->系统管理->硬件驱动”。Ubuntu 自动开始查找可用驱动程序，选中你需要启用的硬件 驱动程序（如显卡驱动），Ubuntu将自动为你安装。完装完成后，请按系统提示重启操作系统。 </p>
<p>8.多媒体应用环境设置</p>
<p>Gstreamer多媒体引擎解码器</p>
<p>sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-pitfdll gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-esd</p>
<p>配置电影播放器</p>
<p>sudo apt-get remove totem-mozilla -y</p>
<p>sudo apt-get install smplayer smplayer-themes mozilla-mplayer libmatroska0</p>
<p>配置音乐播放器</p>
<p>sudo apt-get install gstreamer0.10-fluendo-mpegdemux [...]]]></description>
			<content:encoded><![CDATA[<p>一、基础系统配置</p>
<p>1.安装ubuntu8.10就不讲，网上太多资料</p>
<p>2.配置源（我在杭州当然也就用杭州的源）</p>
<p>sudo cp /etc/apt/sources.list ~</p>
<p>sudo gedit /etc/apt/sources.list</p>
<p>把你要用的源考进去，保存即可</p>
<p>3.更新软件包列表</p>
<p>sudo apt-get update</p>
<p>4.安装系统更新 </p>
<p>打开“系统->系统管理->更新管理器”，安装更新。完成后若系统提示重新启动，请重新启动系统。<br />
<span id="more-584"></span><br />
5.设置中文环境</p>
<p>单击主菜单中的“系统(System) &#8211;> 系统管理(Administration) &#8211;> 语言支持(language support)”。</p>
<p>在“支持的语言”列表中找到“汉语（Chinese）”，在右端打上勾。同时将默认语言修改为“汉语 （Chinese）”并勾选“启用复杂字符输入支持（Enable support to enter complex characters）”， 点击确定按钮。</p>
<p>Ubuntu 这时会下载并安装语言包。安装完毕之后，你注销重新登录后，界面变为中文。<br />
<!more--><br />
6.设置文档查看器 Evince 的中文支持</p>
<p>sudo apt-get install xpdf-chinese-simplified xpdf-chinese-traditional poppler-data</p>
<p>7.安装硬件驱动</p>
<p>打开 “系统->系统管理->硬件驱动”。Ubuntu 自动开始查找可用驱动程序，选中你需要启用的硬件 驱动程序（如显卡驱动），Ubuntu将自动为你安装。完装完成后，请按系统提示重启操作系统。 </p>
<p>8.多媒体应用环境设置</p>
<p>Gstreamer多媒体引擎解码器</p>
<p>sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-pitfdll gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gstreamer0.10-esd</p>
<p>配置电影播放器</p>
<p>sudo apt-get remove totem-mozilla -y</p>
<p>sudo apt-get install smplayer smplayer-themes mozilla-mplayer libmatroska0</p>
<p>配置音乐播放器</p>
<p>sudo apt-get install gstreamer0.10-fluendo-mpegdemux gstreamer0.10-gnonlin libasound2-plugins</p>
<p>安装flash支持，到官方下载install_flash_player_10_linux.deb（目前的最新版本）</p>
<p>9.设置工具软件 </p>
<p>安装腾讯QQ,至腾讯官方网站下载 deb软件包，双击即可安装</p>
<p>安装压缩工具</p>
<p>sudo apt-get install unrar p7zip-full cabextract</p>
<p>安装下载工具（MultiGet），到官方下载deb包，点击安装即可</p>
<p>安装chm阅读器</p>
<p>sudo apt-get install chmsee<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
安装星际译王辞典（到官方下载你需要的词典），把下载的文件解压后拷贝到/usr/share/stardict/dic 目录下即可（也可以用此命令sudo mv 你解压的文件目录 /usr/share/stardict/dic）</p>
<p>10.安装openoffice3.0</p>
<p>1).卸载老版本的openoffice</p>
<p>sudo apt-get remove openoffice.org*</p>
<p>2).解压下载的OOo_3.0.0_LinuxIntel_install_zh-cn_deb.tar.gz包</p>
<p>3).进入解压后的文件目录</p>
<p>cd /home/yangbo/OOO300_m9_native_packed-1_zh-CN.9358/DEBS</p>
<p>4).sudo dpkg -i *.deb</p>
<p>5). 双击安装/OOO300_m9_native_packed-1_zh-CN.9358/DEBS/desktop-integration/下的deb 文件，就ok！</p>
<p>11.由于我较喜欢使用ibus输入法（所以就安装之，不需要的用户可以省去这一步），到</p>
<p>http://archive.ubuntu.org.cn/ubuntu-cn/dists/intrepid/main/binary-i386/ibus/</p>
<p>下载python-dbus_0.83.0-1_i386.deb</p>
<p>ibus_0.1.1.20081106-1_i386.deb</p>
<p>ibus-pinyin_0.1.1.20081106-1_i386.deb</p>
<p>ibus-table_0.1.1.20081106-1_i386.deb</p>
<p>按照下载的顺序安装，由于我不使用五笔，最后一个文件没有安装</p>
<p>然后使用 sudo im-switch -c 选择ibus输入法。重启系统后就可使用</p>
<p>二、开发工具配置</p>
<p>1.Java安装配置</p>
<p>sudo apt-get install sun-java6-jdk</p>
<p>如果之前你没有安装其他版本的java，就不需要设置，否则请参考（http://wiki.ubuntu.org.cn/index.php?title=Java%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE&#038;variant=zh-cn）</p>
<p>java中文支持（或乱码的解决）：java程序是跨平台的，但需要解决中文支持问题。</p>
<p>方法很简单，就是在java安装目录下放进去一个中文字体即可。</p>
<p>cd /usr/lib/jvm/java-6-sun/jre/lib/fonts</p>
<p>sudo mkdir fallback</p>
<p>cd fallback</p>
<p>sudo ln -s /usr/share/fonts/truetype/wqy/wqy-zenhei.ttf(把某个中文字体链接进 fallback 目录，我选了最新的文泉驿夸父字体)</p>
<p>sudo mkfontdir</p>
<p>sudo mkfontscale</p>
<p>2.安装NetBeans</p>
<p>到官方下载（最新版本为6.5），下载后的文件为*.sh文件</p>
<p>用如下命令安装：sudo ./(文件名).sh，按提示即可（可以选择安装目录，我选择opt目录下）</p>
<p>3.安装tomcat，eclipse都很简单，把下载后的文件解压后放到opt目录即可（建立eclipse的快捷方式不用我说了吧）</p>
<p>4.安装数据库</p>
<p>安装 MySQL（可以参考http://wiki.ubuntu.org.cn/index.php?title=MySQL%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97&#038;variant=zh-cn）</p>
<p>sudo apt-get install mysql-server mysql-client</p>
<p>配置MySQL编码</p>
<p>sudo gedit /etc/mysql/my.cnf</p>
<p>在如下位置添加</p>
<p>[client]</p>
<p>default-character-set=utf8</p>
<p>[mysqld]</p>
<p>default-character-set=utf8</p>
<p>init_connect=&#8217;SET_NAMES_utf8&#8242;<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
安装Oracle xe 10g（到官方下载oracle-xe-universal_10.2.0.1-1.0_i386.deb包，可以参考http://hi.baidu.com/colleage/blog/item/e9dc208d2e4d2115b21bba45.html安装）</p>
<p>5.安装apache2和PHP支持</p>
<p>sudo apt-get install apache2 </p>
<p>sudo apt-get install libapache2-mod-php5</p>
<p>sudo apt-get install php5 php5-gd php5-mysql</p>
<p>6.安装phpmyadmin</p>
<p>sudo apt-get install phpmyadmin</p>
<p>可能还需要安装php5-mcrypt</p>
<p>sudo apt-get install php5-mcrypt</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/584.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql Cluster: The definitive HOWTO</title>
		<link>http://www.evanjiang.net.cn/archives/416.html</link>
		<comments>http://www.evanjiang.net.cn/archives/416.html#comments</comments>
		<pubDate>Tue, 17 Feb 2009 17:16:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql cluster]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=416</guid>
		<description><![CDATA[<p>Mysql Cluster: Two webserver setup (three servers required for true redundancy)
HOWTO set up a mysql cluster for two servers
Introduction</p>
<p>This HOWTO was designed for a classic setup of two servers behind a loadbalancer. The aim is to have true redundancy &#8211; either server can be unplugged and yet the site will remain up.
Notes</p>
<p>You MUST have a [...]]]></description>
			<content:encoded><![CDATA[<p>Mysql Cluster: Two webserver setup (three servers required for true redundancy)<br />
HOWTO set up a mysql cluster for two servers<br />
Introduction</p>
<p>This HOWTO was designed for a classic setup of two servers behind a loadbalancer. The aim is to have true redundancy &#8211; either server can be unplugged and yet the site will remain up.<br />
Notes</p>
<p>You MUST have a third server as a managment node but this can be shut down after the cluster starts. Also note that I do not recommend shutting down the managment server (see the extra notes at the bottom of this document for more information). You can not run a mysql cluster with just two servers And have true redundancy.<br />
<span id="more-416"></span><br />
Although it is possible to set the cluster up on two physical servers you WILL NOT GET the ability to &#8220;kill&#8221; one server and for the cluster to continue as normal. For this you need a third server running the managment node.</p>
<p>I am going to talk about three servers,</p>
<p>mysql1.domain.com 192.168.0.1<br />
mysql2.domain.com 192.168.0.2<br />
mysql3.domain.com 192.168.0.3</p>
<p>Servers 1 and 2 will be the two that end up &#8220;clustered&#8221;. This would be perfect for two servers behind a loadbalancer or using round robin DNS and is a good replacement for replication. Server 3 needs to have only minor changes made to it and does NOT require a mysql install. It can be a low-end machine and can be carrying out other tasks.</p>
<p>STAGE 1: Install mysql on the first two servers:</p>
<p>Complete the following steps on both mysql1 and mysql2:</p>
<p>cd /usr/local/<br />
http://dev.mysql.com/get/Downloa &#8230; ux-gnu-i686.tar.gz/<br />
from/http://www.signal42.com/mirrors/mysql/<br />
groupadd mysql<br />
useradd -g mysql mysql<br />
tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
ln -s mysql-max-4.1.9-pc-linux-gnu-i686 mysql<br />
cd mysql<br />
scripts/mysql_install_db &#8211;user=mysql<br />
chown -R root  .<br />
chown -R mysql data<br />
chgrp -R mysql .<br />
cp support-files/mysql.server /etc/rc.d/init.d/<br />
chmod +x /etc/rc.d/init.d/mysql.server<br />
chkconfig &#8211;add mysql.server</p>
<p>Do not start mysql yet.<br />
STAGE 2: Install and configure the managment server</p>
<p>You need the following files from the bin/ of the mysql directory: ndb_mgm and ndb_mgmd. Download the whole mysql-max tarball and extract them from the bin/ directory.<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
mkdir /usr/src/mysql-mgm<br />
cd /usr/src/mysql-mgm<br />
http://dev.mysql.com/get/Downloa &#8230; ux-gnu-i686.tar.gz/<br />
from/http://www.signal42.com/mirrors/mysql/<br />
tar -zxvf mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
rm mysql-max-4.1.9-pc-linux-gnu-i686.tar.gz<br />
cd mysql-max-4.1.9-pc-linux-gnu-i686<br />
mv bin/ndb_mgm .<br />
mv bin/ndb_mgmd .<br />
chmod +x ndb_mg*<br />
mv ndb_mg* /usr/bin/<br />
cd<br />
rm -rf /usr/src/mysql-mgm</p>
<p>You now need to set up the config file for this managment:</p>
<p>mkdir /var/lib/mysql-cluster<br />
cd /var/lib/mysql-cluster<br />
vi [or emacs or any other editor] config.ini</p>
<p>Now, insert the following (changing the bits as indicated):</p>
<p>[NDBD DEFAULT]<br />
NoOfReplicas=2<br />
[MYSQLD DEFAULT]<br />
[NDB_MGMD DEFAULT]<br />
[TCP DEFAULT]<br />
# Managment Server<br />
[NDB_MGMD]<br />
HostName=192.168.0.3# the IP of THIS SERVER<br />
# Storage Engines<br />
[NDBD]<br />
HostName=192.168.0.1# the IP of the FIRST SERVER<br />
DataDir= /var/lib/mysql-cluster<br />
[NDBD]<br />
HostName=192.168.0.2# the IP of the SECOND SERVER<br />
DataDir=/var/lib/mysql-cluster<br />
# 2 MySQL Clients<br />
# I personally leave this blank to allow rapid changes of the mysql clients;<br />
# you can enter the hostnames of the above two servers here. I suggest you dont.<br />
[MYSQLD]<br />
[MYSQLD]</p>
<p>Now, start the managment server:</p>
<p>ndb_mgmd</p>
<p>This is the mysql managment server, not maganment console. You should therefore not expect any output (we will start the console later).<br />
STAGE 3: Configure the storage/SQL servers and start mysql</p>
<p>On each of the two storage/SQL servers (192.168.0.1 and 192.168.0.2) enter the following (changing the bits as appropriate):</p>
<p>vi /etc/my.cnf</p>
<p>Enter i to go to insert mode again and insert this on both servers (changing the IP address to the IP of the managment server that you set up in stage 2):</p>
<p>[mysqld]<br />
ndbcluster<br />
ndb-connectstring=192.168.0.3# the IP of the MANAGMENT (THIRD) SERVER<br />
[mysql_cluster]<br />
ndb-connectstring=192.168.0.3# the IP of the MANAGMENT (THIRD) SERVER</p>
<p>Now, we make the data directory and start the storage engine:</p>
<p>mkdir /var/lib/mysql-cluster<br />
cd /var/lib/mysql-cluster<br />
/usr/local/mysql/bin/ndbd &#8211;initial<br />
/etc/rc.d/init.d/mysql.server start</p>
<p>If you have done one server now go back to the start of stage 3 and repeat exactly the same procedure on the second server.<br />
NOTE that you should ONLY use &#8211;initial if you are either starting from scratch or have changed the config.ini file on the managment.<br />
STAGE 4: Check its working</p>
<p>You can now return to the managment server (mysql3) and enter the managment console:</p>
<p>/usr/local/mysql/bin/ndb_mgm</p>
<p>Enter the command SHOW to see what is going on. A sample output looks like this:</p>
<p>[root@mysql3 mysql-cluster]# /usr/local/mysql/bin/ndb_mgm<br />
&#8211; NDB Cluster &#8212; Management Client &#8211;<br />
ndb_mgm>; show<br />
Connected to Management Server at: localhost:1186<br />
Cluster Configuration<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;<br />
[ndbd(NDB)]     2 node(s)<br />
id=2    @192.168.0.1  (Version: 4.1.9, Nodegroup: 0, Master)<br />
id=3    @192.168.0.2  (Version: 4.1.9, Nodegroup: 0)</p>
<p>[ndb_mgmd(MGM)] 1 node(s)<br />
id=1    @192.168.0.3  (Version: 4.1.9)</p>
<p>[mysqld(API)]   2 node(s)<br />
id=4   (Version: 4.1.9)<br />
id=5   (Version: 4.1.9)</p>
<p>ndb_mgm>;</p>
<p>If you see </p>
<p>not connected, accepting connect from 192.168.0.[1/2/3]</p>
<p>in the first or last two lines they you have a problem. Please email me with as much detail as you can give and I can try to find out where you have gone wrong and change this HOWTO to fix it.</p>
<p>If you are OK to here it is time to test mysql. On either server mysql1 or mysql2 enter the following commands: Note that we have no root password yet.</p>
<p>mysql<br />
use test;<br />
CREATE TABLE ctest (i INT) ENGINE=NDBCLUSTER;<br />
INSERT INTO ctest () VALUES (1);<br />
SELECT * FROM ctest;</p>
<p>You should see 1 row returned (with the value 1).</p>
<p>If this works, now go to the other server and run the same SELECT and see what you get. Insert from that host and go back to host 1 and see if it works. If it works then congratulations.</p>
<p>The final test is to kill one server to see what happens. If you have physical access to the machine simply unplug its network cable and see if the other server keeps on going fine (try the SELECT query). If you dont have physical access do the following:</p>
<p>ps aux | grep ndbd</p>
<p>You get an output like this:</p>
<p>root      5578  0.0  0.3  6220 1964 ?        S    03:14   0:00 ndbd<br />
root      5579  0.0 20.4 492072 102828 ?     R    03:14   0:04 ndbd<br />
root     23532  0.0  0.1  3680  684 pts/1    S    07:59   0:00 grep ndbd</p>
<p>In this case ignore the command &#8220;grep ndbd&#8221; (the last line) but kill the first two processes by issuing the command kill -9 pid pid:</p>
<p>kill -9 5578 5579</p>
<p>Then try the select on the other server. While you are at it run a SHOW command on the managment node to see that the server has died. To restart it, just issue</p>
<p>ndbd</p>
<p>NOTE no &#8211;inital!<br />
Further notes about setup</p>
<p>I strongly recommend that you read all of this (and bookmark this page). It will almost certainly save you a lot of searching.<br />
The Managment Server</p>
<p>I strongly recommend that you do not stop the managment server once it has started. This is for several resons:<br />
The server takes hardly any server resources<br />
If a cluster falls over, you want to be able to just ssh in and type ndbd to stat it. You dont want to have to start messing around with another server<br />
If you want to take backups then you need the managment server up<br />
The cluster log is sent to the management server so to check what is going on in the cluster or has happened since last this is an important tool<br />
All commands from the ndb_mgm client is sent to the management server and thus no management commands without management server.<br />
The managment server is required in case of cluster reconfiguration (crashed server or network split). In the case that it is not running, &#8220;split-brain&#8221; scenario will occure. The management server arbitration role is required for this type of setup to provide better fault tollerance. </p>
<p>However you are welcome to stop the server if you prefer.<br />
Starting and stopping ndbd automatically on boot</p>
<p>To achieve this, do the following on both mysql1 and mysql2:</p>
<p>echo &#8220;ndbd&#8221; >; /etc/rc.d/init.d/ndbd<br />
chmod +x /etc/rc.d/init.d/ndbd<br />
chkconfig &#8211;add ndbd</p>
<p>Note that this is a really quick script. You ought really to write one that at least checks if ndbd is already started on the machine.<br />
Use of hostnames</p>
<p>You will note that I have used IP addresses exclusively throught this setup. This is because using hostnames simply increases the number of things that can go wrong. Mikael Ronstr�m of MySQL AB kindly explains: &#8220;Hostnames certainly work with MySQL Cluster. But using hostnames introduces quite a few error sources since a proper DNS lookup system must be set-up, sometimes /etc/hosts must be edited and their might be security blocks ensuring that communication between certain machines is not possible other than on certain ports&#8221;. I strongly suggest that while testing you use IP addresses if you can, then once it is all working change to hostnames.<br />
RAM</p>
<p>Use the following formula to work out the amount of RAM that you need on each storage node:</p>
<p>(Size of database * NumberofReplicas * 1.1) / Number of storage nodes</p>
<p>NumberofReplicas is set to two by default. You can change it in config.ini if you want. So for example to run a 4GB database you need just under 9GB of RAM on each storage node. For the SQL nodes and managment nodes you dont need much RAM at all.</p>
<p>Note: A lot of people have emailed me querying the maths above! Remember that the cluster is fault tollerant, and each piece of data is stored on at least 2 nodes. (2 by default, as set by NumberOfReplicas). So you need TWICE the space you would need just for one copy, multiplied by 1.1 for overhead.<br />
Adding storage nodes</p>
<p>If you decide to add storage nodes, bear in mind that 3 is not an optimal numbers. If you are going to move from two (above) then move to 4.<br />
Adding SQL nodes</p>
<p>If you want to add another SQL node (i.e. you have another server that you want to add to the cluster but you dont need it to act as a storage node), then just add the following to /etc/my.cnf on the server (it must be a mysql-max server):</p>
<p>[mysqld]<br />
ndbcluster<br />
ndb-connectstring=192.168.0.3# the IP of the MANAGMENT (THIRD) SERVER<br />
[mysql_cluster]<br />
ndb-connectstring=192.168.0.3# the IP of the MANAGMENT (THIRD) SERVER</p>
<p>Then you need to make sure that there is another [MYSQLD] line at the end of config.ini on the managment server. Restart the cluster (see below for an important note) and restart mysql on the new API. It should be connected.<br />
Important note on changing config.ini<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
If you ever change config.ini you must stop the whole cluster and restart it to re-read the config file. Stop the cluster with a SHUTDOWN command to the ndb_mgm package on the managment server and then restart all the storage nodes.</p>
<p>Some useful configuration options that you will need if you have large tables:</p>
<p>DataMemory: defines the space available to store the actual records in the database. The entire DataMemory will be allocated in memory so it is important that the machine contains enough memory to handle the DataMemory size. Note that DataMemory is also used to store ordered indexes. Ordered indexes uses about 10 bytes per record. Default: 80MB<br />
IndexMemory The IndexMemory is the parameter that controls the amount of storage used for hash indexes in MySQL Cluster. Hash indexes are always used for primary key indexes, unique indexes, and unique constraints. Default: 18MB<br />
MaxNoOfAttributes This parameter defines the number of attributes that can be defined in the cluster. Default: 1000<br />
MaxNoOfTables Obvious (bear in mind that each BLOB field creates another table for various reasons so take this into account). Default: 128</p>
<p>View this page at mysql.com for further information about the things you can put in the [NDBD] section of config.ini<br />
A note about security</p>
<p>MySQL cluster is not secure. By default anyone can connect to your managment server and shut the whole thing down. I suggest the following precautions:<br />
Install APF and block all ports except those you use (do NOT include any MySQL cluster ports). Add the IPs of your cluster machines to the /etc/apf/allow_hosts file.<br />
Run MySQL cluster over a second network card on a second, isolated, network.<br />
Other resources</p>
<p>I found the following resources very useful:<br />
The MySQL cluster documentation. This is gradually being reworked. I would, however, suggest that you at least read these pages:<br />
On-line Backup of MySQL Cluster.<br />
Defining MySQL Cluster Storage Nodes for information that you will need to allow for bigger database memory or a larger number of tables, indexes, unique indexes<br />
MySQL Cluster mailing list.<br />
Google.<br />
MySQL Forums<br />
The #mysql IRC chanel on freenode and EFNet. If you need a free (open source) IRC client I recomment Bersirc.<br />
Thanks</p>
<p>I must thank several others who have contributed to this: Mikael Ronstr�m from MySQL AB for helping me to get this to work and spotting my silly mistake right at the end, Lewis Bergman for proof-reading this page and pointing out some improvements, as well as suffering the frustration with me and Martin Pala for explaining the final reason to keep the managment server up as well as a few other minor changes. Thanks also to Terry from Advanced Network Hosts who paid me to set a cluster up and at the same time produce a HOWTO.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/416.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ubutu8.10 安装 apache php mysql 实录</title>
		<link>http://www.evanjiang.net.cn/archives/389.html</link>
		<comments>http://www.evanjiang.net.cn/archives/389.html#comments</comments>
		<pubDate>Sun, 15 Feb 2009 11:30:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[debian linux]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[ubutu 安装 apache php mysql]]></category>

		<guid isPermaLink="false">http://www.evanjiang.net.cn/?p=389</guid>
		<description><![CDATA[<p>ubuntu 安装AMP环境的笔记 Prefork方式与fast-cgi方式</p>
<p>     具体步骤如下: </p>
<p>     系统:ubuntu 8.10 的发行版本 </p>
<p>     AMP with Prefork(mod-php5) </p>
<p>      一、安装APACHE2 </p>
<p>     # sudo  apt-get  install  apache2  apache2-mpm-prefork </p>
<p>     这样APACHE部分就完成，默认目录是 /var/www </p>
<p>  [...]]]></description>
			<content:encoded><![CDATA[<p>ubuntu 安装AMP环境的笔记 Prefork方式与fast-cgi方式</p>
<p>     具体步骤如下: </p>
<p>     系统:ubuntu 8.10 的发行版本 </p>
<p>     AMP with Prefork(mod-php5) </p>
<p>      一、安装APACHE2 </p>
<p>     # sudo  apt-get  install  apache2  apache2-mpm-prefork </p>
<p>     这样APACHE部分就完成，默认目录是 /var/www </p>
<p>     二、进行PHP的环境配置： </p>
<p>     # sudo  apt-get  install  php5  libapache2-mod-php5  php5-cli  php5-dev  php5-gd  php5-imagick  php5-mcrypt  php5-xmlrpc </p>
<p>     当然，需要更多的PHP5 extension 便可以自己补完。完成后手动启动模块： </p>
<p>    # sudo  a2enmod  php5<br />
<span id="more-389"></span></p>
<p>    三、MYSQL软件的安装 </p>
<p>    # sudo  apt-get  install  mysql-server  libapache2-mod-auth-mysql  php5-mysql </p>
<p>    MYSQL安装完成之后一切就搞定，通过APT方式安装MYSQL在安装过程当中是必须为MYSQL的ROOT用户设置密码的。 </p>
<p>    AMP with Worker(fast-cgi) </p>
<p>     如果想使用 worker 方式来跑的话必须使用fast-cgi模式，步骤如下： </p>
<p>    一、首先安装 apache with mpm-worker： </p>
<p>    # sudo  apt-get  install  apache2  apache2-mpm-worker  libapache2-mod-fcgid </p>
<p>   二、安装和配置PHP部分 </p>
<p>    # sudo  apt-get  install  php5  php5-cgi  php5-cli  php5-dev  php5-gd  php5-imagick  php5-mcrypt  php5-xmlrpc<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
    三、MYSQL的安装配置 </p>
<p>    # sudo  apt-get  install  mysql-server  libapache2-mod-auth-mysql  php5-mysql </p>
<p>     (MYSQL需要注意的部分同上,up!) </p>
<p>    四、配置FAST-CGI模式下的目录</p>
<p>         在<Directory …> … </Directory> 里加入一下两句话 </p>
<p>         AddHandler fcgid-script .php </p>
<p>         FCGIWrapper /usr/lib/cgi-bin/php5 .php </p>
<p>         并在本段的 Option 上多加一个参数 ExecCGI </p>
<p>     完成以上工作后，便可以重启apache2进行测试工作~~！ </p>
<p>     # sudo  /etc/init.d/apache2  force-reload </p>
<p>    在服务目录中我们放入写有 phpinfo(); 函数的PHP文件，才查看本LAMP环境的参数是否正确。 </p>
<p>    附录： </p>
<p>     一、根据需要调整APACHE的模块 </p>
<p>    在APACHE部分，首要的编辑就是/etc/apache2/mod-available的目录下的模块加载，你先看看自己需要哪些模块，里面有很多MOD_NAME.load和MOD_NAME.conf然后通过模块添加命令进行添加。 </p>
<p>    模块添加的命令： </p>
<p>    # sudo  a2enmod  [MOD_NAME] </p>
<p>    举例说明： </p>
<p>    启用页面压缩的deflate来说，方法如下： </p>
<p>    # sudo  a2enmod  deflate </p>
<p>    然后编辑 /etc/apache2/mods-available/deflate.conf  ,改为： </p>
<p>    <IfModule mod_deflate.c><br />
        DeflateCompressionLevel  6<br />
        AddOutputFilterByType   DEFLATE  text/html  text/plain  text/xml<br />
        AddOutputFilter   DEFLATE  html  htm  xml  css  js<br />
    </IfModule> </p>
<p>    之后重启 apache2 便可完成。<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
   二、关于apache2-mpm-prefork模式和FAST-CGI模式的php.ini文件位置 </p>
<p>    apache2-mpm-prefork： /etc/php5/apache2/php.ini </p>
<p>    FAST-CGI：/etc/php5/cgi/php.ini </p>
<p>    特别是在使用eAccelerator或MMCache的时候需要特别注意！</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/389.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>启用scounix 6的mysql数据库</title>
		<link>http://www.evanjiang.net.cn/archives/276.html</link>
		<comments>http://www.evanjiang.net.cn/archives/276.html#comments</comments>
		<pubDate>Wed, 21 Jan 2009 10:10:10 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[sco unix]]></category>
		<category><![CDATA[scounix6 mysql]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=276</guid>
		<description><![CDATA[<p>一、	完整安装scounix6
二、安装SCOUNIX6自带apache1.33 php4
三、	启用scounix6自带的mysql4
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
/usr/bin/mysqladmin -u root password &#8216;new-password&#8217;
/usr/bin/mysqladmin -u root -h scosysv password &#8216;new-password&#8217;
See the manual for more instructions.</p>
<p>You can start the MySQL daemon with:
# cd /
# /usr/bin/mysqld_safe &#038;</p>
]]></description>
			<content:encoded><![CDATA[<p>一、	完整安装scounix6<br />
二、安装SCOUNIX6自带apache1.33 php4<br />
三、	启用scounix6自带的mysql4<br />
PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !<br />
To do so, start the server, then issue the following commands:<br />
/usr/bin/mysqladmin -u root password &#8216;new-password&#8217;<br />
/usr/bin/mysqladmin -u root -h scosysv password &#8216;new-password&#8217;<br />
See the manual for more instructions.</p>
<p>You can start the MySQL daemon with:<br />
# cd /<br />
# /usr/bin/mysqld_safe &#038;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/276.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>分享mail服务器mysql数据库备份脚本</title>
		<link>http://www.evanjiang.net.cn/archives/252.html</link>
		<comments>http://www.evanjiang.net.cn/archives/252.html#comments</comments>
		<pubDate>Fri, 16 Jan 2009 07:54:33 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mail]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[shell]]></category>
		<category><![CDATA[shell 备份脚本 mysql]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=252</guid>
		<description><![CDATA[<p>功能：备份mysql数据库中mail的数据库数据,并用gz压缩，先备份到本地，然后自动上传到指定的ftp服务器,备份日志email到指定的邮箱
</p>

?View Code SHELL[root@mail cron.daily]# cat mailmysql_backup_ftp
#!/bin/bash
#Mysql Autobackup Shell
&#160;
#DB env
dbuser=root
dbpasswd=root
dbserver=localhost
dbname=extmail
#dbopt=--opt
backupdir=/home/mysql-backup/
&#160;
#FTP 0 is disable,1 is enable
copytoftp=1
ftpserver=10.1.1.8
ftpuser=admin
ftppasswd=admin
fileprefix=extmail
dumpfilename=$backupdir`date +%F`.sql
newfile=$fileprefix-`date +%F`.gz
keepdays=16
&#160;
#Backup log
logfile=/tmp/mysqldump.log
logtmp=/tmp/mysqldump.tmp
&#160;
#mail 0 is diable,1 is enable
mailenable=1
mailaddress=ruochen0926@hotmail.com
&#160;
#Backup script
#===============================================
if [ ! -d $backupdir ]
then
        echo &#34;$backupdir is not exist, then make ...&#34; &#38;gt; $logfile
        mkdir -p $backupdir
fi
echo [...]]]></description>
			<content:encoded><![CDATA[<p>功能：备份mysql数据库中mail的数据库数据,并用gz压缩，先备份到本地，然后自动上传到指定的ftp服务器,备份日志email到指定的邮箱<br />
<span id="more-252"></span></p>

<div class="wp_codebox_msgheader wp_codebox_hide"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p252code2'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2522"><td class="code" id="p252code2"><pre class="shell" style="font-family:monospace;">[root@mail cron.daily]# cat mailmysql_backup_ftp
#!/bin/bash
#Mysql Autobackup Shell
&nbsp;
#DB env
dbuser=root
dbpasswd=root
dbserver=localhost
dbname=extmail
#dbopt=--opt
backupdir=/home/mysql-backup/
&nbsp;
#FTP 0 is disable,1 is enable
copytoftp=1
ftpserver=10.1.1.8
ftpuser=admin
ftppasswd=admin
fileprefix=extmail
dumpfilename=$backupdir`date +%F`.sql
newfile=$fileprefix-`date +%F`.gz
keepdays=16
&nbsp;
#Backup log
logfile=/tmp/mysqldump.log
logtmp=/tmp/mysqldump.tmp
&nbsp;
#mail 0 is diable,1 is enable
mailenable=1
mailaddress=ruochen0926@hotmail.com
&nbsp;
#Backup script
#===============================================
if [ ! -d $backupdir ]
then
        echo &quot;$backupdir is not exist, then make ...&quot; &amp;gt; $logfile
        mkdir -p $backupdir
fi
echo &quot;start====================================&amp;gt;&quot;&amp;gt;$logfile
echo &quot;Beginning backup `date '+%F %T'`&quot; &amp;gt;&amp;gt;$logfile
echo &quot;Delete $keepdays days ago files ...&quot; &amp;gt;&amp;gt;$logfile
find $backupdir -name $fileprefix* -mtime +$keepdays -fls $logtmp -exec rm {} \;
echo &quot;Deleted Backup File Is :&quot;&amp;gt;&amp;gt;$logfile
cat $logtmp &amp;gt;&amp;gt;$logfile
echo &quot;Delete old file Success!&quot; &amp;gt;&amp;gt;$logfile
if [ -f $backupdir$newfile ]
then
echo &quot;$newfile backup exist, backup stop ...&quot; &amp;gt;&amp;gt;$logfile
else
        if [ -z $dbpasswd ]
        then
#        mysqldump -u$dbuser -h$dbserver $dbopt $dbname &amp;gt;$dumpfilename
        /usr/bin/mysqldump -u$dbuser -h$dbserver $dbopt $dbname &amp;gt;$dumpfilename
        else
#        /opt/lampp/bin/mysqldump -u$dbuser -p$dbpasswd -h$dbserver $dbopt $dbname | gzip &amp;gt; /opt/apache/mysqlbackup/$newfile
        /usr/bin/mysqldump -u$dbuser -p$dbpasswd -h$dbserver $dbopt $dbname | gzip &amp;gt; $backupdir/$newfile
        fi
#        tar czvf $backupdir$newfile $dumpfilename &amp;gt;&amp;gt;$logfile 2&amp;gt;&amp;amp;1
#        gzip $dumpfilename  $newfile  &amp;gt;&amp;gt;$logfile 2&amp;gt;&amp;amp;1
        echo &quot;$backupdir$newfile Backup Success!&quot; &amp;gt;&amp;gt;$logfile
        rm -fr $dumpfilename
&nbsp;
if [ $copytoftp = 1 ];  then
        if [ -z $ftpserver ];then
        echo &quot;Ftp Server not set,Copy to Ftp Failed ...&quot; &amp;gt;&amp;gt;$logfile
        exit 1
        elif [ -z $ftpuser ];then
        echo &quot;Ftp user not set, Copy to Ftp Failed ...&quot; &amp;gt;&amp;gt;$logfile
        exit 2
        elif [ -z $ftppasswd ]; then
        echo &quot;Ftp password not set, Copy to Ftp Failed ...&quot; &amp;gt;&amp;gt;$logfile
        exit 3
        else
        echo &quot;Start copy to Ftp server ....&quot; &amp;gt;&amp;gt; $logfile
ftp -n&amp;lt;&amp;gt;$logfile
echo &quot;End=======================================|&quot;&amp;gt;&amp;gt;$logfile
fi
&nbsp;
if [ $mailenable=1 ];
    then
      mail -s &quot;Mail Server Mysql Backup Status&quot; $mailaddress&amp;lt;$logfile
fi</pre></td></tr></table></div>

<p>
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/252.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>win2003+iis6+php+gd2+mysql安装配置</title>
		<link>http://www.evanjiang.net.cn/archives/130.html</link>
		<comments>http://www.evanjiang.net.cn/archives/130.html#comments</comments>
		<pubDate>Fri, 19 Dec 2008 13:38:32 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[windows2003 apache php mysql  iis]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=130</guid>
		<description><![CDATA[<p> </p>
<p class="MsoNormal">使用windows2003服务器的用户越来越多，而一些精品的程序都是由php开发出来的，本次讲讲window2003下php的安装和配置，以及2003下权限的设置等问题！</p>
<p>       2003以及iis6的安装这里就不讲了，如果你还不会安装win2003和iis6，那最好先看看其他的文章把安装系统和组件学会了再看下面的也不迟！</p>
<p>第一：安装 PHP</p>
<p>1、下载php安装程序 http://www.php.net/downloads.php，
最新版的为php5.1 windows的php安装分为两种方式，一种是源代码安装方式，一种是exe安装方式，exe安装方式为傻瓜式的安装，双击即可安装，我们在此就不讲了，主要的说一下源代码的安装！</p>
<p class="MsoNormal"></p>
<p>下载“PHP  4.3.10 zip package”或者是5.0几5.1几都一样。然后解压缩下载到的 zip 文件到
c:\php（可以根据不同的需要解压到不同的目录，不过不熟悉的默认即可，占用不了多大的空间）。</p>
<p>2、复制 c:\php\php4ts.dll 到 c:\windows\system32。（有时候为了方便，在php文件夹中点击搜索*.dll把搜索到的所有文件夹都复制到system32中也可以，这样省去很多麻烦！）</p>
<p>复制 c:\php\php.ini-recommended（或者是php.ini-dist）为 c:\windows\php.ini然后打开 c:\windows\php.ini，修改如下几个地方：</p>
<p>; 如果使用默认的 4096，那么 PHP 在 IIS6 里面性能将非常糟糕
output_buffering = On








; 如果是在生产服务器上，可以不用修改下面这两行
error_reporting=E_ALL &#38; ~E_NOTICE
display_errors = On（这里是修改php的错误提示，off为不提示，有些数据库链接非错误信息也会被php当做错误信息输出，建议用作web服务器的关闭！）</p>
<p>; 指示 PHP 扩展库所在文件夹
extension_dir=&#8221;c:\php\extensions&#8221;（这儿在php5中为ext文件夹，不同的版本不一样，即放置dll文件的文件夹）</p>
<p>以下两个是超时时间：一般60-120
max_execution_time = 90
max_input_time = 90
post_max_size = 8M（6-10M最佳）
upload_max_filesize = 8M（上传附件大小最大）</p>
<p>default_socket_timeout = 90（端口时间60-120）</p>
<p>session.gc_maxlifetime = 3600（session默认存活时间，秒）
session.save_path = &#8220;C:\PHP\sessiondata&#8221;（此处修改session的存储目录，如果您不需要session功能，也可不修改，注意该目录一定要存在，不存在则建立）
其他设置就根据自己的需要来修改了。做完这些，第一部分就完成了。</p>
<p>第二：在 IIS 中配置 PHP</p>
<p>1、首先通过“管理您的服务器”向导中的“添加或删除角色”功能将IIS安装好。在Windows Server 2003里面，IIS被称为“应用程序服务器”。安装时如果需要，可以选中ASP.NET等选项。不过就算没选中，以后也可以很方便启用的。</p>
<p></p>
<p>（图02_01：安装好IIS）</p>
<p>2、 在“管理您的服务器”向导中，点击“管理此应用程序服务器”连接，打开“应用程序服务器”管理窗口。然后从左侧依次选中“Internet [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p class="MsoNormal"><span>使用</span><span lang="EN-US">windows2003</span><span>服务器的用户越来越多，而一些精品的程序都是由</span><span lang="EN-US">php</span><span>开发出来的，本次讲讲</span><span lang="EN-US">window2003</span><span>下</span><span lang="EN-US">php</span><span>的安装和配置，以及</span><span lang="EN-US">2003</span><span>下权限的设置等问题！</span><span lang="EN-US"></p>
<p>       2003</span><span>以及</span><span lang="EN-US">iis6</span><span>的安装这里就不讲了，如果你还不会安装</span><span lang="EN-US">win2003</span><span>和</span><span lang="EN-US">iis6</span><span>，那最好先看看其他的文章把安装系统和组件学会了再看下面的也不迟！</span><span lang="EN-US"></p>
<p></span><span>第一：安装<span lang="EN-US"> PHP</span></span><span lang="EN-US"></p>
<p>1</span><span>、下载</span><span lang="EN-US">php</span><span>安装程序</span><span lang="EN-US"> http://www.php.net/downloads.php</span><span>，</span><span lang="EN-US"><br />
</span><span>最新版的为</span><span lang="EN-US">php5.1 windows</span><span>的</span><span lang="EN-US">php</span><span>安装分为两种方式，一种是源代码安装方式，一种是</span><span lang="EN-US">exe</span><span>安装方式，</span><span lang="EN-US">exe</span><span>安装方式为傻瓜式的安装，双击即可安装，我们在此就不讲了，主要的说一下源代码的安装！</span></p>
<p class="MsoNormal"><span lang="EN-US"><span id="more-130"></span></p>
<p></span><span>下载</span><span lang="EN-US">“PHP  4.3.10 zip package”</span><span>或者是</span><span lang="EN-US">5.0</span><span>几</span><span lang="EN-US">5.1</span><span>几都一样。然后解压缩下载到的</span><span lang="EN-US"> zip </span><span>文件到</span><span lang="EN-US"><br />
c:\php</span><span>（可以根据不同的需要解压到不同的目录，不过不熟悉的默认即可，占用不了多大的空间）。</span><span lang="EN-US"></p>
<p>2</span><span>、复制</span><span lang="EN-US"> c:\php\php4ts.dll </span><span>到</span><span lang="EN-US"> c:\windows\system32</span><span>。（有时候为了方便，在</span><span lang="EN-US">php</span><span>文件夹中点击搜索</span><span lang="EN-US">*.dll</span><span>把搜索到的所有文件夹都复制到</span><span lang="EN-US">system32</span><span>中也可以，这样省去很多麻烦！）</span><span lang="EN-US"></p>
<p></span><span>复制</span><span lang="EN-US"> c:\php\php.ini-recommended</span><span>（或者是</span><span lang="EN-US">php.ini-dist</span><span>）为</span><span lang="EN-US"> c:\windows\php.ini</span><span>然后打开</span><span lang="EN-US"> c:\windows\php.ini</span><span>，修改如下几个地方：</span><span lang="EN-US"></p>
<p>; </span><span>如果使用默认的</span><span lang="EN-US"> 4096</span><span>，那么</span><span lang="EN-US"> PHP </span><span>在</span><span lang="EN-US"> IIS6 </span><span>里面性能将非常糟糕</span><span lang="EN-US"><br />
<span>output_buffering = On</span><br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
; </span><span>如果是在生产服务器上，可以不用修改下面这两行</span><span lang="EN-US"><br />
error_reporting=E_ALL &amp; ~E_NOTICE<br />
<span>display_errors = On</span></span><span>（这里是修改</span><span lang="EN-US">php</span><span>的错误提示，</span><span lang="EN-US">off</span><span>为不提示，有些数据库链接非错误信息也会被</span><span lang="EN-US">php</span><span>当做错误信息输出，建议用作</span><span lang="EN-US">web</span><span>服务器的关闭！）</span><span lang="EN-US"></p>
<p>; </span><span>指示</span><span lang="EN-US"> PHP </span><span>扩展库所在文件夹</span><span lang="EN-US"><br />
<span>extension_dir=&#8221;c:\php\extensions&#8221;</span></span><span>（</span><span>这儿在</span><span lang="EN-US">php5</span><span>中为</span><span lang="EN-US">ext</span><span>文件夹，不同的版本不一样，即放置</span><span lang="EN-US">dll</span><span>文件的文件夹）</span><span lang="EN-US"></p>
<p></span><span>以下两个是超时时间：一般</span><span lang="EN-US">60-120<br />
<span>max_execution_time = 90</span><br />
<span>max_input_time = 90</span><br />
post_max_size = 8M</span><span>（</span><span lang="EN-US">6-10M</span><span>最佳）</span><span lang="EN-US"><br />
<span>upload_max_filesize = 8M</span></span><span>（上传附件大小最大）</span><span lang="EN-US"></p>
<p>default_socket_timeout = 90</span><span>（端口时间</span><span lang="EN-US">60-120</span><span>）</span><span lang="EN-US"></p>
<p><span>session.gc_maxlifetime = 3600</span></span><span>（</span><span lang="EN-US">session</span><span>默认存活时间，秒）</span><span lang="EN-US"><br />
<span>session.save_path = &#8220;C:\PHP\sessiondata&#8221;</span></span><span>（此处修改</span><span lang="EN-US">session</span><span>的存储目录，如果您不需要</span><span lang="EN-US">session</span><span>功能，也可不修改，注意该目录一定要存在，不存在则建立）</span><span lang="EN-US"><br />
</span><span>其他设置就根据自己的需要来修改了。做完这些，第一部分就完成了。</span><span lang="EN-US"></p>
<p></span><span>第二：在<span lang="EN-US"> IIS </span>中配置<span lang="EN-US"> PHP</span></span><span lang="EN-US"></p>
<p>1</span><span>、首先通过</span><span lang="EN-US">“</span><span>管理您的服务器</span><span lang="EN-US">”</span><span>向导中的</span><span lang="EN-US">“</span><span>添加或删除角色</span><span lang="EN-US">”</span><span>功能将</span><span lang="EN-US">IIS</span><span>安装好。在</span><span lang="EN-US">Windows Server 2003</span><span>里面，</span><span lang="EN-US">IIS</span><span>被称为</span><span lang="EN-US">“</span><span>应用程序服务器</span><span lang="EN-US">”</span><span>。安装时如果需要，可以选中</span><span lang="EN-US">ASP.NET</span><span>等选项。不过就算没选中，以后也可以很方便启用的。</span><span lang="EN-US"></p>
<p><a href="http://www.artcn.cn/online/UploadFiles/200612/20061222220629913.png" target="_blank"></a><!--[if gte vml 1]><v:shapetype id="_x0000_t75"  coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe"  filled="f" stroked="f"> <v:stroke joinstyle="miter" /> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0" /> <v:f eqn="sum @0 1 0" /> <v:f eqn="sum 0 0 @1" /> <v:f eqn="prod @2 1 2" /> <v:f eqn="prod @3 21600 pixelWidth" /> <v:f eqn="prod @3 21600 pixelHeight" /> <v:f eqn="sum @0 0 1" /> <v:f eqn="prod @6 1 2" /> <v:f eqn="prod @7 21600 pixelWidth" /> <v:f eqn="sum @8 21600 0" /> <v:f eqn="prod @7 21600 pixelHeight" /> <v:f eqn="sum @10 21600 0" /> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect" /> <o:lock v:ext="edit" aspectratio="t" /> </v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" alt="" style='width:699.75pt;  height:525pt'> <v:imagedata src="file:///C:\DOCUME~1\gzzymh\LOCALS~1\Temp\msohtml1\01\clip_image001.jpg"   o:href="http://www.artcn.cn/online/UploadFiles/200612/20061222221320286.jpg" /> </v:shape><![endif]--><img src="file:///C:/DOCUME~1/gzzymh/LOCALS~1/Temp/msohtml1/01/clip_image002.jpg" border="0" alt="" width="933" height="700" /></p>
<p></span><span>（图</span><span lang="EN-US">02_01</span><span>：安装好</span><span lang="EN-US">IIS</span><span>）</span><span lang="EN-US"></p>
<p>2</span><span>、</span> <span>在</span><span lang="EN-US">“</span><span>管理您的服务器</span><span lang="EN-US">”</span><span>向导中，点击</span><span lang="EN-US">“</span><span>管理此应用程序服务器</span><span lang="EN-US">”</span><span>连接，打开</span><span lang="EN-US">“</span><span>应用程序服务器</span><span lang="EN-US">”</span><span>管理窗口。然后从左侧依次选中</span><span lang="EN-US">“Internet </span><span>信息服务</span><span lang="EN-US">(IIS)</span><span>管理器</span><span lang="EN-US">-&gt;</span><span>本地计算机</span><span lang="EN-US">-&gt;Web </span><span>服务扩展</span><span lang="EN-US">”</span><span>。接着选中右边任意一个项目。点击</span><span lang="EN-US">“</span><span>添加一个新的</span><span lang="EN-US">Web</span><span>服务扩展</span><span lang="EN-US">”</span><span>连接。</span><span lang="EN-US"></p>
<p></span><span>输入扩展名，并点击</span><span lang="EN-US">“</span><span>添加</span><span lang="EN-US">”</span><span>按钮将</span><span lang="EN-US"> c:\php\sapi\php4isapi.dll</span><span>（有时候</span><span lang="EN-US">isapi</span><span>文件也可能在</span><span lang="EN-US">c:\php</span><span>下）文件添加到列表中。注意是</span><span lang="EN-US"> php4isapi.dll</span><span>，不是</span><span lang="EN-US"> php4ts.dll</span><span>。</span><span lang="EN-US"></p>
<p></span><span>最后选中</span><span lang="EN-US">“</span><span>设置扩展状态为允许</span><span lang="EN-US">”</span><span>，并点击</span><span lang="EN-US">“</span><span>确定</span><span lang="EN-US">”</span><span>按钮关闭对话框。现在应该在</span><span lang="EN-US">“Web </span><span>服务扩展</span><span lang="EN-US">”</span><span>列表中可以看到刚刚添加的项目了。</span><span lang="EN-US"></p>
<p><a href="http://www.artcn.cn/online/UploadFiles/200612/20061222220629473.png" target="_blank"></a><!--[if gte vml 1]><v:shape id="_x0000_i1026" type="#_x0000_t75"  alt="" style='width:699.75pt;height:515.25pt'> <v:imagedata src="file:///C:\DOCUME~1\gzzymh\LOCALS~1\Temp\msohtml1\01\clip_image003.jpg"   o:href="http://www.artcn.cn/online/UploadFiles/200612/20061222221332291.jpg" /> </v:shape><![endif]--><img src="file:///C:/DOCUME~1/gzzymh/LOCALS~1/Temp/msohtml1/01/clip_image004.jpg" border="0" alt="" width="933" height="687" /></p>
<p></span><span>（注意，该图片来自网络，图片中路径和本文路径不一致！下同）</span><span lang="EN-US"><br />
</span><span>（注意：</span><span lang="EN-US">php</span><span>解析分为两种模式，</span><span lang="EN-US">cgi</span><span>和</span><span lang="EN-US">isapi</span><span>两种，如果此处你选择了</span><span lang="EN-US">php_cgi.exe</span><span>，那步骤</span><span lang="EN-US">3</span><span>中一定保持一致！）</span><span lang="EN-US"></p>
<p></span><span>（图</span><span lang="EN-US">02_02</span><span>：添加</span><span lang="EN-US"> PHP4 </span><span>的扩展）</span><span lang="EN-US"></p>
<p>3</span><span>、从</span><span lang="EN-US">“</span><span>应用程序服务器</span><span lang="EN-US">”</span><span>管理窗口左侧依次选中</span><span lang="EN-US">“Internet </span><span>信息服务</span><span lang="EN-US">(IIS)</span><span>管理器</span><span lang="EN-US">-&gt;</span><span>网站</span><span lang="EN-US">”</span><span>。然后在</span><span lang="EN-US">“</span><span>默认网站</span><span lang="EN-US">”</span><span>项目上单击鼠标右键选择</span><span lang="EN-US">“</span><span>属性</span><span lang="EN-US">”</span><span>，打开</span><span lang="EN-US">“</span><span>默认网站属性</span><span lang="EN-US">”</span><span>对话框。</span><span lang="EN-US"></p>
<p></span><span>切换到</span><span lang="EN-US">“</span><span>主目录</span><span lang="EN-US">”</span><span>选项卡，点击</span><span lang="EN-US">“</span><span>配置</span><span lang="EN-US">”</span><span>按钮，打开</span><span lang="EN-US">“</span><span>应用程序配置</span><span lang="EN-US">”</span><span>对话框。再点击</span><span lang="EN-US">“</span><span>添加</span><span lang="EN-US">”</span><span>按钮，打开</span><span lang="EN-US">“</span><span>添加</span><span lang="EN-US">/</span><span>编辑应用程序扩展名映射</span><span lang="EN-US">”</span><span>对话框。</span><span lang="EN-US"></p>
<p></span><span>点击</span><span lang="EN-US">“</span><span>浏览</span><span lang="EN-US">”</span><span>按钮，选中</span><span lang="EN-US"> c:php\sapi\php4isapi.dll</span><span>，并按照（图</span><span lang="EN-US">03</span><span>）中的选项进行设置。最后一路</span><span lang="EN-US">“</span><span>确定</span><span lang="EN-US">”</span><span>返回</span><span lang="EN-US">“</span><span>默认网站属性</span><span lang="EN-US">”</span><span>对话框。</span><span lang="EN-US"></p>
<p><a href="http://www.artcn.cn/online/UploadFiles/200612/20061222220629275.png" target="_blank"></a><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75"  alt="" style='width:525pt;height:457.5pt'> <v:imagedata src="file:///C:\DOCUME~1\gzzymh\LOCALS~1\Temp\msohtml1\01\clip_image005.jpg"   o:href="http://www.artcn.cn/online/UploadFiles/200612/20061222221344858.jpg" /> </v:shape><![endif]--><img src="file:///C:/DOCUME~1/gzzymh/LOCALS~1/Temp/msohtml1/01/clip_image005.jpg" border="0" alt="" width="700" height="610" /></p>
<p></span><span>（图</span><span lang="EN-US">02_03</span><span>：添加应用程序扩展名映射）</span><span lang="EN-US"></p>
<p>4</span><span>、切换到</span><span lang="EN-US">“</span><span>文档</span><span lang="EN-US">”</span><span>选项卡，点击</span><span lang="EN-US">“</span><span>添加</span><span lang="EN-US">”</span><span>按钮将</span><span lang="EN-US"> index.html </span><span>和</span><span lang="EN-US"> index.php </span><span>添加到默认内容文档列表中。最后确认关闭对话框。</span><span lang="EN-US"></p>
<p><a href="http://www.artcn.cn/online/UploadFiles/200612/20061222220629630.png" target="_blank"></a><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75"  alt="" style='width:500.25pt;height:480pt'> <v:imagedata src="file:///C:\DOCUME~1\gzzymh\LOCALS~1\Temp\msohtml1\01\clip_image006.jpg"   o:href="http://www.artcn.cn/online/UploadFiles/200612/20061222221357926.jpg" /> </v:shape><![endif]--><img src="file:///C:/DOCUME~1/gzzymh/LOCALS~1/Temp/msohtml1/01/clip_image007.jpg" border="0" alt="" width="667" height="640" /></p>
<p></span><span>（图</span><span lang="EN-US">02_04</span><span>：添加默认文档）</span><span lang="EN-US"></p>
<p></span><span>第三：验证安装</span><span lang="EN-US"></p>
<p></span><span>用记事本写几行代码</span><span lang="EN-US">:</p>
<p></span><span>保存为</span> <span>网站根目录下为</span><span lang="EN-US">phpinfo.php </span><span>文件。然后启动浏览器，访问</span><span lang="EN-US"> http://xxx.aaa.com/phpinfo.php</span><span>，如果看到如下画面就证明</span><span lang="EN-US">php</span><span>安装成功了！</span><span lang="EN-US"></p>
<p><a href="http://www.artcn.cn/online/UploadFiles/200612/20061222220629885.png" target="_blank"></a><!--[if gte vml 1]><v:shape id="_x0000_i1029" type="#_x0000_t75"  alt="" style='width:460.5pt;height:363.75pt'> <v:imagedata src="file:///C:\DOCUME~1\gzzymh\LOCALS~1\Temp\msohtml1\01\clip_image008.jpg"   o:href="http://www.artcn.cn/online/UploadFiles/200612/20061222221409271.jpg" /> </v:shape><![endif]--><img src="file:///C:/DOCUME~1/gzzymh/LOCALS~1/Temp/msohtml1/01/clip_image008.jpg" border="0" alt="" width="614" height="485" /></p>
<p></span><span>（图</span><span lang="EN-US">03_01: </span><span>检查</span><span lang="EN-US"> PHP </span><span>是否安装成功）</span><span lang="EN-US"></p>
<p></span><span>第四：关于权限</span><span lang="EN-US"></p>
<p>windows2003</span><span>和其他系统为了文件安装使用了</span><span lang="EN-US">NTFS</span><span>格式，并且</span><span lang="EN-US">IIS6</span><span>下可给每个虚拟主机分配不同的用户来匿名访问网站，如果您做了如上设置，那么您在测试</span><span lang="EN-US">php</span><span>的安装的时候可能会出现提示输入用户名，解决办法：</span><span lang="EN-US"></p>
<p></span><span>请先确认访问该虚拟主机的用户对网站跟目录有可读和执行权限！</span><span lang="EN-US"></p>
<p></span><span>在</span><span lang="EN-US">iis</span><span>管理相应虚拟主机上右健属性查看，目录安全性选项卡，匿名访问和认证控制中可看到允许访问的用户，并让用户对</span><span lang="EN-US">c:\php</span><span>有可读写权限</span><span lang="EN-US"><br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
</span><span>如果您的主机上有多个虚拟主机，并且每个用户都使用不同的用户名访问网站，那最好是把所有用户加入到同一个组，让组对</span><span lang="EN-US">php</span><span>文件夹有读写权限即可！</span><span lang="EN-US"><br />
 </p>
<p></span><span>修改后，提示输入用户名和密码的窗口应该已经去掉！！</span><span lang="EN-US"></p>
<p></span><span>第五：<span lang="EN-US">mysql</span>安装和<span lang="EN-US">gd2</span>的支持</span><span lang="EN-US"></p>
<p></span><span>首先下载</span><span lang="EN-US">mysql</span><span>安装文件，</span><span lang="EN-US">mysql</span><span>在</span><span lang="EN-US">win</span><span>的安装一般都是使用</span><span lang="EN-US">exe</span><span>安装文件，所以，这里就不介绍安装了！</span><span lang="EN-US"></p>
<p>php</span><span>在安装后是默认不支持读取</span><span lang="EN-US">mysql</span><span>的，我们要修改</span><span lang="EN-US">php.ini</span><span>文件，把</span><span lang="EN-US"></p>
<p><span>extension=php_mysql.dll<br />
extension=php_gd2.dll</span><br />
</span><span>前面的</span><span lang="EN-US">“</span><span>；</span><span lang="EN-US">”</span><span>去掉，注意，为了让</span><span lang="EN-US">php</span><span>支持生成真彩图片，一般都要求支持</span><span lang="EN-US">gd2</span><span>，</span><span lang="EN-US">extension=php_gd2.dll</span><span>即支持</span><span lang="EN-US">gd2</span><span>的</span><span lang="EN-US">dll</span><span>文件。</span><span lang="EN-US"></p>
<p></span><span>注意，</span><span lang="EN-US">php5</span><span>以前的版本，是默认不支持</span><span lang="EN-US">mysql4.1</span><span>以后的密码访问格式的，在</span><span lang="EN-US">Mysql</span><span>中使用如下命令，把密码统一一下就可以了：</span><span lang="EN-US"><br />
set password for &#8216;username&#8217;@'hostname&#8217;=OLD_PASSWORD(&#8216;password&#8217;);</p>
<p></span><span>这样即可顺利连接</span><span lang="EN-US">mysql</span><span>了！或者是干脆直接安装</span><span lang="EN-US">php5</span><span>即可！</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/130.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高可用性、负载均衡的mysql集群解决方案</title>
		<link>http://www.evanjiang.net.cn/archives/99.html</link>
		<comments>http://www.evanjiang.net.cn/archives/99.html#comments</comments>
		<pubDate>Wed, 17 Dec 2008 13:56:48 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[负载均衡]]></category>
		<category><![CDATA[负载均衡 mysql 集群]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=99</guid>
		<description><![CDATA[<p class="p0">一、mysql的市场占有率</p>
<p class="p0">二、mysql为什么受到如此的欢迎</p>
<p class="p0">三、mysql数据库系统的优缺点</p>
<p class="p0">四、网络服务器的需求</p>
<p class="p0">五、什么是mysql的集群</p>
<p class="p0">六、什么是负载均衡</p>
<p class="p0">七、mysql集群部署和实现方法</p>
<p class="p0">八、负载均衡的配置和测试</p>
<p class="p0">九、Mysql集群系统的测试（测试方案+测试脚本+测试结果分析）</p>
<p class="p0">
<p class="p0">
<p class="p0">l mysql的市场占有率</p>
<p class="p0">
<p class="p0">MySQL是世界上最流行的开源数据库，已有1100多万的击活安装，每天超过五万的下</p>
<p class="p0">载。MySQL为全球开发者、DBA和IT管理者在可靠性、性能、易用性方面提供了选</p>
<p class="p0">择。</p>
<p class="p0">
<p class="p0">第三方市场调查机构Evans Data Corporation调查显示，过去两年内在开发者使用</p>
<p class="p0">的所有数据库中，MySQL已经拥有了25%的市场占有率。开源已经成为当今IT结构中</p>
<p class="p0">不可或缺的重要部分，而且开源的市场占有率将继续增加。如下图所示：</p>
<p class="p0"></p>

<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">l mysql为什么受到如此的欢迎</p>
<p class="p0">
<p class="p0">Sun公司今天1月份花了10亿美元将mysql收购，准备进军开源和数据库。</p>
<p class="p0">




<p class="p0">数据库系统</p>


<p class="p0">Oracle</p>


<p class="p0">SQL Server</p>


<p class="p0">MySQL</p>


<p class="p0">DB2</p>




<p class="p0">是否免费</p>


<p class="p0">收费</p>


<p class="p0">收费</p>


<p class="p0">免费</p>


<p class="p0">收费</p>




<p class="p0">存储过程</p>


<p class="p0">支持</p>


<p class="p0">支持</p>


<p class="p0">支持</p>


<p class="p0">支持</p>




<p class="p0">视图</p>


<p class="p0">支持</p>


<p class="p0">支持</p>


<p class="p0">支持</p>


<p class="p0">支持</p>




<p class="p0">快照</p>


<p class="p0">支持</p>


<p [...]]]></description>
			<content:encoded><![CDATA[<p class="p0"><span>一、</span><span>mysql<span style="font-family: 宋体;">的市场占有率</span></span></p>
<p class="p0"><span>二、</span><span>mysql<span style="font-family: 宋体;">为什么受到如此的欢迎</span></span></p>
<p class="p0"><span>三、</span><span>mysql<span style="font-family: 宋体;">数据库系统的优缺点</span></span></p>
<p class="p0"><span>四、</span><span><span style="font-family: 宋体;">网络服务器的需求</span></span></p>
<p class="p0"><span>五、</span><span><span style="font-family: 宋体;">什么是mysql的集群</span></span></p>
<p class="p0"><span>六、</span><span><span style="font-family: 宋体;">什么是负载均衡</span></span></p>
<p class="p0"><span>七、</span><span>mysql<span style="font-family: 宋体;">集群部署和实现方法</span></span></p>
<p class="p0"><span>八、</span><span><span style="font-family: 宋体;">负载均衡的配置和测试</span></span></p>
<p class="p0"><span>九、</span><span>Mysql<span style="font-family: 宋体;">集群系统的测试（测试方案+测试脚本+测试结果分析）</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span>l </span><span>mysql<span style="font-family: 宋体;">的市场占有率</span></span></p>
<p class="p0">
<p class="p0"><span>MySQL<span style="font-family: 宋体;">是世界上最流行的开源数据库，已有1100多万的击活安装，每天超过五万的下</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">载。MySQL为全球开发者、DBA和IT管理者在可靠性、性能、易用性方面提供了选</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">择。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">第三方市场调查机构Evans Data Corporation调查显示，过去两年内在开发者使用</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">的所有数据库中，MySQL已经拥有了25%的市场占有率。开源已经成为当今IT结构中</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">不可或缺的重要部分，而且开源的市场占有率将继续增加。如下图所示：</span></span></p>
<p class="p0"><span id="more-99"></span></p>
<div><img src="http://blogimg.chinaunix.net/blog/upfile2/081217203312.gif" border="0" alt="" /></div>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span>l </span><span>mysql<span style="font-family: 宋体;">为什么受到如此的欢迎</span></span></p>
<p class="p0">
<p class="p0"><span>Sun<span style="font-family: 宋体;">公司今天1月份花了10亿美元将mysql收购，准备进军开源和数据库。</span></span></p>
<p class="p0">
<table border="0">
<tbody>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">数据库系统</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span>Oracle</span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span>SQL Server</span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span>MySQL</span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span>DB2</span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">是否免费</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">收费</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">收费</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">免费</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">收费</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">存储过程</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">视图</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">快照</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">不支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">触发器</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">支持</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">安全</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">强</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">强</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">复杂查询</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">强</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">弱</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">索引</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">丰富</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">一般</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">弱</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">数据类型</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">多</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">多</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">多</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">多</span></span></p>
</td>
</tr>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">事务处理</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">强</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">强</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">弱</span></span></p>
</td>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">中</span></span></p>
</td>
</tr>
</tbody>
</table>
<p class="p0">
<p class="p0">
<p class="p0"><span>l </span><span>mysql<span style="font-family: 宋体;">数据库系统的优缺点</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">每个系统都有自身的不足和发展历程，mysql也一样。</span></span></p>
<p class="p0">
<table border="0">
<tbody>
<tr>
<td width="284" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">优点</span></span></p>
</td>
<td width="284" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">缺点</span></span></p>
</td>
</tr>
<tr>
<td width="284" valign="top">
<p class="p0"><span>1. </span><span><span style="font-family: 宋体;">源码公开，免费</span></span></p>
<p class="p0"><span>2. </span><span><span style="font-family: 宋体;">跨平台</span></span></p>
<p class="p0"><span>3. </span><span><span style="font-family: 宋体;">为多种开发语言和包提供了API</span></span></p>
<p class="p0"><span>4. </span><span><span style="font-family: 宋体;">支持多线程</span></span></p>
<p class="p0"><span>5. </span><span><span style="font-family: 宋体;">小巧、灵活、速度较快</span></span></p>
<p class="p0"><span>6. </span><span><span style="font-family: 宋体;">支持各种字符集</span></span></p>
<p class="p0"><span>7. </span><span><span style="font-family: 宋体;">提供各种连接、优化的工具包</span></span></p>
<p class="p0">
</td>
<td width="284" valign="top">
<p class="p0"><span>1. </span><span><span style="font-family: 宋体;">不完善，很多数据库特性不支持</span></span></p>
<p class="p0"><span>2. </span><span><span style="font-family: 宋体;">只适合中小型应用，对于大型应用，可以跟其他数据库互补；</span></span></p>
<p class="p0"><span>3. </span><span><span style="font-family: 宋体;">数据库系统数据量只能达到千万级别；</span></span></p>
<p class="p0">
</td>
</tr>
</tbody>
</table>
<p class="p0">
<p class="p0"><span>l </span><span><span style="font-family: 宋体;">网络服务的需求</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">随着Internet的飞速发展和对我们生活的深入影响，越来越多的个人在互联网上购物、娱</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">乐、休闲、与人沟通、获取信息；越来越多的企业把他们与顾客和业务伙伴之间的联络</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">搬到互联网上，通过网络来完成交易，建立与客户之间的联系。互联网的用户数和网络</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">流量正以几何级数增长，这对网络服务的可伸缩性提出很高的要求。例如，比较热门的Web</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">站点会因为被访问次数急剧增长而不能及时处理用户的请求，导致用户进行长时间的等待</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">，大大降低了服务质量。另外，随着电子商务等关键性应用在网上运行，任何例外的服务</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">中断都将造成不可估量的损失，服务的高可用性也越来越重要。所以，对用硬件和软件方</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">法实现高可伸缩、高可用网络服务的需求不断增长，这种需求可以归结以下几点：</span></span></p>
<p class="p0">
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">可伸缩性（Scalability），当服务的负载增长时，系统能被扩展来满足需求，且不降</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">低服务质量。</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">高可用性（Availability），尽管部分硬件和软件会发生故障，整个系统的服务必须是</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">每天24小时每星期7天可用的。</span></span></p>
<p class="p0"><span>3) </span><span><span style="font-family: 宋体;">可管理性（Manageability），整个系统可能在物理上很大，但应该容易管理。</span></span></p>
<p class="p0"><span>4) </span><span><span style="font-family: 宋体;">价格有效性（Cost-effectiveness），整个系统实现是经济的、易支付的。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">单服务器显然不能处理不断增长的负载。这种服务器升级方法有下列不足：一是升级过</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">程繁琐，机器切换会使服务暂时中断，并造成原有计算资源的浪费；二是越往高端的服务</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">器，所花费的代价越大；三是一旦该服务器或应用软件失效，会导致整个服务的中断。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">通过高性能网络或局域网互联的服务器集群正成为实现高可伸缩的、高可用网络服务的有</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">效结构。这种松耦合结构比紧耦合的多处理器系统具有更好的伸缩性和性能价格比，组成</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">集群的PC服务器或RISC服务器和标准网络设备因为大规模生产，价格低，具有很高的性能</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">价格比。但是，这里有很多挑战性的工作，如何在集群系统实现并行网络服务，它对外是</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">透明的，它具有良好的可伸缩性和可用性。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">针对上述需求，我们给出了基于IP层和基于内容请求分发的负载平衡调度解决方法，并在</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">Linux内核中实现了这些方法，将一组服务器构成一个实现可伸缩的、高可用网络服务的服</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">务器集群，我们称之为Linux虚拟服务器（Linux Virtual Server）。在LVS集群中，使得</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">服务器集群的结构对客户是透明的，客户访问集群提供的网络服务就像访问一台高性能、</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">高可用的服务器一样。客户程序不受服务器集群的影响不需作任何修改。系统的伸缩性通</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">过在服务机群中透明地加入和删除一个节点来达到，通过检测节点或服务进程故障和正</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">确地重置系统达到高可用性。</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span>l </span><span><span style="font-family: 宋体;">什么是mysql集群</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">分为同步集群和异步集群。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">同步集群（mysql cluster）</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">结构：</span></span><span><span style="font-family: 宋体;">（data + sql + mgm节点）</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">特点：</span></span></p>
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">内存级别的，对硬件要求较低，但是对内存要求较大。换算比例为：1：1.1；</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">数据同时放在几台服务器上，冗余较好；</span></span></p>
<p class="p0"><span>3) </span><span><span style="font-family: 宋体;">速度一般；</span></span></p>
<p class="p0"><span>4) </span><span><span style="font-family: 宋体;">建表需要声明为engine=ndbcluster</span></span></p>
<p class="p0"><span>5) </span><span><span style="font-family: 宋体;">扩展性强；</span></span></p>
<p class="p0"><span>6) </span><span><span style="font-family: 宋体;">可以实现高可用性和负载均衡，实现对大型应用的支持；</span></span></p>
<p class="p0"><span>7) </span><span><span style="font-family: 宋体;">必须是特定的mysql版本，如：已经编译好的max版本；</span></span></p>
<p class="p0"><span> <img src='http://www.evanjiang.net.cn/wp-includes/images/smilies/icon_cool.gif' alt='8)' class='wp-smiley' /> </span><span><span style="font-family: 宋体;">配置和管理方便，不会丢失数据；</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">异步集群（mysql replication）</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">结构：</span></span><span><span style="font-family: 宋体;">（master + slave）</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">特点：</span></span></p>
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">主从数据库异步数据；</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">数据放在几台服务器上，冗余一般；</span></span></p>
<p class="p0"><span>3) </span><span><span style="font-family: 宋体;">速度较快；</span></span></p>
<p class="p0"><span>4) </span><span><span style="font-family: 宋体;">扩展性差；</span></span></p>
<p class="p0"><span>5) </span><span><span style="font-family: 宋体;">无法实现高可用性和负载均衡（只能在程序级别实现读写分离，减轻对主数据库的压力）；</span></span></p>
<p class="p0"><span>6) </span><span><span style="font-family: 宋体;">配置和管理较差，可能会丢失数据；</span></span></p>
<p class="p0">
<p class="p0"><span>l </span><span><span style="font-family: 宋体;">什么是负载均衡</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">通过director，将用户的请求分发到real server服务器上，然后返回给用户。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">负载均衡部署灵活、能够满足各种需求。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">实现方式：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">硬件：BIG/IP、Cisco、IBM（昂贵）</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">软件：LVS（免费）</span></span></p>
<p class="p0"><span>LVS<span style="font-family: 宋体;">系统将用户的请求的数据包在数据层和网络层进行了封装和转发，由三种方式满足各种需求。</span></span></p>
<p class="p0">
<p class="p0"><span>1) </span><span>DR<span style="font-family: 宋体;">：直接路由</span></span></p>
<p class="p0"><span>2) </span><span>Tuning<span style="font-family: 宋体;">：tcp/ip隧道</span></span></p>
<p class="p0"><span>3) </span><span>NAT<span style="font-family: 宋体;">：网络地址转换</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">需求：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">免费的软件包</span></span></p>
<p class="p0"><span>1) </span><span>2<span style="font-family: 宋体;">台低端的director（active和standby）</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">心跳线：连接2台director，检测活动情况</span></span></p>
<p class="p0"><span>3) </span><span>2<span style="font-family: 宋体;">台以上的real servers</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">通用结构：</span></span></p>
<div><img src="http://blogimg.chinaunix.net/blog/upfile2/081217203336.jpg" border="0" alt="" width="500" /></div>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">有兴趣的可以分别研究上面的三种LVS结构。</span></span></p>
<p class="p0">
<p class="p0"><span>l </span><span>mysql<span style="font-family: 宋体;">集群部署和实现方法</span></span></p>
<p class="p0">
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">假设现在有4台服务器（mysql官方推荐的最小配置）</span></span></p>
<p class="p0">
<p>
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
</p>
<table border="0">
<tbody>
<tr>
<td width="113" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">服务器</span></span></p>
</td>
<td width="205" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">开启的服务</span></span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">角色</span></span></p>
</td>
</tr>
<tr>
<td rowspan="3" width="113" valign="top">
<p class="p0"><span>192.168.131.164</span></p>
<p class="p0"><span>Ndb1</span></p>
</td>
<td width="205" valign="top">
<p class="p0"><span>Mysqld</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Mysql API</span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Ndb_mgmd</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">管理节点(master)</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Heartbeat</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Director(master)</span></p>
</td>
</tr>
<tr>
<td rowspan="3" width="113" valign="top">
<p class="p0"><span>192.168.131.26</span></p>
<p class="p0"><span>Ndb2</span></p>
</td>
<td width="205" valign="top">
<p class="p0"><span>Mysqld</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Mysql API</span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Ndb_mgmd</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">管理节点(backup)</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Heartbeat</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Director(standby)</span></p>
</td>
</tr>
<tr>
<td rowspan="3" width="113" valign="top">
<p class="p0"><span>192.168.131.77</span></p>
<p class="p0"><span>Sql1</span></p>
</td>
<td width="205" valign="top">
<p class="p0"><span>Mysqld</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Mysql API<span style="font-family: 宋体;">（realserver）</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Ndbd</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">存储节点</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Arptables</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">访问路由</span></span></p>
</td>
</tr>
<tr>
<td rowspan="3" width="113" valign="top">
<p class="p0"><span>192.168.131.101</span></p>
<p class="p0"><span>Sql2</span></p>
</td>
<td width="205" valign="top">
<p class="p0"><span>Mysqld</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span>Mysql API<span style="font-family: 宋体;">（realserver）</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Ndbd</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">存储节点</span></span></p>
</td>
</tr>
<tr>
<td width="205" valign="top">
<p class="p0"><span>Arptables</span></p>
</td>
<td width="246" valign="top">
<p class="p0"><span><span style="font-family: 宋体;">访问路由</span></span></p>
</td>
</tr>
</tbody>
</table>
<p class="p0">
<p class="p0"><span>2）</span><span><span style="font-family: 宋体;">服务器安装配置和网络连接</span></span></p>
<p class="p0"><span>(<span style="font-family: 宋体;">以下为所有服务器各操作一遍，共4遍)</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">安装：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">将4台服务器安装CentOS 5.2，选择下面的包：</span></span></p>
<p class="p0"><span>Clustering</span></p>
<p class="p0"><span>Storage Clustering</span></p>
<p class="p0"><span>mysql<span style="font-family: 宋体;">不需要安装</span></span><span><span style="font-family: 宋体;">，但perl-mysql-xxx的所有包需要安装</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">开发工具包和类库</span></span></p>
<p class="p0"><span>sshd<span style="font-family: 宋体;">服务</span></span></p>
<p class="p0"><span>SElinux ==&gt;disable</span></p>
<p class="p0"><span><span style="font-family: 宋体;">语言</span></span><span><span style="font-family: 宋体;">支持</span></span><span><span style="font-family: 宋体;">包不安装，默认</span></span><span><span style="font-family: 宋体;">美国英语</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">设定主机名：</span></span></p>
<p class="p0"><span>Vi /etc/sysconfig/network</span></p>
<p class="p0"><span>Hostname=xxx</span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">检查主机名：</span></span></p>
<p class="p0"><span>Uname -a</span></p>
<p class="p0"><span><span style="font-family: 宋体;">必须和上表中的一一对应。否则有问题。</span></span></p>
<p class="p0">
<p class="p0"><span>Vi /etc/hosts</span></p>
<p class="p0"><span>Ndb1</span><span> </span><span>192.168.131.164</span></p>
<p class="p0"><span>Ndb2</span><span> </span><span>192.168.131.26</span></p>
<p class="p0"><span>Sql1</span><span> </span><span>192.168.131.77</span></p>
<p class="p0"><span>Sql2</span><span> </span><span>192.168.131.101</span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">更新：</span></span></p>
<p class="p0"><span>#rpm &#8211;import http://dries.ulyssis.org/rpm/RPM-GPG-KEY.dries.txt</span></p>
<p class="p0"><span>#yum update -y &amp;&amp; yum -y install lynx libawt xorg-x11-deprecated-libs nx freenx arptables_jf httpd-devel</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">下载：</span></span></p>
<p class="p0"><span>Mysql cluster<span style="font-family: 宋体;">版本（我下载的5.0.67社区版本）：</span></span></p>
<p class="p0"><span>[root@ndb1 RHEL5]# ls -lh  MySQL* | awk &#8217;{print $9}&#8217;</span></p>
<p class="p0"><span>MySQL-client-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-clusterextra-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-clustermanagement-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-clusterstorage-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-clustertools-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-devel-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-server-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-shared-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-shared-compat-5.0.67-0.rhel4.i386.rpm</span></p>
<p class="p0"><span>MySQL-shared-compat-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>MySQL-test-community-5.0.67-0.rhel5.i386.rpm</span></p>
<p class="p0"><span>perl-HTML-Template-2.9-1.el5.rf.noarch.rpm</span></p>
<p class="p0"><span>[root@ndb1 RHEL5]# </span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在服务器上安装以上包，在安装的过程中如果缺少包或者库，采用：</span></span></p>
<p class="p0"><span>yum install xxxx<span style="font-family: 宋体;">自行安装。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">建立目录：</span></span></p>
<p class="p0"><span>#</span><span>mkdir /var/lib/mysql-cluster</span><span> -p</span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下分别操作：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">安装cluster组件：</span></span></p>
<p class="p0"><span>#Rpm -Uvh MySQL-xx-xx.rpm<span style="font-family: 宋体;">，根据不同，可以少安装部分组件。根据你需要而定。</span></span></p>
<p class="p0">
<p class="p0"><span>163<span style="font-family: 宋体;">、26上，我安装了：</span></span></p>
<p class="p0"><span>[root@ndb1 RHEL5]# rpm -aq | grep MySQL</span></p>
<p class="p0"><span>MySQL-clusterstorage-community-5.0.67-0.rhel5</span></p>
<p class="p0"><span>MySQL-clustertools-community-5.0.67-0.rhel5</span></p>
<p class="p0"><span>MySQL-clustermanagement-community-5.0.67-0.rhel5</span></p>
<p class="p0"><span>MySQL-shared-community-5.0.67-0.rhel5</span></p>
<p class="p0"><span>perl-DBD-MySQL-3.0007-1.fc6</span></p>
<p class="p0"><span>MySQL-server-community-5.0.67-0.rhel5</span></p>
<p class="p0"><span>[root@ndb1 RHEL5]# </span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span>101<span style="font-family: 宋体;">、77上，我安装了：</span></span></p>
<p class="p0"><span>[root@sql1 ~]# rpm -aq | grep MySQL</span></p>
<p class="p0"><span>MySQL-clusterstorage-community-5.0.67-0.rhel4</span></p>
<p class="p0"><span>MySQL-devel-community-5.0.67-0.rhel4</span></p>
<p class="p0"><span>MySQL-server-community-5.0.67-0.rhel4</span></p>
<p class="p0"><span>MySQL-client-community-5.0.67-0.rhel4</span></p>
<p class="p0"><span>MySQL-shared-community-5.0.67-0.rhel4</span></p>
<p class="p0"><span>[root@sql1 ~]# </span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下在ndb1（164）和ndb2（26）上操作</span></span></p>
<p class="p0"><span>[root@ndb1 ~]# vi /var/lib/mysql-cluster/config.ini </span></p>
<p class="p0"><span>[NDBD DEFAULT]</span></p>
<p class="p0"><span>NoOfReplicas=2</span></p>
<p class="p0"><span>DataMemory=800M</span></p>
<p class="p0"><span>IndexMemory=400M</span></p>
<p class="p0">
<p class="p0"><span>[MYSQLD DEFAULT]</span></p>
<p class="p0">
<p class="p0"><span>[NDB_MGMD DEFAULT]</span></p>
<p class="p0">
<p class="p0"><span>[TCP DEFAULT]</span></p>
<p class="p0">
<p class="p0"><span># Section for the cluster management node</span></p>
<p class="p0"><span>[NDB_MGMD]</span></p>
<p class="p0"><span># IP address of the management node (this system)</span></p>
<p class="p0"><span>ID=1</span></p>
<p class="p0"><span>HostName=192.168.131.164</span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span>[NDB_MGMD]</span></p>
<p class="p0"><span># IP address of the management node (this system)</span></p>
<p class="p0"><span>ID=2</span></p>
<p class="p0"><span>HostName=192.168.131.26</span></p>
<p class="p0">
<p class="p0"><span># Section for the storage nodes</span></p>
<p class="p0"><span>[NDBD]</span></p>
<p class="p0"><span># IP address of the first storage node</span></p>
<p class="p0"><span>HostName=192.168.131.77</span></p>
<p class="p0"><span>DataDir= /var/lib/mysql-cluster</span></p>
<p class="p0">
<p class="p0"><span>[NDBD]</span></p>
<p class="p0"><span># IP address of the second storage node</span></p>
<p class="p0"><span>HostName=192.168.131.101</span></p>
<p class="p0"><span>DataDir=/var/lib/mysql-cluster</span></p>
<p class="p0">
<p class="p0"><span># one [MYSQLD] per storage node</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>[MYSQLD]</span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下在mysql API上操作（这里，我设定了7个API，以后可以随时加入）</span></span></p>
<p class="p0">
<p class="p0"><span>Mysqld API<span style="font-family: 宋体;">的配置文件：</span></span></p>
<p class="p0"><span>Vi /etc/my.cnf</span></p>
<p class="p0"><span>[root@ndb1 ~]# cat /etc/my.cnf </span></p>
<p class="p0"><span>[mysqld]</span></p>
<p class="p0"><span>ndbcluster</span></p>
<p class="p0"><span>ndb-connectstring = &#8221;host=192.168.131.164,host=192.168.131.26&#8243; </span></p>
<p class="p0">
<p class="p0"><span>[ndb_mgm]</span></p>
<p class="p0"><span>connect-string = &#8221;host=192.168.131.164,host=192.168.131.26&#8243;</span></p>
<p class="p0">
<p class="p0"><span>[ndbd]</span></p>
<p class="p0"><span>connect-string = &#8221;host=192.168.131.164,host=192.168.131.26&#8243;</span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">分别启动ndb_mgmd/ndbd/mysqld</span></span></p>
<p class="p0"><span>164/26:</span></p>
<p class="p0"><span>ndb_mgmd -f /var/lib/mysql-cluster/config.ini</span></p>
<p class="p0">
<p class="p0"><span>77/101:</span></p>
<p class="p0"><span>Ndbd &#8211;initial</span></p>
<p class="p0">
<p class="p0"><span>164/26/77/101:</span></p>
<p class="p0"><span>/etc/rc.d/init.d/mysql start</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在管理节点ndb1(164)和ndb2(26)上查看各节点的情况：</span></span></p>
<p class="p0"><span>[root@ndb1 ~]# ndb_mgm</span></p>
<p class="p0"><span>&#8211; NDB Cluster &#8211; Management Client &#8211;</span></p>
<p class="p0"><span>ndb_mgm&gt; show</span></p>
<p class="p0"><span>Connected to Management Server at: 192.168.131.164:1186</span></p>
<p class="p0"><span>Cluster Configuration</span></p>
<p class="p0"><span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="p0"><span>[ndbd(NDB)]     2 node(s)</span></p>
<p class="p0"><span>id=3    @192.168.131.77  (Version: 5.0.67, Nodegroup: 0, Master)</span></p>
<p class="p0"><span>id=4    @192.168.131.101  (Version: 5.0.67, Nodegroup: 0)</span></p>
<p class="p0">
<p class="p0"><span>[ndb_mgmd(MGM)] 2 node(s)</span></p>
<p class="p0"><span>id=1    @192.168.131.164  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=2    @192.168.131.26  (Version: 5.0.67)</span></p>
<p class="p0">
<p class="p0"><span>[mysqld(API)]   7 node(s)</span></p>
<p class="p0"><span>id=5    @192.168.131.101  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=6    @192.168.131.26  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=7    @192.168.131.164  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=8    @192.168.131.77  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=9 (not connected, accepting connect from any host)</span></p>
<p class="p0"><span>id=10 (not connected, accepting connect from any host)</span></p>
<p class="p0"><span>id=11 (not connected, accepting connect from any host)</span></p>
<p class="p0">
<p class="p0"><span>ndb_mgm&gt; </span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以上说明一切正常。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">将服务增加到开机启动服务项中：</span></span></p>
<p class="p0"><span>164/26:</span></p>
<p class="p0"><span>echo &#8217;ndb_mgmd -f /var/lib/mysql-cluster/config.ini&#8217; &gt; /etc/</span><span>rc.d/</span><span>init.d/ndb_mgmd</span><span><br />
</span><span>chmod 755 /etc/</span><span>rc.d/</span><span>init.d/ndb_mgmd</span></p>
<p class="p0">
<p class="p0"><span>77/101:</span></p>
<p class="p0"><span>Echo &#8217;ndbd&#8217; &gt; /etc/rc.d/init.d/ndbd</span></p>
<p class="p0"><span>Chmod 755 /etc/rc.d/init.d/ndbd</span></p>
<p class="p0"><span>Chkconfig &#8211;level 2345 ndbd on</span></p>
<p class="p0">
<p class="p0"><span>OK<span style="font-family: 宋体;">，到此mysql cluster 配置完成。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">强调：</span></span></p>
<p class="p0"><span>1<span style="font-family: 宋体;">）由于数据放在内存中，需要在ndb节点上加大内存的数量。按照1：1.1的比例，如果数据量达到3.6GB，需要4GB的内存。</span></span></p>
<p class="p0"><span>2<span style="font-family: 宋体;">）由于NDB和mysqld（API）都很耗费内存，所以建议将NDB放在164和26上。可能启动的时候会有警告，但是没关系的。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">查看数据和内存情况：</span></span></p>
<p class="p0"><span>77<span style="font-family: 宋体;">：</span></span></p>
<p class="p0"><span>[root@sql2 ~]# top</span></p>
<p class="p0"><span>top - 16:39:36 up  1:59,  1 user,  load average: 1.37, 0.76, 0.60</span></p>
<p class="p0"><span>Tasks:  80 total,   2 running,  78 sleeping,   0 stopped,   0 zombie</span></p>
<p class="p0"><span>Cpu(s):  4.0%us,  4.0%sy,  0.0%ni, 87.3%id,  2.9%wa,  0.2%hi,  1.5%si,  0.0%st</span></p>
<p class="p0"><span>Mem: </span><span>2075600k total,  2005868k used, </span><span> 69732k free,    68256k buffers</span></p>
<p class="p0"><span>Swap:  2031608k total,        0k used,  2031608k free,  1400812k cached</span></p>
<p class="p0">
<p class="p0"><span>PID USER    PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND </span><span>2306 mysql     25   0  119m   15m   3952 S   22  0.8         10:20.94 mysqld </span></p>
<p class="p0"><span>23791 root      15   0  1587m  484m  31m R   20  23.9        9:34.97 ndbd</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">由于77只有2GB的内存，而在config.ini中，把1.2GB的内存分配给了NDB，所以，加上mysqld用掉的，2GB的内存似乎已经所剩无几了。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">查看77上的数据大小：</span></span></p>
<p class="p0"><span>[root@sql2 ~]# cd /var/lib/mysql-cluster/ndb_4_fs/</span></p>
<p class="p0"><span>[root@sql2 ndb_4_fs]# du -lh</span></p>
<p class="p0"><span>1.3GB</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">连接API创建数据库：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">由于上面4台都做为mysqld 的API，所以创建数据库的时候，都需要创建一遍。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">以下操作在4台API上都需要操作：</span></span></p>
<p class="p0"><span># Mysql -uroot -pxxxxxxxxxxxx -A</span></p>
<p class="p0"><span>Mysql&gt; create database testdatabase;</span></p>
<p class="p0"><span>Mysql&gt; grant all on *.testdatabase to </span><span><a href="mailto:root@%27192.168.131.%%27"><span class="15">root@&#8217;192.168.131.%&#8217;</span></a></span><span> identified by &#8217;xxxxxxxxxxxxxxx&#8217;;</span></p>
<p class="p0"><span>Mysql&gt; flush privileges;</span></p>
<p class="p0"><span>Mysql&gt; create table test(int (1));</span></p>
<p class="p0"><span>Mysql&gt; insert into test(1);</span></p>
<p class="p0"><span>Mysql&gt; quit;</span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以上做完以后，可以通过任意一台API上创建表，并写数据到表中，其他数据库都会同步写入。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">分别连接每台服务器进行检查：</span></span></p>
<p class="p0"><span># Mysql -uroot -pxxxxxxxxxxxx -A</span></p>
<p class="p0"><span>Mysql&gt; use testdatabase;</span></p>
<p class="p0"><span>Mysql&gt; select * from test;</span></p>
<p class="p0"><span><span style="font-family: 宋体;">如果输出结果完全相同，表明mysql cluster已经可以正常工作了。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在2台API上设置LVS</span></span></p>
<p class="p0">
<p class="p0"><span>Mysql cluster<span style="font-family: 宋体;">做好以后，数据库分别建立同名的数据库以后，权限分配好，然后只要在一台上写入数据，其他的NDB就存储了相同的数据。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">用程序连接任意一台API写数据，如果程序中未设置API的选择和判断，只使用了其中一个API，一旦API当机，则无法写入数据，必须修改程序。即便做了API的判断和选择，因为没有实现负载均衡，服务器的性能没有充分利用。高可用性也没有达到目标。所以，我们现在在2台API之间做LVS。</span></span></p>
<p class="p0">
<p class="p0"><span>LVS<span style="font-family: 宋体;">采用 ultramonkey（</span></span><span><a href="http://www.ultramonkey.org/"><span class="15">http://www.ultramonkey.org</span></a></span><span><span style="font-family: 宋体;">）</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">首先在NDB1（164）和NDB2（26）上下载heartbeat的软件包：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">下载所有的rpm包：</span></span></p>
<p class="p0"><span>Cd /usr/local/src</span></p>
<p class="p0"><span>Mkdir heartbeat</span></p>
<p class="p0"><span>Cd heartbeat</span></p>
<p class="p0"><span>#Wget xxx.xxx.rpm</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">我下载了如下的软件包：</span></span></p>
<p class="p0"><span>[root@ndb1 heartbeat]# ls -lh *.rpm | awk &#8217;{print $9}&#8217;;</span></p>
<p class="p0"><span>arptables-noarp-addr-0.99.2-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>heartbeat-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm</span></p>
<p class="p0"><span>heartbeat-ldirectord-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm</span></p>
<p class="p0"><span>heartbeat-pils-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm</span></p>
<p class="p0"><span>heartbeat-stonith-1.2.3.cvs.20050927-1.rh.el.um.4.i386.rpm</span></p>
<p class="p0"><span>ipvsadm-1.21-1.rh.el.1.um.1.i386.rpm</span></p>
<p class="p0"><span>libnet-1.1.2.1-1.rh.el.um.1.i386.rpm</span></p>
<p class="p0"><span>perl-Authen-SASL-2.08-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-Convert-ASN1-0.18-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-IO-Socket-SSL-0.96-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-ldap-0.3202-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-Mail-IMAPClient-2.2.9-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-Net-SSLeay-1.25-1.rh.el.um.1.i386.rpm</span></p>
<p class="p0"><span>perl-Parse-RecDescent-1.94-1.el5.rf.noarch.rpm</span></p>
<p class="p0"><span>perl-Parse-RecDescent-1.94-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-XML-NamespaceSupport-1.08-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>perl-XML-SAX-0.12-1.rh.el.um.1.noarch.rpm</span></p>
<p class="p0"><span>[root@ndb1 heartbeat]# </span></p>
<p class="p0">
<p class="p0"><span>Heartbeat<span style="font-family: 宋体;">中包含以下几部分：</span></span></p>
<p class="p0"><span>1) </span><span>Master Director<span style="font-family: 宋体;">（分发器）&#8211; MD</span></span></p>
<p class="p0"><span>2) </span><span>Backup Director<span style="font-family: 宋体;">（备份分发器）&#8211; BD</span></span></p>
<p class="p0"><span>3) </span><span>Real server <span style="font-family: 宋体;">（真实服务器，可以有2个以上）&#8211;RS</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span>IP<span style="font-family: 宋体;">设置并确认：</span></span></p>
<p class="p0"><span>MD:</span></p>
<p class="p0"><span>Eth0:192.168.131.164/24/GW:192.168.131.1</span></p>
<p class="p0"><span>Eth1:10.9.30.1/24</span></p>
<p class="p0">
<p class="p0"><span>MD:</span></p>
<p class="p0"><span>Eth0:192.168.131.26/24/GW:192.168.131.1</span></p>
<p class="p0"><span>Eth1:10.9.30.2</span></p>
<p class="p0">
<p class="p0"><span>VIP:192.168.131.105/24/GW:192.168.131.1 &#8211; <span style="font-family: 宋体;">用户访问的统一虚拟IP</span></span></p>
<p class="p0">
<p class="p0"><span>RS1:192.168.131.101/24/GW:192.168.131.1</span></p>
<p class="p0"><span>RS2:192.168.131.77/24/GW:192.168.131.1</span></p>
<p class="p0"><span><span style="font-family: 宋体;">。。。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">等等</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下操作在所有服务器上执行：</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">主机名确认：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">分别执行：</span></span></p>
<p class="p0"><span>#uname -a</span></p>
<p class="p0"><span><span style="font-family: 宋体;">主机名对应表中所列。</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在MD和BD修改IP转发：</span></span></p>
<p class="p0"><span>#vi modprobe.sh</span></p>
<p class="p0"><span>modprobe ip_vs_dh</span><span><br />
</span><span>modprobe ip_vs_ftp</span><span><br />
</span><span>modprobe ip_vs</span><span><br />
</span><span>modprobe ip_vs_lblc</span><span><br />
</span><span>modprobe ip_vs_lblcr</span><span><br />
</span><span>modprobe ip_vs_lc</span><span><br />
</span><span>modprobe ip_vs_nq</span><span><br />
</span><span>modprobe ip_vs_rr</span><span><br />
</span><span>modprobe ip_vs_sed</span><span><br />
</span><span>modprobe ip_vs_sh</span><span><br />
</span><span>modprobe ip_vs_wlc</span><span><br />
</span><span>modprobe ip_vs_wrr </span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span>#chmod 755 modprobe.sh</span></p>
<p class="p0"><span># sh modprobe.sh</span></p>
<p class="p0"><span># </span><span>vi /etc/modules</span></p>
<p class="p0"><span>ip_vs_dh</span></p>
<p class="p0"><span>ip_vs_ftp</span></p>
<p class="p0"><span>ip_vs</span></p>
<p class="p0"><span>ip_vs_lblc</span></p>
<p class="p0"><span>ip_vs_lblcr</span></p>
<p class="p0"><span>ip_vs_lc</span></p>
<p class="p0"><span>ip_vs_nq</span></p>
<p class="p0"><span>ip_vs_rr</span></p>
<p class="p0"><span>ip_vs_sed</span></p>
<p class="p0"><span>ip_vs_sh</span></p>
<p class="p0"><span>ip_vs_wlc</span></p>
<p class="p0"><span>ip_vs_wrr</span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span>#Vi </span><span><a><span>/etc/sysctl.conf</span></a></span></p>
<p class="p0"><span>net.ipv4.ip_forward = 0 </span></p>
<p class="p0"><span><span style="font-family: 宋体;">改为：</span></span></p>
<p class="p0"><span>net.ipv4.ip_forward = 1</span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">使修改生效：</span></span></p>
<p class="p0"><span>/sbin/sysctl -p</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在MD和BD上安装heartbeat软件包</span></span></p>
<p class="p0">
<p class="p0"><span>#Rpm -Uvh perl-xx-xx-xx.rpm</span></p>
<p class="p0"><span>#Yum  install heartbeat</span></p>
<p class="p0"><span>#Rpm -Uvh arptables-noarp-addr-0.99.2-1.rh.el.um.1.noarch.rpm </span></p>
<p class="p0"><span>#rpm -Uvh perl-Mail-POP3Client-2.17-1.el5.centos.noarch.rpm</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">缺少perl包，就使用yum install perl-xx-xx</span></span></p>
<p class="p0"><span>#Perl -CPAN -e shell</span></p>
<p class="p0"><span><span style="font-family: 宋体;">这样安装的perl包不知道为何不好使？奇怪</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">这里VIP实际上是绑定在2台director上。所以director之间需要做心跳处理。心跳线使用eth1口，用交叉线连接起来。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">交叉线的一端：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">另外一端：</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">这样可以避免影响其他服务器。</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">配置heartbeat</span></span></p>
<p class="p0"><span>Heartbeat<span style="font-family: 宋体;">有3个配置文件：</span></span></p>
<p class="p0"><span>Ha.cf</span></p>
<p class="p0"><span>Authkeys</span></p>
<p class="p0"><span>Haresources</span></p>
<p class="p0">
<p class="p0"><span>ldirectord<span style="font-family: 宋体;">进程的配置文件</span></span></p>
<p class="p0"><span>Ldirectord.cf</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">一共需要配置4个配置文件。</span></span></p>
<p class="p0">
<p class="p0"><span>#vi ha.cf</span></p>
<p class="p0"><span>logfacility  local0</span></p>
<p class="p0"><span>bcast        eth1</span></p>
<p class="p0"><span>mcast eth1 225.0.0.1 694 1 0</span></p>
<p class="p0"><span>auto_failback off</span></p>
<p class="p0"><span>node        ndb1</span></p>
<p class="p0"><span>node        ndb2</span></p>
<p class="p0"><span>respawn hacluster /usr/lib/heartbeat/ipfail</span></p>
<p class="p0"><span>apiauth ipfail gid=haclient uid=hacluster</span></p>
<p class="p0">
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span># vi authkeys </span></p>
<p class="p0"><span>auth 3</span></p>
<p class="p0"><span>3 md5 514a49f83820e34c877ff48770e48ea7</span></p>
<p class="p0">
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0"><span># vi haresources</span></p>
<p class="p0"><span>ndb1</span><span> \</span></p>
<p class="p0"><span> ldirectord::ldirectord.cf \</span></p>
<p class="p0"><span> LVSSyncDaemonSwap::master \</span></p>
<p class="p0"><span> IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0">
<p class="p0"><span>Ndb2<span style="font-family: 宋体;">上需要将主机名更改一下。</span></span></p>
<p class="p0">
<p class="p0"><span>:wq</span></p>
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">设置属性并使heartbeat开机启动</span></span></p>
<p class="p0"><span># chmod 600 /etc/ha.d/authkeys</span></p>
<p class="p0"><span>#/sbin/chkconfig &#8211;level 2345 heartbeat on</span></p>
<p class="p0"><span>#/sbin/chkconfig &#8211;del ldirectord</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">启动heartbeat：</span></span></p>
<p class="p0"><span>/etc/init.d/ldirectord stop</span></p>
<p class="p0"><span>/etc/init.d/heartbeat start</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在MD和BD上检查VIP是否生效：</span></span></p>
<p class="p0"><span>ip addr sh eth0</span></p>
<p class="p0"><span>[root@ndb1 ha.d]# ip addr sh eth0</span></p>
<p class="p0"><span>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast qlen 1000</span></p>
<p class="p0"><span> link/ether 00:30:48:28:c6:85 brd ff:ff:ff:ff:ff:ff</span></p>
<p class="p0"><span> inet 192.168.131.164/24 brd 192.168.131.255 scope global eth0</span></p>
<p class="p0"><span> inet 192.168.131.105/24 brd 192.168.131.255 scope global secondary eth0</span></p>
<p class="p0"><span> inet6 fe80::230:48ff:fe28:c685/64 scope link </span></p>
<p class="p0"><span> valid_lft forever preferred_lft forever</span></p>
<p class="p0"><span>[root@ndb1 ha.d]# </span></p>
<p class="p0">
<p class="p0"><span>[root@ndb2 ~]# ip addr sh eth0</span></p>
<p class="p0"><span>2: eth0: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc pfifo_fast qlen 1000</span></p>
<p class="p0"><span> link/ether 00:30:48:28:c4:af brd ff:ff:ff:ff:ff:ff</span></p>
<p class="p0"><span> inet 192.168.131.26/24 brd 192.168.131.255 scope global eth0</span></p>
<p class="p0"><span> inet6 fe80::230:48ff:fe28:c4af/64 scope link </span></p>
<p class="p0"><span> valid_lft forever preferred_lft forever</span></p>
<p class="p0"><span>[root@ndb2 ~]#</span></p>
<p class="p0"><span><span style="font-family: 宋体;">现在在MD（164）上已经生效了。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">检查ldirectored进程</span></span></p>
<p class="p0"><span>[root@ndb1 ha.d]# /usr/sbin/ldirectord ldirectord.cf status</span></p>
<p class="p0"><span>ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5596</span></p>
<p class="p0"><span>[root@ndb1 ha.d]# </span></p>
<p class="p0"><span>[root@ndb2 ~]# /usr/sbin/ldirectord ldirectord.cf status</span></p>
<p class="p0"><span>ldirectord is stopped for /etc/ha.d/ldirectord.cf</span></p>
<p class="p0"><span>[root@ndb2 ~]#</span></p>
<p class="p0"><span>VIP<span style="font-family: 宋体;">生效的director应该是running状态，standby应该是stop状态。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">利用ipvs检查包转发是否生效</span></span></p>
<p class="p0"><span>[root@ndb1 ha.d]# /sbin/ipvsadm -L -n</span></p>
<p class="p0"><span>IP Virtual Server version 1.2.1 (size=4096)</span></p>
<p class="p0"><span>Prot LocalAddress:Port Scheduler Flags</span></p>
<p class="p0"><span> -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</span></p>
<p class="p0"><span>TCP  192.168.131.105:3306 wrr</span></p>
<p class="p0"><span> -&gt; 192.168.131.77:3306          Route   1      3          3034 </span></p>
<p class="p0"><span> -&gt; 192.168.131.101:3306         Route   1      3          3038 </span></p>
<p class="p0"><span>[root@ndb1 ha.d]# </span></p>
<p class="p0">
<p class="p0"><span>[root@ndb2 ~]# /sbin/ipvsadm -L -n</span></p>
<p class="p0"><span>IP Virtual Server version 1.2.1 (size=4096)</span></p>
<p class="p0"><span>Prot LocalAddress:Port Scheduler Flags</span></p>
<p class="p0"><span> -&gt; RemoteAddress:Port           Forward Weight ActiveConn InActConn</span></p>
<p class="p0"><span>[root@ndb2 ~]#</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在MB上已经生效了。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">在MD和BD上检查</span></span><span>LVSSyncDaemonSwap</span><span><span style="font-family: 宋体;">的状态：</span></span></p>
<p class="p0"><span>[root@ndb1 ha.d]# /etc/ha.d/resource.d/LVSSyncDaemonSwap master status</span></p>
<p class="p0"><span>master running</span></p>
<p class="p0"><span>(ipvs_syncmaster pid: 5689)</span></p>
<p class="p0"><span>[root@ndb1 ha.d]#</span></p>
<p class="p0"><span>[root@ndb2 ~]# /etc/ha.d/resource.d/LVSSyncDaemonSwap master status</span></p>
<p class="p0"><span>master stopped</span></p>
<p class="p0"><span>(ipvs_syncbackup pid: 5493)</span></p>
<p class="p0"><span>[root@ndb2 ~]# </span></p>
<p class="p0"><span><span style="font-family: 宋体;">同样，standby的处于stopped状态。</span></span></p>
<p class="p0">
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下在RS服务器上执行：</span></span></p>
<p class="p0"><span>ARP<span style="font-family: 宋体;">转发限制</span></span></p>
<p class="p0"><span>MD<span style="font-family: 宋体;">或者BD采用ARP欺骗将ARP包转发给下面的realserver。为了转发成功，需要做ARP限制。</span></span></p>
<p class="p0"><span>#/etc/init.d/arptables_jf stop</span></p>
<p class="p0"><span>#/usr/sbin/arptables-noarp-addr 192.168.6.240 start</span></p>
<p class="p0"><span>#/etc/init.d/arptables_jf save</span></p>
<p class="p0"><span>#/sbin/chkconfig &#8211;level 2345 arptables_jf on</span></p>
<p class="p0"><span>#/etc/init.d/arptables_jf start</span></p>
<p class="p0"><span><span style="font-family: 宋体;">查看限制链表</span></span></p>
<p class="p0"><span>[root@sql2 mysql-cluster]# /sbin/arptables -L -v -n</span></p>
<p class="p0"><span>Chain IN (policy ACCEPT 29243 packets, 819K bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span> 54  1512 DROP       *      *       0.0.0.0/0            192.168.131.105      00/00              00/00              any    0000/0000  0000/0000  0000/0000 </span></p>
<p class="p0">
<p class="p0"><span>Chain OUT (policy ACCEPT 3931 packets, 110K bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span> 0     0 mangle     *      eth0    192.168.131.105      0.0.0.0/0            00/00              00/00              any    0000/0000  0000/0000  0000/0000 &#8211;mangle-ip-s 192.168.131.101 </span></p>
<p class="p0">
<p class="p0"><span>Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span>[root@sql2 mysql-cluster]# </span></p>
<p class="p0">
<p class="p0"><span>[root@sql1 ~]# /sbin/arptables -L -v -n</span></p>
<p class="p0"><span>Chain IN (policy ACCEPT 29375 packets, 823K bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span> 54  1512 DROP       *      *       0.0.0.0/0            192.168.131.105      00/00              00/00              any    0000/0000  0000/0000  0000/0000 </span></p>
<p class="p0">
<p class="p0"><span>Chain OUT (policy ACCEPT 3903 packets, 109K bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span> 0     0 mangle     *      eth0    192.168.131.105      0.0.0.0/0            00/00              00/00              any    0000/0000  0000/0000  0000/0000 &#8211;mangle-ip-s 192.168.131.77 </span></p>
<p class="p0">
<p class="p0"><span>Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)</span></p>
<p class="p0"><span> pkts bytes target     in     out     source-ip            destination-ip       source-hw          destination-hw     hlen   op         hrd        pro </span></p>
<p class="p0"><span>[root@sql1 ~]# </span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">这样，由MD或者BD转发过来的ARP包就被链表控制了。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">设置如何接收ARP包</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">以下在所有RS上执行</span></span></p>
<p class="p0"><span># cp /etc/sysconfig/network-scripts/ifcfg-lo /etc/sysconfig/network-scripts/ifcfg-lo:0</span></p>
<p class="p0"><span>#Vi /etc/sysconfig/network-scripts/ifcfg-lo\:0 </span></p>
<p class="p0"><span>DEVICE=lo:0</span></p>
<p class="p0"><span>IPADDR=192.168.131.105</span></p>
<p class="p0"><span>NETMASK=255.255.255.255</span></p>
<p class="p0"><span>NETWORK=192.168.131.0</span></p>
<p class="p0"><span>BROADCAST=192.168.131.255</span></p>
<p class="p0"><span>ONBOOT=yes</span></p>
<p class="p0"><span>NAME=loopback</span></p>
<p class="p0"><span>:wq</span></p>
<p class="p0"><span>#/sbin/ifup lo</span></p>
<p class="p0"><span><span style="font-family: 宋体;">查看lo:0</span></span></p>
<p class="p0"><span>[root@sql1 ~]# ip addr sh lo</span></p>
<p class="p0"><span>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 qdisc noqueue </span></p>
<p class="p0"><span> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span></p>
<p class="p0"><span> inet 127.0.0.1/8 scope host lo</span></p>
<p class="p0"><span> inet 192.168.131.105/32 brd 192.168.131.255 scope global lo:0</span></p>
<p class="p0"><span> inet6 ::1/128 scope host </span></p>
<p class="p0"><span> valid_lft forever preferred_lft forever</span></p>
<p class="p0"><span>[root@sql1 ~]# </span></p>
<p class="p0">
<p class="p0"><span>[root@sql2 mysql-cluster]# ip addr sh lo</span></p>
<p class="p0"><span>1: lo: &lt;LOOPBACK,UP,LOWER_UP&gt; mtu 16436 qdisc noqueue </span></p>
<p class="p0"><span> link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00</span></p>
<p class="p0"><span> inet 127.0.0.1/8 scope host lo</span></p>
<p class="p0"><span> inet 192.168.131.105/32 brd 192.168.131.255 scope global lo:0</span></p>
<p class="p0"><span> inet6 ::1/128 scope host </span></p>
<p class="p0"><span> valid_lft forever preferred_lft forever</span></p>
<p class="p0"><span>[root@sql2 mysql-cluster]#</span></p>
<p class="p0"><span><span style="font-family: 宋体;">重新启动服务器</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">以下在所有服务器上执行（请确认ip，服务器上没有running任何正在使用的服务）</span></span></p>
<p class="p0"><span>reboot</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">启动mysql cluster：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">顺序：</span></span></p>
<p class="p0"><span>ndb_mgmd &#8211; 164/26</span></p>
<p class="p0"><span>Ndbd &#8211; 101/77</span></p>
<p class="p0"><span>Mysqld &#8211; <span style="font-family: 宋体;">所有</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">检查服务是否正常</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">以下在ndb上执行</span></span></p>
<p class="p0"><span>#ndb_mgm</span></p>
<p class="p0"><span>[root@ndb1 ha.d]# ndb_mgm</span></p>
<p class="p0"><span>&#8211; NDB Cluster &#8211; Management Client &#8211;</span></p>
<p class="p0"><span>ndb_mgm&gt; show</span></p>
<p class="p0"><span>Connected to Management Server at: 192.168.131.164:1186</span></p>
<p class="p0"><span>Cluster Configuration</span></p>
<p class="p0"><span>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;</span></p>
<p class="p0"><span>[ndbd(NDB)]     2 node(s)</span></p>
<p class="p0"><span>id=3    @192.168.131.77  (Version: 5.0.67, Nodegroup: 0, Master)</span></p>
<p class="p0"><span>id=4    @192.168.131.101  (Version: 5.0.67, Nodegroup: 0)</span></p>
<p class="p0">
<p class="p0"><span>[ndb_mgmd(MGM)] 2 node(s)</span></p>
<p class="p0"><span>id=1    @192.168.131.164  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=2    @192.168.131.26  (Version: 5.0.67)</span></p>
<p class="p0">
<p class="p0"><span>[mysqld(API)]   7 node(s)</span></p>
<p class="p0"><span>id=5    @192.168.131.101  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=6    @192.168.131.26  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=7    @192.168.131.164  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=8    @192.168.131.77  (Version: 5.0.67)</span></p>
<p class="p0"><span>id=9 (not connected, accepting connect from any host)</span></p>
<p class="p0"><span>id=10 (not connected, accepting connect from any host)</span></p>
<p class="p0"><span>id=11 (not connected, accepting connect from any host)</span></p>
<p class="p0">
<p class="p0"><span>ndb_mgm&gt; </span></p>
<p class="p0"><span><span style="font-family: 宋体;">一切正常。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">检查heartbeat是否正常：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">关闭BD，在MD上查看日志：</span></span></p>
<p class="p0"><span>[root@ndb1 ha.d]# tail -f /var/log/messages</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 heartbeat: [5462]: info: Received shutdown notice from &#8217;ndb2&#8242;.</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 heartbeat: [5462]: info: Resources being acquired from ndb2.</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 harc[7085]: info: Running /etc/ha.d/rc.d/status status</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 mach_down[7118]: info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 mach_down[7118]: info: mach_down takeover complete for node ndb2.</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 heartbeat: [5462]: info: mach_down takeover complete.</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 ldirectord[7153]: Invoking ldirectord invoked as: /etc/ha.d/resource.d/ldirectord ldirectord.cf status </span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 ldirectord[7153]: ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5596 </span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 ldirectord[7153]: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 heartbeat: [7086]: info: Local Resource acquisition completed.</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 harc[7175]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 ip-request-resp[7175]: received ip-request-resp ldirectord::ldirectord.cf OK yes</span></p>
<p class="p0"><span>Dec 17 19:42:21 ndb1 ResourceManager[7196]: info: Acquiring resource group: ndb1 ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0"><span>Dec 17 19:42:22 ndb1 ldirectord[7223]: Invoking ldirectord invoked as: /etc/ha.d/resource.d/ldirectord ldirectord.cf status </span></p>
<p class="p0"><span>Dec 17 19:42:22 ndb1 ldirectord[7223]: ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 5596 </span></p>
<p class="p0"><span>Dec 17 19:42:22 ndb1 ldirectord[7223]: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:42:22 ndb1 ResourceManager[7196]: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start</span></p>
<p class="p0"><span>Dec 17 19:42:23 ndb1 ldirectord[7245]: Invoking ldirectord invoked as: /etc/ha.d/resource.d/ldirectord ldirectord.cf start </span></p>
<p class="p0"><span>Dec 17 19:42:23 ndb1 IPaddr2[7291]: INFO:  Running OK</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">如果没有出现异常，表明一切正常。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">破坏性试验</span></span></p>
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">检查ndbd</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">关闭任意一台ndbd的进程，在ndb_mgm上查看是否失去连接。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">如果失去连接，表示已经识别出来。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">此时在数据库表中增加内容之后启动刚刚关闭的ndbd，检查新写入的数据是否已经被同步过来。如果同步过来，一切正常。</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">检查heartbeat</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">关闭MD，检查BD的反应：</span></span></p>
<p class="p0"><span>[root@ndb2 ~]# tail -f /var/log/messages</span></p>
<p class="p0"><span>Dec 17 19:47:22 ndb2 harc[6862]: info: Running /etc/ha.d/rc.d/status status</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Comm_now_up(): updating status to active</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Local status now set to: &#8217;active&#8217;</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Starting child client &#8221;/usr/lib/heartbeat/ipfail&#8221; (498,496)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6879]: info: Starting &#8221;/usr/lib/heartbeat/ipfail&#8221; as uid 498  gid 496 (pid 6879)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: remote resource transition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: remote resource transition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Local Resource acquisition completed. (none)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Initial resource acquisition complete (T_RESOURCES(them))</span></p>
<p class="p0"><span>Dec 17 19:47:29 ndb2 ipfail: [6879]: info: Ping node count is balanced.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6852]: info: Received shutdown notice from &#8217;ndb1&#8242;.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6852]: info: Resources being acquired from ndb1.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6884]: info: acquire all HA resources (standby).</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ResourceManager[6911]: info: Acquiring resource group: ndb2 ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6957]: ldirectord is stopped for /etc/ha.d/ldirectord.cf </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6957]: Exiting with exit_status 3: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6885]: info: Local Resource acquisition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6961]: ldirectord is stopped for /etc/ha.d/ldirectord.cf </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6961]: Exiting with exit_status 3: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start</span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6986]: Starting Linux Director v1.77.2.32 as daemon </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Added virtual server: 192.168.131.105:3306 </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Quiescent real server: 192.168.131.101:3306 mapped from 192.168.131.101:3306 ( x 192.168.131.105:3306) (Weight set to 0) </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Quiescent real server: 192.168.131.77:3306 mapped from 192.168.131.77:3306 ( x 192.168.131.105:3306) (Weight set to 0) </span></p>
<p>
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
</p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/LVSSyncDaemonSwap master start</span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 kernel: IPVS: stopping sync thread 5493 &#8230;</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: sync thread stopped!</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncbackup down</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncmaster up</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncmaster obtained</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7102]: INFO:  Resource is stopped</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/IPaddr2 192.168.131.105/24/eth0/192.168.131.255 start</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: ip -f inet addr add 192.168.131.105/24 brd 192.168.131.255 dev eth0</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 avahi-daemon[2776]: Registering new address record for 192.168.131.105 on eth0.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: ip link set eth0 up</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: /usr/lib/heartbeat/send_arp -i 200 -r 5 -p /var/run/heartbeat/rsctmp/send_arp/send_arp-192.168.131.105 eth0 192.168.131.105 auto not_used not_used</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7185]: INFO:  Success</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6884]: info: all HA resource acquisition completed (standby).</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6852]: info: Standby resource acquisition done [all].</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 harc[7277]: info: Running /etc/ha.d/rc.d/status status</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 last message repeated 14 times</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 mach_down[7293]: info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 mach_down[7293]: info: mach_down takeover complete for node ndb1.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6852]: info: mach_down takeover complete.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 harc[7327]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ip-request-resp[7327]: received ip-request-resp ldirectord::ldirectord.cf OK yes</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ResourceManager[7348]: info: Acquiring resource group: ndb2 ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 last message repeated 3 times</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ldirectord[7375]: ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 6988 </span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ldirectord[7375]: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ResourceManager[7348]: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 last message repeated 6 times</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 IPaddr2[7443]: INFO:  Running OK</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 last message repeated 289 times</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: WARN: node ndb1: is dead</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: info: Dead node ndb1 gave up resources.</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: info: Link ndb1:eth1 dead.</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 ipfail: [6879]: info: Status update: Node ndb1 now has status dead</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 last message repeated 8 times</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: NS: We are dead. :&lt;</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: Link Status update: Link ndb1/eth1 now has status dead</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: We are dead. :&lt;</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: Asking other side for ping node count.</span></p>
<p class="p0"><span>Dec 17 19:48:18 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers[root@ndb2 ~]# tail -f /var/log/messages</span></p>
<p class="p0"><span>Dec 17 19:47:22 ndb2 harc[6862]: info: Running /etc/ha.d/rc.d/status status</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Comm_now_up(): updating status to active</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Local status now set to: &#8217;active&#8217;</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Starting child client &#8221;/usr/lib/heartbeat/ipfail&#8221; (498,496)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6879]: info: Starting &#8221;/usr/lib/heartbeat/ipfail&#8221; as uid 498  gid 496 (pid 6879)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: remote resource transition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: remote resource transition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Local Resource acquisition completed. (none)</span></p>
<p class="p0"><span>Dec 17 19:47:23 ndb2 heartbeat: [6852]: info: Initial resource acquisition complete (T_RESOURCES(them))</span></p>
<p class="p0"><span>Dec 17 19:47:29 ndb2 ipfail: [6879]: info: Ping node count is balanced.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6852]: info: Received shutdown notice from &#8217;ndb1&#8242;.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6852]: info: Resources being acquired from ndb1.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6884]: info: acquire all HA resources (standby).</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ResourceManager[6911]: info: Acquiring resource group: ndb2 ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6957]: ldirectord is stopped for /etc/ha.d/ldirectord.cf </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6957]: Exiting with exit_status 3: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 heartbeat: [6885]: info: Local Resource acquisition completed.</span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6961]: ldirectord is stopped for /etc/ha.d/ldirectord.cf </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ldirectord[6961]: Exiting with exit_status 3: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:43 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start</span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6986]: Starting Linux Director v1.77.2.32 as daemon </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Added virtual server: 192.168.131.105:3306 </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Quiescent real server: 192.168.131.101:3306 mapped from 192.168.131.101:3306 ( x 192.168.131.105:3306) (Weight set to 0) </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ldirectord[6988]: Quiescent real server: 192.168.131.77:3306 mapped from 192.168.131.77:3306 ( x 192.168.131.105:3306) (Weight set to 0) </span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/LVSSyncDaemonSwap master start</span></p>
<p class="p0"><span>Dec 17 19:47:44 ndb2 kernel: IPVS: stopping sync thread 5493 &#8230;</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: sync thread stopped!</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncbackup down</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: sync thread started: state = MASTER, mcast_ifn = eth0, syncid = 0</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncmaster up</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 LVSSyncDaemonSwap[7050]: info: ipvs_syncmaster obtained</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7102]: INFO:  Resource is stopped</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ResourceManager[6911]: info: Running /etc/ha.d/resource.d/IPaddr2 192.168.131.105/24/eth0/192.168.131.255 start</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: ip -f inet addr add 192.168.131.105/24 brd 192.168.131.255 dev eth0</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 avahi-daemon[2776]: Registering new address record for 192.168.131.105 on eth0.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: ip link set eth0 up</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7214]: INFO: /usr/lib/heartbeat/send_arp -i 200 -r 5 -p /var/run/heartbeat/rsctmp/send_arp/send_arp-192.168.131.105 eth0 192.168.131.105 auto not_used not_used</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 IPaddr2[7185]: INFO:  Success</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6884]: info: all HA resource acquisition completed (standby).</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6852]: info: Standby resource acquisition done [all].</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 harc[7277]: info: Running /etc/ha.d/rc.d/status status</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 last message repeated 14 times</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 mach_down[7293]: info: /usr/share/heartbeat/mach_down: nice_failback: foreign resources acquired</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 mach_down[7293]: info: mach_down takeover complete for node ndb1.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 heartbeat: [6852]: info: mach_down takeover complete.</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 harc[7327]: info: Running /etc/ha.d/rc.d/ip-request-resp ip-request-resp</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ip-request-resp[7327]: received ip-request-resp ldirectord::ldirectord.cf OK yes</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 ResourceManager[7348]: info: Acquiring resource group: ndb2 ldirectord::ldirectord.cf LVSSyncDaemonSwap::master IPaddr2::192.168.131.105/24/eth0/192.168.131.255</span></p>
<p class="p0"><span>Dec 17 19:47:45 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 last message repeated 3 times</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ldirectord[7375]: ldirectord for /etc/ha.d/ldirectord.cf is running with pid: 6988 </span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ldirectord[7375]: Exiting from ldirectord status </span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 ResourceManager[7348]: info: Running /etc/ha.d/resource.d/ldirectord ldirectord.cf start</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 last message repeated 6 times</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 IPaddr2[7443]: INFO:  Running OK</span></p>
<p class="p0"><span>Dec 17 19:47:46 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 last message repeated 289 times</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: WARN: node ndb1: is dead</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: info: Dead node ndb1 gave up resources.</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 heartbeat: [6852]: info: Link ndb1:eth1 dead.</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 ipfail: [6879]: info: Status update: Node ndb1 now has status dead</span></p>
<p class="p0"><span>Dec 17 19:48:16 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 last message repeated 8 times</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: NS: We are dead. :&lt;</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: Link Status update: Link ndb1/eth1 now has status dead</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: We are dead. :&lt;</span></p>
<p class="p0"><span>Dec 17 19:48:17 ndb2 ipfail: [6879]: info: Asking other side for ping node count.</span></p>
<p class="p0"><span>Dec 17 19:48:18 ndb2 kernel: IPVS: ip_vs_wrr_schedule(): no available servers</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">如果没有错误，表明heartbeat已经切换。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">此时再次插入数据验证，如果还可以继续写入，表明配置完全成功。</span></span></p>
<p class="p0">
<p class="p0"><span>Mysql cluster<span style="font-family: 宋体;">的测试报告：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">在192.168.8.48上部署测试脚本，让这台服务器表示一个客户端请求读写数据库。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">测试脚本1：</span></span></p>
<p class="p0"><span>[root@localhost mysql-cluster]# cat /data/pay.kingsoft.com/wwwroot/test.php </span></p>
<p class="p0"><span>&lt;?php</span></p>
<p class="p0">
<p class="p0"><span>$link = mysql_connect(&#8217;192.168.131.105&#8242;, &#8217;ldirector&#8217;, &#8217;xxxxxxxxx&#8217;);</span></p>
<p class="p0"><span>mysql_select_db(&#8216;kingsoft&#8217;,$link);</span></p>
<p class="p0"><span>$sql = &#8221;insert into `preference`(`id`,`preferenceSerialNumber`,`username`,`preferenceTypeId`,`isExpired`,`isUsed`,`preferenceUsername`,`equalMoney`,`genDatetime`,`useDatetime`,`grantDatetime`,`expriedDatetime`) values ( NULL,&#8217;514a49f83820e34c877ff48770e48ea7&#8242;,&#8217;liujun&#8217;,&#8217;2&#8242;,&#8217;1&#8242;,&#8217;1&#8242;,&#8217;kingsoft&#8217;,&#8217;512.23&#8242;,&#8217;2008-12-03&#8242;,&#8217;2008-12-03&#8242;,&#8217;2008-12-03&#8242;,&#8217;2008-12-03&#8242;)&#8221;;</span></p>
<p class="p0"><span>for($i = 0;$i &lt; 100 ;$i++){</span></p>
<p class="p0"><span> mysql_query($sql);</span></p>
<p class="p0"><span>}</span></p>
<p class="p0"><span>mysql_close($link);</span></p>
<p class="p0"><span>?&gt;</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">测试脚本2：</span></span></p>
<p class="p0"><span>[root@localhost mysql-cluster]# cat test.sh </span></p>
<p class="p0"><span>#!/bin/sh</span></p>
<p class="p0"><span>i=0;</span></p>
<p class="p0"><span>j=0;</span></p>
<p class="p0">
<p class="p0"><span> while [ $i -lt  1000 ]</span></p>
<p class="p0"><span> do</span></p>
<p class="p0"><span> wget -q http://pay.kingsoft.sug/test.php;</span></p>
<p class="p0"><span> i=`expr $i + 1`;</span></p>
<p class="p0"><span> done</span></p>
<p class="p0">
<p class="p0"><span>sleep 2;</span></p>
<p class="p0">
<p class="p0"><span>find . -name &#8221;test.php.*&#8221; | xargs rm -rf ;</span></p>
<p class="p0">
<p class="p0"><span>while [ $j -lt 1000 ]</span></p>
<p class="p0"><span>do</span></p>
<p class="p0"><span> mysql -uldirector -pxxxxxxxxxxx  -h192.168.131.105 -e &#8221;use kingsoft; insert into preference(preferenceSerialNumber,username,preferenceTypeId,preferenceUsername,equalMoney,genDatetime,useDatetime,grantDatetime,expriedDatetime) values(&#8217;514a49f83820e34c877ff48770e48ea7&#8242;,&#8217;liujun2&#8242;,&#8217;3&#8242;,&#8217;liujun33333&#8242;,&#8217;33.8&#8242;,&#8217;2008-12-23 7:05:00&#8242;,&#8217;2008-12-23 7:15:00&#8242;,&#8217;2008-12-23 7:25:00&#8242;,&#8217;2008-12-23 7:35:00&#8242;)&#8221;;</span></p>
<p class="p0"><span> j=`expr $j + 1`;</span></p>
<p class="p0"><span>done</span></p>
<p class="p0"><span>sleep 3;</span></p>
<p class="p0"><span>server=`mysql -uldirector -pxxxxxxxxxx  -h192.168.131.105 -e &#8221;use kingsoft;select count(*) from preference&#8221;`;</span></p>
<p class="p0"><span>datetime=`date +%T`;</span></p>
<p class="p0"><span>echo $datetime&#8221;&#8212;&#8212;&#8212;-&#8221;$server &gt;&gt; /tmp/mysql-cluster/mysql.log;</span></p>
<p class="p0">
<p class="p0"><span>[root@localhost mysql-cluster]#</span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">测试时间：</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">在192.168.8.48的cron中添加：</span></span></p>
<p class="p0"><span>[root@localhost mysql-cluster]# crontab -e</span></p>
<p class="p0"><span>*/3 * * * * sh /tmp/mysql-cluster/test.sh &gt; /dev/null 2&gt;&amp;1</span></p>
<p class="p0"><span>[root@localhost mysql-cluster]#</span></p>
<p class="p0"><span><span style="font-family: 宋体;">连续运行24小时。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">测试结果：</span></span></p>
<p class="p0"><span>#Cat mysql.log</span></p>
<p class="p0"><span>14:31:54&#8212;&#8212;&#8212;-count(*) 21022</span></p>
<p class="p0"><span>14:35:00&#8212;&#8212;&#8212;-count(*) 42634</span></p>
<p class="p0"><span>14:37:57&#8212;&#8212;&#8212;-count(*) 63608</span></p>
<p class="p0"><span>14:40:55&#8212;&#8212;&#8212;-count(*) 84708</span></p>
<p class="p0"><span>14:43:55&#8212;&#8212;&#8212;-count(*) 105887</span></p>
<p class="p0"><span>14:46:54&#8212;&#8212;&#8212;-count(*) 127045</span></p>
<p class="p0"><span>14:49:58&#8212;&#8212;&#8212;-count(*) 148512</span></p>
<p class="p0"><span>14:53:01&#8212;&#8212;&#8212;-count(*) 169795</span></p>
<p class="p0"><span>14:56:27&#8212;&#8212;&#8212;-count(*) 190714</span></p>
<p class="p0"><span>14:59:29&#8212;&#8212;&#8212;-count(*) 209921</span></p>
<p class="p0"><span>15:02:03&#8212;&#8212;&#8212;-count(*) 231380</span></p>
<p class="p0"><span>15:03:51&#8212;&#8212;&#8212;-count(*) 252231</span></p>
<p class="p0"><span>15:05:12&#8212;&#8212;&#8212;-count(*) 269825</span></p>
<p class="p0"><span>15:05:33&#8212;&#8212;&#8212;-count(*) 271824</span></p>
<p class="p0"><span>15:08:05&#8212;&#8212;&#8212;-count(*) 291141</span></p>
<p class="p0"><span>15:10:59&#8212;&#8212;&#8212;-count(*) 311836</span></p>
<p class="p0"><span>15:14:00&#8212;&#8212;&#8212;-count(*) 332951</span></p>
<p class="p0"><span>15:16:57&#8212;&#8212;&#8212;-count(*) 353841</span></p>
<p class="p0"><span>15:19:59&#8212;&#8212;&#8212;-count(*) 374977</span></p>
<p class="p0"><span>15:23:03&#8212;&#8212;&#8212;-count(*) 396181</span></p>
<p class="p0"><span>15:26:01&#8212;&#8212;&#8212;-count(*) 417064</span></p>
<p class="p0"><span>15:29:01&#8212;&#8212;&#8212;-count(*) 438098</span></p>
<p class="p0"><span>15:32:03&#8212;&#8212;&#8212;-count(*) 459191</span></p>
<p class="p0"><span>15:35:05&#8212;&#8212;&#8212;-count(*) 480229</span></p>
<p class="p0"><span>15:38:05&#8212;&#8212;&#8212;-count(*) 501222</span></p>
<p class="p0"><span>15:41:02&#8212;&#8212;&#8212;-count(*) 521868</span></p>
<p class="p0"><span>15:43:59&#8212;&#8212;&#8212;-count(*) 542721</span></p>
<p class="p0"><span>15:47:02&#8212;&#8212;&#8212;-count(*) 563841</span></p>
<p class="p0"><span>16:00:32&#8212;&#8212;&#8212;-count(*) 698215</span></p>
<p class="p0"><span>18:50:49&#8212;&#8212;&#8212;-count(*) 2105513</span></p>
<p class="p0"><span>19:09:01&#8212;&#8212;&#8212;-count(*) 2105513</span></p>
<p class="p0"><span>19:26:13&#8212;&#8212;&#8212;-count(*) 2105513</span></p>
<p class="p0"><span>19:27:28&#8212;&#8212;&#8212;-count(*) 2105513</span></p>
<p class="p0"><span>[root@localhost mysql-cluster]# </span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">测试结果分析：</span></span></p>
<p class="p0"><span>1）</span><span><span style="font-family: 宋体;">当逐渐增加负载，数据库的负载并不大，CPU占用率为30%，而内存则由600MB逐渐升至2GB，最终达到极限。</span></span></p>
<p class="p0"><span>2）</span><span><span style="font-family: 宋体;">数据并发量大，并未引起数据库的异常，表明负载均衡已经解决了单台服务器负载太大的引起的瓶颈。</span></span></p>
<p class="p0"><span>3）</span><span><span style="font-family: 宋体;">由于内存有限（2GB），当表中数据达到一定量以后，会出现表满现象。这种情况可以通过增加内存来解决。</span></span></p>
<p class="p0"><span>4）</span><span>mysql cluster<span style="font-family: 宋体;">可以实现高可用性、负载均衡，并且通过优化参数使其进一步稳定服务。</span></span></p>
<p class="p0"><span>5）</span><span><span style="font-family: 宋体;">可以采用6.3版本的mysql cluster，来减小NDBD内存用量。</span></span></p>
<p class="p0"><span>6）</span><span>Mysql cluster<span style="font-family: 宋体;">的性能一般，比mysql replication慢。</span></span></p>
<p class="p0"><span><span style="font-family: 宋体;">需要注意的问题：</span></span></p>
<p class="p0"><span>1) </span><span><span style="font-family: 宋体;">当ndbd第一次启动的时候或者config.ini更改的时候，需要加&#8211;initial参数进行初始化。</span></span></p>
<p class="p0"><span>2) </span><span><span style="font-family: 宋体;">尽可能的不要人工干预系统，出现问题需要谨慎对待。</span></span></p>
<p class="p0">
<p class="p0"><span><span style="font-family: 宋体;">以下是一个外国人写的注意事项和优化：</span></span></p>
<p class="p0"><span> 1. Broken up into three parts. The MySQL servers sit separate from the NDB Storage Engine, which are storage nodes (NDB nodes). The third part is called a management server. The management server, oddly enough, isn’t required once the cluster is up and running unless you want to add another storage node.</span></p>
<p class="p0"><span> 2. Memory based storage engine. If you’re not using 5.1+ then you must have enough RAM in each storage node to store the data set. This means that if you have four machines with 4GB of RAM each you can store 8GB of data (16GB of total storage divided by two for two copies of the data set).</span></p>
<p class="p0"><span> 3. Storage nodes are static and pre-allocate resources on startup.</span></p>
<p class="p0"><span> 4. Supports transactions and row level locking.</span></p>
<p class="p0"><span> 5. Should be noted this is a storage engine so you can’t create MyISAM or InnoDB tables inside of a cluster.</span></p>
<p class="p0"><span> 6. Uses fixed sized records. This means if you have a varchar(255) and put a single byte into it that field is still using 255 bytes.</span></p>
<p class="p0"><span> 7. No foreign key constraint support.</span></p>
<p class="p0"><span> 8. Replication across nodes is syncronous across nodes. I assume this means that an INSERT happens once all of the nodes have completed the INSERT. This is different than regular replication which is asyncronous and introduces race conditions.</span></p>
<p class="p0"><span> 9. Tables are divided into fragments (one fragment for each storage node). Each storage node is responsible for each fragment. Each fragment also has a secondary fragment, which is a copy of another node’s primary fragment. This data distribution happens automatically.</span></p>
<p class="p0"><span> 10. NDB takes your primary key, creates a hash and then converts that to a fragment. So you’ll have various rows on each different storage node.</span></p>
<p class="p0"><span> 11. A node group is a set of nodes that share the same fragment information. If you lose an entire node group you’ve lost half of the table and the cluster will not continue to operate. However, if one node in a node group fails there will still be enough data to keep the cluster up and running.</span></p>
<p class="p0"><span> 12. If a node fails and it’s secondary counterpart takes over it will, essentially, have to perform the job of two nodes. Until a node has fully recovered it will not rejoin the cluster.</span></p>
<p class="p0"><span> 13. Backups are hot and non-locking. Each node writes its own set of backup files. No support for incremental backups.</span></p>
<p class="p0"><span> 14. Because it’s memory based you could lose data on a system crash (as you might have transactions sitting in RAM when a crash occurs). The COMMIT command does not write changes to disk meaning that you could have data sitting in memory that’s not on disk when a node crashes. This means the odd truth is that MySQL Clusters support syncronous replication, but are not atomic.</span></p>
<p class="p0"><span> 15. NDB nodes will checkpoint data to disk (data + logs), which are used for system recovery. They write two logs, the UNDO and REDO logs.</span></p>
<p class="p0"><span> 16. They recommend using TRUNCATE to delete all rows from a table.</span></p>
<p class="p0"><span> 17. Modification operations are distributed to both the primary and secondary fragments (obviously).</span></p>
<p class="p0"><span> 18. NDB will run on 64-bit machines. They recommend Dual CPU 64-bit machines. NDB is threaded. Application nodes (MySQL servers) can be whatever.</span></p>
<p class="p0"><span> 19. SCI offers 30-100% better performance over gigabit.</span></p>
<p class="p0"><span> 20. They actually recommend avoiding joins and to denormalize your schemas. Are you kidding me? He actually said “Performance for joins sucks.”</span></p>
<p class="p0">
<p class="p0"><span>Overall, I’m underwhelmed by MySQL Clustering. You’re limited in storage with the RAM and you can’t optimize your schemas due to fixed field sizes. And any RDBMS “solution” that recommends you denormalize puts me off.</span></p>
<p class="p0">
<p class="p0"><span>That being said the actual technology is pretty interesting and I suspect that in a few years we’ll see the clustering features in MySQL come into their own. As of now I suspect few people would be able to justify the sacrifices for the gains clustering allows.</span></p>
<p class="p0">
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/99.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL损坏数据的恢复</title>
		<link>http://www.evanjiang.net.cn/archives/56.html</link>
		<comments>http://www.evanjiang.net.cn/archives/56.html#comments</comments>
		<pubDate>Wed, 17 Dec 2008 03:41:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[mysql 数据恢复]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=56</guid>
		<description><![CDATA[<p>环境：windows2003
数据库:mysql
损坏数据文件名:function_products
将数据库内容物理文件直接导入到mysqldata下，每只表各3个文件，依次分别为：.frm .MYD .MYI
首先我第一想到的是去网上搜索，寻找类似的工具，试图通过工具来恢复已损坏的文件，于是我在GOOGLE上查找，找到一款名为MySQLRecovery的工具，安装后我用其进行恢复，只可惜效果太不理想，几十M大的数据文件，恢复之后它提示我竟然只有几十K&#8230;&#8230;&#8230;&#8230;&#8230;
我又想到mysql下应有自己本身的修复程序等，于是想通过其来进行恢复，心想应不会太差劲吧，在网上查找了资料，提示：
由于临时断电，使用kill -9中止MySQL服务进程，或者是mysql正在高速运转时进行强制备份操作时等，所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时，服务正在改变文件，文件可能会留下错误的或不一致的状态。因为这样的毁坏有时是不容易被发现的，当你发现这个错误时可能是很久以后的事。
于是，当你发现这个问题时，也许所有的备份都有同样的错误。
我想我现在碰到的问题可能是这个问题，因为备份的数据也是有部分损坏的数据，所以导致不能完全运行，意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的。如果MySQL服务正在使用某一文件，并对myisamchk正在检查的文件进行修改，myisamchk会误以为发生了错误，并会试图进行修复&#8211;这将导致MySQL服务的崩溃！这样，要避免这种情况的发生，通常我们需要在工作时关闭MySQL服务。</p>
<p>
作为选择，你也可以暂时关闭服务以制作一个文件的拷贝，然后在这个拷贝上工作。当你做完了以后，重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)。
MySQL数据目录不是太难理解的。每一个数据库对应一个子目录，每个子目录中包含了对应于这个数据库中的
数据表的文件。每一个数据表对应三个文件，它们和表名相同，但是具有不同的扩展名。tblName.frm文件是
表的定义，它保存了表中包含的数据列的内容和类型。tblName.MYD文件包含了表中的数据。tblName.MYI文件
包含了表的索引(例如，它可能包含lookup表以帮助提高对表的主键列的查询)。
要检查一个表的错误，只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名，或者是表的索引文件名：
% myisamchk /usr/local/mysql/var/dbName/tblName
% myisamchk /usr/local/mysql/var/dbName/tblName.MYI</p>
<p>上面的两个命令都可以执行对指定表的检查。要检查数据库中所有的表，可以使用通配符：
% myisamchk /usr/local/mysql/var/dbName/*.MYI
要检查所有数据库中的所有表，可以使用两个通配符：
% myisamchk /usr/local/mysql/var/*/*.MYI
如果不带任何选项，myisamchk将对表文件执行普通的检查。如果你对一个表有怀疑，但是普通的检查不能发现任何错误，你可以执行更彻底的检查(但是也更慢！)，这需要使用&#8211;extend-check选项：
% myisamchk &#8211;extend-check /path/to/tblName
对错误的检查是没有破坏性的，这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟。另一方面，修复选项，虽然通常也是安全的，但是它对你的数据文件的更改是无法撤消的。因为这个原因，我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份，并确保在制作这个备份之前你的MySQL服务是关闭的。
我在win2003下通过命令提示符，输入：
注：此为记录我当时操作的全部过程
Documents and SettingsAdministrator&#62;c:
C:&#62;cd mysql
C:mysql&#62;cd data
C:mysqldata&#62;cd hw_enterprice
C:mysqldatahw_enterprice&#62;myisamchk function_products.frm&#8217;myisamchk&#8217; 不是内部或外部命令，也不是可运行的程序
或批处理文件。
C:mysqldatahw_enterprice&#62;cd
C:&#62;cd mysql
C:mysql&#62;cd bin
注：查看myisamchk的帮助信息







C:mysqlin&#62;myisamchk
myisamchk Ver 2.6 for Win95/Win98 at i32
By Monty, for your professional use
This software comes with NO WARRANTY: see the PUBLIC for details.
Description, check and repair of ISAM tables.
Used without opti**** all tables [...]]]></description>
			<content:encoded><![CDATA[<p>环境：windows2003<br />
数据库:mysql<br />
损坏数据文件名:function_products<br />
将数据库内容物理文件直接导入到mysqldata下，每只表各3个文件，依次分别为：.frm .MYD .MYI<br />
首先我第一想到的是去网上搜索，寻找类似的工具，试图通过工具来恢复已损坏的文件，于是我在GOOGLE上查找，找到一款名为MySQLRecovery的工具，安装后我用其进行恢复，只可惜效果太不理想，几十M大的数据文件，恢复之后它提示我竟然只有几十K&#8230;&#8230;&#8230;&#8230;&#8230;<br />
我又想到mysql下应有自己本身的修复程序等，于是想通过其来进行恢复，心想应不会太差劲吧，在网上查找了资料，提示：<br />
由于临时断电，使用kill -9中止MySQL服务进程，或者是mysql正在高速运转时进行强制备份操作时等，所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时，服务正在改变文件，文件可能会留下错误的或不一致的状态。因为这样的毁坏有时是不容易被发现的，当你发现这个错误时可能是很久以后的事。<br />
于是，当你发现这个问题时，也许所有的备份都有同样的错误。<br />
我想我现在碰到的问题可能是这个问题，因为备份的数据也是有部分损坏的数据，所以导致不能完全运行，意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的。如果MySQL服务正在使用某一文件，并对myisamchk正在检查的文件进行修改，myisamchk会误以为发生了错误，并会试图进行修复&#8211;这将导致MySQL服务的崩溃！这样，要避免这种情况的发生，通常我们需要在工作时关闭MySQL服务。</p>
<p><span id="more-56"></span><br />
作为选择，你也可以暂时关闭服务以制作一个文件的拷贝，然后在这个拷贝上工作。当你做完了以后，重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)。<br />
MySQL数据目录不是太难理解的。每一个数据库对应一个子目录，每个子目录中包含了对应于这个数据库中的<br />
数据表的文件。每一个数据表对应三个文件，它们和表名相同，但是具有不同的扩展名。tblName.frm文件是<br />
表的定义，它保存了表中包含的数据列的内容和类型。tblName.MYD文件包含了表中的数据。tblName.MYI文件<br />
包含了表的索引(例如，它可能包含lookup表以帮助提高对表的主键列的查询)。<br />
要检查一个表的错误，只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名，或者是表的索引文件名：<br />
% myisamchk /usr/local/mysql/var/dbName/tblName<br />
% myisamchk /usr/local/mysql/var/dbName/tblName.MYI</p>
<p>上面的两个命令都可以执行对指定表的检查。要检查数据库中所有的表，可以使用通配符：<br />
% myisamchk /usr/local/mysql/var/dbName/*.MYI<br />
要检查所有数据库中的所有表，可以使用两个通配符：<br />
% myisamchk /usr/local/mysql/var/*/*.MYI<br />
如果不带任何选项，myisamchk将对表文件执行普通的检查。如果你对一个表有怀疑，但是普通的检查不能发现任何错误，你可以执行更彻底的检查(但是也更慢！)，这需要使用&#8211;extend-check选项：<br />
% myisamchk &#8211;extend-check /path/to/tblName<br />
对错误的检查是没有破坏性的，这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟。另一方面，修复选项，虽然通常也是安全的，但是它对你的数据文件的更改是无法撤消的。因为这个原因，我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份，并确保在制作这个备份之前你的MySQL服务是关闭的。<br />
我在win2003下通过命令提示符，输入：<br />
注：此为记录我当时操作的全部过程<br />
Documents and SettingsAdministrator&gt;c:<br />
C:&gt;cd mysql<br />
C:mysql&gt;cd data<br />
C:mysqldata&gt;cd hw_enterprice<br />
C:mysqldatahw_enterprice&gt;myisamchk function_products.frm&#8217;myisamchk&#8217; 不是内部或外部命令，也不是可运行的程序<br />
或批处理文件。<br />
C:mysqldatahw_enterprice&gt;cd<br />
C:&gt;cd mysql<br />
C:mysql&gt;cd bin<br />
注：查看myisamchk的帮助信息
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
C:mysqlin&gt;myisamchk<br />
myisamchk Ver 2.6 for Win95/Win98 at i32<br />
By Monty, for your professional use<br />
This software comes with NO WARRANTY: see the PUBLIC for details.<br />
Description, check and repair of ISAM tables.<br />
Used without opti**** all tables on the command will be checked for errors<br />
Usage: myisamchk [OPTI****] tables[.MYI]<br />
Global opti****:<br />
-#, &#8211;debug=&#8230; Output debug log. Often this is &#8216;d:t,filename&#8217;<br />
-?, &#8211;help Display this help and exit.<br />
-O, &#8211;set-variable var=option<br />
Change the value of a variable. Please note that<br />
this option is deprecated; you can set variables<br />
directly with &#8216;&#8211;variable-name=value&#8217;.<br />
-t, &#8211;tmpdir=path Path for temporary files<br />
-s, &#8211;silent Only print errors. One can use two -s to make<br />
myisamchk very silent<br />
-v, &#8211;verbose Print more information. This can be used with<br />
&#8211;description and &#8211;check. Use many -v for more verbosity!<br />
-V, &#8211;version Print version and exit.<br />
-w, &#8211;wait Wait if table is locked.<br />
Check opti**** (check is the default action for myisamchk):<br />
-c, &#8211;check Check table for errors<br />
-e, &#8211;extend-check Check the table VERY throughly. Only use this in<br />
extreme cases as myisamchk should normally be able to<br />
find out if the table is ok even without this switch<br />
-F, &#8211;fast Check only tables that haven&#8217;t been closed properly<br />
-C, &#8211;check-only-changed<br />
Check only tables that have changed since last check<br />
-f, &#8211;force Restart with &#8216;-r&#8217; if there are any errors in the table.<br />
States will be updated as with &#8216;&#8211;update-state&#8217;<br />
-i, &#8211;information Print statistics information about table that is checked<br />
-m, &#8211;medium-check Faster than extend-check, but only finds 99.99% of<br />
all errors. Should be good enough for most cases<br />
-U &#8211;update-state Mark tables as crashed if you find any errors<br />
-T, &#8211;read-only Don&#8217;t mark table as checked<br />
Repair opti**** (When using &#8216;-r&#8217; or &#8216;-o&#8217;)<br />
-B, &#8211;backup Make a backup of the .MYD file as &#8216;filename-time.BAK&#8217;<br />
&#8211;correct-checksum Correct checksum information for table.<br />
-D, &#8211;data-file-length=# Max length of data file (when recreating data<br />
file when it&#8217;s full)<br />
-e, &#8211;extend-check Try to recover every possible row from the data file<br />
Normally this will also find a lot of garbage rows;<br />
Don&#8217;t use this option if you are not totally desperate.<br />
-f, &#8211;force Overwrite old temporary files.<br />
-k, &#8211;keys-used=# Tell MyISAM to update only some specific keys. # is a<br />
bit mask of which keys to use. This can be used to<br />
get faster inserts!<br />
-r, &#8211;recover Can fix almost anything except unique keys that aren&#8217;t<br />
unique.<br />
-n, &#8211;sort-recover Forces recovering with sorting even if the temporary<br />
file would be very big.<br />
-p, &#8211;parallel-recover<br />
Uses the same technique as &#8216;-r&#8217; and &#8216;-n&#8217;, but creates<br />
all the keys in parallel, in different threads.<br />
THIS IS ALPHA CODE. USE AT YOUR OWN RISK!<br />
-o, &#8211;safe-recover Uses old recovery method; Slower than &#8216;-r&#8217; but can<br />
handle a couple of cases where &#8216;-r&#8217; reports that it<br />
can&#8217;t fix the data file.<br />
&#8211;character-sets-dir=&#8230;<br />
Directory where character sets are<br />
&#8211;set-character-set=name<br />
Change the character set used by the index<br />
-q, &#8211;quick Faster repair by not modifying the data file.<br />
One can give a second &#8216;-q&#8217; to force myisamchk to<br />
modify the original datafile in case of duplicate keys<br />
-u, &#8211;unpack Unpack file packed with myisampack.<br />
Other acti****:<br />
-a, &#8211;analyze Analyze distribution of keys. Will make some joins in<br />
MySQL faster. You can check the calculated distribution<br />
by using &#8216;&#8211;description &#8211;verbose table_name&#8217;.<br />
-d, &#8211;description Prints some information about table.<br />
-A, &#8211;set-auto-increment[=value]<br />
Force auto_increment to start at this or higher value<br />
If no value is given, then sets the next auto_increment<br />
value to the highest used value for the auto key + 1.<br />
-S, &#8211;sort-index Sort index blocks. This speeds up &#8216;read-next&#8217; in<br />
applicati****<br />
-R, &#8211;sort-records=#<br />
Sort records according to an index. This makes your<br />
data much more localized and may speed up things<br />
C:mysqlin&gt;myisamchk c:mysqldatahw_enterpricefunction_products.frm<br />
myisamchk: error: &#8216;c:mysqldatahw_enterpricefunction_products.frm&#8217; is not a M<br />
yISAM-table<br />
C:mysqlin&gt;myisamchk c:mysqldatahw_enterpricefunction_products.myi<br />
Checking MyISAM file: c:mysqldatahw_enterpricefunction_products.myi<br />
Data records: 85207 Deleted blocks: 39<br />
myisamchk: warning: Table is marked as crashed<br />
myisamchk: warning: 1 clients is using or hasn&#8217;t closed the table properly<br />
- check file-size<br />
- check key delete-chain<br />
- check record delete-chain<br />
myisamchk: error: record delete-link-chain corrupted<br />
- check index reference<br />
- check data record references index: 1<br />
- check data record references index: 2<br />
- check data record references index: 3<br />
- check record links<br />
myisamchk: error: Wrong bytesec: 0-195-171 at linkstart: 841908<br />
MyISAM-table &#8216;c:mysqldatahw_enterpricefunction_products.myi&#8217; is corrupted<br />
Fix it using switch &#8220;-r&#8221; or &#8220;-o&#8221;<br />
继续进行操作：
<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
C:mysqlin&gt;myisamchk &#8211;recover &#8211;quick c:mysqldatahw_enterpricefunction_p<br />
roducts.myi<br />
- check key delete-chain<br />
- check record delete-chain<br />
myisamchk: error: record delete-link-chain corrupted<br />
myisamchk: error: Quick-recover aborted; Run recovery without switch &#8216;q&#8217;<br />
Updating MyISAM file: c:mysqldatahw_enterpricefunction_products.myi<br />
MyISAM-table &#8216;c:mysqldatahw_enterpricefunction_products.myi&#8217; is not fixed be<br />
cause of errors<br />
Try fixing it by using the &#8211;safe-recover (-o) or the &#8211;force (-f) option<br />
系统提示我使用&#8211;safe-recover (-o) or the &#8211;force (-f) option进行修复操作，于是<br />
C:mysqlin&gt;myisamchk &#8211;safe-recover c:mysqldatahw_enterpricefunction_prod<br />
ucts.myi<br />
- recovering (with keycache) MyISAM-table &#8216;c:mysqldatahw_enterpricefunction_<br />
products.myi&#8217;<br />
Data records: 85207<br />
Wrong bytesec: 0-195-171 at 841908; Skipped<br />
Data records: 85215<br />
将修复后的物理文件复制到mysqldata下之后，通过phpMyAdmin进行访问，OK正常！<br />
本次数据修复操作成功，数据已被正常恢复，总计85215条记录，其中恢复数据共计85207条。<br />
总结本次经验及查找资料，如下：</p>
<p>当你试图修复一个被破坏的表的问题时，有三种修复类型。如果你得到一个错误信息指出一个临时文件不能建立，删除信息所指出的文件并再试一次&#8211;这通常是上一次修复操作遗留下来的。<br />
这三种修复方法如下所示：<br />
% myisamchk &#8211;recover &#8211;quick /path/to/tblName<br />
% myisamchk &#8211;recover /path/to/tblName<br />
% myisamchk &#8211;safe-recover /path/to/tblName</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/56.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RedHat 企业版5下系统故障恢复</title>
		<link>http://www.evanjiang.net.cn/archives/53.html</link>
		<comments>http://www.evanjiang.net.cn/archives/53.html#comments</comments>
		<pubDate>Wed, 17 Dec 2008 03:37:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[mysql]]></category>
		<category><![CDATA[Redhat  Linux 故障恢复]]></category>

		<guid isPermaLink="false">http://www.hunttech.com.cn/wpblog/?p=53</guid>
		<description><![CDATA[<p>RedHat 企业版5下系统故障恢复</p>
<p>Redhat Enterprise 5的系统故障的极端情况主要包括grub配置文件丢失，fstab分区挂载表丢失及/boot系统引</p>
<p>导目录被删除的故障恢复，本文针对此三种情况分别给出恢复策略。</p>
<p>一 Grub配置文件丢失的故障恢复：
Grub配置文件一般指/boot/grub/grub.conf文件，该文件指示了系统引导时要从哪个分区去加载内核及内存镜像</p>
<p>(RAMDISK)文件，该文件的丢失将使电脑启动时在grub配置界面中卡住。解决该文件丢失需要管理员记住</p>
<p>grub.conf的基本配置信息，比如：
[root@localhost ~]# cat /etc/grub.conf
default=0 #默认加载第几个系统，从0起算
timeout=5 #启动时停留在Grub配置界面中的时间
splashimage=(hd0,0)/grub/splash.xpm.gz #Grub的背景图片
hiddenmenu #是否隐藏菜单
title Red Hat Enterprise Linux Server (2.6.18-8.el5) #操作系统的标题
root (hd0,0) #操作系统的引导分区
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet #设置加载的内核 initrd /initrd-2.6.18-</p>
<p>8.el5.img #设置加载的内存磁盘文件</p>
<p></p>
<p>解决方法：
1在系统启动的grub配置环境中敲入如下几条语句；
root (hd0,0)
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-8.el5.img
2 再敲入boot 启动；
3 去/boot/grub/中做一个grub.conf文件（文件内容就是刚才显示的内容），或者把备份的grub文件恢复一份为</p>
<p>grub.conf;此后系统重启后即可正常引导;</p>
<p>二 fstab分区挂载表丢失的故障恢复：
fstab文件位于/etc/fstab,该文件指示了系统在启动后要怎么装载系统分区，像系统的几个重要系统分区</p>
<p>如/,/boot,/home,swap分区都要通过fstab让系统去挂载，该文件丢失的话系统挂载过程会出错，虽然在</p>
<p>RedhatLinux Enterprise 5中fstab丢失系统仍可启动至图形界面（如果有安装的话），但是在切入到命令行界</p>
<p>面即会出错，我们先看一下fstab的内容：
[root@localhost ~]# vi /etc/fstab</p>
<p>LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 [...]]]></description>
			<content:encoded><![CDATA[<p>RedHat 企业版5下系统故障恢复</p>
<p>Redhat Enterprise 5的系统故障的极端情况主要包括grub配置文件丢失，fstab分区挂载表丢失及/boot系统引</p>
<p>导目录被删除的故障恢复，本文针对此三种情况分别给出恢复策略。</p>
<p>一 Grub配置文件丢失的故障恢复：<br />
Grub配置文件一般指/boot/grub/grub.conf文件，该文件指示了系统引导时要从哪个分区去加载内核及内存镜像</p>
<p>(RAMDISK)文件，该文件的丢失将使电脑启动时在grub配置界面中卡住。解决该文件丢失需要管理员记住</p>
<p>grub.conf的基本配置信息，比如：<br />
[root@localhost ~]# cat /etc/grub.conf<br />
default=0 #默认加载第几个系统，从0起算<br />
timeout=5 #启动时停留在Grub配置界面中的时间<br />
splashimage=(hd0,0)/grub/splash.xpm.gz #Grub的背景图片<br />
hiddenmenu #是否隐藏菜单<br />
title Red Hat Enterprise Linux Server (2.6.18-8.el5) #操作系统的标题<br />
root (hd0,0) #操作系统的引导分区<br />
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet #设置加载的内核 initrd /initrd-2.6.18-</p>
<p>8.el5.img #设置加载的内存磁盘文件</p>
<p><span id="more-53"></span></p>
<p>解决方法：<br />
1在系统启动的grub配置环境中敲入如下几条语句；<br />
root (hd0,0)<br />
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet<br />
initrd /initrd-2.6.18-8.el5.img<br />
2 再敲入boot 启动；<br />
3 去/boot/grub/中做一个grub.conf文件（文件内容就是刚才显示的内容），或者把备份的grub文件恢复一份为</p>
<p>grub.conf;此后系统重启后即可正常引导;</p>
<p>二 fstab分区挂载表丢失的故障恢复：<br />
fstab文件位于/etc/fstab,该文件指示了系统在启动后要怎么装载系统分区，像系统的几个重要系统分区</p>
<p>如/,/boot,/home,swap分区都要通过fstab让系统去挂载，该文件丢失的话系统挂载过程会出错，虽然在</p>
<p>RedhatLinux Enterprise 5中fstab丢失系统仍可启动至图形界面（如果有安装的话），但是在切入到命令行界</p>
<p>面即会出错，我们先看一下fstab的内容：<br />
[root@localhost ~]# vi /etc/fstab</p>
<p>LABEL=/ / ext3 defaults 1 1<br />
LABEL=/boot /boot ext3 defaults 1 2<br />
devpts /dev/pts devpts gid=5,mode=620 0 0<br />
tmpfs /dev/shm tmpfs defaults 0 0<br />
LABEL=/home /home ext3 defaults 1 2<br />
proc /proc proc defaults 0 0<br />
sysfs /sys sysfs defaults 0 0<br />
LABEL=SWAP-sda3 swap swap defaults 0 0<br />
我们来看一下这一行：<br />
LABEL=/ / ext3 defaults 1 1<br />
这行说明了标签(label)等于/的分区挂载在根（/）目录下，分区是ext3格式，第五列的1指明访分区是否要备份</p>
<p>(0 为不备份，1 为要备份, 一般根分区要备份)，第六列的1指明该分区要自检 (0 为不自检，1 或者 2 为要自</p>
<p>检, 如果是根分区要设为1，其他分区只能是2)。<br />
我们设置标签是因为分区名（如/dev/sda1）很难记忆，所以系统自动会把要挂载到/目录的分区标签设为/,把挂</p>
<p>载到/home目录的分区标签设为/home,设置标签的命令如下：<br />
将/dev/sda1分区命名为abc：<br />
[root@localhost ~]#e2label /dev/sda1 abc<br />
查询/dev/sda1分区：<br />
[root@localhost ~]#e2label /dev/sda1 abc<br />
查找标签为abc的分区：<br />
[root@localhost ~]#findfs LABEL=abc<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
解决方法：<br />
A 如有系统可以启动并可以使用命令的话，手工做一份fstab放入/etc即可，但由于fstab比较难记，管理员先前</p>
<p>最好要有备份，将备份文件拷贝为/etc/fstab即可。</p>
<p>B 如果系统不能启动，要依靠系统光盘的救援模式，按照如下步骤解决：<br />
1 放入Redhat系统光盘，设置从光盘引导，并且进入救援模式（敲入linux rescue）;</p>
<p>2 findfs LABEL=/ 来查找原来/目录所挂载的分区名;</p>
<p>3 如第2步找到的分区为/dev/sda9，先用mkdir /mnt/sysimage建立一个目录，再用<br />
mount /dev/sda9 /mnt/sysimage来挂载;</p>
<p>5 进入/mnt/sysimage/etc目录，如果fstab有备份的话将其恢复(如mv fstab.bak fstab)，如果没有，请自己做</p>
<p>一个fstab;<br />
如果用chroot /mnt/sysimage将当前根目录设定为磁盘中的根目录(否则当前根目录在光盘中)，此时进入/etc目</p>
<p>录，如果fstab有备份的话将其恢复(如mv fstab.bak fstab)，如果没有，请自己做一个fstab;</p>
<p>6 敲入reboot或敲入两次exit并命出光盘重启即可；</p>
<p>三 /boot系统引导目录被删除的故障恢复<br />
/boot目录中存放有grub.conf及系统引导用的内核及内存磁盘文件，该目录被删除一般会导致grub配置界面都没</p>
<p>有使用，并有提示 error15，解决方法还只能依靠系统光盘的救援模式。<br />
我们来考查最糟糕的一种情况，就是/boot目录被删除的同时，fstab也被删除了，此时要怎么恢复？<br />
系统先前环境：<br />
系统假设安装有linux与winxp<br />
其中/dev/sda8挂载在/boot目录下<br />
/dev/sda9挂载在/目录下<br />
/dev/sda12挂载于/home目录下<br />
且/home目录中备份有kernel-2.6.18-8.el5.i686.rpm（该文件用于安装系统内核，极为重要，建议管理员备份</p>
<p>一个，在系统光盘中也有）,fstab,grub.conf文件<br />
以下是系统grub.conf的配置：<br />
default=1<br />
timeout=5<br />
splashimage=(hd0,7)/grub/splash.xpm.gz<br />
hiddenmenu<br />
title Red Hat Enterprise Linux Server (2.6.18-8.el5)<br />
root (hd0,7)<br />
kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/ rhgb quiet<br />
initrd /initrd-2.6.18-8.el5.img<br />
title Other<br />
rootnoverify (hd0,0)<br />
chainloader +1</p>
<p>以下是df -h的结果:<br />
Filesystem Size Used Avail Use% Mounted on<br />
/dev/sda9 9.5G 2.7G 6.3G 30% /<br />
/dev/sda8 99M 28M 67M 30% /boot<br />
tmpfs 474M 0 474M 0% /dev/shm<br />
/dev/sda12 965M 53M 863M 6% /home<br />
/dev/sda10 965M 18M 898M 2% /zjg<br />
/dev/sdb5 983M 628M 355M 64% /media/disk</p>
<p>解决方法:<br />

<!-- Begin alimama Adserver code -->
<script type="text/javascript"><!--
google_ad_client = "pub-8438729971248494";
/* 728x90, ������ 10-2-7 */
google_ad_slot = "4752526529";
google_ad_width = 728;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<!-- End Alimama Adserver code -->
<br />
1 放入系统盘，设置从光盘启动，敲入linux rescue进入救援模式;<br />
2 此时是光盘无法自动挂载/分区到/mnt/sysimage，要手工挂载；<br />
用findfs LABEL=/ 找到原来/分区所挂载的分区，比如为/dev/sda9，同样的找到原来/home,/boot对应的分</p>
<p>区/dev/sda12,/dev/sda8<br />
mount /dev/sda9 /mnt/sysimage 挂载/<br />
mount /dev/sda8 /mnt/sysimage/boot 挂载/ （注：也可不挂载）<br />
mount /dev/sda12 /mnt/sysimage/home 挂载/home</p>
<p>3 chroot /mnt/sysimage切换到原系统的根分区，否则是光盘上的分区；<br />
4　比如管理员在/home目录下有fstab的备份，此时要把/home下的备份fstab拷贝到/etc/fstab,没有的话请自己</p>
<p>配一下；重启;<br />
5 再次进入光盘救援模式，chroot /mnt/sysimage切换到原系统的根分区，<br />
6 去/home目录，并安装kernel-2.6.18-8.el5.i686.rpm<br />
rpm -ivh kernel-2.6.18-8.el5.i686.rpm &#8211;root=/ &#8211;force<br />
7 此时可以查看/boot目录，已经安装了内核文件与文件系统文件<br />
vmlinuz-2.6.18-8.el5<br />
initrd-2.6.18-8.el5.img<br />
8　安装grub: grub-install /dev/sda<br />
8 把/home下的grub.conf拷贝到/boot/grub/grub.conf,没有的话请自己配一下；<br />
9 reboot或两次exit重启，并拿出光盘即可启动；</p>
]]></content:encoded>
			<wfw:commentRss>http://www.evanjiang.net.cn/archives/53.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
