<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>行者无疆 - Lewphee</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/" />
    <link rel="self" type="application/atom+xml" href="http://www.lewphee.com/atom.xml" />
    <id>tag:www.lewphee.com,2008-12-04://1</id>
    <updated>2010-07-08T07:28:40Z</updated>
    
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.23-en</generator>

<entry>
    <title>The show show</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/life/2010-07-08-152106.html" />
    <id>tag:www.lewphee.com,2010://1.69</id>

    <published>2010-07-08T07:21:06Z</published>
    <updated>2010-07-08T07:28:40Z</updated>

    <summary><![CDATA[很久没更新了，出来露个脸。叫&nbsp;"The show show"。 ... .... 不知写什么...想写的又不知如何开始。 &nbsp;...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="生活记录" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>很久没更新了，出来露个脸。叫&nbsp;"The show show"。</p>
<p>...</p>
<p>....</p>
<p>不知写什么...想写的又不知如何开始。</p>
<p>&nbsp;</p>]]>
        
    </content>
</entry>

<entry>
    <title>SH获取昨天日期</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2010-02-02-21506.html" />
    <id>tag:www.lewphee.com,2010://1.68</id>

    <published>2010-02-01T18:15:06Z</published>
    <updated>2010-02-01T18:39:21Z</updated>

    <summary><![CDATA[区别于bash的sh获取昨天的日期 bash里使用 date -d "yesterday"就可以了，但sh里不行 我们用变换时区的办法获取： &gt; d=`TZ=$TZ+24 date "+%Y/%m/%d"` &gt; echo $d 2010/02/01 ----- 但是，建议还是看一下date的用法。不同的环境可能有更好的办法 我在freebsd下， date的用法如下 usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]--- 其中，参数-v可以进行这样的操作 &gt; date -v-1d +%Y%m%d...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="shell" label="SHELL" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>区别于bash的sh获取昨天的日期</p>
<p>bash里使用 date -d "yesterday"就可以了，但sh里不行</p>
<p>我们用变换时区的办法获取：</p>
<p>&gt; d=`TZ=$TZ+24 date "+%Y/%m/%d"`</p>
<p>&gt; echo $d</p>
<p>2010/02/01</p>
<p>-----</p>
<p>但是，建议还是看一下date的用法。不同的环境可能有更好的办法</p>
<p>我在freebsd下，</p>
<p>date的用法如下</p>
<p>usage: date [-jnu] [-d dst] [-r seconds] [-t west] [-v[+|-]val[ymwdHMS]] ...<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; [-f fmt date | [[[[[cc]yy]mm]dd]HH]MM[.ss]] [+format]<br />---</p>
<p>其中，参数-v可以进行这样的操作</p>
<p>&gt; date -v-1d +%Y%m%d</p>
<p>20100201</p>
<p>&gt; date -v-2d +%Y%m%d</p>
<p>20100131</p>]]>
        
    </content>
</entry>

<entry>
    <title>FreeBSD安装Nginx+PHP+Mysql</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-12-03-152658.html" />
    <id>tag:www.lewphee.com,2009://1.63</id>

    <published>2009-12-03T07:26:58Z</published>
    <updated>2009-12-17T04:51:28Z</updated>

    <summary><![CDATA[首先，需要强调的是，用ports安装，避免叮叮当当的许多问题。 FB 7.0 -RELEASE 之前的版本了，所以更新一下ports portsnap fetch extract update &nbsp; 安装MySQL cd /usr/ports/databases/mysql51-server/make WITH_CHARSET=utf-8 WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install cleancp /usr/local/share/mysql/my-small.cnf /etc/my.cnf&nbsp;/usr/local/bin/mysql_install_db --user=mysqlmysqladmin -u root password 'new_password' //root的新密码 &nbsp; 安装 PHP 及其扩展 cd /usr/ports/lang/php5make install cleancp /usr/local/etc/php.ini-dist /usr/local/etc/php.inicd...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="freebsd" label="FreeBSD" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="nginx" label="Nginx" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="web" label="WEB" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>首先，需要强调的是，用ports安装，避免叮叮当当的许多问题。</p>
<p>FB 7.0 -RELEASE</p>
<p>之前的版本了，所以更新一下ports</p>
<p>portsnap fetch extract update</p>
<p>&nbsp;</p>
<p><strong>安装MySQL</strong></p>
<p>cd /usr/ports/databases/mysql51-server/<br />make WITH_CHARSET=utf-8 WITH_XCHARSET=all WITH_PROC_SCOPE_PTH=yes BUILD_OPTIMIZED=yes BUILD_STATIC=yes SKIP_DNS_CHECK=yes WITHOUT_INNODB=yes install clean<br />cp /usr/local/share/mysql/my-small.cnf /etc/my.cnf<br />&nbsp;<br />/usr/local/bin/mysql_install_db --user=mysql<br />mysqladmin -u root password 'new_password' //root的新密码</p>
<p>&nbsp;</p>
<p><strong>安装 PHP 及其扩展</strong></p>
<p>cd /usr/ports/lang/php5<br />make install clean<br />cp /usr/local/etc/php.ini-dist /usr/local/etc/php.ini<br />cd /usr/ports/lang/php5-extensions/<br />make install clean</p>
<p><strong>安装Nginx</strong></p>
<p>cd /usr/ports/www/nginx/<br />make install clean</p>
<p><strong>开机启动</strong></p>
<p>vi /etc/rc.conf<br />mysql_enable="YES"<br />nginx_enable="YES"<br />/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -u www -g www -C 4 -f /usr/local/bin/php-cgi</p>]]>
        
    </content>
</entry>

