<?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>开源小站 &#187; 数据库应用</title>
	<atom:link href="http://www.litrin.net/category/%e6%95%b0%e6%8d%ae%e5%ba%93%e5%ba%94%e7%94%a8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.litrin.net</link>
	<description>It is Cool to OpenSource</description>
	<lastBuildDate>Fri, 03 Feb 2012 04:33:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>MongoDB的分发模式和部署</title>
		<link>http://www.litrin.net/2012/01/11/mongodb%e7%9a%84%e5%88%86%e5%8f%91%e6%a8%a1%e5%bc%8f%e5%92%8c%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mongodb%25e7%259a%2584%25e5%2588%2586%25e5%258f%2591%25e6%25a8%25a1%25e5%25bc%258f%25e5%2592%258c%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2012/01/11/mongodb%e7%9a%84%e5%88%86%e5%8f%91%e6%a8%a1%e5%bc%8f%e5%92%8c%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Wed, 11 Jan 2012 03:58:07 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[nosql]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1634</guid>
		<description><![CDATA[MongoDB是近期一直在研究的No-SQL，作为No-SQL来说，Mongo做的反而更像传统的关系型数据库，可以利用弱关系进行查询。作为网站应用来说，毫不客气地说，如果你的查询复杂程度到了MongoDB无法支持的程度，只能说明你的数据结构设计的有问题。 作为No-sql的强项，MongoDB的数据分发/同步机制相对比MySQL灵活的多，支持传统上的主从同步和趋向于高性能的ShareSet，而且对于程序端来说改动相对较小，代价几乎可以不计。现在就从这两种分发机制方式说起。 Master-slaver机制 不同于MySQL的主从同步，MongoDB的主备同步有3种角色，primary（相当于Master）, secondary（相当于Slave），Arbite（选举机）。正常情况下primary与secondary的配置要相当，因为很有可能主备切换，Arbite则没有被升格的可能（只有选举权，没有被选举权），正常情况下只是相当于一个心跳监控机而已。一旦p出现故障或者整个拓扑结构发生变化，导致P不能联系上大多数M之后，如果存在多台S需要升格成P的时候就需要A来进行选举。 Master-Slaver的部署 假设3台主机,主机名分别是 P S A,请注意Shell提示符 P# mongod &#8211;rest &#8211;replSet testSet P# mongo &#62;cfg = {member:{host: “P:27017&#8243;}} &#62;  rs.initiate(cfg) S# mongod &#8211;rest &#8211;replSet testSet p#mongo &#62;rs.add(“S”) { “ok” : 1 } A# mongod &#8211;rest &#8211;replSet testSet &#8211;oplogSize 8 p# mongo &#62;rs.add( { host:”A”, arbiterOnly:true } ) { “ok” : 1 } 宣告成功！就这么简单！ 如果之前一直按照此步骤的话，你就可以直接通过访问http://P:28017/来查看整个系统的状态。 理论上MongoDB可以支持互为主备，但个人觉得没有意义，反而会出现较多的一致性问题，没有在这里测试。 Sharding机制 不知道你会怎么理解”Sharding”这个单词，我的第一反应是罐头装的沙丁鱼。从拓扑结构上看，真的很像！ [...]]]></description>
			<content:encoded><![CDATA[<p>MongoDB是近期一直在研究的No-SQL，作为No-SQL来说，Mongo做的反而更像传统的关系型数据库，可以利用弱关系进行查询。作为网站应用来说，毫不客气地说，如果你的查询复杂程度到了MongoDB无法支持的程度，只能说明你的数据结构设计的有问题。</p>
<p>作为No-sql的强项，MongoDB的数据分发/同步机制相对比MySQL灵活的多，支持传统上的主从同步和趋向于高性能的ShareSet，而且对于程序端来说改动相对较小，代价几乎可以不计。现在就从这两种分发机制方式说起。</p>
<p><span id="more-1634"></span></p>
<p><strong>Master-slaver机制</strong></p>
<p><img class="aligncenter" src="http://www.mongodb.org/download/attachments/9830402/replset.png?version=1&amp;modificationDate=1321024229272" alt="" width="405" height="310" /></p>
<p>不同于MySQL的主从同步，MongoDB的主备同步有3种角色，primary（相当于Master）, secondary（相当于Slave），Arbite（选举机）。正常情况下primary与secondary的配置要相当，因为很有可能主备切换，Arbite则没有被升格的可能（只有选举权，没有被选举权），正常情况下只是相当于一个心跳监控机而已。一旦p出现故障或者整个拓扑结构发生变化，导致P不能联系上大多数M之后，如果存在多台S需要升格成P的时候就需要A来进行选举。</p>
<p><strong>Master-Slaver的部署</strong></p>
<p>假设3台主机,主机名分别是 P S A,请注意Shell提示符</p>
<p>P# mongod &#8211;rest &#8211;replSet testSet</p>
<p>P# mongo</p>
<p>&gt;cfg = {member:{host: “P:27017&#8243;}}<br />
&gt;  rs.initiate(cfg)</p>
<p>S# mongod &#8211;rest &#8211;replSet testSet<br />
p#mongo</p>
<p>&gt;rs.add(“S”)</p>
<p>{ “ok” : 1 }</p>
<p>A# mongod &#8211;rest &#8211;replSet testSet &#8211;oplogSize 8</p>
<p>p# mongo</p>
<p>&gt;rs.add( { host:”A”, arbiterOnly:true } )</p>
<p>{ “ok” : 1 }</p>
<p>宣告成功！就这么简单！</p>
<p>如果之前一直按照此步骤的话，你就可以直接通过访问http://P:28017/来查看整个系统的状态。</p>
<p>理论上MongoDB可以支持互为主备，但个人觉得没有意义，反而会出现较多的一致性问题，没有在这里测试。</p>
<p><strong>Sharding机制</strong></p>
<p><img class="aligncenter" src="http://www.mongodb.org/download/attachments/2097393/sharding.PNG?version=2&amp;modificationDate=1267724627656" alt="" width="572" height="333" /></p>
<p>不知道你会怎么理解”Sharding”这个单词，我的第一反应是罐头装的沙丁鱼。从拓扑结构上看，真的很像！</p>
<p>沙丁鱼有3种角色，shard，参与存储和运算的节点，要求数量多；config ，控制节点，保存有各个数据的哈希映射，及负载信息,相对来说是整个环节中的关键应用；mongos，路由节点，负责前端分发和数据汇总，相对来说是整个环节中的中央应用。客户端向任意一个Mongos发起请求，mongs首先从config上获取哈希映射，再通过哈希映射获取所有的数据后汇总给客户端。config不断的维系全局的数据分片，又有点类似心跳监视的意思。更加夸张的是，这种沙丁鱼结构支持嵌套，同样也支持嵌套上面的主从结构。</p>
<p><strong>sharding的部署</strong></p>
<p>这次还是3台机器，S1 S2 MS，S1 S2在做shard服务器的同时也兼作config，shard是27018口，config是27019口，都是默认的端口。</p>
<p>s1# mongod &#8211;shardsvr &#8211;replSet s1</p>
<p>s1# mongo</p>
<p>&gt; cfg = { _id : “s1&#8243;, members : [ {_id : 0, host : "S1:27018"}, ] }</p>
<p>&gt; rs.initiate(cfg)</p>
<p>s2# mongod &#8211;shardsvr &#8211;replSet s2</p>
<p>s2# mongo</p>
<p>&gt; cfg = { _id : “s1&#8243;, members : [ {_id : 0, host : "S2:27018"}, ] }<br />
&gt; rs.initiate(cfg)</p>
<p>s1# mongod &#8211;configsvr</p>
<p>s2# mongod &#8211;configsvr</p>
<p>MS# mongos &#8211;configdb s1:27019,s2:27019</p>
<p>MS#mongo</p>
<p>&gt; db.adminCommand( { addShard : “s1/s1:27018&#8243; } )</p>
<p>&gt; db.adminCommand( { addShard : “s2/s2:27018&#8243; } )</p>
<p>恭喜完成了这么复杂的系统!需要注意的是整个系统中尽量使用主机名,通过hosts指向还是通过DNS无所谓，这是因为系统一旦启动就很难修改主机信息，IP地址远没有主机名灵活。</p>
<p><strong>客户端的配置</strong></p>
<p>算了,照贴PHP官档！</p>
<div>
<div>
<p><code>&lt;?php</code></p>
<p>// 连接池方式，主机名之间用逗号隔开，然后添加array(“replicaSet” =&gt; true)<br />
$m1 = new Mongo(“mongodb://sf2.example.com,ny1.example.com”, array(“replicaSet” =&gt; true));</p>
<p>// 可以只写一个连接，然后添加array(“replicaSet” =&gt; true)表示这是一个集群，系统将会获取完整的服务器列表<br />
$m2 = new Mongo(“mongodb://ny1.example.com”, array(“replicaSet” =&gt; true));</p>
<p>?&gt;</p>
</div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2012/01/11/mongodb%e7%9a%84%e5%88%86%e5%8f%91%e6%a8%a1%e5%bc%8f%e5%92%8c%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从Redis的数据丢失说起</title>
		<link>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bb%258eredis%25e7%259a%2584%25e6%2595%25b0%25e6%258d%25ae%25e4%25b8%25a2%25e5%25a4%25b1%25e8%25af%25b4%25e8%25b5%25b7</link>
		<comments>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/#comments</comments>
		<pubDate>Thu, 22 Dec 2011 02:35:21 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[Redis]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1611</guid>
		<description><![CDATA[碰到一个悲催的事情：一台Redis服务器，4核，16G内存且没有任何硬件上的问题。持续高压运行了大约3个月，保存了大约14G的数据，设置了比较完备的Save参数。而就是这台主机，在一次重起之后，丢失了大量的数据，14G的数据最终只恢复了几百兆而已。 正常情况下，像Redis这样定期回写磁盘的内存数据库，丢失几个数据也是在情理之中，可超过80%数据丢失率实在太离谱。排除了误操作的可能性之后，开始寻找原因。 &#160; 重启动时的日志： [26641] 21 Dec 09:46:34 * Slave ask for synchronization [26641] 21 Dec 09:46:34 * Starting BGSAVE for SYNC [26641] 21 Dec 09:46:34 # Can&#8217;t save in background: fork: Cannot allocate memory [26641] 21 Dec 09:46:34 * Replication failed, can&#8217;t BGSAVE [26641] 21 Dec 09:46:34 # Received SIGTERM, scheduling shutdown&#8230; [26641] 21 [...]]]></description>
			<content:encoded><![CDATA[<p>碰到一个悲催的事情：一台Redis服务器，4核，16G内存且没有任何硬件上的问题。持续高压运行了大约3个月，保存了大约14G的数据，设置了比较完备的Save参数。而就是这台主机，在一次重起之后，丢失了大量的数据，14G的数据最终只恢复了几百兆而已。</p>
<p>正常情况下，像Redis这样定期回写磁盘的内存数据库，丢失几个数据也是在情理之中，可超过80%数据丢失率实在太离谱。排除了误操作的可能性之后，开始寻找原因。</p>
<p><span id="more-1611"></span></p>
<p>&nbsp;</p>
<p>重启动时的日志：</p>
<p><strong>[26641] 21 Dec 09:46:34 * Slave ask for synchronization</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 * Starting BGSAVE for SYNC</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # <span style="color: #ff0000;">Can&#8217;t save in background: fork: Cannot allocate memory</span></strong></p>
<p><strong>[26641] 21 Dec 09:46:34 * Replication failed, can&#8217;t BGSAVE</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # Received SIGTERM, scheduling shutdown&#8230;</strong></p>
<p><strong>[26641] 21 Dec 09:46:34 # User requested shutdown&#8230;</strong></p>
<p>很明显的一个问题，系统不能在后台保存，fork进程失败。</p>
<p>翻查了几个月的日志，发觉系统在频繁报错：</p>
<p><strong>[26641] 18 Dec 04:02:14 * 1 changes in 900 seconds. Saving&#8230;</strong></p>
<p><strong>[26641] 18 Dec 04:02:14 #<span style="color: #ff0000;"> Can&#8217;t save in background: fork: Cannot allocate memory</span></strong></p>
<p>系统不能在后台保存，fork进程时无法指定内存。</p>
<p>对源码进行跟踪，在src/rdb.c中定位了这个报错：</p>
<pre class="cpp">int rdbSaveBackground(char *filename) {
    pid_t childpid;
    long long start;

    if (server.bgsavechildpid != -1) return REDIS_ERR;
    if (server.vm_enabled) waitEmptyIOJobsQueue();
    server.dirty_before_bgsave = server.dirty;
    start = ustime();
    if ((childpid = fork()) == 0) {
        /* Child */
        if (server.vm_enabled) vmReopenSwapFile();
        if (server.ipfd &gt; 0) close(server.ipfd);
        if (server.sofd &gt; 0) close(server.sofd);
        if (rdbSave(filename) == REDIS_OK) {
            _exit(0);
        } else {
            _exit(1);
        }
    } else {
        /* Parent */
        server.stat_fork_time = ustime()-start;
        if (childpid == -1) {
            redisLog(REDIS_WARNING,"Can't save in background: fork: %s",
                strerror(errno));
            return REDIS_ERR;
        }
        redisLog(REDIS_NOTICE,"Background saving started by pid %d",childpid);
        server.bgsavechildpid = childpid;
        updateDictResizePolicy();
        return REDIS_OK;
    }
    return REDIS_OK; /* unreached */
}</pre>
<p>数据丢失的问题总算搞清楚了！</p>
<p>Redis的数据回写机制分同步和异步两种，</p>
<ol>
<li>同步回写即SAVE命令，主进程直接向磁盘回写数据。在数据大的情况下会导致系统假死很长时间，所以一般不是推荐的。</li>
<li>异步回写即BGSAVE命令，主进程fork后，复制自身并通过这个新的进程回写磁盘，回写结束后新进程自行关闭。由于这样做不需要主进程阻塞，系统不会假死，一般默认会采用这个方法。</li>
</ol>
<p>个人感觉方法２采用fork主进程的方式很拙劣，但似乎是唯一的方法。内存中的热数据随时可能修改，要在磁盘上保存某个时间的内存镜像必须要冻结。冻结就会导致假死。fork一个新的进程之后等于复制了当时的一个内存镜像，这样主进程上就不需要冻结，只要子进程上操作就可以了。</p>
<p>在小内存的进程上做一个fork,不需要太多资源，但当这个进程的内存空间以Ｇ为单位时，fork就成为一件很恐怖的操作。何况在16G内存的主机上fork 14G内存的进程呢？肯定会报内存无法分配的。更可气的是，越是改动频繁的主机上fork也越频繁，fork操作本身的代价恐怕也不会比假死好多少。</p>
<p>找到原因之后，直接修改内核参数vm.overcommit_memory = 1</p>
<p>Linux内核会根据参数vm.overcommit_memory参数的设置决定是否放行。</p>
<ol>
<li> 如果 vm.overcommit_memory = 1，直接放行</li>
<li>vm.overcommit_memory = 0：则比较 此次请求分配的虚拟内存大小和系统当前空闲的物理内存加上swap，决定是否放行。</li>
<li>vm.overcommit_memory = 2：则会比较 进程所有已分配的虚拟内存加上此次请求分配的虚拟内存和系统当前的空闲物理内存加上swap，决定是否放行。</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/12/22/%e4%bb%8eredis%e7%9a%84%e6%95%b0%e6%8d%ae%e4%b8%a2%e5%a4%b1%e8%af%b4%e8%b5%b7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Redis的主从复制</title>
		<link>http://www.litrin.net/2011/12/20/redis%e7%9a%84%e4%b8%bb%e4%bb%8e%e5%a4%8d%e5%88%b6/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=redis%25e7%259a%2584%25e4%25b8%25bb%25e4%25bb%258e%25e5%25a4%258d%25e5%2588%25b6</link>
		<comments>http://www.litrin.net/2011/12/20/redis%e7%9a%84%e4%b8%bb%e4%bb%8e%e5%a4%8d%e5%88%b6/#comments</comments>
		<pubDate>Tue, 20 Dec 2011 05:43:46 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[Redis]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1605</guid>
		<description><![CDATA[作为MySQL对于Web应用的优化之一，主从复制（Master-slaver）是普遍被接受的，Redis作为当下一个no-sql的解决方案，很自然的将这个特性引入。同时将“操作便捷”作为一大目标，Redis的主从复制更为简单，甚至不需要额外的操作，完全可以在两台热机之间进行。 首先，准备2套Redis主机，本例192.168.0.1为主，192.168.0.2为从。为了保障不会出现稀奇古怪的毛病，要求2台主机配置文件中 databases ，dbs数量，决定了select命令的最大数（分块数量） maxmemory，最大内存使用，决定了整个系统的容量 两个参数的配置要一致，系统版本尽量保证一致（我测试过不一致的版本也可以同步，但不保证所有的情况下都可以同步）其余的数据不强制要求一致。 用客户端连接slaver主机的redis并操作 redis-cli -h 192.168.0.2 redis 192.168.0.2:6379&#62; slaveof 192.168.0.1 6379 OK 就这么方便！ 这时，可以在输入info命令，查看master_host的配置： redis 192.168.0.2:6379&#62;info &#8230; master_host:192.168.0.1 &#8230; 为保证主机每次启动都保持slave的状态，则可以在redis.conf中增加一行slaveof 192.168.0.1 6379 即可，也非常简单。 作为redis这类nosql来说，并发的压力并不像MySQL那样迫切，何况数据没有关联，一旦出现并发的瓶颈，可以很方便的将数据拆分成多个主机。那对于标准的web应用，主从的意义是什么？ 个人理解： 解决Redis内存回写磁盘一瞬间的阻塞问题。 Redis 是内存数据库，数据都在内存中，仅在改变时才会回写。但在磁盘回写的时候，由于需要拷贝内存镜像，整个处于阻塞状态，服务器不会做任何相应，在数据少的情况下阻塞时间也很少，可以忽略。但数据达到G这个级别之后的阻塞绝对是致命的。而且这个阻塞由Redis特性决定，无法彻底解决。 通过主从这种方式对任务进行分工，主机负责写入，通过配置文件中的save选项，减少回写甚至直接取消数据回写，将数据持久化的任务交由slaver主机进行。一旦宕机，由slaver主机上的数据恢复出master。 数据热迁移。 这个很好理解了，数据迁移示意图 &#160;]]></description>
			<content:encoded><![CDATA[<p>作为MySQL对于Web应用的优化之一，主从复制（Master-slaver）是普遍被接受的，Redis作为当下一个no-sql的解决方案，很自然的将这个特性引入。同时将“操作便捷”作为一大目标，Redis的主从复制更为简单，甚至不需要额外的操作，完全可以在两台热机之间进行。</p>
<p><span id="more-1605"></span></p>
<p>首先，准备2套Redis主机，本例192.168.0.1为主，192.168.0.2为从。为了保障不会出现稀奇古怪的毛病，要求2台主机配置文件中</p>
<ul>
<li>databases ，dbs数量，决定了select命令的最大数（分块数量）</li>
<li>maxmemory，最大内存使用，决定了整个系统的容量</li>
</ul>
<p>两个参数的配置要一致，系统版本尽量保证一致（我测试过不一致的版本也可以同步，但不保证所有的情况下都可以同步）其余的数据不强制要求一致。</p>
<p>用客户端连接slaver主机的redis并操作</p>
<p>redis-cli -h 192.168.0.2</p>
<p>redis 192.168.0.2:6379&gt; slaveof 192.168.0.1 6379<br />
OK</p>
<p>就这么方便！</p>
<p>这时，可以在输入info命令，查看master_host的配置：</p>
<p>redis 192.168.0.2:6379&gt;info<br />
&#8230;<br />
master_host:192.168.0.1<br />
&#8230;</p>
<p>为保证主机每次启动都保持slave的状态，则可以在redis.conf中增加一行slaveof 192.168.0.1 6379 即可，也非常简单。</p>
<p>作为redis这类nosql来说，并发的压力并不像MySQL那样迫切，何况数据没有关联，一旦出现并发的瓶颈，可以很方便的将数据拆分成多个主机。那对于标准的web应用，主从的意义是什么？</p>
<p>个人理解：</p>
<ol>
<li>解决Redis内存回写磁盘一瞬间的阻塞问题。<br />
Redis 是内存数据库，数据都在内存中，仅在改变时才会回写。但在磁盘回写的时候，由于需要拷贝内存镜像，整个处于阻塞状态，服务器不会做任何相应，在数据少的情况下阻塞时间也很少，可以忽略。但数据达到G这个级别之后的阻塞绝对是致命的。而且这个阻塞由Redis特性决定，无法彻底解决。<br />
通过主从这种方式对任务进行分工，主机负责写入，通过配置文件中的save选项，减少回写甚至直接取消数据回写，将数据持久化的任务交由slaver主机进行。一旦宕机，由slaver主机上的数据恢复出master。</li>
<li>数据热迁移。<br />
这个很好理解了，<a href="http://www.litrin.net/2011/12/20/redis%e7%9a%84%e4%b8%bb%e4%bb%8e%e5%a4%8d%e5%88%b6/redis_data/" rel="attachment wp-att-1606">数据迁移示意图</a></li>
</ol>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/12/20/redis%e7%9a%84%e4%b8%bb%e4%bb%8e%e5%a4%8d%e5%88%b6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql Innodb的两种表空间方式</title>
		<link>http://www.litrin.net/2011/12/06/mysql-innodb%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%a1%a8%e7%a9%ba%e9%97%b4%e6%96%b9%e5%bc%8f/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql-innodb%25e7%259a%2584%25e4%25b8%25a4%25e7%25a7%258d%25e8%25a1%25a8%25e7%25a9%25ba%25e9%2597%25b4%25e6%2596%25b9%25e5%25bc%258f</link>
		<comments>http://www.litrin.net/2011/12/06/mysql-innodb%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%a1%a8%e7%a9%ba%e9%97%b4%e6%96%b9%e5%bc%8f/#comments</comments>
		<pubDate>Tue, 06 Dec 2011 05:17:36 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1599</guid>
		<description><![CDATA[要说表空间，Mysql的表空间管理远远说不上完善。换句话说，事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式，默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表，则需要执行alter table MY_TABLE engine=innodb命令迁移数据。 共享表空间方式 由于是默认的方式，就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个（或几个）文件中，比较利于管理，而且在操作的时候只需要open这一个（或几个）文件即可，相对来说代价很低。 但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理，而且对于一个如此巨大的文件来说，读写它需要耗费的资源一样巨大。更加令人费解的是，MySQL竟然将索引和数据保存于同一个文件中，索引和数据之间尚存在资源争用，不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件，但MySQL的逻辑是“用满后增加”，仅仅是一个文件的拆分而已，不能从根本上分离数据和索引。 之前曾经遭遇到700G以上的表空间文件，而且更加让人郁闷的是对于如此大的文件还在以每天数G的数量增加。由于无法停机，即便是拷贝一下也要花费差不多一夜，只能眼睁睁看着它继续增大而毫无保守可行的办法。 独立表空间方式 相对而言对立表空间每个表都有独立的多个数据文件，而且做到了索引和数据的分离。多个小文件之间很方便的完成跨数据库甚至跨硬件的数据拷贝和迁移。相对来说灵活性很好。 这样做同样带来另一个方面的问题。当数据库中的表数量达到一定级别时，每次操作所涉及的文件过多，如果按照默认Centos的ulimit -n = 1024的话，仅仅只能保证同时打开256个表以内，这在习惯上“拆库拆表”的MySQL数据结构上很难达到要求。尚且这种数据文件的利用率不算很高，当大量“不高”的文件集中起来，浪费的空间也很惊人，更何况最后可能出现的状况不是“一堆K级别的小文件”而是“一堆G级别的大文件”，有点适得其反的意思。你自然可以联想到分区表，又是一个“仅仅做文件拆分而已”，多个分区文件缺一不可。 之前同样遇到过这个问题，MySQL连接大的状况下大量的timeout，但主机负载还算可以，查了一圈才知道是open files限制的问题，限制一修改，负载变得惊人，但连接数却又提升的不多。 总之，两种方法各有所长，部分互补，但都不是解决问题的终极方案。期待MySQL能够出现真正意义上表空间的概念，更加自由的规划数据文件。]]></description>
			<content:encoded><![CDATA[<p>要说表空间，Mysql的表空间管理远远说不上完善。换句话说，事实上Mysql根本没有真正意义上的表空间管理。Mysql的Innodb包含两种表空间文件模式，默认的共享表空间和每个表分离的独立表空间。只要在my.cnf里面增加innodb_file_per_table=1就可以从共享表空间切换到独立表空间。当然对于已经存在的表，则需要执行alter table MY_TABLE engine=innodb命令迁移数据。</p>
<p><span id="more-1599"></span><strong>共享表空间方式</strong></p>
<p>由于是默认的方式，就暂且理解为Mysql官方推荐的方式。相对而言所有的数据都在一个（或几个）文件中，比较利于管理，而且在操作的时候只需要open这一个（或几个）文件即可，相对来说代价很低。</p>
<p>但问题是在数据达到以G为单位来计算的时候优劣逆转。一个大小惊人的文件很不利于管理，而且对于一个如此巨大的文件来说，读写它需要耗费的资源一样巨大。更加令人费解的是，MySQL竟然将索引和数据保存于同一个文件中，索引和数据之间尚存在资源争用，不利于性能的提升。你当然可以通过innodb_data_file_path的配置规划多个表空间文件，但MySQL的逻辑是“用满后增加”，仅仅是一个文件的拆分而已，不能从根本上分离数据和索引。</p>
<p>之前曾经遭遇到700G以上的表空间文件，而且更加让人郁闷的是对于如此大的文件还在以每天数G的数量增加。由于无法停机，即便是拷贝一下也要花费差不多一夜，只能眼睁睁看着它继续增大而毫无保守可行的办法。</p>
<p><strong>独立表空间方式</strong></p>
<p>相对而言对立表空间每个表都有独立的多个数据文件，而且做到了索引和数据的分离。多个小文件之间很方便的完成跨数据库甚至跨硬件的数据拷贝和迁移。相对来说灵活性很好。</p>
<p>这样做同样带来另一个方面的问题。当数据库中的表数量达到一定级别时，每次操作所涉及的文件过多，如果按照默认Centos的ulimit -n = 1024的话，仅仅只能保证同时打开256个表以内，这在习惯上“拆库拆表”的MySQL数据结构上很难达到要求。尚且这种数据文件的利用率不算很高，当大量“不高”的文件集中起来，浪费的空间也很惊人，更何况最后可能出现的状况不是“一堆K级别的小文件”而是“一堆G级别的大文件”，有点适得其反的意思。你自然可以联想到分区表，又是一个“仅仅做文件拆分而已”，多个分区文件缺一不可。</p>
<p>之前同样遇到过这个问题，MySQL连接大的状况下大量的timeout，但主机负载还算可以，查了一圈才知道是open files限制的问题，限制一修改，负载变得惊人，但连接数却又提升的不多。</p>
<p>总之，两种方法各有所长，部分互补，但都不是解决问题的终极方案。期待MySQL能够出现真正意义上表空间的概念，更加自由的规划数据文件。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/12/06/mysql-innodb%e7%9a%84%e4%b8%a4%e7%a7%8d%e8%a1%a8%e7%a9%ba%e9%97%b4%e6%96%b9%e5%bc%8f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从SQL到NoSQL</title>
		<link>http://www.litrin.net/2011/09/26/%e4%bb%8esql%e5%88%b0nosql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bb%258esql%25e5%2588%25b0nosql</link>
		<comments>http://www.litrin.net/2011/09/26/%e4%bb%8esql%e5%88%b0nosql/#comments</comments>
		<pubDate>Mon, 26 Sep 2011 05:13:28 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[nosql]]></category>
		<category><![CDATA[Redis]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1559</guid>
		<description><![CDATA[之前接触到的基于LAMP平台的网站，凡是稍微有一点量上去的，在数据结构的设计上总是离不开“拆库拆表”。同样，作为网站的数据结构设计，很少会出现类似ERP系统才会应用到的函数（function）、存储过程（procudce）、触发器（trigger）什么的——曾经看过有ERP系统的所有逻辑都是通过这3者保存在数据库端的。加上MySQL本身的一些因素，用之前一个朋友的话说：“Mysql在网站中的地位更多的是一个数据容器，而不是完整意义上的数据库。” 既然仅仅只是当作一个容器，从性能上考虑那为什么要用MySQL呢？ 最近在研究一些NoSQL的东西，memcache类这类的纯Key-value；redis这类key-list；以及更加接近于关系型的MongoDB。这类的数据容器相较MySQL这类SQL数据库而言，更多的都是在性能上做大幅提升。从搜索能力上讲，MySQL的搜索能力又远不及Sphinx或者Solr这类单纯的索引服务器。如果说关系型数据库的优势在于一致性。那事物操作本身也不是MySQL所擅长的，“拆库拆表”的设计理念更是打破了一致性的优势。MySQL剩下的优势恐怕只剩下了“便于维护”这一条了吧。 相比MySQL这些年做的改进，几乎都是在完善事物处理这类高级的SQL逻辑。之前人们选择MySQL的原因，其实很少是由于MySQL的事务处理，而是性能方面的优势。当MySQL不再将性能的提升作为首要任务时，加上近一段时间风声水起的SNS热潮，MySQL的王者地位已经逐渐被NoSQL数据库挑战——甚至出现了完全排除MySQL的SNS框架。 据说MySQL5.6中启用了对于Memcache的支持，看来连MySQL自己也顿悟了……]]></description>
			<content:encoded><![CDATA[<p>之前接触到的基于LAMP平台的网站，凡是稍微有一点量上去的，在数据结构的设计上总是离不开“拆库拆表”。同样，作为网站的数据结构设计，很少会出现类似ERP系统才会应用到的函数（function）、存储过程（procudce）、触发器（trigger）什么的——曾经看过有ERP系统的所有逻辑都是通过这3者保存在数据库端的。加上MySQL本身的一些因素，用之前一个朋友的话说：“Mysql在网站中的地位更多的是一个数据容器，而不是完整意义上的数据库。”</p>
<p><span id="more-1559"></span>既然仅仅只是当作一个容器，从性能上考虑那为什么要用MySQL呢？</p>
<p>最近在研究一些NoSQL的东西，memcache类这类的纯Key-value；redis这类key-list；以及更加接近于关系型的MongoDB。这类的数据容器相较MySQL这类SQL数据库而言，更多的都是在性能上做大幅提升。从搜索能力上讲，MySQL的搜索能力又远不及Sphinx或者Solr这类单纯的索引服务器。如果说关系型数据库的优势在于一致性。那事物操作本身也不是MySQL所擅长的，“拆库拆表”的设计理念更是打破了一致性的优势。MySQL剩下的优势恐怕只剩下了“便于维护”这一条了吧。</p>
<div id="attachment_1561" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-1561" title="mysql mongodb 写入对比" src="http://www.litrin.net/wp-content/uploads/2011/09/mysql-mongodb-write-300x179.png" alt="mysql mongodb 写入对比" width="300" height="179" /><p class="wp-caption-text">mysql mongodb 写入对比</p></div>
<div id="attachment_1562" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-1562" title="mysql mongodb 查询对比" src="http://www.litrin.net/wp-content/uploads/2011/09/mysql-mongodb-read-300x244.png" alt="mysql mongodb 查询对比" width="300" height="244" /><p class="wp-caption-text">mysql mongodb 查询对比</p></div>
<div id="attachment_1560" class="wp-caption aligncenter" style="width: 310px"><img class="size-medium wp-image-1560" title="mysql mongodb 资源对比" src="http://www.litrin.net/wp-content/uploads/2011/09/mysql-mongodb-300x202.png" alt="mysql mongodb 资源对比" width="300" height="202" /><p class="wp-caption-text">mysql mongodb 资源对比</p></div>
<p>相比MySQL这些年做的改进，几乎都是在完善事物处理这类高级的SQL逻辑。之前人们选择MySQL的原因，其实很少是由于MySQL的事务处理，而是性能方面的优势。当MySQL不再将性能的提升作为首要任务时，加上近一段时间风声水起的SNS热潮，MySQL的王者地位已经逐渐被NoSQL数据库挑战——甚至出现了完全排除MySQL的SNS框架。</p>
<p>据说MySQL5.6中启用了对于Memcache的支持，看来连MySQL自己也顿悟了……</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/09/26/%e4%bb%8esql%e5%88%b0nosql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Hadoop的单机部署</title>
		<link>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=hadoop%25e7%259a%2584%25e5%258d%2595%25e6%259c%25ba%25e9%2583%25a8%25e7%25bd%25b2</link>
		<comments>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/#comments</comments>
		<pubDate>Fri, 19 Aug 2011 13:23:08 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[Hadoop]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1528</guid>
		<description><![CDATA[&#160; 要说最近最热的云计算，不得不提Hadoop。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。 这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。 既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下： echo “deb http://archive.canonical.com/ natty partner” &#62;&#62; /etc/apt/sources.list #添加源 apt-get update apt-get install sun-java-jdk 文件多而大，耐心等待。 基础环境 默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后， echo "/usr/lib/jvm/java-6-sun"  &#62; /etc/jvm 官方建议关闭ipv6，尽管我不清楚有什么影响 echo "blacklist ipv6" &#62;&#62; /etc/modprobe.d/blacklist 建立用户/组，没什么要解释的 addgroup hadoop adduser --ingroup hadoop hadoop 修改环境变量，vi /etc/bash.bashrc，在末尾添加： export JAVA_HOME=/usr/lib/jvm/java-6-sun export JDK_HOME=$JAVA_HOME export PATH=$PATH:$JAVA_HOME/bin 切换用户到hadoop, su &#8211; hadoop 调通ssh，具体参见这里之前的东西。 mkdir [...]]]></description>
			<content:encoded><![CDATA[<p>&nbsp;</p>
<p>要说最近最热的云计算，不得不提<a rel="nofollow" target="_blank" href="http://hadoop.apache.org" target="_blank">Hadoop</a>。这个项目就是为集群运算而生的。依赖于它的项目n多，个人感觉hadoop已经逐渐成为一个“基于Java的分布式运算中间件”。</p>
<p>这里安装的hadoop为ver 0.21.0版本，包含了HDFS分布式文件系统。平台为老一套的Ubuntu 1104 server for amd64。</p>
<p>既然是Java Base的，首先要准备jdk环境。默认1104已经把java从apt中剔除了——跟oracle收购sun不无关系，尽管openjdk还在，我还是建议安装sun-jdk。具体实现如下：</p>
<p><span id="more-1528"></span><br />
echo “deb http://archive.canonical.com/ natty partner” &gt;&gt; /etc/apt/sources.list #添加源<br />
apt-get update<br />
apt-get install sun-java-jdk</p>
<p>文件多而大，耐心等待。</p>
<p><strong>基础环境</strong></p>
<p><strong></strong>默认apt方式安装的jdk目录为/usr/lib/jvm/java-6-sun ，等待jdk完成之后，</p>
<pre>echo "/usr/lib/jvm/java-6-sun"  &gt; /etc/jvm</pre>
<p>官方建议关闭ipv6，尽管我不清楚有什么影响</p>
<pre>echo "blacklist ipv6" &gt;&gt; /etc/modprobe.d/blacklist</pre>
<p>建立用户/组，没什么要解释的</p>
<pre>addgroup hadoop
adduser --ingroup hadoop hadoop</pre>
<p>修改环境变量，vi /etc/bash.bashrc，在末尾添加：</p>
<pre>export JAVA_HOME=/usr/lib/jvm/java-6-sun
export JDK_HOME=$JAVA_HOME
export PATH=$PATH:$JAVA_HOME/bin</pre>
<p>切换用户到hadoop, su &#8211; hadoop</p>
<p>调通ssh，具体参见<a title="用publickey验证登录SSH服务器" href="http://www.litrin.net/2006/04/10/%e7%94%a8publickey%e9%aa%8c%e8%af%81%e7%99%bb%e5%bd%95ssh%e6%9c%8d%e5%8a%a1%e5%99%a8/" target="_blank">这里</a>之前的东西。</p>
<pre>mkdir .ssh
cd .ssh
ssh-keygen -t rsa
cat id_rsa.pub &gt;&gt; authorized_keys
ssh localhost</pre>
<p><strong>配置Hadoop</strong></p>
<p>我默认已经使用hadoop用户进行操作，root权限可以不用了。</p>
<p>将下载后的hadoop保存在适当的目录下，我选择了/opt/hadoop目录。</p>
<p>修改/opt/hadoop/conf/hadoop-env.sh文件中，添加 export JAVA_HOME=/usr/lib/jvm/java-6-sun</p>
<p>cd /opt/hadoop/conf 一堆的配置文件要改。</p>
<p>conf/core-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;fs.default.name&lt;/name&gt;&lt;!--文件系统名称--&gt;
        &lt;!--&lt;value&gt;hdfs://localhost:9000&lt;/value&gt;单机，不使用集群文件系统 --&gt;&lt;value&gt;/date/hadoop&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/hdfs-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;dfs.replication&lt;/name&gt;
         &lt;value&gt;1&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>conf/mapred-site.xml:</p>
<pre>&lt;configuration&gt;
     &lt;property&gt;
         &lt;name&gt;mapred.job.tracker&lt;/name&gt;
         &lt;value&gt;localhost:9001&lt;/value&gt;
     &lt;/property&gt;
&lt;/configuration&gt;</pre>
<p>需要注意的是，不同的版本号之间，配置方式有细微的不同。</p>
<p>配置OK!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/08/19/hadoop%e7%9a%84%e5%8d%95%e6%9c%ba%e9%83%a8%e7%bd%b2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu上Coreseek+php的安装</title>
		<link>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258acoreseekphp%25e7%259a%2584%25e5%25ae%2589%25e8%25a3%2585</link>
		<comments>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/#comments</comments>
		<pubDate>Thu, 16 Jun 2011 02:23:30 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1489</guid>
		<description><![CDATA[Coreseek是一个基于sphinx引擎，支持与mmseg中文分词模块合作完成中文的全文搜索引擎。相对sql这类操作，Coreseek负载可谓是微不足道。当然类似的索引服务器还有给予Java的solr等。我选择coreseek的主要原因之一是他可以通过配置后可以与现有的mysql客户端兼容，并可以直接嵌入到mysql中成为mysql的引擎之一。 首先，下载安装包，我选择的是最新的stable版， 不过不客气的说，即便是coreseek的stable版本，不论是从稳定性、兼容性还是灵活性上都不能算是完善，至少无法跟apache这类经典应用相提并论。 安装ubuntu开发包： apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev   解压： tar xzvf coreseek-3.2.14.tar.gz cd coreseek-3.2.14 应该看到有mmseg csft testpack 至少3个目录 安装mmseg中文分词模块 cd mmseg-3.2.14 ./bootstrap ./configure &#8211;prefix=/usr/local/mmseg3 #不喜欢这个官方目录配置，更换目录后配置无法生效郁闷了很久，稍后再说 make make install cd ../testpack /usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #测试结果，请确保终端可以看到utf8中文，应该可以看到分词后的结果 安装Python包 虽然coreseek支持直接的mysql连接，但考虑到分词、分表的情况，这种设置不是很灵活。我的方案是通过python脚本的预处理，将mysql的数据整理后传输到coreseek建立索引。这样还有一个优势就是“万能数据源”——memcache、redis这类几乎不指望coreseek官方支持的妖异存储方案，只要有python的api，均可以索引。 官方的安装手册中介绍的python接口是基于ActivePython 替代系统python语言的方式进行的。ActivePython属于第三方封包，远没有系统自带python来的方便，刚开始用系统python测试了数次，均不成功，后来根据出错信息，找到了原因。 apt-get install python-dev python-sqlite python-mysqldb python-memcache 安装coreseek cd ../csft-3.2.14 [...]]]></description>
			<content:encoded><![CDATA[<p>Coreseek是一个基于sphinx引擎，支持与mmseg中文分词模块合作完成中文的全文搜索引擎。相对sql这类操作，Coreseek负载可谓是微不足道。当然类似的索引服务器还有给予Java的solr等。我选择coreseek的主要原因之一是他可以通过配置后可以与现有的mysql客户端兼容，并可以直接嵌入到mysql中成为mysql的引擎之一。</p>
<p>首先，下载安装包，我选择的是<a rel="nofollow" target="_blank" href="http://www.coreseek.cn/uploads/csft/3.2/coreseek-3.2.14.tar.gz">最新的stable版</a>， 不过不客气的说，即便是coreseek的stable版本，不论是从稳定性、兼容性还是灵活性上都不能算是完善，至少无法跟apache这类经典应用相提并论。</p>
<p><span id="more-1489"></span><br />
安装ubuntu开发包：<br />
apt-get install make gcc g++ automake libtool mysql-client libmysqlclient15-dev libxml2-dev libexpat1-dev</p>
<p><strong> </strong><br />
解压：<br />
tar xzvf coreseek-3.2.14.tar.gz<br />
cd coreseek-3.2.14</p>
<p>应该看到有mmseg csft testpack 至少3个目录</p>
<p><strong>安装mmseg中文分词模块</strong></p>
<p>cd mmseg-3.2.14<br />
./bootstrap<br />
./configure &#8211;prefix=/usr/local/mmseg3 #不喜欢这个官方目录配置，更换目录后配置无法生效郁闷了很久，稍后再说<br />
make<br />
make install<br />
cd ../testpack<br />
/usr/local/mmseg3/bin/mmseg -d /usr/local/mmseg3/etc var/test/test.xml #测试结果，请确保终端可以看到utf8中文，应该可以看到分词后的结果</p>
<p><strong>安装Python包</strong></p>
<p>虽然coreseek支持直接的mysql连接，但考虑到分词、分表的情况，这种设置不是很灵活。我的方案是通过python脚本的预处理，将mysql的数据整理后传输到coreseek建立索引。这样还有一个优势就是“万能数据源”——memcache、redis这类几乎不指望coreseek官方支持的妖异存储方案，只要有python的api，均可以索引。</p>
<p>官方的安装手册中介绍的python接口是基于<a rel="nofollow" target="_blank" href="http://www.activestate.com/activepython" target="_blank">ActivePython</a> 替代系统python语言的方式进行的。ActivePython属于第三方封包，远没有系统自带python来的方便，刚开始用系统python测试了数次，均不成功，后来根据出错信息，找到了原因。</p>
<p>apt-get install python-dev python-sqlite python-mysqldb python-memcache</p>
<p><strong>安装coreseek</strong></p>
<p>cd ../csft-3.2.14<br />
./buildconf.sh<br />
./configure &#8211;prefix=/usr/local/coreseek &#8211;without-unixodbc &#8211;with-mmseg &#8211;with-mmseg-includes=/usr/local/mmseg3/include/mmseg/ &#8211;with-mmseg-libs=/usr/local/mmseg3/lib/ &#8211;with-mysql &#8211;with-python<br />
make<br />
make install</p>
<p>cd ../testpack<br />
/usr/local/coreseek/bin/indexer -c etc/csft.conf &#8211;all<br />
/usr/local/coreseek/bin/search -c etc/csft.conf 网络搜索 #没什么问题了</p>
<p><strong>安装libsphinxclient</strong></p>
<p>coreseek官方教程中建议php使用直接include一个php文件进行操作，事实上php有独立的sphinx模块可以直接操作coreseek (coreseek就是sphinx！)已经进入了php的官方函数库，而且效率的提升不是一点点！但php模块依赖于libsphinxclient包。</p>
<p>cd ../csft-3.2.14/api/libsphinxclient<br />
./configure<br />
make<br />
make install<br />
ldconfig</p>
<p><strong>安装php-sphinx支持 </strong></p>
<p>apt-get install php5-dev<br />
wget http://pecl.php.net/get/sphinx-1.1.0.tgz<br />
tar vzxf  sphinx-1.1.0.tgz<br />
cd  sphinx-1.1.0<br />
phpize<br />
./configure<br />
make<br />
make install</p>
<p>确信成功后修改php.ini，还是遵从ubuntu的配置规则<br />
echo “extension=sphinx.so”  &gt; /etc/php5/conf.d/sphinx.ini</p>
<p>如果使用apache或者fast-cgi的话，请重起。察看phpinfo() 如下则安装成功。</p>
<h2><a name="module_sphinx">sphinx</a></h2>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<th>sphinx support</th>
<th>enabled</th>
</tr>
<tr>
<th>Version</th>
<th>1.1.0</th>
</tr>
<tr>
<th>Revision</th>
<th>$Revision: 303462 $</th>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>配置coreseek</strong></p>
<p>说容易也容易，说麻烦也麻烦的工作，照贴一份吧前面说过，我用的是python数据源</p>
<p>/usr/local/coreseek/etc/coreseek.conf</p>
<pre>python
{
           path = /usr/local/coreseek/DBSource #python 数据源脚本的存放路径
}
source Blog #索引库1 “Blog”
{
          type = python #类型为python
          name = Blog.MainSource #调用python的class
}
index Blog
{
    source          = Blog #数据源名称
    path            = /data/sphinx/Blog #数据文件存放路径
    docinfo         = extern
    mlock           = 0
    morphology      = none
    min_word_len    = 1
    html_strip      = 0
   charset_dictpath = /usr/local/mmseg3/etc/ #mmseg中文分词库的位置，本文开头时我说不能修改mmseg的安装路径就错在这里
   charset_type        = zh_cn.utf-8
}
source UserInfo #索引库2 “UserInfo” 其余同上
{
    type = python
    name = UserInfo.MainSource
}
index UserInfo
{
     source          = UserInfo
     path            = /data/sphinx/UserInfo
     docinfo         = extern
     mlock           = 0
    morphology      = none
    min_word_len    = 1
    html_strip      = 0
    charset_dictpath = /usr/local/mmseg3/etc/
    charset_type        = zh_cn.utf-8
}

searchd #服务器配置
{
    listen          =   9312  #显而易见，默认的监听端口
    listen          =   172.18.196.90:3306:mysql41 #兼容mysql方式的监听，我们配置了php-sphinx，故除了命令行方式外意义不大，可以关闭
    pid_file        =   /var/run/coreseek.pid
}</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/06/16/ubuntu%e4%b8%8acoreseekphp%e7%9a%84%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>运维的CAP原则</title>
		<link>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e8%25bf%2590%25e7%25bb%25b4%25e7%259a%2584cap%25e5%258e%259f%25e5%2588%2599</link>
		<comments>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/#comments</comments>
		<pubDate>Sat, 28 May 2011 07:23:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1480</guid>
		<description><![CDATA[小站上的 文章大多以实际操作为主，这次就介绍点理论吧。 曾经跟几个同行聊起了数据库这边的容错方案，有朋友发过类似的牢骚：“网站（或者数据库）做了负载均衡，可用性提高了，单点故障也不怕了，但数据的同步总是慢半拍，无法适用某些应用。如果要求完全解决一一致性的麻烦，就只能到回去。” 程序开发上始终念念不忘的有个“摩尔定律”，归根结底的就是说不要放太多精力去隄防运算速度达不到的问题。在运维以及底层架构涉及上有着同样重要的定律“CAP”，最早由加州大学伯克利分校（又是他）的Eric A. Brewer教授提出的。所有的分布式系统的好坏主要有3个重要的指标来衡量： 一致性（Consistency） 可用性（Availibility） 容错性、鲁棒性原文翻译是“分区容错”（Partition tolerance） 任何一个分布式系统只能同时满足3个条件中的两个，无法同时达到3者兼备。 就拿磁盘RAID来说： RAID0的情况是数据分散在多块硬盘之上，只存一份。由于只有一份数据，不存在数据不同步的情况，一致性得到保障。多磁盘分散IO，性能提升，可用性提升。多块磁盘拼凑一份数据，磁盘损坏的概率正比上升，同时增加磁盘的难度提升，容错性下降。即为了C和A，放弃了P。 RAID1的情况是数据在每个磁盘上做一个备份。由于有多个备份，可能出现多个磁盘上数据不统一的情况，一致性下降。多磁盘分散IO，性能提升，可用性上升。很容易增加备份磁盘，多个备份，磁盘损坏概率反比下降，鲁棒性上升。即为了A和P，放弃了C。 RAID5的情况是一份数据分散在多块硬盘上，另外保存一份校验数据以方便恢复。数据只有一份，不存在一致性的问题。数据读写的同时可能会需要生成校验数据，影响速度，可用性下降。任何一块磁盘的损坏都可以通过剩余的磁盘中的数据和校验数据恢复，鲁棒性上升。即为了C和P，放弃了A。 对于传统的关系数据库的要求又不得不提ACID： 原子性 （Atomicity）数据和操作不可再次分隔 一致性（Consistency）操作结束后，仍可进行同样的操作 隔离性／无关性（Isolation）操作和操作不得影响 不可撤销（Durability） “不可撤销”，“隔离性”，“原子性”都是限制鲁棒性和容错性的P，一致性本身就是C。剩余的A只能作为牺牲的指标。说得明显点就是目前尚没有什么有效的方法让一条SQL同时在多台主机上同时执行正常。跨表SQL很正常，跨数据库操作已经够变态的了，跨系统进行SQL操作而且保证数据的实时和一致几乎是不可能的。 对于传统的关系型数据库来说难度就是CAP三个之中在你需要任何一个的情况下，即便你愿意花钱去升级硬件，也必须以其他的下降作为代价。要么高可用（负载均衡），要么高安全（热备份），要么高容错（事务回滚），想要正比的升级来获取A是不可能的。 这些年大负载架构的出现带动了nosql型数据库。类似memcache，bigtable和Hbase这类的key-value也是一大亮点。相比关系型的数据库而言，新的数据模型仍然无法摆脱这个魔咒，唯一的优势在于这些架构相对灵活，可以根据需要进行CAP取舍，找出真正适合的C 、A、 P比例。]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.litrin.net">小站</a>上的 文章大多以实际操作为主，这次就介绍点理论吧。</p>
<p>曾经跟几个同行聊起了数据库这边的容错方案，有朋友发过类似的牢骚：“网站（或者数据库）做了负载均衡，可用性提高了，单点故障也不怕了，但数据的同步总是慢半拍，无法适用某些应用。如果要求完全解决一一致性的麻烦，就只能到回去。”</p>
<p><span id="more-1480"></span></p>
<p>程序开发上始终念念不忘的有个“摩尔定律”，归根结底的就是说不要放太多精力去隄防运算速度达不到的问题。在运维以及底层架构涉及上有着同样重要的定律“CAP”，最早由加州大学伯克利分校（又是他）的Eric A. Brewer教授提出的。所有的分布式系统的好坏主要有3个重要的指标来衡量：</p>
<ul>
<li>一致性（Consistency）</li>
<li>可用性（Availibility）</li>
<li>容错性、鲁棒性原文翻译是“分区容错”（Partition tolerance）</li>
</ul>
<p>任何一个分布式系统只能同时满足3个条件中的两个，无法同时达到3者兼备。</p>
<p>就拿磁盘RAID来说：</p>
<p>RAID0的情况是数据分散在多块硬盘之上，只存一份。由于只有一份数据，不存在数据不同步的情况，一致性得到保障。多磁盘分散IO，性能提升，可用性提升。多块磁盘拼凑一份数据，磁盘损坏的概率正比上升，同时增加磁盘的难度提升，容错性下降。即为了C和A，放弃了P。</p>
<p>RAID1的情况是数据在每个磁盘上做一个备份。由于有多个备份，可能出现多个磁盘上数据不统一的情况，一致性下降。多磁盘分散IO，性能提升，可用性上升。很容易增加备份磁盘，多个备份，磁盘损坏概率反比下降，鲁棒性上升。即为了A和P，放弃了C。</p>
<p>RAID5的情况是一份数据分散在多块硬盘上，另外保存一份校验数据以方便恢复。数据只有一份，不存在一致性的问题。数据读写的同时可能会需要生成校验数据，影响速度，可用性下降。任何一块磁盘的损坏都可以通过剩余的磁盘中的数据和校验数据恢复，鲁棒性上升。即为了C和P，放弃了A。</p>
<p>对于传统的关系数据库的要求又不得不提ACID：</p>
<ul>
<li>原子性 （Atomicity）数据和操作不可再次分隔</li>
<li>一致性（Consistency）操作结束后，仍可进行同样的操作</li>
<li>隔离性／无关性（Isolation）操作和操作不得影响</li>
<li>不可撤销（Durability）</li>
</ul>
<p>“不可撤销”，“隔离性”，“原子性”都是限制鲁棒性和容错性的P，一致性本身就是C。剩余的A只能作为牺牲的指标。说得明显点就是目前尚没有什么有效的方法让一条SQL同时在多台主机上同时执行正常。跨表SQL很正常，跨数据库操作已经够变态的了，跨系统进行SQL操作而且保证数据的实时和一致几乎是不可能的。</p>
<p>对于传统的关系型数据库来说难度就是CAP三个之中在你需要任何一个的情况下，即便你愿意花钱去升级硬件，也必须以其他的下降作为代价。要么高可用（负载均衡），要么高安全（热备份），要么高容错（事务回滚），想要正比的升级来获取A是不可能的。</p>
<p>这些年大负载架构的出现带动了nosql型数据库。类似memcache，bigtable和Hbase这类的key-value也是一大亮点。相比关系型的数据库而言，新的数据模型仍然无法摆脱这个魔咒，唯一的优势在于这些架构相对灵活，可以根据需要进行CAP取舍，找出真正适合的C 、A、 P比例。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/05/28/%e8%bf%90%e7%bb%b4%e7%9a%84cap%e5%8e%9f%e5%88%99/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>LAMP的常用扩展安装</title>
		<link>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=lamp%25e7%259a%2584%25e5%25b8%25b8%25e7%2594%25a8%25e6%2589%25a9%25e5%25b1%2595%25e5%25ae%2589%25e8%25a3%2585</link>
		<comments>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/#comments</comments>
		<pubDate>Mon, 16 May 2011 01:57:56 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1467</guid>
		<description><![CDATA[之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装： FreeBSD + Apache + PHP + Mysql (恶搞版) FreeBSD + Apache + PHP + Mysql + Oracle Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP Ubuntu + nginx + php Ubuntu + php + Oracle Memcache 说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。 For Ubuntu apt-get install memcached php5-memcache /etc/init.d/memcached start For FreeBSD cd /usr/ports/databases/memcached make install clean cd /usr/ports/databases/pecl-memcache make [...]]]></description>
			<content:encoded><![CDATA[<p>之前已经弄过许多篇关于LAMP搭建的东西，都是基于最简单包的，这次说说几个比较常用扩展的安装：</p>
<ul>
<li><a title="用FreeBSD的ports安装apache+php+mysql" href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/" target="_blank">FreeBSD + Apache + PHP + Mysql</a> (<a title="用FreeBSD的ports安装apache+php+mysql·改" href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">恶搞版</a>)</li>
<li><a title="FreeBSD+apache+PHP+OCI支持Oracle" href="http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/" target="_blank">FreeBSD + Apache + PHP + Mysql + Oracle</a></li>
<li>Ubuntu + Apache + PHP + Mysql ，比较简单，正常server版安装结束的最后一步可以选择安装LAMP</li>
<li><a title="Ubuntu下安装Nginx+php(FastCGI)" href="http://www.litrin.net/2010/10/27/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85nginxphpfastcgi/" target="_blank">Ubuntu + nginx + php</a></li>
<li><a title="配置Ubuntu的php支持OCI8" href="http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/" target="_blank">Ubuntu + php + Oracle</a></li>
</ul>
<p><span id="more-1467"></span></p>
<p><strong>Memcache</strong></p>
<p>说起Memcache，这年头稍微大点的网站几乎是必不可少的。内存Key-value一对一数据库，但数据易失。新浪的团队也有个项目是memcachedb，就是以速度为代价，部分数据回写硬盘。但似乎不是memcache的本意，个人觉得不如直接写sql，仁者见仁吧。</p>
<ul>
<li>For Ubuntu<br />
apt-get install memcached php5-memcache<br />
/etc/init.d/memcached start</li>
<li>For FreeBSD<br />
cd /usr/ports/databases/memcached<br />
make install clean<br />
cd /usr/ports/databases/pecl-memcache<br />
make install clean<br />
echo”memcached_enable=YES” &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/memcached start</li>
</ul>
<p><strong>Redis</strong></p>
<p>也是一个Key-value数据库，比起Memcache速度慢一点，但会回写硬盘，数据不丢失。处理Feed之类SQL吃上劲的应用必备。</p>
<ul>
<li>For Ubuntu //11.04可行，8.04不行，官方似乎从904以后才加入的。之前的版本不妨用<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/r/redis/" target="_blank">debian包<br />
</a>apt-get install redis-server php-redis //同样的<a rel="nofollow" target="_blank" href="http://ftp.us.debian.org/debian/pool/main/p/php-radius/" target="_blank">debian包下载</a><br />
/etc/init.d/redis-server start</li>
<li>For Freebsd<br />
cd /usr/ports/databases/redis<br />
make install clean<br />
echo &#8216;redis_enable=”YES”&#8216; &gt;&gt; /etc/rc.conf<br />
/usr/local/etc/rc.d/redis restart<br />
cd /usr/ports/databases/php5-redis<br />
make install clean //敲的条件反射了</li>
</ul>
<p>说起redis的PHP支持类，由于redis是明文的传输，所以很多人会选择<a rel="nofollow" target="_blank" href="https://github.com/jdp/redisent" target="_blank">redisend</a>这类基于socket连接方式的php类——说白了就是模拟telnet 6379。根据实际测试的结果，C扩展至少有40%以上的提升，而且内存更少，加包和拆包的过程更迅速。更何况redisend的前一个版本一堆问题，后一个版本又是php5.3 only的天上一脚，地上一脚的维护也是麻烦。不是万不得已还是少用为妙。</p>
<p><strong>PHP-FPM</strong></p>
<p>这个是给Nginx做fastcgi扩展的，相比php-cgi, spawn-cgi不但性能上有提升，配置上也灵活的多，但FreeBSD不支持，Ubuntu也不官方推荐。这里使用了ubuntu的非官方库。</p>
<p>echo “deb <a rel="nofollow" target="_blank" href="http://php53.dotdeb.org">http://php53.dotdeb.org</a> stable all” &gt;&gt; /etc/apt/sources.list<br />
apt-get update; apt-get upgrade<br />
apt-get install php5-fpm</p>
<p>会直接覆盖之前官方支持的PHP包，请慎重考虑。</p>
<p>/etc/init.d/php5-fpm start</p>
<p><strong>PHP-GD</strong></p>
<p>最常见的缺失，但很容易。</p>
<ul>
<li>For Ubuntu<br />
apt-get install php5-gd</li>
<li>For FreeBSD<br />
cd /usr/ports/graphics/php5-gd<br />
make install clean</li>
</ul>
<p><strong>Minify</strong></p>
<p>Minify是一个基于PHP5的CSS/JS优化包，其实这不属于Php的扩展。</p>
<ol>
<li><a rel="nofollow" target="_blank" href="http://code.google.com/p/minify/">http://code.google.com/p/minify/</a> 下载最新的minify，解压后，将min目录拷贝至网站根目录下。</li>
<li>确认是否开启了apache 的mod_rewrite，Ubuntu默认不开启，需要a2enmod,选择rewrite后,/etc/init.d/apache2 restart 重起apache</li>
<li>网站根目录下编辑.htaccess内容如下：
<pre>RewriteEngine On
        RewriteBase /
         RewriteRule ^(.*\.(css|js))\S?$ min/index.php?f=$1 [L]</pre>
</li>
<li>如果系统已经安装了memcache包，不妨用MC替代文件方式存储优化后的信息，编辑min/config.php，末尾添加
<pre class="php">require 'lib/Minify/Cache/Memcache.php';
$memcache = new Memcache;
$memcache-&gt;connect('localhost', 11211); //根据本地配置调整
$min_cachePath = new Minify_Cache_Memcache($memcache);</pre>
</li>
</ol>
<p><strong>TokyoTyrant (ttServer)</strong></p>
<p>TykyoTyrant想必web game, social game的公司用的很多，大概是由于某家企鹅公司的框架所限吧。这东西就是一个“支持lua扩展并可持续化”的key-value。个人觉得完全可以通过memcache + redis两者取代。</p>
<ul>
<li>for Ubuntu (natty ok, hardy not support)<br />
apt-get install tokyotyrant<br />
/etc/init.d/tokyotyrant 52~53行稍作修改：<br />
52 #SERVERHOST=”$RUNDIR/$NAME.sock”<br />
53 SERVERPORT=1978<br />
即可通过/etc/init.d/tokyotyrant start命令启动1978端口的监听</li>
</ul>
<ul>
<li>for Freebsd<br />
cd /usr/ports/databases/tokyotyrant/<br />
make install clean</li>
</ul>
<div>tokyotyrant有自己的php模块，但习惯上都是通过memcache模块进行操作的，命令等价于memcahce的操作。</div>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/05/16/lamp%e7%9a%84%e5%b8%b8%e7%94%a8%e6%89%a9%e5%b1%95%e5%ae%89%e8%a3%85/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>高负载的Lamp架构</title>
		<link>http://www.litrin.net/2011/04/20/%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%9a%84lamp%e6%9e%b6%e6%9e%84/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%25ab%2598%25e8%25b4%259f%25e8%25bd%25bd%25e7%259a%2584lamp%25e6%259e%25b6%25e6%259e%2584</link>
		<comments>http://www.litrin.net/2011/04/20/%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%9a%84lamp%e6%9e%b6%e6%9e%84/#comments</comments>
		<pubDate>Wed, 20 Apr 2011 04:23:26 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[网络和安全]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1435</guid>
		<description><![CDATA[记得那时是2005年10月，开源小站刚上线不久的一篇文章。那时的我还仅仅将网站的高可用性和大负载，大流量集中在“堆硬件”的层面上。包括之后的一篇文档，似乎也没有逃脱这个范畴。之后由于工作内容的关系，始终没有再继续探讨这个问题。仅仅只在一篇关于GAE的文章中讲述了一下架构的趋势。 时隔了5年多，不妨回头重新从新的高度上说说LAMP结构的网站如何支撑尽可能大的负载。同样说明，本文代表站长Litrin的个人意见，欢迎共同探讨，但喷子慎入。 首先声明的是，以下一堆相对无趣的文字仅针对一系列负载到了至少10W pv以上级别，对于较小规模的网站大可不必遵守，还是提倡成本优先的原则，到了对应的PV级别想必也会有足够的财力和物力去改版了。 初期规划 这里主要还是指设计模型等前期工作。MVC的设计结构深入人心，不得不承认确实大多架构设计师首选的设计结构必是MVC。事实上，在一个网站上最容易获取，最不缺的资源是CPU和内存，最大的瓶颈都是出现在IO。 作为LAMP架构最大的问题就是MVC的代价太大，层层的封包意味着重复判断；打开大量的程序文件只会严重拖累性能。网上很多免费的、开源的PHP框架，用过的几个诸如ThinkPHP, ZF等应付中小型网站绝对没有问题，但都不适合大负载的网站。甚至包括Smarty这样单纯的模版引擎，大量的IO操作会拖累整体性能。如果不考虑其他因素，我甚至都考虑过All in 1的垃圾结构——这当然不现实。但恰恰是这种all in 1却正是大负载最适合的结构。奇怪的悖论。 受GAE的影响，曾经想过API+XML的方式实现网站架构，但后来打消了这个念头。XML本身的结构冗余度很多，这也就意味着信息承载率低。在内部几台服务器之间的通讯状况想必都没有必要搞XML，如果要搞类似的模式，CSV方式反倒是不错的选择。XML是为了开放给第三方用户的。 数据库设计 读写分离这个是众所周知的秘密了。Mysql 的Master + Slaver的设计真的很方便！最多就是多搞几重的读写分离。 拆表、拆库、分机器，大表做纵拆，宽表做横拆，不关联的分机器；纵拆是为了省时间，横拆是为了省内存，分机器是为了分负载。Mysql在几百万行数据级别以下性能是很不错的，超过这个数量级，就算机器再强悍都会死的很难看，mysql垃圾的锁表机制会展现无疑。没有人愿等到30秒以上的Respone，何况我曾经遭遇一个45分钟以上的Select操作（一重操作，没有用到Like，使用索引）。曾经用过mysql 的分区表，感觉这种方法更像是在打补丁——改变数据库结构去适应程序，很奇怪的流程，更何况即便逃过这次不拆，迟早有一天还会回来拆的。 索引，该有的全都有，但对于写操作频繁的表，索引反倒成了累赘，不要让索引数占到字段数的30%以上这是约定俗成的标准吧。 memcache，没什么可以多说的，这玩意基本上就是铺硬件换时间的。 说道非关系型数据库，好像近期很热门。怎么说呢？越是复杂的网站越是能体现出它的优势，但问题是大多数网站都不会像twitter或者Facebook这么复杂，况且大多数程序员的逻辑还是SQL模式，贸进很可能搞砸。 WWW服务器拓扑设计 F5这类的设备是必须的，之前曾经觉得LVS可以替代F5这样的设备。用过之后才发现，这等于是将整个网站的身价性命都扔到了一台服务器上，一旦宕机或者被侵入呢？ 对于Apache还是nginx的争论持续了很久。nginx很快速，可以将单独的PHP负载分离出去，但没有apache来的灵活。要根据需求再做评价。 异步操作和缓存机制 这个貌似也没有什么花头，调整好负载之后可以将一部分操作异步到数据库相对空闲的时段进行，达到移峰填谷的效果。配合memcache或者其他的缓存机制本身也是动转静的手段之一。 自动和手动的问题 属于代码级别了吧。良好的编程规范对系统的优化是很显著的。漫山遍野的select *， 大量的变量不清空是高负载系统的忌讳。纵然php的内存处理机制再出色，它永远也不会理解你设置的变量什么时候失效，减少这看似寥寥无几的空间乘上惊人的pv数也是很可观的。]]></description>
			<content:encoded><![CDATA[<p>记得那时是2005年10月，<a title="开源小站" href="http://www.litrin.net" target="_blank">开源小站</a>刚上线不久的<a title="中国顶级门户网站架构分析" href="http://www.litrin.net/2005/10/27/%e4%b8%ad%e5%9b%bd%e9%a1%b6%e7%ba%a7%e9%97%a8%e6%88%b7%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e5%88%86%e6%9e%90/" target="_blank">一篇文章</a>。那时的我还仅仅将网站的高可用性和大负载，大流量集中在“堆硬件”的层面上。包括之后的<a href="http://www.litrin.net/2005/11/06/%e5%8c%96%e7%ae%80%e4%b8%ba%e7%b9%81%e2%80%94%e2%80%94%e4%bc%98%e5%8c%96%e4%bd%a0%e7%9a%84%e7%bd%91%e7%ab%99%e5%b1%82%e6%ac%a1/" target="_blank">一篇文档</a>，似乎也没有逃脱这个范畴。之后由于工作内容的关系，始终没有再继续探讨这个问题。仅仅只在一篇关于<a href="http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/" target="_blank">GAE的文章</a>中讲述了一下架构的趋势。</p>
<p>时隔了5年多，不妨回头重新从新的高度上说说LAMP结构的网站如何支撑尽可能大的负载。同样说明，本文代表站长Litrin的个人意见，欢迎共同探讨，但喷子慎入。</p>
<p><span id="more-1435"></span></p>
<p>首先声明的是，以下一堆相对无趣的文字仅针对一系列负载到了至少10W pv以上级别，对于较小规模的网站大可不必遵守，还是提倡成本优先的原则，到了对应的PV级别想必也会有足够的财力和物力去改版了。</p>
<h2>初期规划</h2>
<p>这里主要还是指设计模型等前期工作。MVC的设计结构深入人心，不得不承认确实大多架构设计师首选的设计结构必是MVC。事实上，在一个网站上最容易获取，最不缺的资源是CPU和内存，最大的瓶颈都是出现在IO。</p>
<p>作为LAMP架构最大的问题就是MVC的代价太大，层层的封包意味着重复判断；打开大量的程序文件只会严重拖累性能。网上很多免费的、开源的PHP框架，用过的几个诸如ThinkPHP, ZF等应付中小型网站绝对没有问题，但都不适合大负载的网站。甚至包括Smarty这样单纯的模版引擎，大量的IO操作会拖累整体性能。如果不考虑其他因素，我甚至都考虑过All in 1的垃圾结构——这当然不现实。但恰恰是这种all in 1却正是大负载最适合的结构。奇怪的悖论。</p>
<p>受GAE的影响，曾经想过API+XML的方式实现网站架构，但后来打消了这个念头。XML本身的结构冗余度很多，这也就意味着信息承载率低。在内部几台服务器之间的通讯状况想必都没有必要搞XML，如果要搞类似的模式，CSV方式反倒是不错的选择。XML是为了开放给第三方用户的。</p>
<h2>数据库设计</h2>
<p>读写分离这个是众所周知的秘密了。Mysql 的Master + Slaver的设计真的很方便！最多就是多搞几重的读写分离。</p>
<p>拆表、拆库、分机器，大表做纵拆，宽表做横拆，不关联的分机器；纵拆是为了省时间，横拆是为了省内存，分机器是为了分负载。Mysql在几百万行数据级别以下性能是很不错的，超过这个数量级，就算机器再强悍都会死的很难看，mysql垃圾的锁表机制会展现无疑。没有人愿等到30秒以上的Respone，何况我曾经遭遇一个45分钟以上的Select操作（一重操作，没有用到Like，使用索引）。曾经用过mysql 的分区表，感觉这种方法更像是在打补丁——改变数据库结构去适应程序，很奇怪的流程，更何况即便逃过这次不拆，迟早有一天还会回来拆的。</p>
<p>索引，该有的全都有，但对于写操作频繁的表，索引反倒成了累赘，不要让索引数占到字段数的30%以上这是约定俗成的标准吧。</p>
<p>memcache，没什么可以多说的，这玩意基本上就是铺硬件换时间的。</p>
<p>说道非关系型数据库，好像近期很热门。怎么说呢？越是复杂的网站越是能体现出它的优势，但问题是大多数网站都不会像twitter或者Facebook这么复杂，况且大多数程序员的逻辑还是SQL模式，贸进很可能搞砸。</p>
<h2>WWW服务器拓扑设计</h2>
<p>F5这类的设备是必须的，之前曾经觉得LVS可以替代F5这样的设备。用过之后才发现，这等于是将整个网站的身价性命都扔到了一台服务器上，一旦宕机或者被侵入呢？</p>
<p>对于Apache还是nginx的争论持续了很久。nginx很快速，可以将单独的PHP负载分离出去，但没有apache来的灵活。要根据需求再做评价。</p>
<h2>异步操作和缓存机制</h2>
<p>这个貌似也没有什么花头，调整好负载之后可以将一部分操作异步到数据库相对空闲的时段进行，达到移峰填谷的效果。配合memcache或者其他的缓存机制本身也是动转静的手段之一。</p>
<h2>自动和手动的问题</h2>
<p>属于代码级别了吧。良好的编程规范对系统的优化是很显著的。漫山遍野的select *， 大量的变量不清空是高负载系统的忌讳。纵然php的内存处理机制再出色，它永远也不会理解你设置的变量什么时候失效，减少这看似寥寥无几的空间乘上惊人的pv数也是很可观的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2011/04/20/%e9%ab%98%e8%b4%9f%e8%bd%bd%e7%9a%84lamp%e6%9e%b6%e6%9e%84/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从GAE看网站架构趋势</title>
		<link>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e4%25bb%258egae%25e7%259c%258b%25e7%25bd%2591%25e7%25ab%2599%25e6%259e%25b6%25e6%259e%2584%25e8%25b6%258b%25e5%258a%25bf</link>
		<comments>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/#comments</comments>
		<pubDate>Tue, 21 Dec 2010 01:59:53 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[站长的blog]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[GAE]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[业界话题]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1372</guid>
		<description><![CDATA[在Google App Engine做了几个东西。从当初觉得这个平台的迥然不同，直到现在逐步了解了这个平台的逻辑架构。作为Google的一款成功的作品，相信GAE的很多东西将会陆陆续续被模仿和抄袭，直到真正影响到我们。本文就以我个人的理解，谈谈GAE将会给今后的网站架构带来哪些革命性的东西。 首当其冲的应该算是云技术，但这个技术总体上属于物理层的技术，况且云已经成为公认的技术趋势。这里主要是谈下网站的架构，云技术相对关系较为偏离，我也就不再探讨了。 BigTable数据库 一开始接触下来的GAE，最感觉不适应的就非它的“数据存储”技术。通常用惯了SQL，用了GAE觉得数据设计上很要有很大的转变。 GAE的“数据库”感觉就是一个巨大的List，每一条记录都是key-value的对应关系。当然起初是无法满足很多传统上的数据结构。不过如果你能够在数据结构设计上打破SQL的限制，通过极端灵活的Key-value, key-value, key-value，你就能发觉这样的框架事实上比传统的SQL更适合网站。 说mysql比oracle在网站实现上的优势并非是因为它功能的强大，而是它速度快，结构简单。尽管有人戏称mysql“裸奔”，但无可否认的就是这种“裸奔”的效果带来的mysql的成功。GAE的数据库比mysql还要“裸奔”，但更快的响应将会是SQL永远无法企及的。FaceBook之前也抛弃了SQL亦证明了这一点。 此外整站之间的数据复制也算是革新之一。 多通道的融合 GAE整合了mail，xmpp，跨域验证等一系列的通道也算是特色之一，想必很多人会认为google这是在捆绑自己的产品。作为之前的门户网站的特色，每家人都会有一个自己的邮箱，一个自己的聊天工具，以及一系列自己的产品捆绑在内。GAE的创新在于用户只需要一个自己的google帐户就可以实现捆绑所有的gae服务。这是一个真正意义上的以用户为本。 Xmpp的捆绑还意味着EDM之后，将来IM营销或者类似的IM推送将会逐步成为一个产业。或者更进一步，IM机器人或者类似的技术将会一定程度上取代现有人人对话模式。当然，这需要一段时间，但至少个人认为目前大量的taobao网店需要这种技术^_^。 精巧的运维界面 相信GAE的后他大家也会印象深刻，能对每一个模块进行精确的监控，已经让运维的工作从翻阅日志的文本化提升到了图形化。粒度也更为精准，如果能配合Analytics之类的数据，完全可以实现智能化的运维。 RSS XML SOAP 网址抓取&#8230; 其实这也不算是什么革新，Web2.0时代的开始就是以此为标志的。但事实上单单从开发库中各个库的名称都叫API来看，就可以明白，其实整个GAE就是构建在这些基础之上的。SOAP成为了各个模块之间的粘合剂。 这个带来的优势就是，无需关心这个库那个库——好像本站技术性文档的大部分都是解决的“库问题”。各自统一接口，加速了开发的进程。]]></description>
			<content:encoded><![CDATA[<p>在Google App Engine做了几个东西。从当初觉得这个平台的迥然不同，直到现在逐步了解了这个平台的逻辑架构。作为Google的一款成功的作品，相信GAE的很多东西将会陆陆续续被模仿和抄袭，直到真正影响到我们。本文就以我个人的理解，谈谈GAE将会给今后的网站架构带来哪些革命性的东西。</p>
<p>首当其冲的应该算是云技术，但这个技术总体上属于物理层的技术，况且云已经成为公认的技术趋势。这里主要是谈下网站的架构，云技术相对关系较为偏离，我也就不再探讨了。</p>
<p><span id="more-1372"></span></p>
<p><strong>BigTable数据库</strong></p>
<p>一开始接触下来的GAE，最感觉不适应的就非它的“数据存储”技术。通常用惯了SQL，用了GAE觉得数据设计上很要有很大的转变。<br />
GAE的“数据库”感觉就是一个巨大的List，每一条记录都是key-value的对应关系。当然起初是无法满足很多传统上的数据结构。不过如果你能够在数据结构设计上打破SQL的限制，通过极端灵活的Key-value, key-value, key-value，你就能发觉这样的框架事实上比传统的SQL更适合网站。<br />
说mysql比oracle在网站实现上的优势并非是因为它功能的强大，而是它速度快，结构简单。尽管有人戏称mysql“裸奔”，但无可否认的就是这种“裸奔”的效果带来的mysql的成功。GAE的数据库比mysql还要“裸奔”，但更快的响应将会是SQL永远无法企及的。FaceBook之前也抛弃了SQL亦证明了这一点。</p>
<p>此外整站之间的数据复制也算是革新之一。</p>
<p><strong>多通道的融合</strong></p>
<p>GAE整合了mail，xmpp，跨域验证等一系列的通道也算是特色之一，想必很多人会认为google这是在捆绑自己的产品。作为之前的门户网站的特色，每家人都会有一个自己的邮箱，一个自己的聊天工具，以及一系列自己的产品捆绑在内。GAE的创新在于用户只需要一个自己的google帐户就可以实现捆绑所有的gae服务。这是一个真正意义上的以用户为本。<br />
Xmpp的捆绑还意味着EDM之后，将来IM营销或者类似的IM推送将会逐步成为一个产业。或者更进一步，IM机器人或者类似的技术将会一定程度上取代现有人人对话模式。当然，这需要一段时间，但至少个人认为目前大量的taobao网店需要这种技术^_^。</p>
<p><strong>精巧的运维界面</strong></p>
<p>相信GAE的后他大家也会印象深刻，能对每一个模块进行精确的监控，已经让运维的工作从翻阅日志的文本化提升到了图形化。粒度也更为精准，如果能配合Analytics之类的数据，完全可以实现智能化的运维。</p>
<p><strong>RSS XML </strong><strong>SOAP </strong>网址抓取&#8230;</p>
<p>其实这也不算是什么革新，Web2.0时代的开始就是以此为标志的。但事实上单单从开发库中各个库的名称都叫API来看，就可以明白，其实整个GAE就是构建在这些基础之上的。SOAP成为了各个模块之间的粘合剂。<br />
这个带来的优势就是，无需关心这个库那个库——好像<a href="http://www.litrin.net/" target="_blank">本站</a>技术性文档的大部分都是解决的“库问题”。各自统一接口，加速了开发的进程。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/12/21/%e4%bb%8egae%e7%9c%8b%e7%bd%91%e7%ab%99%e6%9e%b6%e6%9e%84%e8%b6%8b%e5%8a%bf/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>SQLServer的聚合索引问题</title>
		<link>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sqlserver%25e7%259a%2584%25e8%2581%259a%25e5%2590%2588%25e7%25b4%25a2%25e5%25bc%2595%25e9%2597%25ae%25e9%25a2%2598</link>
		<comments>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/#comments</comments>
		<pubDate>Mon, 05 Jul 2010 06:08:45 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[DataBase]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1272</guid>
		<description><![CDATA[ 有台SqlServer2000的主机，主要是用来纪录日志的。系统配置属于双核+2G，不算很高，目前数据文件大约在2G左右。高峰时每分钟100次写入左右。 这些天，系统在部分时间（不一定是高峰期），会出现大量的堵塞。堵塞每次持续时间最多5分钟，之后要么自己恢复，要么系统IO吃光。已经排除了病毒或者网络的问题。 利用sqlserver自带的“事件探查器”发觉大多数的阻塞都是跟其中的一个表有关。这个表数据有3M行的数据，并建立了聚合索引。 反复优化索引，系统没有起色。狠心删除了主键的聚合索引，问题竟奇迹般的解决了！ 将聚合索引索引转为非聚合索引之后，系统再也没有出现故障。 分析下来大致如此： 系统纪录的日志文件是以时间倒序为聚合索引，但由于日志的记入方式决定了数据的纪录方式并非按照顺序。即会出现新纪录比旧纪录先写入的情况。 3百万行的数据大约有500~700M的磁盘空间占用，按照聚合索引占整体数据大小的30%来计，索引大小大约为200M左右。 由于聚合索引是按照固定的顺序纪录，出现乱序的数据写入，sqlserver就必须重建聚合索引，每次都要重新生成这200M。 200M的数据需要相当长的时间，在此期间如果再有数据记入，行锁就上升为表锁，故出现系统阻塞。而之前一直没有出现问题，只不过是由于数据小，而索引生成的很快罢了。 所以建议聚合索引的使用前请确认在大数据的情况下务必保证新加的数据都在文件的末尾，这样系统就不会因为频繁的重建索引而造成数据阻塞或者IO的浪费。]]></description>
			<content:encoded><![CDATA[<p> 有台SqlServer2000的主机，主要是用来纪录日志的。系统配置属于双核+2G，不算很高，目前数据文件大约在2G左右。高峰时每分钟100次写入左右。</p>
<p>这些天，系统在部分时间（不一定是高峰期），会出现大量的堵塞。堵塞每次持续时间最多5分钟，之后要么自己恢复，要么系统IO吃光。已经排除了病毒或者网络的问题。<br />
<span id="more-1272"></span></p>
<p>利用sqlserver自带的“事件探查器”发觉大多数的阻塞都是跟其中的一个表有关。这个表数据有3M行的数据，并建立了聚合索引。<br />
反复优化索引，系统没有起色。狠心删除了主键的聚合索引，问题竟奇迹般的解决了！<br />
将聚合索引索引转为非聚合索引之后，系统再也没有出现故障。</p>
<p>分析下来大致如此：</p>
<ol>
<li>系统纪录的日志文件是以时间倒序为聚合索引，但由于日志的记入方式决定了数据的纪录方式并非按照顺序。即会出现新纪录比旧纪录先写入的情况。</li>
<li>3百万行的数据大约有500~700M的磁盘空间占用，按照聚合索引占整体数据大小的30%来计，索引大小大约为200M左右。</li>
<li>由于聚合索引是按照固定的顺序纪录，出现乱序的数据写入，sqlserver就必须重建聚合索引，每次都要重新生成这200M。</li>
<li>200M的数据需要相当长的时间，在此期间如果再有数据记入，行锁就上升为表锁，故出现系统阻塞。而之前一直没有出现问题，只不过是由于数据小，而索引生成的很快罢了。</li>
</ol>
<p>所以建议聚合索引的使用前请确认在大数据的情况下务必保证新加的数据都在文件的末尾，这样系统就不会因为频繁的重建索引而造成数据阻塞或者IO的浪费。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/07/05/sqlserver%e7%9a%84%e8%81%9a%e5%90%88%e7%b4%a2%e5%bc%95%e9%97%ae%e9%a2%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>将Apache日志实时写入mysql</title>
		<link>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e5%25b0%2586apache%25e6%2597%25a5%25e5%25bf%2597%25e5%25ae%259e%25e6%2597%25b6%25e5%2586%2599%25e5%2585%25a5mysql</link>
		<comments>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 09:54:15 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[mysql]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1176</guid>
		<description><![CDATA[貌似 站长Litrin已经很久没有关注过LAMP的东西了。 作为网站运行来说，日志分析是一个很重要的工作。当一个网站的日志到了一定程度，或者一个网站同时有多台服务器的时候，传统的文本日志分析总会遇到瓶颈。 这个时候我就会想起强大的sql语句。看了网上很多人的帖子，都是将日志转成sql语句再导入的，搞得有点复杂。本方案不需要任何多余的软件和操作，一切全是实时、自动，供各位参考。 主机至少需要预安装apache(废话！)和mysql的客户端。如果访问量不大且服务器的资源管够的话可以将mysql装在本地，否则建议一台独立的mysql服务器。 在apache配置文件或者虚拟主机配置文件中面添加 LogFormat INSERT INTO apacheLog (ID, dateTime, IP, URL, code, referer, userAgent, size, request) VALUES ( NULL , \"%{%Y-%m-%d %H:%M:%S}t\", \"%a\", \"%U\", \"%&#62;s\", \" %{Referer}i\", \"%{User-Agent}i\", %b, %T);" sqlcomm CustomLog "&#124; /usr/local/Mysql --host=HOST --user=USER --password=PASSWORD --database=LITRIN_NET" sqlcomm 建立数据库apacheLog。 CREATE TABLE ` apacheLog ` ( `ID` int(11) NOT NULL auto_increment, `dateTime` datetime NOT [...]]]></description>
			<content:encoded><![CDATA[<p>貌似 站长Litrin已经很久没有关注过LAMP的东西了。</p>
<p>作为网站运行来说，日志分析是一个很重要的工作。当一个网站的日志到了一定程度，或者一个网站同时有多台服务器的时候，传统的文本日志分析总会遇到瓶颈。</p>
<p>这个时候我就会想起强大的sql语句。看了网上很多人的帖子，都是将日志转成sql语句再导入的，搞得有点复杂。本方案不需要任何多余的软件和操作，一切全是实时、自动，供各位参考。</p>
<p><span id="more-1176"></span></p>
<p>主机至少需要预安装apache(废话！)和mysql的客户端。如果访问量不大且服务器的资源管够的话可以将mysql装在本地，否则建议一台独立的mysql服务器。</p>
<p>在apache配置文件或者虚拟主机配置文件中面添加</p>
<pre>LogFormat INSERT INTO apacheLog (ID, dateTime, IP, URL, code, referer, userAgent, size, request) VALUES ( NULL , \"%{%Y-%m-%d %H:%M:%S}t\", \"%a\", \"%U\", \"%&gt;s\", \" %{Referer}i\", \"%{User-Agent}i\", %b, %T);" sqlcomm
CustomLog "| /usr/local/Mysql --host=HOST --user=USER --password=PASSWORD --database=LITRIN_NET" sqlcomm</pre>
<p>建立数据库apacheLog。</p>
<pre name=code class=sql>
CREATE TABLE ` apacheLog ` (
  `ID` int(11) NOT NULL auto_increment,
  `dateTime` datetime NOT NULL,
  `IP` varchar(15) NOT NULL,
  `URL` varchar(256) NOT NULL,
  `code` varchar(3) NOT NULL,
  `referer` varchar(256) NOT NULL,
  `userAgent` varchar(256) NOT NULL,
  `size` int(11) NOT NULL,
  `request` float NOT NULL,
  PRIMARY KEY  (`ID`),
  KEY `dateTime` (`dateTime`)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1;
SET character_set_client = @saved_cs_client;
</pre>
<p> 确认无误后重启apache生效！</p>
<p>其实整个流程很简单：先是利用LogFormat设置将日志转换为接近sql的格式，再通过CustomLog 调用pipe实现mysql写入。你也可以参照<a rel="nofollow" target="_blank" href="http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats">http://httpd.apache.org/docs/2.2/mod/mod_log_config.html#formats</a>的格式设置写入自己关心的数据。<br />
此外，你也可以使用<code>SetEnvIf配合正则表达式过滤掉诸如图片、CSS、JS之类相对不重要的信息。</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2010/02/24/%e5%b0%86apache%e6%97%a5%e5%bf%97%e5%ae%9e%e6%97%b6%e5%86%99%e5%85%a5mysql/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Ubuntu下安装oracle11G up2</title>
		<link>http://www.litrin.net/2009/11/30/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85oracle11g-up2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ubuntu%25e4%25b8%258b%25e5%25ae%2589%25e8%25a3%2585oracle11g-up2</link>
		<comments>http://www.litrin.net/2009/11/30/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85oracle11g-up2/#comments</comments>
		<pubDate>Mon, 30 Nov 2009 07:39:38 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1118</guid>
		<description><![CDATA[oracle的11G总算到了up2，这次的升级个人感觉最大的改善就是将clustter包成了标准包的一部分，看起来今后oracle数据库要越发的使用更多的机器了。目前官方只提供了Solaris和Linux的安装包，Win以及其他操作系统看起来还是要等。 oracle官方建议的linux仅限于Redhat, Suse, Asianux以及oracle自家的linux。但作为测试的一部分，我选择了ubuntu的新版本910 AMD64 server作为平台。不过理论上使用ubuntu Desktop或者Xubuntu更省力一点。系统内存为8G，根据建议（如下），设置了8G的swap。 之前还有一篇solaris下10up2的安装可以参考 Between 0 MB and 256 MB 3 times the size of RAM Between 256 MB and 512 MB 2 times the size of RAM Between 512 MB and 2 GB 1.5 times the size of RAM Between 2 GB and 16 GB Equal to the size of [...]]]></description>
			<content:encoded><![CDATA[<p>oracle的11G总算到了up2，这次的升级个人感觉最大的改善就是将clustter包成了标准包的一部分，看起来今后oracle数据库要越发的使用更多的机器了。目前官方只提供了<a rel="nofollow" target="_blank" href="http://www.oracle.com/technology/software/products/database/index.html">Solaris和Linux的安装包</a>，Win以及其他操作系统看起来还是要等。</p>
<p>oracle官方建议的linux仅限于Redhat, Suse, Asianux以及oracle自家的linux。但作为测试的一部分，我选择了ubuntu的新版本910 AMD64 server作为平台。不过理论上使用ubuntu Desktop或者Xubuntu更省力一点。系统内存为8G，根据建议（如下），设置了8G的swap。</p>
<p><a href="http://www.litrin.net/2007/11/15/solaris%e4%b8%8b%e5%ae%89%e8%a3%85oracle-10-up-2/" target="_blank">之前还有一篇solaris下10up2的安装可以参考</a></p>
<table title="RAM and Swap Space Relationship" dir="ltr" border="1" cellspacing="0" cellpadding="3" width="100%" frame="hsides" rules="groups" summary="RAM and swap space relationship">
<tbody>
<tr align="left" valign="top">
<td id="r2c1-t6" align="left">Between 0 MB and 256 MB</td>
<td align="left">3 times the size of RAM</td>
</tr>
<tr align="left" valign="top">
<td id="r3c1-t6" align="left">Between 256 MB and 512 MB</td>
<td align="left">2 times the size of RAM</td>
</tr>
<tr align="left" valign="top">
<td id="r4c1-t6" align="left">Between 512 MB and 2 GB</td>
<td align="left">1.5 times the size of RAM</td>
</tr>
<tr align="left" valign="top">
<td id="r5c1-t6" align="left">Between 2 GB and 16 GB</td>
<td align="left">Equal to the size of RAM</td>
</tr>
<tr align="left" valign="top">
<td id="r6c1-t6" align="left">More than 16 GB</td>
<td align="left">16 GB</td>
</tr>
</tbody>
</table>
<p><span id="more-1118"></span></p>
<p>安装完毕后还是个人习惯性的那一套：<br />
#sudo apt-get update<br />
#sudo apt-get upgrade</p>
<p>升级结束后安装必要的库：<br />
#sudo apt-get install gnome-core unzip build-essential libaio-dev(ms libaio 就可以)</p>
<p>设置环境变量：<br />
修改/etc/bash.bashrc，在末尾添加如下内容<br />
<code>ORACLE_HOME=/opt/oracle/product/11.2.0/Db_1<br />
export ORACLE_HOME<br />
ORACLE_BASE=/opt/oracle<br />
export ORACLE_BASE<br />
NLS_LANG=american_america.zhs16gbk<br />
export NLS_LANG<br />
PATH=$PATH:$ORACLE_HOME/bin<br />
ORACLE_SID=orcl<br />
export ORACLE_SID<br />
</code><br />
修改内核参数：（官方文档没有提及，保险起见，还是添加了）<br />
<code><br />
fs.file-max = 6815744<br />
fs.aio-max-nr = 1048576<br />
kernel.shmall = 2097152<br />
kernel.shmmax = 2147483648<br />
kernel.shmmni = 4096<br />
kernel.sem = 250 32000 100 128<br />
net.ipv4.ip_local_port_range = 9000 65500<br />
net.core.rmem_default = 262144<br />
net.core.rmem_max = 4194304<br />
net.core.wmem_default = 262144<br />
net.core.wmem_max = 1048576<br />
</code></p>
<p><code>重起机器。</code></p>
<p><code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/11/30/ubuntu%e4%b8%8b%e5%ae%89%e8%a3%85oracle11g-up2/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Ubuntu的php支持OCI8</title>
		<link>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e9%2585%258d%25e7%25bd%25aeubuntu%25e7%259a%2584php%25e6%2594%25af%25e6%258c%2581oci8</link>
		<comments>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 09:48:03 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=1085</guid>
		<description><![CDATA[PHP的OCI模块支持Oracle总是比较让人头痛。这趟弄个ubuntu的安装文档。 通过ubuntu-server安装盘安装LAMP。当然，正常情况下，建议安装好openssh服务器，免得麻烦。 虽然ubuntu的server支持root直接登录，既然是ubutu，还是遵循它的sudo吧。 安装结束后，启动server。 首先，经典的更新 #sudo apt-get update; sudo apt-get upgrade 添加所需的包 #sudo apt-get install php5-dev build-essential php-pear libaio1 差点忘了，要装unzip： #sudo apt-get install unzip 按照oracle官方网站的要求http://www.oracle.com/technology/tech/oci/instantclient/index.html 下载Instant Client ，我老老实实的下载了basic和sdk两个包，理论上下载basic-lit和sdk就可以。 设立目录，解压缩： #sudo mkdir /opt/oracle #sudo cp ~/*.zip /opt/oracle #cd /opt/oracle #sudo unzip ./*.zip #sudo mv instantclient_11_1 instantclient 设置instantclient： #sudo ln –s libclntsh.so.11.1 libclntsh.so #sudo ln –s libocci.so.11.1 libocci.so [...]]]></description>
			<content:encoded><![CDATA[<p>PHP的OCI模块支持Oracle总是比较让人头痛。这趟弄个ubuntu的安装文档。</p>
<p>通过ubuntu-server安装盘安装LAMP。当然，正常情况下，建议安装好openssh服务器，免得麻烦。</p>
<p>虽然ubuntu的server支持root直接登录，既然是ubutu，还是遵循它的sudo吧。</p>
<p>安装结束后，启动server。</p>
<p>首先，经典的更新<br />
#sudo apt-get update; sudo apt-get upgrade</p>
<p><span id="more-1085"></span></p>
<p>添加所需的包<br />
#sudo apt-get install php5-dev build-essential php-pear libaio1</p>
<p>差点忘了，要装unzip：<br />
#sudo apt-get install unzip</p>
<p>按照oracle官方网站的要求<a rel="nofollow" target="_blank" href="http://www.oracle.com/technology/tech/oci/instantclient/index.html">http://www.oracle.com/technology/tech/oci/instantclient/index.html</a> 下载<span>Instant Client ，我老老实实的下载了basic和sdk两个包，理论上下载basic-lit和sdk就可以。</span></p>
<p>设立目录，解压缩：<br />
#sudo mkdir /opt/oracle<br />
#sudo cp ~/*.zip /opt/oracle<br />
#cd /opt/oracle<br />
#sudo unzip ./*.zip<br />
#sudo mv instantclient_11_1 instantclient</p>
<p>设置instantclient：<br />
#sudo ln –s libclntsh.so.11.1 libclntsh.so<br />
#sudo ln –s libocci.so.11.1 libocci.so<br />
#sudo export ORACLE_HOME=/opt/oracle/instantclien</p>
<p>添加lib库位置：<br />
#cd /etc/ld.so.conf.d<br />
#sudo nano liboci.conf  //添加一行：/opt/oracle/instantclient<br />
#sudo ldconfig</p>
<p>准备OCI8库：<br />
#sudo mkdir /tmp/src<br />
#cd /tmp/src<br />
#sudo pecl download oci8<br />
#sudo tar vzxf oci8-1.3.5.tgz //我下载的版本是135<br />
#cd oci8-1.3.5</p>
<p>编译OCI8：<br />
#sudo phpize //比较容易出错的地方，如果报错，你可能没有安装php5-dev包<br />
#sudo ./configure &#8211;with-oci8=share,instantclient,$ORACLE_HOME<br />
#sudo make; sudo make install</p>
<p>设置php5支持：<br />
正常情况下编译完成后会有提示：Installing shared extensions:     /usr/lib/php5/20060613/<br />
到此目录下确认是否存在oci8.so<br />
#cd /etc/php5/conf.d<br />
#sudo nano oci8.ini //添加一行：extension=oci8.so<br />
#sudo apache2ctl restart</p>
<p>经过上述步骤，oci8模块就会成功安装，可以通过phpinfo页面确认是否存在oci8模块</p>
<h2><a name="module_oci8">oci8</a></h2>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<td>OCI8 Support</td>
<td>enabled</td>
</tr>
<tr>
<td>Version</td>
<td>1.3.5</td>
</tr>
<tr>
<td>Revision</td>
<td>$Revision: 1.269.2.16.2.38.2.32 $</td>
</tr>
<tr>
<td>Active Persistent Connections</td>
<td>0</td>
</tr>
<tr>
<td>Active Connections</td>
<td>0</td>
</tr>
<tr>
<td>Oracle Instant Client Version</td>
<td>11.1</td>
</tr>
<tr>
<td>Temporary Lob support</td>
<td>enabled</td>
</tr>
<tr>
<td>Collections support</td>
<td>enabled</td>
</tr>
</tbody>
</table>
<p> </p>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<th>Directive</th>
<th>Local Value</th>
<th>Master Value</th>
</tr>
<tr>
<td>oci8.connection_class</td>
<td><em>no value</em></td>
<td><em>no value</em></td>
</tr>
<tr>
<td>oci8.default_prefetch</td>
<td>100</td>
<td>100</td>
</tr>
<tr>
<td>oci8.events</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.max_persistent</td>
<td>-1</td>
<td>-1</td>
</tr>
<tr>
<td>oci8.old_oci_close_semantics</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.persistent_timeout</td>
<td>-1</td>
<td>-1</td>
</tr>
<tr>
<td>oci8.ping_interval</td>
<td>60</td>
<td>60</td>
</tr>
<tr>
<td>oci8.privileged_connect</td>
<td>Off</td>
<td>Off</td>
</tr>
<tr>
<td>oci8.statement_cache_size</td>
<td>20</td>
<td>20</td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/09/15/%e9%85%8d%e7%bd%aeubuntu%e7%9a%84php%e6%94%af%e6%8c%81oci8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>FreeBSD+apache+PHP+OCI支持Oracle</title>
		<link>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=freebsdapachephpoci%25e6%2594%25af%25e6%258c%2581oracle</link>
		<comments>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 10:08:54 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[FreeBSD]]></category>
		<category><![CDATA[服务器]]></category>

		<guid isPermaLink="false">http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/</guid>
		<description><![CDATA[由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。 首先，确定你已经安装好apache + php，没有安装的可以参考这里或者文学化的这里 安装php5-oci8 cd /usr/ports/database/php5-oci8 make install clean 安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。 将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下 内容大致如下： ORCL = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = ORCL) ) ) 由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接 ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG 易出现的问题就是乱码了，这里要设置一下。 killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况 ee /usr/local/sbin/apachectl 在第二行加入： setenv american_america.UTF8 setenv ORACLE_HOME [...]]]></description>
			<content:encoded><![CDATA[<p>由于FreeBSD的Port中自带了oracle-client可用，但仅支持i386的平台，故此文仅针对于i386，AMD64无法实现oci的连接库。</p>
<p>首先，确定你已经安装好apache + php，没有安装的可以参考<a href="http://www.litrin.net/2005/11/09/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql/comment-page-1/#comment-1345" target="_blank">这里</a>或者文学化的<a href="http://www.litrin.net/2007/08/01/%e7%94%a8freebsd%e7%9a%84ports%e5%ae%89%e8%a3%85apachephpmysql%c2%b7%e6%94%b9/" target="_blank">这里</a></p>
<p>安装php5-oci8</p>
<p>cd /usr/ports/database/php5-oci8<br />
make install clean</p>
<p>安装到这里，Php的OCI8库已经安装成功，但需要对oracle-client进行设置，否则无法使用。</p>
<p>将tnsnames.ora拷贝到/usr/local/oracle8-client/network/admin/ 目录下<br />
内容大致如下：<span id="more-1026"></span></p>
<p>ORCL =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.1)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = ORCL)<br />
)<br />
)<br />
<!--break--><br />
由于php默认只会在/etc目录下查找该目录，这里我做了一个手工链接<br />
ln -s /usr/local/oracle8-client/network/admin/tnsnames.ora /etc/tnsnames.ora</p>
<p>tnsnames已经配置完成，但对于非ASCII字符集最容setenv NLS_LANG<br />
易出现的问题就是乱码了，这里要设置一下。<br />
killall httpd //杀掉httpd进程，我曾经碰到过apachectl无效的情况<br />
ee /usr/local/sbin/apachectl<br />
在第二行加入：<br />
setenv american_america.UTF8<br />
setenv ORACLE_HOME /usr/local/oracle8-client</p>
<p>开启apache<br />
apachectl start</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/06/15/freebsdapachephpoci%e6%94%af%e6%8c%81oracle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>搭建oracle双机热备系统</title>
		<link>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e6%2590%25ad%25e5%25bb%25baoracle%25e5%258f%258c%25e6%259c%25ba%25e7%2583%25ad%25e5%25a4%2587%25e7%25b3%25bb%25e7%25bb%259f</link>
		<comments>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 09:09:42 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=977</guid>
		<description><![CDATA[系统环境： 安装相同版本的Oracle软件，企业版而非标准版。 SUN V245 x 2; Solaris Sparc 10 up 5; Oracle 10G up 2 。 建议在之前建立两台机器间Oralce用户的ssh互信认证机制。 Oralce官方建议使用交换机连接两台主机，原因是“网卡直连容易因为网卡故障出现问题”。个人认为一根超5类或者干脆6类线直连两台主机的可以避免交换机的使用，省钱的同时也会提升传输速度。由于原本服务器还有空闲的网口，这里采用了双机直连的方式做心跳。 主数据库操作 强制数据库执行日志切换，并启动数据库归档模式 Alter database force logging; Shutdown abort; &#60;!&#8211; @page { margin: 2cm } P { margin-bottom: 0.21cm } &#8211;&#62; Startup mount; Alter database archivelog; 数据库密码文件创建 Orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** entries=5; # for WIN       orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** [...]]]></description>
			<content:encoded><![CDATA[<ol>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;"><span style="font-size: small;"><strong>系统环境：</strong></span></span></p>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;">安装相同版本的<span style="font-family: AR PL UMing CN,serif;">Oracle</span>软件，企业版而非标准版。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;">SUN V245 x 2; Solaris Sparc 10 up 5; Oracle 10G up 2 </span>。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;">建议在之前建立两台机器间<span style="font-family: AR PL UMing CN,serif;">Oralce</span>用户的<span style="font-family: AR PL UMing CN,serif;">ssh</span>互信认证机制。</p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;">Oralce</span>官方建议使用交换机连接两台主机，原因是“网卡直连容易因为网卡故障出现问题”。个人认为一根超<span style="font-family: AR PL UMing CN,serif;">5</span>类或者干脆<span style="font-family: AR PL UMing CN,serif;">6</span>类线直连两台主机的可以避免交换机的使用，省钱的同时也会提升传输速度。由于原本服务器还有空闲的网口，这里采用了双机直连的方式做心跳。</p>
</li>
</ol>
</li>
<p><span id="more-977"></span></p>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;"><span style="font-size: small;"><strong>主数据库操作</strong></span></span></p>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">强制数据库执行日志切换，并启动数据库归档模式</span></p>
</li>
</ol>
</li>
</ol>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database force logging;</span></span></span></p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Shutdown abort;</span></span></span></p>
<p>&lt;!&#8211; @page { margin: 2cm } P { margin-bottom: 0.21cm } &#8211;&gt;</p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Startup mount;</span></span></span></p>
<p style="text-indent: 0.74cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database archivelog;</span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">数据库密码文件创建</span></p>
</li>
</ol>
</li>
</ol>
<p style="text-indent: 0.64cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Orapwd file=$ORACLE_HOME/dbs/orapw$ORACLE_SID password=****** entries=5; # for WIN<br />
      <span style="color: #0000ff;">orapwd file=$ORACLE_HOME/dbs/<strong>orapw</strong>$ORACLE_SID password=****** #for Unix, 官方手册竟然没有区分</span></span></span></span></p>
<p style="text-indent: 0.64cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;"> </span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%;"><span style="color: #000000;">增加<span style="font-family: Tahoma,serif;">Standby Redo Logfile</span>，建议添加</span></p>
</li>
</ol>
</li>
</ol>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database add standby logfile group 6 ‘/oradata/db/orcl/redo06.log’ size 100M;</span></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改主数据库初始化参数：</span></p>
<ol type="i">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">create pfile = ””old_setting.ora”” from spfile;</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">$ORACLE_HOME/dbs/old_setting.ora</span></span></span><span style="color: #000000;">文件，增加如下内容：</span></p>
</li>
</ol>
</li>
</ol>
</li>
</ol>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.db_unique_name=””primary”” </strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_config=””DG_CONFIG=(primary,standby)””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_dest_1=””LOCATION=/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=primary””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.log_archive_dest_2=””service=standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES) db_unique_name=standby””</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.FAL_SERVER=standby</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.FAL_CLIENT=primary</strong></span></span></span></p>
<p style="margin-left: 1.38cm; margin-bottom: 0cm; line-height: 150%;"><span style="color: #002060;"><span style="font-family: Tahoma,serif;"><strong>*.STANDBY_FILE_MANAGEMENT=AUTO</strong></span></span></p>
<ol>
<li>
<ol type="a">
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">修改主数据库<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">listener.ora</span></span></span><span style="color: #000000;">、<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">tnsnames.ora</span></span></span><span style="color: #000000;">，增加两个数据库连接设置，一个为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">primary,</span></span></span><span style="color: #000000;">一个为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Standby</span></span></span><span style="color: #000000;">，其中主数据库为<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Primary</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">create spfile from pfile = ””old_setting.ora””</span></span></span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">备份数据库文件</span></p>
</li>
<li>
<p style="margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="color: #000000;">创建<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;">Standby</span></span></span><span style="color: #000000;">数据库的控制文件<span style="font-family: AR PL UMing CN,serif;"><span style="font-family: Tahoma,serif;"><br />
startup mount;</span></span></span></p>
</li>
</ol>
</li>
</ol>
<p style="margin-left: 0.64cm; margin-bottom: 0cm; line-height: 150%; widows: 2; orphans: 2;"><span style="font-family: AR PL UMing CN,serif;"><span style="color: #000000;"><span style="font-family: Tahoma,serif;">Alter database create standby controlfile as ‘standby01.ctl’;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/04/25/%e6%90%ad%e5%bb%baoracle%e5%8f%8c%e6%9c%ba%e7%83%ad%e5%a4%87%e7%b3%bb%e7%bb%9f/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql的几个设置值</title>
		<link>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql%25e7%259a%2584%25e5%2587%25a0%25e4%25b8%25aa%25e8%25ae%25be%25e7%25bd%25ae%25e5%2580%25bc</link>
		<comments>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 09:19:57 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[www]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[硬件相关]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=970</guid>
		<description><![CDATA[mysql数据库的优化——老声长谈的话题，总是有那么多的话题好谈。闲来无事，谈谈几个关键优化参数的设置问题。注意的是，本文主要针对于MyISAM引擎，其他的，日后再吧。 在此之前，如果对mysql的命令和配置不很熟的情况下，phpmysql是必要的。 首先，到状态选项栏，拉一个系统状态表下来，或者执行mysqladmin variables extended-status –u root –p  ，同时计算下系统的uptime. 配置文件一般保存在/etc/my.cnf中，直接修改其中的内容即可。 此外，我的设置中还有如下内容： skip-networking #不使用网络连接 skip-innodb #不使用innodb引擎 thread_concurrency = 4 #这个数值等于cpu核心数x2 key_buffer_size参数的设置:索引缓冲池大小，决定了处理索引的速度。官方文档说最多这将会有238%的性能提升。什么，你的表不加索引？来人啊，把他拖到这个页面。 算法一：把系统中所有在用的表的索引加起来，个人习惯取一个最接近此数的2的n次方。如32M，64M，128M…… 算法二：设置到Key_reads  ：Key_read_requests 至少应该1：500以上，越大越好，例如我的： [root@www ~]# mysqladmin variables extended-status -u admin -p  &#124;grep Key_re Enter password: &#124; Key_read_requests        &#124; 7335599   &#124; &#124; Key_reads                          &#124; 9137      &#124; 两种方式随个人喜好啦，个人习惯用后面的方式进行配置。 query_cache_size：返回结果缓存，数据库会将返回值缓冲，当然会快，如果想要强制关闭该功能，可以在sql中加入SQL_NO_CACHE。 [root@www ~]# mysqladmin variables extended-status -u [...]]]></description>
			<content:encoded><![CDATA[<p>mysql数据库的优化——老声长谈的话题，总是有那么多的话题好谈。闲来无事，谈谈几个关键优化参数的设置问题。注意的是，本文主要针对于MyISAM引擎，其他的，日后再吧。</p>
<p>在此之前，如果对mysql的命令和配置不很熟的情况下，phpmysql是必要的。</p>
<p>首先，到状态选项栏，拉一个系统状态表下来，或者执行mysqladmin variables extended-status –u root –p  ，同时计算下系统的uptime.</p>
<p>配置文件一般保存在/etc/my.cnf中，直接修改其中的内容即可。</p>
<p>此外，我的设置中还有如下内容：</p>
<p>skip-networking #不使用网络连接<br />
skip-innodb #不使用innodb引擎</p>
<p>thread_concurrency = 4 #这个数值等于cpu核心数x2</p>
<p><span id="more-970"></span></p>
<p><strong>key_buffer_size参数的设置:</strong>索引缓冲池大小，决定了处理索引的速度。官方文档说最多这将会有238%的性能提升。什么，你的表不加索引？来人啊，<a href="http://www.litrin.net/2006/03/25/%e4%bc%98%e5%8c%96%e4%bd%a0%e7%9a%84%e6%95%b0%e6%8d%ae%e5%ba%93/">把他拖到这个页面。</a></p>
<ol>
<li>算法一：把系统中所有在用的表的索引加起来，个人习惯取一个最接近此数的2的n次方。如32M，64M，128M……</li>
<li>算法二：设置到Key_reads  ：Key_read_requests 至少应该1：500以上，越大越好，例如我的：<br />
[root@www ~]# mysqladmin variables extended-status -u admin -p  |grep Key_re<br />
Enter password:<br />
| Key_read_requests        | 7335599   |<br />
| Key_reads                          | 9137      |</li>
</ol>
<p>两种方式随个人喜好啦，个人习惯用后面的方式进行配置。</p>
<p><strong>query_cache_size：</strong>返回结果缓存，数据库会将返回值缓冲，当然会快，如果想要强制关闭该功能，可以在sql中加入SQL_NO_CACHE。</p>
<p>[root@www ~]# mysqladmin variables extended-status -u admin -p  |grep Qcache<br />
Enter password:<br />
| Qcache_free_blocks       | 115       |<br />
| Qcache_free_memory       | 27422464  | #剩余的缓冲空间<br />
| Qcache_hits              | 15257     |<br />
| Qcache_inserts           | 11492     |<br />
| Qcache_lowmem_prunes     | 0         | #出现缓存过低的此数<br />
| Qcache_not_cached        | 29        |<br />
| Qcache_queries_in_cache  | 1115      | #缓存的结果数<br />
| Qcache_total_blocks      | 2441      |<br />
| Questions                | 43849     |</p>
<p>次数值大致算法：最大返回大小x每5分钟查询次数。</p>
<p>原则上，如果内存足够的情况下，可以尽量调大此数值。个人认为  uptime 秒数/Qcache_lowmem_prunes  应该小于300。这意味着至少不是每5分钟系统就报一次缓存过低。</p>
<p>要注意的是配置了此参数的时候，请同时设置 query_cache_type= 1</p>
<p><strong>table_cache</strong>：表缓冲数量。</p>
<p>mysqladmin variables extended-status -u admin -p  |grep Open<br />
Enter password:<br />
| Open_files               | 191       |<br />
| Open_streams             | 0         |<br />
| Open_tables              | 132       | #打开的表<br />
| Opened_tables            | 138       | #已经打开的表</p>
<p>我这边设置的table_cache为512，uptime为2小时，暂时看不出有什么问题，如果系统一开没多久Open_tables就已经等于设置的table_cache的时候，请将此数值再调大。</p>
<p><strong>关于索引：</strong>刚才被拖走的兄弟可以回来了^_^<br />
很多人最初接触索引的时候，以为索引越多越快。其实不然，过多的索引往往会拖慢系统，按照惯例索引字段最多只占字段总数的40%。多则无益。</p>
<p>索引字段的类型，尽量选择numeric下属的类型或者date time下属的类型，如果非要用string，可以尝试使用char来取代varchar，很多情况下不影响使用，但性能提升一个档次。</p>
<p><strong>关于内存</strong></p>
<p>经过上面的折腾，内存耗用量应该大有提升。很多人觉得内存占用高了性能会下降——这似乎是windows桌面的问题。要知道，<span style="text-decoration: underline;">作为一个数据库服务器而言，痛苦的不是内存用完了；而是内存用不掉，IO用光了。</span> 能把内存用的光光但swap基本不动，这才是高明的系统管理员。</p>
<p>正常负载下，mysql的内存耗用要保证大于空闲内存。</p>
<p><strong>sql语句的问题</strong></p>
<p>尽管这不属于系统管理员的工作内容，但要知道，一个到处是select * 语句的程序是绝对会影响系统性能的。</p>
<p><strong></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2009/04/14/mysql%e7%9a%84%e5%87%a0%e4%b8%aa%e8%ae%be%e7%bd%ae%e5%80%bc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Solaris下安装Oracle 10 up 2</title>
		<link>http://www.litrin.net/2007/11/15/solaris%e4%b8%8b%e5%ae%89%e8%a3%85oracle-10-up-2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=solaris%25e4%25b8%258b%25e5%25ae%2589%25e8%25a3%2585oracle-10-up-2</link>
		<comments>http://www.litrin.net/2007/11/15/solaris%e4%b8%8b%e5%ae%89%e8%a3%85oracle-10-up-2/#comments</comments>
		<pubDate>Thu, 15 Nov 2007 01:59:49 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[Unix]]></category>
		<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[oracle]]></category>
		<category><![CDATA[solaris]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=470</guid>
		<description><![CDATA[环境配置：SUN V245server，安装有最新版本的Solaris10update4 for SPARC，从www.oracle.com下载了最新版本的Oracle 10G update 2 &#8212; Linux 和windows已经可以下载到 11G，可不知道为什么作为“oralce的最佳平台”的solaris只有10up2？   首先，在/etc/system的末尾添加，否则，在安装的过程中将会提示“out of memory”之类的错误： set semsys:seminfo_semmni=100 set semsys:seminfo_semmns=1024 set semsys:seminfo_semmsl=256 set semsys:seminfo_semvmx=32767 set shmsys:shminfo_shmmax=4294967295 set shmsys:shminfo_shmmin=1 set shmsys:shminfo_shmmni=100 set shmsys:shminfo_shmseg=10 解压oracle: gzcat 10gr2_db_sol.cpio.gz &#124; cpio -icvd 添加dba组和属于dba组的oracle用户，并创建相关的权限的目录：/opt/oracle/ 10.2.0/Db_1， /oracdata 修改oracle用户目录下的.profile文件，添加如下内容： umask 022 TEMP=/tmp;export TEMP TMPDIR=/tmp;export TMPDIR ORACLE_HOME=/opt/oracle/ 10.2.0/Db_1;export ORACLE_HOME ORACLE_BASE=/opt/oracle;export ORACLE_BASE PATH=$ORACLE_HOME/bin:/bin:/usr/bin:/usr/ucb:/etc:/usr/openwin/bin:/usr/ccs/bin ORACLE_SID=HSDB;export ORACLE_SID [...]]]></description>
			<content:encoded><![CDATA[<p><span style="FONT-FAMILY: 宋体">环境配置：</span><span lang="EN-US">SUN V245server</span><span style="FONT-FAMILY: 宋体">，安装有最新版本的</span><span lang="EN-US">Solaris10update4 for SPARC</span><span style="FONT-FAMILY: 宋体">，从</span><span lang="EN-US"><a rel="nofollow" target="_blank" href="http://www.oracle.com/">www.oracle.com</a></span><span style="FONT-FAMILY: 宋体">下载了最新版本的</span><span lang="EN-US">Oracle 10G update 2 &#8212; Linux </span><span style="FONT-FAMILY: 宋体">和</span><span lang="EN-US">windows</span><span style="FONT-FAMILY: 宋体">已经可以下载到</span></p>
<div><span lang="EN-US">11G</span><span style="FONT-FAMILY: 宋体">，可不知道为什么作为“</span><span class="SpellE"><span lang="EN-US">oralce</span></span><span style="FONT-FAMILY: 宋体">的最佳平台”的</span><span class="SpellE"><span lang="EN-US">solaris</span></span><span style="FONT-FAMILY: 宋体">只有</span><span lang="EN-US">10up2</span><span style="FONT-FAMILY: 宋体">？</span></div>
<p> </p>
<p><span style="FONT-FAMILY: 宋体">首先，在</span><span lang="EN-US">/etc/system</span><span style="FONT-FAMILY: 宋体">的末尾添加，否则，在安装的过程中将会提示“</span><span lang="EN-US">out of memory</span><span style="FONT-FAMILY: 宋体">”之类的错误：</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">semsys:seminfo_semmni</span>=100</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">semsys:seminfo_semmns</span>=1024</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">semsys:seminfo_semmsl</span>=256</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">semsys:seminfo_semvmx</span>=32767</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">shmsys:shminfo_shmmax</span>=4294967295</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">shmsys:shminfo_shmmin</span>=1</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">shmsys:shminfo_shmmni</span>=100</span></p>
<p><span class="GramE"><span lang="EN-US">set</span></span><span lang="EN-US"> <span class="SpellE">shmsys:shminfo_shmseg</span>=10</span></p>
<p><span style="FONT-FAMILY: 宋体">解压</span><span lang="EN-US">oracle:</span></p>
<p><span class="SpellE"><span class="GramE"><span lang="EN-US">gzcat</span></span></span><span lang="EN-US"> 10gr2_db_sol.cpio.gz | <span class="SpellE">cpio</span> -<span class="SpellE">icvd</span></span></p>
<p><span style="FONT-FAMILY: 宋体">添加</span><span class="SpellE"><span lang="EN-US">dba</span></span><span style="FONT-FAMILY: 宋体">组和属于</span><span class="SpellE"><span lang="EN-US">dba</span></span><span style="FONT-FAMILY: 宋体">组的</span><span lang="EN-US">oracle</span><span style="FONT-FAMILY: 宋体">用户，并创建相关的权限的目录：</span><span lang="EN-US">/opt/oracle/ 10.2.0/Db_1</span><span style="FONT-FAMILY: 宋体">，</span><span lang="EN-US"> /<span class="SpellE">oracdata</span></span></p>
<p><span style="FONT-FAMILY: 宋体">修改</span><span lang="EN-US">oracle</span><span style="FONT-FAMILY: 宋体">用户目录下的</span><span lang="EN-US">.profile</span><span style="FONT-FAMILY: 宋体">文件，添加如下内容：</span></p>
<p><span class="SpellE"><span class="GramE"><span lang="EN-US">umask</span></span></span><span lang="EN-US"> 022</span></p>
<p><span lang="EN-US">TEMP=/<span class="SpellE">tmp<span class="GramE">;export</span></span> TEMP</span></p>
<p><span lang="EN-US">TMPDIR=/<span class="SpellE">tmp<span class="GramE">;export</span></span> TMPDIR</span></p>
<p><span lang="EN-US">ORACLE_HOME=/opt/oracle/ 10.2.0/Db_1;export ORACLE_HOME</span></p>
<p><span lang="EN-US">ORACLE_BASE=/opt/<span class="SpellE">oracle<span class="GramE">;export</span></span> ORACLE_BASE</span></p>
<p><span lang="EN-US">PATH=$ORACLE_HOME/bin<span class="GramE">:/</span>bin:/usr/bin:/usr/ucb:/etc:/usr/openwin/bin:/usr/ccs/bin</span></p>
<p><span lang="EN-US">ORACLE_SID=<span class="SpellE">HSDB;export</span> ORACLE_SID #</span><span style="FONT-FAMILY: 宋体">注</span><span lang="EN-US">HSDB</span><span style="FONT-FAMILY: 宋体">是我设置的数据库</span><span lang="EN-US">SID</span><span style="FONT-FAMILY: 宋体">，可以根据需要设定相对应的</span><span lang="EN-US">SID</span></p>
<p><span style="FONT-FAMILY: 宋体">启动</span><span lang="EN-US">X</span><span style="FONT-FAMILY: 宋体">界面（我的机器没有显卡，只能用</span><span class="SpellE"><span lang="EN-US">Xmanger</span></span><span style="FONT-FAMILY: 宋体">）启动安装程序：</span></p>
<p><span lang="EN-US">Su <span class="SpellE">oralce</span></span></p>
<p><span lang="EN-US"><span class="SpellE"></p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/11/15/solaris%e4%b8%8b%e5%ae%89%e8%a3%85oracle-10-up-2/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>mysql的“降级”移植</title>
		<link>http://www.litrin.net/2007/05/30/mysql%e7%9a%84%e2%80%9c%e9%99%8d%e7%ba%a7%e2%80%9d%e7%a7%bb%e6%a4%8d/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=mysql%25e7%259a%2584%25e2%2580%259c%25e9%2599%258d%25e7%25ba%25a7%25e2%2580%259d%25e7%25a7%25bb%25e6%25a4%258d</link>
		<comments>http://www.litrin.net/2007/05/30/mysql%e7%9a%84%e2%80%9c%e9%99%8d%e7%ba%a7%e2%80%9d%e7%a7%bb%e6%a4%8d/#comments</comments>
		<pubDate>Wed, 30 May 2007 02:50:37 +0000</pubDate>
		<dc:creator>Litrin</dc:creator>
				<category><![CDATA[数据库应用]]></category>
		<category><![CDATA[网络和安全]]></category>
		<category><![CDATA[mysql]]></category>

		<guid isPermaLink="false">http://www.litrin.net/?p=449</guid>
		<description><![CDATA[开发了一个项目，在部署时遇到了一点问题。 开发环境原本是mysql5.1，可实际部署的时候才发现服务器端的环境是mysql4.0。可mysqldump出来的数据无法直接倒入4.0，直接拷贝出来的数据，mysql4.0根本无法识别。 研究了一下mysqldump的文档，找到了一个选项&#8220;&#8211;compatible=name&#8221; 问题迎刃而解。而且这个选项竟然支持在多个环境中的平移。 选项支持mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb,格式的SQL语句。]]></description>
			<content:encoded><![CDATA[<p>开发了一个项目，在部署时遇到了一点问题。</p>
<p>开发环境原本是mysql5.1，可实际部署的时候才发现服务器端的环境是mysql4.0。可mysqldump出来的数据无法直接倒入4.0，直接拷贝出来的数据，mysql4.0根本无法识别。</p>
<p>研究了一下mysqldump的文档，找到了一个选项&ldquo;&#8211;compatible=name&rdquo; 问题迎刃而解。而且这个选项竟然支持在多个环境中的平移。 选项支持mysql323, mysql40, postgresql, oracle, mssql, db2, maxdb,格式的SQL语句。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.litrin.net/2007/05/30/mysql%e7%9a%84%e2%80%9c%e9%99%8d%e7%ba%a7%e2%80%9d%e7%a7%bb%e6%a4%8d/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