<entry>
    <title>为PHP打上fpm的支持</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-12-03-01910.html" />
    <id>tag:www.lewphee.com,2009://1.62</id>

    <published>2009-12-02T16:19:10Z</published>
    <updated>2009-12-17T04:49:35Z</updated>

    <summary><![CDATA[php-fpm是PHP的FastCGI Process Manager，我们可以在这里获取：www.php-fpm.org 那里通常有最新版本的patch，下载一个下来，比如php-fpm-0.6-103~5.3.1.tar.gz，这个对应的是PHP-5.3.1版本的fpm patch tar zxf php-fpm-0.6-103~5.3.1.tar.gz php-fpm-0.6-103~5.3.1/generate-patch&nbsp; (这里会产生一个fpm.patch的文件) cd php-5.3.1 patch -p1 &lt; ../fpm.patch ---------------- OK，打上fpm了，编译PHP前，先 ./buildconf --force 不然，configure不认--with-fastcgi这个选项 再 ./configure ........... 即可...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="php" label="PHP" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>php-fpm是PHP的FastCGI Process Manager，我们可以在这里获取：<a href="http://www.php-fpm.org">www.php-fpm.org</a></p>
<p>那里通常有最新版本的patch，下载一个下来，比如php-fpm-0.6-103~5.3.1.tar.gz，这个对应的是PHP-5.3.1版本的fpm patch</p>
<p>tar zxf php-fpm-0.6-103~5.3.1.tar.gz</p>
<p>php-fpm-0.6-103~5.3.1/generate-patch&nbsp; (这里会产生一个fpm.patch的文件)</p>
<p>cd php-5.3.1</p>
<p>patch -p1 &lt; ../fpm.patch</p>
<p>----------------</p>
<p>OK，打上fpm了，编译PHP前，先</p>
<p>./buildconf --force</p>
<p>不然，configure不认--with-fastcgi这个选项</p>
<p>再</p>
<p>./configure ...........</p>
<p>即可</p>]]>
        
    </content>
</entry>

<entry>
    <title>Godaddy域名注册优惠码</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/res/2009-11-06-112457.html" />
    <id>tag:www.lewphee.com,2009://1.67</id>

    <published>2009-11-06T03:24:57Z</published>
    <updated>2009-12-17T08:23:47Z</updated>

    <summary>Godaddy域名注册优惠码 优惠码: cjc695dom说明: $7.49 .COM 注册 有效期: N/A 优惠码: cjctld749 说明: $7.49 .NET 注册 有效期: N/A 优惠码: cjctld749 说明: $7.49 .ORG 注册 有效期: N/A...</summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="网络资源" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="godaddy" label="GODADDY" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="vps虚拟主机" label="VPS&amp;虚拟主机" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="域名注册" label="域名注册" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="服务器" label="服务器" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>Godaddy域名注册优惠码</p>
<p>优惠码: cjc695dom<br />说明: $7.49 .COM 注册 <br />有效期: N/A</p>
<p>优惠码: cjctld749 <br />说明: $7.49 .NET 注册 <br />有效期: N/A</p>
<p>优惠码: cjctld749 <br />说明: $7.49 .ORG 注册 <br />有效期: N/A</p>]]>
        
    </content>
</entry>

<entry>
    <title>GODADDY主机产品优惠码</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/res/2009-11-06-111938.html" />
    <id>tag:www.lewphee.com,2009://1.66</id>

    <published>2009-11-06T03:19:38Z</published>
    <updated>2009-12-17T08:21:39Z</updated>

    <summary><![CDATA[Godaddy主机优惠码(通用) 优惠券: cjcshare20 购买所有主机产品优惠20%.&nbsp; （独立主机例外）有效期: 无限制 优惠券：cjc20hun&nbsp; 购买100$及以上可以优惠20$有效期: 无限制 优惠码: cjctenoff购买50$及以上可以优惠10$有效期：无限制 优惠码: cjcsave购买30$及以上可以优惠 5$有效期：无限制 优惠码：cjcdeal 购买75$以上优惠15%...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="网络资源" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="godaddy" label="GODADDY" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>Godaddy主机优惠码(通用)</p>
<p>优惠券: cjcshare20 <br />购买所有主机产品优惠20%.&nbsp; （独立主机例外）<br />有效期: 无限制</p>
<p>优惠券：cjc20hun&nbsp; <br />购买100$及以上可以优惠20$<br />有效期: 无限制</p>
<p>优惠码: cjctenoff<br />购买50$及以上可以优惠10$<br />有效期：无限制</p>
<p>优惠码: cjcsave<br />购买30$及以上可以优惠 5$<br />有效期：无限制</p>
<p>优惠码：cjcdeal 购买75$以上优惠15%</p>]]>
        
    </content>
</entry>

<entry>
    <title>Win7来了，我的64位时代也来了</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/life/2009-10-25-153343.html" />
    <id>tag:www.lewphee.com,2009://1.61</id>

    <published>2009-10-25T07:33:43Z</published>
    <updated>2009-12-17T04:46:26Z</updated>

    <summary>前几天，MS发布了Windows7，我也装了个，还是64位的，一进去，多数软件还是32位，找64位的软件还是挺辛苦的。 以后都用64位了。 下面是截图，够眩的。...</summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="生活记录" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="windows" label="WINDOWS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>前几天，MS发布了Windows7，我也装了个，还是64位的，一进去，多数软件还是32位，找64位的软件还是挺辛苦的。</p>
<p>以后都用64位了。</p>
<p>下面是截图，够眩的。</p>]]>
        
    </content>
</entry>

<entry>
    <title>删除多余的备份</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/technology/2009-09-19-13855.html" />
    <id>tag:www.lewphee.com,2009://1.59</id>

    <published>2009-09-18T17:38:55Z</published>
    <updated>2009-12-17T04:53:34Z</updated>

    <summary><![CDATA[当初的server-backup.pl不太完善，因为不会自动删除已经备份的文件，所以日积月累会很多多余的文件。现在改进一下。 #now, we delete the file created at 7 days ago.($sec,$min,$hour,$mday,$mon,$year,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $wday,$yday,$isdst) = localtime(time()-7*24*60*60);$bto = sprintf("/data/backup/%4d%02d%02d.tar.gz", $year+1900, $mon+1, $mday);system("rm -f ".$bto);system("echo \"".localtime(time)." delete $bto OK.\" &gt;&gt; /data/log/backup.log"); 这样，就会删除7天以前的备份档了。...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="分类技术" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>当初的server-backup.pl不太完善，因为不会自动删除已经备份的文件，所以日积月累会很多多余的文件。现在改进一下。</p>
<p>#now, we delete the file created at 7 days ago.<br />($sec,$min,$hour,$mday,$mon,$year,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $wday,$yday,$isdst) = localtime(time()-7*24*60*60);<br />$bto = sprintf("/data/backup/%4d%02d%02d.tar.gz", $year+1900, $mon+1, $mday);<br />system("rm -f ".$bto);<br />system("echo \"".localtime(time)." delete $bto OK.\" &gt;&gt; /data/log/backup.log");</p>
<p>这样，就会删除7天以前的备份档了。</p>]]>
        
    </content>
</entry>

<entry>
    <title>SQL之JOIN结构简单理解</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-09-18-233052.html" />
    <id>tag:www.lewphee.com,2009://1.60</id>

    <published>2009-09-18T15:30:52Z</published>
    <updated>2009-12-17T04:54:22Z</updated>

    <summary>以前写JOIN的时候都是这样： select * from a join b on a.xx=b.yy where a.zz=ww 现在遇到了多表联合了，一下连join几个都不对，其实，可以这样理解，SELECT 就是从某个源取得数据的，所以应该这样： select * from (((a join b on a.xx=b.yy) join c on c.zz=a.ww) join d on d.kk=c.ii .....)...... 括号内的是表联合后构成的数据源...</summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>以前写JOIN的时候都是这样：</p>
<p>select * from a join b on a.xx=b.yy where a.zz=ww</p>
<p>现在遇到了多表联合了，一下连join几个都不对，其实，可以这样理解，SELECT 就是从某个源取得数据的，所以应该这样：</p>
<p>select * from (((a join b on a.xx=b.yy) join c on c.zz=a.ww) join d on d.kk=c.ii .....)......</p>
<p>括号内的是表联合后构成的数据源</p>]]>
        
    </content>
</entry>

<entry>
    <title>Alma</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/life/2009-09-04-225616.html" />
    <id>tag:www.lewphee.com,2009://1.65</id>

    <published>2009-09-04T14:56:16Z</published>
    <updated>2009-12-17T05:01:11Z</updated>

    <summary><![CDATA[来自Nacho Sotomayor的La Roca CD1/1994中的音轨1，Alma -----一朝步入画卷，一日梦回千年&nbsp;...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="生活记录" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>来自Nacho Sotomayor的La Roca CD1/1994中的音轨1，Alma</p>
<p>-----一朝步入画卷，一日梦回千年&nbsp; </p>
<script type="text/javascript">
<!--//
var p200909042256 = new MultimediaClass("/uploads/music/recommend/", "Alma", 0);

p200909042256.flushPlayer();
//-->
</script>]]>
        
    </content>
</entry>

<entry>
    <title>Techniques To Manage Procrastination (SELECT)</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/life/2009-08-31-02549.html" />
    <id>tag:www.lewphee.com,2009://1.64</id>

    <published>2009-08-30T16:25:49Z</published>
    <updated>2009-12-17T04:57:28Z</updated>

    <summary>Set Priorities. Not: I don&apos;t know where to begin, so I can&apos;t begin at all.Not: I have to do EVERYTHING! Nothing less will do.Instead: The most important step is to pick one project to focus on. Break the Task Down...</summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="生活记录" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p><strong>Set Priorities. <br /></strong>Not: I don't know where to begin, so I can't begin at all.<br />Not: I have to do EVERYTHING! Nothing less will do.<br />Instead: The most important step is to pick one project to focus on. </p>
<p><br /><strong>Break the Task Down into Little Pieces <br /></strong>Not: There's so much to do, and it's so complicated. I'm overwhelmed by my English term paper.<br />Instead: I don't have to do the whole project at once. There are separate small steps I can take one at a time to begin researching and drafting my paper. </p>
<p><br /><strong>Set Up Small, Specific Goals. <br /></strong>Not: I have to write my thesis within two months.<br />Instead: If I write 2 pages per day, Monday-Friday, I can finish a 1st draft in 1 month. I'll have a revised final draft in 2 months. </p>
<p><br /><strong>Take One Small Step at a Time. <br /></strong>Not: It's too much. I'll never get it all done<br />Instead: What is the one next step on my list? I'll concentrate on that step for right now </p>
<p><br /><strong>Reward Yourself Right Away When You Accomplish a Small Goal. <br /></strong>Not: I can't take any time out until I'm completely finished.<br />Instead: I spent an hour working. Now I'll call a friend.</p>
<p>&nbsp;<br /><strong>Use a Time Schedule.</strong> <br />Not: I must devote the whole week to this project<br />Instead: I can use these times this week to work on my project:<br />Monday 7-8; Tuesday 7-9; Saturday 10-12.</p>
<p>&nbsp;<br /><strong>Learn How to Tell Time. <br /></strong>Not: Sorting through these papers and reorganizing my file cabinet will be a snap. It won't take me more than an hour, so I can do it any time.<br />Instead: Sorting papers always takes longer than I expect, so I'll start tonight. I'll spend 1 hour filing 1 stack of papers.</p>
<p>&nbsp;<br /><strong>Optimize Your Chances for Success.</strong> <br />Not: I'll do my writing this weekend at home.<br />Instead: I'll write during the week in a library. (Choose whatever conditions are optimal for you to get work done.)</p>
<p>&nbsp;<br /><strong>Delegate, if Possible.</strong> <br />Not: I am the only person in the world who can do this.<br />Instead: I don't have to do this all by myself. I can ask someone else to do part of the job and still feel a sense of accomplishment.</p>
<p>&nbsp;<br /><strong>Just Get Started. <br /></strong>Not: I can't write this speech until inspiration hits.<br />Instead: I'll write what first comes to mind, then improve it later.</p>
<p>&nbsp;<br /><strong>Look at What You Have Accomplished.</strong> <br />Not: I have hardly made a dent in all there is to do.<br />Instead: I have reviewed my lecture notes and read 3 chapters. That won't guarentee me an "A", but it's more than I did yesterday.</p>
<p>&nbsp;<br /><strong>Be Realistic! <br /></strong>Not: I should be able to work full-time, take 4 classes, be president of the Esperanto Club, spend more time with friends, and play tennis 2 hours a day with no trouble at all.<br />Instead: I have limits. I can take on fewer responsibilities and still like myself.</p>]]>
        
    </content>
</entry>

<entry>
    <title>OS？SO？</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-07-16-182757.html" />
    <id>tag:www.lewphee.com,2009://1.58</id>

    <published>2009-07-16T10:27:57Z</published>
    <updated>2009-07-16T10:33:37Z</updated>

    <summary><![CDATA[　　谷歌7月8日宣布，将推出基于Chrome浏览器的PC操作系统，直接与微软展开竞争。其实这则新闻不算突然，早在2008年底就有相关的新闻了。 &nbsp; 　　有人说这个操作系统会对微软带来实质性的威胁，我并不这样认为。 &nbsp; 　　原因是操作系统的开发关联的技术性问题并不是重点，重点是市场化。当前相当多的硬件厂商，相对都是针对Windows来进行优化和定制的，很多品牌机都贴有Windows XP、Windows Vista的标签就很说明问题。硬件的支持是一个操作系统的关键因素，如果没有全面的硬件厂商的支持，想发展一个操作系统是相当的困难。这方面Linux就是一个很好的范例。 &nbsp; 　　Linux本身获得硬件厂商的直接支持很少，这使得新出的硬件产品有一部分并不能很好地兼容Linux。如果Google的Chrome OS(暂这叫吧)能获得硬件厂商的支持，那发展的第一步就不是什么问题了。可喜的是，Google已经在这样做了。 &nbsp; 　　另外，OS的市场是个问题。Windows是个非常成功的产品，这得益于其不断改进的友好的用户界面。大家都知道，Google历来都是以简洁（甚至简洁得很难看）著称的，我现在真有点担心这个Chrome OS一出来就是DOS这样的东西。如果界面不友好，支持的软件少，市场是很难打开的。如此一来，就绕不开Microsoft的授权了。要知道，Windows的市场占有率超过85%，多数人的工作都是在Windows平台下的，要想转到Chrome OS上，Chrome OS上就必须有相关的工具。但，Linux没有吗？可以说Windows能干的事，Linux基本都可以，Linux不也没把MS勒倒么？Linux没有固定的支持中心或许是个原因，但原因不单止这个。 &nbsp; 　　如此看来，Google Chrome OS还真有相当长的一段路要走的，不是一出来就能把Windows弄倒的。不管怎么说，独门独市总是不好的，希望Chrome OS能走得好，让用户有更多的选择。...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="google" label="GOOGLE" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="os" label="OS" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="windows" label="WINDOWS" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>　　谷歌7月8日宣布，将<a href="http://tech.sina.com.cn/i/2009-07-08/13203245535.shtml">推出基于Chrome浏览器的PC操作系统</a>，直接与微软展开竞争。其实这则新闻不算突然，早在2008年底就有相关的新闻了。</p>
<p>&nbsp;</p>
<p>　　有人说这个操作系统会对微软带来实质性的威胁，我并不这样认为。</p>
<p>&nbsp;</p>
<p>　　原因是操作系统的开发关联的技术性问题并不是重点，重点是市场化。当前相当多的硬件厂商，相对都是针对Windows来进行优化和定制的，很多品牌机都贴有Windows XP、Windows Vista的标签就很说明问题。硬件的支持是一个操作系统的关键因素，如果没有全面的硬件厂商的支持，想发展一个操作系统是相当的困难。这方面Linux就是一个很好的范例。</p>
<p>&nbsp;</p>
<p>　　Linux本身获得硬件厂商的直接支持很少，这使得新出的硬件产品有一部分并不能很好地兼容Linux。如果Google的Chrome OS(暂这叫吧)能获得硬件厂商的支持，那发展的第一步就不是什么问题了。可喜的是，<a href="http://tech.sina.com.cn/i/2009-07-09/15023249657.shtml">Google已经在这样做</a>了。</p>
<p>&nbsp;</p>
<p>　　另外，OS的市场是个问题。Windows是个非常成功的产品，这得益于其不断改进的友好的用户界面。大家都知道，Google历来都是以简洁（甚至简洁得很难看）著称的，我现在真有点担心这个Chrome OS一出来就是DOS这样的东西。如果界面不友好，支持的软件少，市场是很难打开的。如此一来，就绕不开Microsoft的授权了。要知道，Windows的市场占有率超过85%，多数人的工作都是在Windows平台下的，要想转到Chrome OS上，Chrome OS上就必须有相关的工具。但，Linux没有吗？可以说Windows能干的事，Linux基本都可以，Linux不也没把MS勒倒么？Linux没有固定的支持中心或许是个原因，但原因不单止这个。</p>
<p>&nbsp;</p>
<p>　　如此看来，Google Chrome OS还真有相当长的一段路要走的，不是一出来就能把Windows弄倒的。不管怎么说，独门独市总是不好的，希望Chrome OS能走得好，让用户有更多的选择。</p>]]>
        
    </content>
</entry>

<entry>
    <title>使用SSH爬墙</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-06-30-213555.html" />
    <id>tag:www.lewphee.com,2009://1.57</id>

    <published>2009-06-30T13:35:55Z</published>
    <updated>2009-06-30T13:45:49Z</updated>

    <summary><![CDATA[　　得益于我们伟大的GFW，我们经常无法查到一些事情的真实情况，有时，连资料都没法查。所以只能使用SSH进行代理爬墙了。 　　刚好，在国外的主机是使用SSH进行远程管理的，所以我就使用SSH进行代理查找资料了。 &nbsp; Windows客户端我使用了Putty，Putty里带有个plink的程序，可以用它来建立从客户端到服务器的隧道。 plink -N username@ip -D localport 把username、ip以及localport替换成你的主机信息。如： plink -N lewphee@myserver.com -D 4800 这样，就建立了个隧道。在浏览器使用SOCK5代理，端口为4800，就可以爬墙了...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="ssh" label="SSH" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>　　得益于我们伟大的GFW，我们经常无法查到一些事情的真实情况，有时，连资料都没法查。所以只能使用SSH进行代理爬墙了。</p>
<p>　　刚好，在国外的主机是使用SSH进行远程管理的，所以我就使用SSH进行代理查找资料了。</p>
<p>&nbsp;</p>
<p>Windows客户端我使用了Putty，Putty里带有个plink的程序，可以用它来建立从客户端到服务器的隧道。</p>
<p>plink -N <a href="mailto:username@ip">username@ip</a> -D localport</p>
<p>把username、ip以及localport替换成你的主机信息。如：</p>
<p>plink -N <a href="mailto:lewphee@myserver.com">lewphee@myserver.com</a> -D 4800</p>
<p>这样，就建立了个隧道。在浏览器使用SOCK5代理，端口为4800，就可以爬墙了</p>]]>
        
    </content>
</entry>

<entry>
    <title>MySQL数据库优化（一）</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-06-25-22435.html" />
    <id>tag:www.lewphee.com,2009://1.56</id>

    <published>2009-06-24T18:24:35Z</published>
    <updated>2009-07-16T09:51:53Z</updated>

    <summary><![CDATA[　　对于许多访问量大的网站来说，数据库优化是性能提升、负载提升的至关重要的一个环节。本篇是由Sams Publishing出版的&lt;MySQL Administrator's Guide&gt;中的第六章"MySQL Optimization"翻译过来，诣在做个学习的笔记，以及为有需要的人作个参考。在内容中可能穿插有我的一些注解，但都会明显地标识出来的。由于是一节节地翻译出来，所以就以一篇篇日记的方式发布吧。另，由于水平有限，难免有错漏或意思表达欠妥的地方，还请各位能指出，以能进一步修改。 内容主要有： * 优化概览 * SELECT语句以及其它查询的优化 * 关于"锁"的问题 * 数据库结构优化 * MySQL 数据库服务器的优化 * 关于磁盘 --------- &nbsp; &nbsp; 　　基础设计是让一个系统更快速运行的最重要的因素。你必须知道你的系统将要进行什么工作并且知道它的瓶颈在哪里。 &nbsp; 　　绝大多数的瓶颈在以下几个方面： &nbsp; 　　磁盘寻址。寻址需要耗费时间，在近代的磁盘里，每次的寻址耗费平均为10ms，这样，一秒内，磁盘可进行大约100次的寻址。这个时间由于磁盘的更新换代，正正慢慢地减小，然而对于单一数据源来说，这个寻址时间已经很难优化了。将数据源置于多磁盘中，是优化寻址时间的方法之一。 &nbsp; 　　磁盘读写。当磁盘指针位于合适的位置时，我们需要读取数据，当前的磁盘都有10~20MB/s的吞吐能力。相较之下，这个指标比磁盘寻址时间更容易优化，因为我们可以同时从多个磁盘并行地读取数据。 &nbsp; 　　CPU时钟周期。当我们将数据读入内存中（或数据早已在内存），我们必须处理它以期得到我们想要的结果。此数据量小的表的数量与内存数量的比率是比较常见的限制因素，但对于小表来说，速度通常不是问题所在。 &nbsp; 　　内存带宽。当CPU需要更多的数据以填入CPU的缓存里时，主存带宽就成了瓶颈----在多数系统里，这个通常不是瓶颈，但我们应该意识到有这个瓶颈的存在。 &nbsp; &nbsp;* MySQL设计的限制和权衡 　　当使用MyISAM存储引挚时，MySQL极快地将表锁定以让多个客户端进行读取数据或只一个数据写入的客户端。此类型的数据引挚最大的问题是，当你持续不断地对某一数据表进行数据更新时，对那个表操作（如查询）的其它客户端就显得过于慢了。当你能确定是哪个表进行的操作过于频繁时，我们可以对那个表单独使用其它的存储引挚，如InnoDB等。 &nbsp; 　　MySQL可以对混合类型的表进行操作，即一个数据库内包含不同的数据存储引挚，事务型或非事务型的。为了能更好地运行非事务型的表，MySQL进行了以下的约定： &nbsp;...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="mysql" label="MySQL" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="优化" label="优化" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="数据库" label="数据库" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="服务器" label="服务器" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="高性能" label="高性能" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>　　对于许多访问量大的网站来说，数据库优化是性能提升、负载提升的至关重要的一个环节。本篇是由Sams Publishing出版的&lt;MySQL Administrator's Guide&gt;中的第六章"MySQL Optimization"翻译过来，诣在做个学习的笔记，以及为有需要的人作个参考。在内容中可能穿插有我的一些注解，但都会明显地标识出来的。由于是一节节地翻译出来，所以就以一篇篇日记的方式发布吧。另，由于水平有限，难免有错漏或意思表达欠妥的地方，还请各位能指出，以能进一步修改。</p>
<p>内容主要有：</p>
<p><a href="http://www.lewphee.com/notes/2009-06-25-22435.html">* 优化概览</a></p>
<p>* SELECT语句以及其它查询的优化</p>
<p>* 关于"锁"的问题</p>
<p>* 数据库结构优化</p>
<p>* MySQL 数据库服务器的优化</p>
<p>* 关于磁盘</p>
<p>---------</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>　　基础设计是让一个系统更快速运行的最重要的因素。你必须知道你的系统将要进行什么工作并且知道它的瓶颈在哪里。</p>
<p>&nbsp;</p>
<p>　　绝大多数的瓶颈在以下几个方面：</p>
<p>&nbsp;</p>
<p><strong>　　磁盘寻址</strong>。寻址需要耗费时间，在近代的磁盘里，每次的寻址耗费平均为10ms，这样，一秒内，磁盘可进行大约100次的寻址。这个时间由于磁盘的更新换代，正正慢慢地减小，然而对于单一数据源来说，这个寻址时间已经很难优化了。将数据源置于多磁盘中，是优化寻址时间的方法之一。</p>
<p>&nbsp;</p>
<p><strong>　　磁盘读写</strong>。当磁盘指针位于合适的位置时，我们需要读取数据，当前的磁盘都有10~20MB/s的吞吐能力。相较之下，这个指标比磁盘寻址时间更容易优化，因为我们可以同时从多个磁盘并行地读取数据。</p>
<p>&nbsp;</p>
<p><strong>　　CPU时钟周期</strong>。当我们将数据读入内存中（或数据早已在内存），我们必须处理它以期得到我们想要的结果。此数据量小的表的数量与内存数量的比率是比较常见的限制因素，但对于小表来说，速度通常不是问题所在。</p>
<p>&nbsp;</p>
<p><strong>　　内存带宽</strong>。当CPU需要更多的数据以填入CPU的缓存里时，主存带宽就成了瓶颈----在多数系统里，这个通常不是瓶颈，但我们应该意识到有这个瓶颈的存在。</p>
<p>&nbsp;</p>
<p>&nbsp;* <strong>MySQL设计的限制和权衡</strong></p>
<p>　　当使用MyISAM存储引挚时，MySQL极快地将表锁定以让多个客户端进行读取数据或只一个数据写入的客户端。此类型的数据引挚最大的问题是，当你持续不断地对某一数据表进行数据更新时，对那个表操作（如查询）的其它客户端就显得过于慢了。当你能确定是哪个表进行的操作过于频繁时，我们可以对那个表单独使用其它的存储引挚，如InnoDB等。</p>
<p>&nbsp;</p>
<p>　　MySQL可以对混合类型的表进行操作，即一个数据库内包含不同的数据存储引挚，事务型或非事务型的。为了能更好地运行非事务型的表，MySQL进行了以下的约定：</p>
<p>&nbsp;</p>
<p>　　- 所有的字段都有默认值<br />　　- 如果你插入"错误"的值，比如，插入的整型过大，MySQL将不会报错，代之以插入其认为最合适的值。对数值类型来说，这些"最合适的值"通常为0、最小的值、最大的值。对字符串类型一说，是空值或者该字段能存储的最长的字符串。<br />　　- 所有的计算式都会返回值，即使是错误的计算，也会返回一个"合适"的值而不会报错。如 1/0将返回NULL</p>
<p>　　根据以上的约定，很显然，MySQL的本意是你必须在你的程序中检查插入的值是否正确，而不要等MySQL将你的值检查再转换成合法的值。</p>
<p>&nbsp;</p>
<p>* <strong>设计具可移植性的应用程序</strong></p>
<p>　　因为所有的数据库服务器都实现了标准SQL的不同部分，所以要写一个具可移植性的SQL程序也是一个相当耗力的工作。写出具有可移植性的简单查询或插入SQL语句是件相当容易的事，但是，当你的查询越复杂时，要实现复杂查询的同时具有良好的可移植性，就是件难事了。</p>
<p>&nbsp;</p>
<p>　　写个具有可移植性的复杂程序前，你需要确定你的程序所使用的数据库以及该种数据库所具有的各种功能。所有的数据库系统都有一个弱点，即是，它们不同的设计让步从而导致不同的行为后果。</p>
<p>&nbsp;</p>
<p>　　你可以使用MySQL crash-me程序在一个已选择的数据库中查询函数、类型或者限制。crash-me并不查询所有可能支持的功能，但它支持的功能已相当多，大约在450个左右。比如，当你使用Informix或者DB2时，crash-me可以告诉你，字段的名称的长度不能超过18个字符。</p>
<p>&nbsp;</p>
<p>　　crash-me和MySQL benchmarks都是无关数据库系统的。看看它们是怎么写成的，你可以对写具有可移植性的数据库程序有个大概的了解。程序可以在MySQL源码中的sql-bench目录找到。它们是用Perl写成的，使用了DBI的数据库接口。使用DBI可以解决其本身的可移植性问题，因为DBI提供了一些无关数据库类型的访问方法。</p>
<p>&nbsp;</p>
<p>　　查找关于crash-me和benchmarks的信息，请访问<a href="http://dev.mysql.com/tech-resources/crash-me.php">http://dev.mysql.com/tech-resources/crash-me.php</a>和<a href="http://dev.mysql.com/tech-resources/benchmarks/">http://dev.mysql.com/tech-resources/benchmarks/</a>。</p>
<p>&nbsp;</p>
<p>　　如果你想设计无关平台的数据库，你需要对每个数据库服务器的瓶颈有所了解。比如，MySQL在MyISAM类型的表中读写都相当的快，但是，如果对同一个表同时进行读取和写入数据操作时，它将会显得慢了。Oracle，当你访问刚刚更新的数据行时，将会有问题。事务型数据库在从日志表生成汇总表通常都不是很好，因为如果这样，行锁基本是没什么大的作用了。</p>
<p>&nbsp;</p>
<p>　　为了让你的程序真正做到无关数据库系统平台，你需要定义一个简单的扩展接口以对你的数据进行操作。因为C++在许多系统中都兼容，就用C++的类作为数据库的操作接口吧。</p>
<p>&nbsp;</p>
<p>　　如果你用了某些指定数据库才具有的应用(如，MySQL中的REPLACE)，你必须为其它的数据库系统也实现一个兼容的动作。虽然会慢一点，但至少可在其它的数据库系统运行相同的任务。</p>
<p>&nbsp;</p>
<p>　　MySQL中，你可以使用/*! */来加入一个MySQL已定义的关键字到查询。但是，/**/就是注释了，这个是大多数数据库系统都支持的注释语法。</p>
<p>&nbsp;</p>
<p>　　如果高性能远比精确度更具重要性（比如在Web项目中），那么，你可以建立一个应用层以缓存所有记录集，这样可以提高不少的性能。对结果的过期时间进行设置后，你可以在相当程度上保持缓存的记录为最新的。你可以动态增加缓存并且合理设置过期时间，以有效地提高负荷。</p>
<p>&nbsp;</p>
<p>　　因此，一个表的信息应该包含缓存的初始大小以及更新的频率等信息。</p>
<p>&nbsp;</p>
<p>　　使用MySQL查询缓存是应用程序缓存的替换方法。启用查询缓存后，数据库服务器会监控详细的查询信息以决定一个查询是否使用缓存。这个会简化你的应用程序。参看章节4.10 "MySQL查询缓存"。</p>
<p>&nbsp;</p>
<p><strong>* 我们用MySQL做了什么</strong></p>
<p>　　本节我们讨论MySQL的早期。</p>
<p>　　在MySQL开发的初期，MySQL主要的功能是满足于我们的一个最大的客户。其使用了数据仓库来处理在瑞典的两个最大的分销商的数据。</p>
<p>&nbsp;</p>
<p>　　我们对每个店面每周出一收益概要报表，并且提供一些有用的信息以让店主清楚如何进行对他们的客户进行有效的广告运作。</p>
<p>&nbsp;</p>
<p>　　数据的容量是非常巨大的（大概每月700万条交易数据），并且有4~10年的数据要向客户提供查询。我们每周从这些数据中为有需要的客户生成报表。</p>
<p>&nbsp;</p>
<p>　　为了解决这一问题，我们每月将所有的信息压缩存进交易表中。我们有一系列简单的宏来按不同的需要(产品、客户id、商店等等)从交易表中生成汇总表。报告是Perl脚本动态生成的WEB页面。</p>
<p>&nbsp;</p>
<p>　　对于图片数据，我们使用C写了个简单的工具，能处理SQL查询请求并根据查询结果生成GIF图像。这个工具也能通过WEB页的Perl脚本进行动态地调用。</p>
<p>&nbsp;</p>
<p>　　多数情况下，一个新的报表能通过复制和更改现有的脚本进行产生。少数情况我们需要为现有的报表添加更多的字段信息，但这也是很简单的事，因为我们已经把所有的数据都存在硬盘上了。</p>
<p>&nbsp;</p>
<p><strong>* MySQL Benchmark套件</strong></p>
<p>　　本节包含一些MySQL Benchmark(以及crash-me)的尚未编写的技术描述。当前你可以通过sql-bench目录的源码获取一些好的解决办法。</p>
<p>&nbsp;</p>
<p>　　MySQL Benchmark是用来测试MySQL的SQL语句的性能情况的。需要提醒的是，当前benchmark是单线程的，这样它能很好地测试SQL操作的最小时间。我们在往后的时间里将转成多线程的。</p>
<p>&nbsp;</p>
<p>　　要使用Benchmark套件，以下必需条件是要满足的：<br />　　- Benchmark套件已经在源码中提供。你当然也可从 <a href="http://dev.mysql.com/downloads/">http://dev.mysql.com/downloads/</a> 那单独下载来自行编译使用。<br />　　- Benchmark脚本是使用Perl以及Perl的DBI模块来写的，所以DBI是必须安装的。如果需要测试其它类型的数据库，你还需要指定类型的DBD模块。</p>
<p>　　当你取得MySQL源码后，你会在sql-bench目录下找到benchmark，要运行benchmark，只需运行run-all-tests脚本。</p>
<p>&nbsp;</p>
<p>shell&gt; cd sql-bench<br />shell&gt; perl run-all-tests --server=server_name</p>
<p>server_name是个可用的服务器，想查看更多的可用列表，运行此命令：</p>
<p>shell&gt; perl run-all-tests --help</p>
<p>crash-me脚本也在sql-bench目录下。crash-me会取得当前数据库的一些支持信息比如它的实际运行容量和限制等。如：<br />　　- 支持的字段数据类型<br />　　- 支持多少索引<br />　　- 支持的功能<br />　　- 支持多大的查询<br />　　- VARCHAR类型支持多大的数据量<br /></p>]]>
        
    </content>
</entry>

<entry>
    <title>非增量每日备份</title>
    <link rel="alternate" type="text/html" href="http://www.lewphee.com/notes/2009-06-23-135556.html" />
    <id>tag:www.lewphee.com,2009://1.55</id>

    <published>2009-06-23T05:55:56Z</published>
    <updated>2009-06-23T05:58:54Z</updated>

    <summary><![CDATA[被FSCK搞怕了，所以得每天都备份(之前都是1个星期才备份一次-_-!)。现在就写了个备份的脚本，让服务器每天自动备份 备份是通过FTP来的，所以首先建立一个backup用户useradd -g sites -d /backups -s /usr/sbin/nologin backuppasswd backup**********update successfully... 然后使用以下脚本进行备份到本地：vi backup-server.pl #/usr/bin/perl -w #backup server scripts #files$datadir = "/www";@fl = ("www.lewphee.com");@db = ("dbname"); #数据库$pswd = "*****"; #root 密码 #backup directory$bto = '/backups';$bto1 = '/backups';my ($sec,$min,$hour,$mday,$mon,$year,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $wday,$yday,$isdst) = localtime...]]></summary>
    <author>
        <name>lewphee</name>
        
    </author>
    
        <category term="学习笔记" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="unix" label="UNIX" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="服务器" label="服务器" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en" xml:base="http://www.lewphee.com/">
        <![CDATA[<p>被FSCK搞怕了，所以得每天都备份(之前都是1个星期才备份一次-_-!)。现在就写了个备份的脚本，让服务器每天自动备份</p>
<p>备份是通过FTP来的，所以首先建立一个backup用户<br />useradd -g sites -d /backups -s /usr/sbin/nologin backup<br />passwd backup<br />*****<br />*****<br />update successfully...</p>
<p>然后使用以下脚本进行备份到本地：<br />vi backup-server.pl</p>
<p>#/usr/bin/perl -w</p>
<p>#backup server scripts</p>
<p>#files<br />$datadir = "/www";<br />@fl = ("<a href="http://www.lewphee.com">www.lewphee.com</a>");<br />@db = ("dbname"); #数据库<br />$pswd = "*****"; #root 密码</p>
<p>#backup directory<br />$bto = '/backups';<br />$bto1 = '/backups';<br />my ($sec,$min,$hour,$mday,$mon,$year,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $wday,$yday,$isdst) = localtime time;</p>
<p>$bto = sprintf("$bto/%4d%02d%02d/", $year+1900, $mon+1, $mday);<br />if (!-e $bto) {<br />&nbsp;&nbsp;&nbsp; system("mkdir -p ".$bto);<br />}</p>
<p>foreach (@fl){<br />&nbsp;&nbsp;&nbsp; system("cd $datadir;tar -czf ".$bto.$_.".tar.gz ".$_);<br />&nbsp;&nbsp;&nbsp; system("echo \"".localtime(time)." tar ".$datadir."/".$_." ok.\" &gt;&gt; /logs/backup.log");<br />}</p>
<p>#database<br />foreach (@db){<br />&nbsp;&nbsp;&nbsp; #登录数据库服务器并完全备份数据库成一个压缩文件<br />&nbsp;&nbsp;&nbsp; system("/usr/local/mysql/bin/mysqldump -uroot -p".$pswd." -S /tmp/mysql.sock -R --add-drop-database=TRUE ".$_." | gzip &gt; ".$bto.$_.".sql.gz");<br />&nbsp;&nbsp;&nbsp; system("echo \"".localtime(time)." database ".$_." backup successfully\" &gt;&gt; /logs/backup.log");<br />}</p>
<p>#now, tar the directory.<br />system("cd ".$bto1.";tar -czf ".sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday).".tar.gz ".sprintf("%4d%02d%02d", $year+1900, $mon+1, $mday));<br />system("rm -rf ".$bto);<br />system("echo \"".localtime(time)."backup total successfully\" &gt;&gt; /logs/backup.log");</p>
<p>这样，本地要备份的数据库和文件目录，只用在@fl和@db数组添加就可以了。<br />本地备份完成了，但我们得从别的服务器里拷回这些备份，不然只在本地备份就等于没备份！</p>
<p>之前建立的FTP帐号派上用场了----我们同样用脚本登录FTP进行数据下载：</p>
<p>vi backup-client.pl</p>
<p>#/usr/bin/perl -w</p>
<p>use Net::FTP;</p>
<p>#backup remote server's file to local</p>
<p>#local backup dir<br />$dir = "/backups/";</p>
<p>#remote server<br />$server = "server.name.here";</p>
<p>#ftp parameters<br />$user = "backup";<br />$pswd = "****";</p>
<p>$ftp = Net::FTP-&gt;new($server, Debug=&gt;0) or die("can't connect to $server:$@");<br />$ftp-&gt;login($user, $pswd);<br />$ftp-&gt;cwd("/");</p>
<p>my ($sec,$min,$hour,$mday,$mon,$year,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; $wday,$yday,$isdst) = localtime time;</p>
<p>$file = sprintf("%04d%02d%02d.tar.gz", $year+1900, $mon+1, $mday);</p>
<p>$ftp-&gt;binary();<br />$ftp-&gt;get($file, $dir.$server."-".$file);<br />system("echo \"".localtime(time)." backup remote ".$server." total successfully\" &gt;&gt; /logs/backup.log");<br />$ftp-&gt;quit();</p>
<p>最后，在主数据服务器里的crontab里设置每日0时备份<br />crontab -e<br />0 0 * * * (perl /tools/backup-server.pl)</p>
<p>远程备份服务器(有延迟，因为不可能同时运行，那边还没压缩完呢)：<br />crontab -e<br />30 0 * * * (perl /tools/backup-client.pl)</p>
<p>这样，就可以做到天天备份，不用怕down机了(不down肯定好过down的，我意思是说，不怕down机找不回数据了)^o^</p>]]>
        
    </content>
</entry>

</feed>
