<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>DBA notes</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/" />
    <link rel="self" type="application/atom+xml" href="http://www.dbanotes.net/atom.xml" />
   <id>tag:www.dbanotes.net,2008://1</id>
    <link rel="service.post" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1" title="DBA notes" />
    <updated>2008-06-22T15:48:49Z</updated>
    <subtitle>SELECT blog FROM Fenng.Thought 
 WHERE subjects IN (&apos;ORACLE&apos;, &apos;Web Arch&apos;, &apos;UNIX&apos;, &apos;Web 2.0&apos;, &apos;OPENSOURCE&apos;) ; 

     
        Weblog
                 Wiki
LinkLog
                 OpenRSS
Search
                                  Articles
                 About
               </subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type 4.2rc2-en</generator>
 

<entry>
    <title>Unix/Linux 的 Load 初级解释</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/unix_linux_load.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1448" title="Unix/Linux 的 Load 初级解释" />
    <id>tag:www.dbanotes.net,2008://1.1448</id>
    
    <published>2008-06-23T18:58:31Z</published>
    <updated>2008-06-22T15:48:49Z</updated>
    
    <summary>几乎每个接触类 Unix 操作系统的工程师都知道如何查看系统负载。但这东西的工作机理到底是怎样的，可能没有多少能说清楚。对比了一些相关信息，加上自己的理解，做一下笔记。

什么是 Load ? 什么是 Load Average ? 

Load 就是对计算机干活多少的度量(WikiPedia: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。【最好的参考文章：UNIX® Load Average Part 1: How It Works】

下面是一个 uptime 命令输出：

$ uptime 18:57:48 up 423 days,  3:55,  2 users,  load average: 1.16, 1.12, 1.20

尽管各种信息来源的定义都不太确定。能确定的一件事情是，你不能精确获取当前时间的 Load .  最小的计算粒度是 5 秒钟(CALC_LOAD 每 5HZ 计算一次, 5HZ  为 5秒钟). 参见 Linux Kernel 这段代码: 
 869        count -= ticks;
 870        if (unlikely(count  874                        CALC_LOAD(avenrun[1], EXP_5, active_tasks); 875                        CALC_LOAD(avenrun[2], EXP_15, active_tasks); 876                        count += LOAD_FREQ;
 877                } while (count 

如何判断系统是否已经 Over Load ?

对一般的系统来说，根据 CPU 数量去判断，如上面的例子， 如果平均负载始终在 1.2  以下，而你是 2 颗 CPU 的机器。那么基本不会出现 CPU 不够用的情况。也就是 Load 平均要小于 CPU 的数量。

这是  Solaris 性能与工具(Solaris Performance Tools ) 一书推荐的评估方法。【在这里要推荐一下这本书，尽管在 Load 这个地方没有达到我期望的那么细致。但全书揭示了非常多的性能信息。每个 DBA、架构师 的必须书。】

这么说实际上带来另外两个疑问：

1 如果是多核 CPU / 超线程的机器怎么判断? 对这样的机器，我的建议是看操作系统怎么识别的 CPU，根据系统识别出来的逻辑 CPU 数量来判断。如果要考虑性能系数，建议参考一下 Oracle 针对不同架构下多核 CPU 的收费标准。

2 如果应用是面向线程的怎么判断? 这实际上和 M:N 线程模型有关。你的系统是怎样的? 把这个问题考虑进去即可了。

多数情况下，Load 过高都未必和 CPU 有关。或许倒是有一个例外的，就是应用场景的问题。比如用单 CPU 的机器去做高并发 Web 服务器，麻烦就来了

Load 与容量规划(Capacity Planning)

任何一个相对成熟的站点都会利用 Cacti（基于RRDTool） 等工具进行容量规划工作。抓取的 Load 会传 1、5、15  分钟列值过去，这三个度量采用哪个呢? 15 分钟为首选【参见Gunther 的 PPT】。

Load 与系统预警

很多对可用性要求比较高的环境都建立了 邮件或SMS 报警机制。关于 Load 报警阈值的制定也有看到不太合理的时候。这里建议 Critical 值(如果用 Nagios 之类的工具你明白这是什么)上限为 物理 CPU 的个数(当然你可以设置比这个低)。但比这个值高的话，意义就不大了。比如，数据库服务器有 4 颗 CPU，那么 Load 高于 4 就应该报警出来，设置比 4 高可能意义不大，因为接到报警还有个人为响应时间...

误解 一：系统 Load 高一定是性能有问题。
真相：系统 Load 高也或许是因为在进行 CPU 密集型的计算(比如编译)

误解 二：系统 Load 高一定是 CPU 能力问题或数量不够。
真相：Load 高只是代表需要运行的队列累积过多了。但队列中的任务实际可能是耗 CPU的，也可能是耗 I/O 乃至其它因素的。

误解 三：系统长期 Load 高，首选增加 CPU。
真相：Load 只是表象，不是实质。增加 CPU 个别时候会临时看到系统 Load 下降，但治标不治本。

小小一个 Load 讲究其实不少。英文信息其实比较全的，尽量保证加入一点新信息到这篇文章里。入看到有写的不合理的地方或者有异议，请指正或告知。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>几乎每个接触类 Unix 操作系统的工程师都知道如何查看系统负载。但这东西的工作机理到底是怎样的，可能没有多少能说清楚。对比了一些相关信息，加上自己的理解，做一下笔记。</p>

<h4>什么是 Load ? 什么是 Load Average ? </h4>

<p>Load 就是对计算机干活多少的度量(<a href="http://en.wikipedia.org/wiki/Load_(computing)">WikiPedia</a>: the system load is a measure of the amount of work that a computer system is doing)。也有简单的说是进程队列的长度. Load Average 就是一段时间 (1 分钟、5分钟、15分钟) 内平均 Load 。【最好的参考文章：<a href="http://www.teamquest.com/resources/gunther/display/5/">UNIX® Load Average Part 1: How It Works</a>】</p>

<p>下面是一个 uptime 命令输出：</p>

<pre>$ uptime<br /> 18:57:48 up 423 days,  3:55,  2 users,  load average: 1.16, 1.12, 1.20</pre>

<p>尽管各种信息来源的定义都不太确定。能确定的一件事情是，你不能<strong>精确</strong>获取当前时间的 Load .  最小的计算粒度是 5 秒钟(<a href="http://lxr.linux.no/linux/kernel/timer.c#L864">CALC_LOAD 每 5HZ 计算一次</a>, 5HZ  为 5秒钟). 参见 Linux Kernel <a href="http://lxr.linux.no/linux/kernel/timer.c#L623">这段代码</a>: </p>
<pre> 869        count -= ticks;
 870        if (unlikely(count < 0)) {
 871                active_tasks = count_active_tasks();
 872                do {
 873                        CALC_LOAD(avenrun[0], EXP_1, active_tasks); <br /> 874                        CALC_LOAD(avenrun[1], EXP_5, active_tasks);<br /> 875                        CALC_LOAD(avenrun[2], EXP_15, active_tasks);<br /> 876                        count += LOAD_FREQ;
 877                } while (count < 0);
 878        }
 879} </pre>
<br />
<h4>如何判断系统是否已经 Over Load ?</h4>

<p>对一般的系统来说，根据 CPU 数量去判断，如上面的例子， 如果平均负载始终在 1.2  以下，而你是 2 颗 CPU 的机器。那么基本不会出现 CPU 不够用的情况。也就是 Load 平均要小于 CPU 的数量。</p>

<p>这是  Solaris 性能与工具(Solaris Performance Tools ) 一书推荐的评估方法。【在这里要推荐一下这本书，尽管在 Load 这个地方没有达到我期望的那么细致。但全书揭示了非常多的性能信息。每个 DBA、架构师 的必须书。】</p>

<p>这么说实际上带来另外两个疑问：</p>

<p><strong>1 如果是多核 CPU / 超线程的机器怎么判断?</strong> 对这样的机器，我的建议是看操作系统怎么识别的 CPU，根据系统识别出来的逻辑 CPU 数量来判断。如果要考虑性能系数，建议参考一下 Oracle 针对不同架构下多核 CPU 的收费标准。</p>

<p><strong>2 如果应用是面向线程的怎么判断?</strong> 这实际上和 <a href="http://www.dbanotes.net/techmemo/aix_6_new_features.html">M:N 线程</a>模型有关。你的系统是怎样的? 把这个问题考虑进去即可了。</p>

<p>多数情况下，Load 过高都未必和 CPU 有关。或许倒是有一个例外的，就是<strong>应用场景</strong>的问题。比如用单 CPU 的机器去做高并发 Web 服务器，麻烦就来了</p>

<h4>Load 与容量规划(Capacity Planning)</h4>

<p>任何一个相对成熟的站点都会利用 Cacti（基于RRDTool） 等工具进行容量规划工作。抓取的 Load 会传 1、5、15  分钟列值过去，这三个度量采用哪个呢? 15 分钟为首选【参见<a href="http://nosheep.net/story/defining-unix-load-average/">Gunther 的 PPT</a>】。</p>

<h4>Load 与系统预警</h4>

<p>很多对可用性要求比较高的环境都建立了 邮件或SMS 报警机制。关于 Load 报警阈值的制定也有看到不太合理的时候。这里建议 Critical 值(如果用 Nagios 之类的工具你明白这是什么)上限为 物理 CPU 的个数(当然你可以设置比这个低)。但比这个值高的话，意义就不大了。比如，数据库服务器有 4 颗 CPU，那么 Load 高于 4 就应该报警出来，设置比 4 高可能意义不大，因为接到报警还有个人为响应时间...</p>

<h4>误解 一：系统 Load 高一定是性能有问题。</h4>
真相：系统 Load 高也或许是因为在进行 CPU 密集型的计算(比如编译)

<h4>误解 二：系统 Load 高一定是 CPU 能力问题或数量不够。</h4>
<p>真相：Load 高只是代表需要运行的队列累积过多了。但队列中的任务实际可能是耗 CPU的，也可能是耗 I/O 乃至其它因素的。</p>

<h4>误解 三：系统长期 Load 高，首选增加 CPU。</h4>
<p>真相：Load 只是表象，不是实质。增加 CPU 个别时候会临时看到系统 Load 下降，但治标不治本。</p>

<p>小小一个 Load 讲究其实不少。英文信息其实比较全的，尽量保证加入一点新信息到这篇文章里。入看到有写的不合理的地方或者有异议，请指正或告知。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>AIX 上配置 rsync 简记</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/aix_rsync.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1346" title="AIX 上配置 rsync 简记" />
    <id>tag:www.dbanotes.net,2008://1.1346</id>
    
    <published>2008-01-24T16:52:12Z</published>
    <updated>2008-01-25T07:10:41Z</updated>
    
    <summary>前提: OpenSSH 配置完毕。并且，目标端到源端通过 SSH 登录无需提示密码验证. (参见我以前的也是关于  rsync 的废话)

下载 AIX 5L Expansion Pack CD 中的 rsync，这个版本稍微有点低。其实也足够了，不过如果和更高版本混用的话，会报告另外一个错误：
sync: connection unexpectedly closed (24 bytes read so far)rsync error: error in rsync protocol data stream (code 12) ...

在 AIX 上 rsync 需要依赖 Popt--A C library for parsing command line parameters，通过 rpm 命令安装即可. 现在的 AIX 系统默认应该就有安装  rpm （AIX-rpm) 工具包的.

在维基百科上 有 对 rsync 算法的介绍。简单的理解是这么回事：待传送的文件被分成若干定长的文件段，然后对每个文件段做个 &quot;Rolling Checksum&quot;，加上一个强 MD4 校验码, 传送这些信息给接收方, 接收方查找本地类似文件--定长的每个文件段, 对比 Rolling Checksum 与 MD4, 然后传送差异(Delta)数据. 

rsync 1996 年才被搞出来，最初是用来对付在低速网络连接上传送差异化文件的。

我一直比较好奇的是 Oracle 的 Data Guard 用什么算法保证所有的归档能无差错传送到远地(?)。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>前提: OpenSSH 配置完毕。并且，目标端到源端通过 SSH 登录无需提示密码验证. (参见我以前的也是<a href="http://www.dbanotes.net/techmemo/rsync_openssh.html">关于  rsync 的废话</a>)</p>

<p>下载 <a href="http://www-03.ibm.com/systems/p/os/aix/expansionpack/index.html">AIX 5L Expansion Pack CD</a> 中的 <a href="http://www-03.ibm.com/systems/p/os/aix/linux/toolbox/download.html">rsync</a>，这个版本稍微有点低。其实也足够了，不过如果和更高版本混用的话，会报告另外一个<a href="http://samba.anu.edu.au/rsync/issues.html">错误</a>：<br />
<pre>sync: connection unexpectedly closed (24 bytes read so far)<br />rsync error: error in rsync protocol data stream (code 12) ...</pre></p>

<p>在 AIX 上 rsync 需要依赖 <a href="http://www-03.ibm.com/systems/p/os/aix/linux/toolbox/download.html">Popt</a>--A C library for parsing command line parameters，通过 rpm 命令安装即可. 现在的 AIX 系统默认应该就有安装  rpm （AIX-rpm) 工具包的.</p>

<p>在维基百科上 有 对 <a href="http://en.wikipedia.org/wiki/Rsync">rsync 算法</a>的介绍。简单的理解是这么回事：待传送的文件被分成若干定长的文件段，然后对每个文件段做个 "Rolling Checksum"，加上一个强 MD4 校验码, 传送这些信息给接收方, 接收方查找本地类似文件--定长的每个文件段, 对比 Rolling Checksum 与 MD4, 然后传送差异(Delta)数据. </p>

<p>rsync 1996 年才被搞出来，最初是用来对付在低速网络连接上传送差异化文件的。</p>

<p>我一直比较好奇的是 <strong>Oracle 的 Data Guard 用什么算法保证所有的归档能无差错传送到远地</strong>(?)。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>Linux 下的 df 命令以及其他</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/linux_df.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1332" title="Linux 下的 df 命令以及其他" />
    <id>tag:www.dbanotes.net,2008://1.1332</id>
    
    <published>2008-01-10T12:29:18Z</published>
    <updated>2008-01-10T12:15:48Z</updated>
    
    <summary>手边有 AIX  以及 Linux 环境，df 算是我用的频率较高的系统命令了。这个小小的命令在不同的环境中差别还是很大的。比如 &quot;-v&quot; 这个参数，在 AIX 上可以配合 -k -m -g 等参数显示可读性更强的信息,  Linux 上只是为了兼容 System V 的 df 命令而保留 &quot;-v&quot;。在 Linux 上类似的命令 是 “-B” ，可以接 k 、m、g 等. 如 df -Bg 按照 GB 显示。如果同时维护这样的混合环境，在命令的使用上也要考虑“兼容性”。 

以前介绍过 GNU 核心工具，不过没介绍那份有趣的 GNU Core Utilities FAQ，前两天又重新读了一遍。多少有点新内容。比如那个比较经典的问题，“Linux 下 df 与 du 显示的为什么不一样&quot; (我自己就遇到过一次)，在 FAQ 上更新了很有权威性的线索: df and du report different information。

我这里补充一下的是，在比较大的文件系统上，保留给超级用户的数据块也可能会产生混淆。默认是 5%，如果文件系统比较大，这里的浪费还是比较惊人的，需要就实际情况作权衡。这个也会对 df 的显示有影响。如果创建文件系统的时候需要修改，用&quot;-m&quot;参数指定特定的百分数。

虽说差不多每天都在用 Unix ，但是总有无数知识盲点.

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>手边有 AIX  以及 Linux 环境，df 算是我用的频率较高的系统命令了。这个小小的命令在不同的环境中差别还是很大的。比如 "-v" 这个参数，在 AIX 上可以配合 -k -m -g 等参数显示可读性更强的信息,  Linux 上只是为了兼容 System V 的 df 命令而保留 "-v"。在 Linux 上类似的命令 是 “-B” ，可以接 k 、m、g 等. 如 df -Bg 按照 GB 显示。如果同时维护这样的混合环境，在命令的使用上也要考虑“兼容性”。</p> 

<p>以前介绍过 <a href="http://www.dbanotes.net/opensource/gnu_core_utilities.html">GNU 核心工具</a>，不过没介绍那份有趣的 <a href="http://www.gnu.org/software/coreutils/faq/coreutils-faq.html">GNU Core Utilities FAQ</a>，前两天又重新读了一遍。多少有点新内容。比如那个比较经典的问题，“Linux 下 df 与 du 显示的为什么不一样" (我自己就<a href="http://www.dbanotes.net/database/tomcat.html">遇到过一次</a>)，在 FAQ 上更新了很有权威性的线索: <a href="http://www.gnu.org/software/coreutils/faq/coreutils-faq.html#df-and-du-report-different-information">df and du report different information</a>。</p>

<p>我这里补充一下的是，在比较大的文件系统上，保留给超级用户的数据块也可能会产生混淆。默认是 5%，如果文件系统比较大，这里的浪费还是比较惊人的，需要就实际情况作权衡。这个也会对 df 的显示有影响。如果创建文件系统的时候需要修改，用"-m"参数指定特定的百分数。</p>

<p>虽说差不多每天都在用 Unix ，但是总有无数知识盲点.</p>

<p>--EOF--<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>如何避免 Unix 环境中的 &apos;rm -f&apos; 灾难</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/unix_rm_-f.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1308" title="如何避免 Unix 环境中的 'rm -f' 灾难" />
    <id>tag:www.dbanotes.net,2007://1.1308</id>
    
    <published>2007-12-19T13:19:56Z</published>
    <updated>2007-12-19T12:20:28Z</updated>
    
    <summary>在 ITPub 论坛上，最近有朋友发起了一个&quot;请列出你在从事DBA生涯中,最难以忘怀的一次误操作&quot;话题讨论，如果有足够的耐心看下去的话，会发现很多误操作都是类似的，最上镜的就是这个操作系统级别的 &quot;rm -f&quot; / &quot;rm -rf&quot; 了。

在那本著名的 Unix 痛恨者手册 上，rm 问题也作为一个罪状而提出。的确，Unix/Linux 的这个 rm 的 -f 参数是系统管理员（SA)乃至数据库管理员(DBA)最容易引发系统灾难的导火索。

如何避免这样的灾难发生呢?

如果一个人能不犯任何误操作就好了。但这是不可能的。我相信肯定有很多 DBA 或 SA 到现在也没烦过这样的错误，但不要忘了墨菲定律的诅咒。

1.有安全的 rm 命令麽?
一种比较理想的是如果编译源代码的时候把这个 -f 选项去掉，肯定能让不少人少犯错误。不过搜索了整个网络，好像还真没有具体如何操作的。Sun 的 Solaris 10 对 rm 作了一点改进处理，&quot;rm -rf /&quot; 是不允许的。可惜的是 &quot;rm -rf *&quot;类似的操作是没限制的。另外，对于其他系统也不可用。或许，将来 GNU/Linux 能有改进。

2.Alias 方式
第二个方式是在 Profile 层次上设置命令别名( alias ).
alias rm=&quot;rm -i&quot;
这也是最常用的方式。如果脚本上直接调用了 rm  命令的全路径，还是不管用的。这其实也是如果功能上没办法完全禁止，那就提高用户的使用成本 :)

3.替代命令
第三个方法是使用替代命令。如用一个 del 命令来替代 rm. 这个就要挑战用户的使用习惯了。真的会始终用替代命令麽? 这个方式需要注意的是，无论如何不要真的把 rm 命令挪走(比如物理的 rename 名字)，如果这样，是很糟糕的策略。

4.修改权限
也有不少人直接把 rm 的权限修改，比如只允许 root 用户而不允许普通用户执行命令。这在调用一些脚本或者编译文件的时候，很容易引来很多麻烦。

任何一种策略，如果要扩大应用到一个团队的话，还需要考虑使用习惯对其他成员带来的影响。毕竟，&quot;不爽&quot;也会让很多人更容易犯错。

最后，友情提示，有的人经常通过层层跳板 Login 到主机上，可能会因为忘记了&quot;身在何处&quot; 而犯错误，最管用的方式是设置一下 PS1 环境变量。比如我在 Dreamhost 上用这样的：

PS1=&quot;\n\e[1;37m[\e[m\e[1;32m\u\e[m\e[1;33m@\e[m\e[1;35m\h\e[m \e[4m\`pwd\`\e[m\e[1;37m]\e[m\e[1;36m\n\e[m\\$ &quot; 

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>在 ITPub 论坛上，最近有朋友发起了一个"<a href="http://www.itpub.net/thread-911086-1-1.html">请列出你在从事DBA生涯中,最难以忘怀的一次误操作</a>"话题讨论，如果有足够的耐心看下去的话，会发现很多误操作都是类似的，最上镜的就是这个操作系统级别的 "rm -f" / "rm -rf" 了。</p>

<p>在那本著名的 <a href="http://research.microsoft.com/~daniel/unix-haters.html">Unix 痛恨者手册</a> 上，rm 问题也作为一个罪状而提出。的确，Unix/Linux 的这个 rm 的 -f 参数是系统管理员（SA)乃至数据库管理员(DBA)最容易引发系统灾难的导火索。</p>

<p>如何避免这样的灾难发生呢?</p>

<p>如果一个人能不犯任何误操作就好了。但这是不可能的。我相信肯定有很多 DBA 或 SA 到现在也没烦过这样的错误，但不要忘了<a href="http://www.dbanotes.net/database/murphys_law_dba.html">墨菲定律</a>的诅咒。</p>

<h4>1.有安全的 rm 命令麽?</h4>
<p>一种比较理想的是如果编译源代码的时候把这个 -f 选项去掉，肯定能让不少人少犯错误。不过搜索了整个网络，好像还真没有具体如何操作的。Sun 的 <a href="http://blogs.sun.com/jbeck/date/20041001#rm_rf_protection">Solaris 10 对 rm 作了一点改进处理</a>，"rm -rf /" 是不允许的。可惜的是 "rm -rf *"类似的操作是没限制的。另外，对于其他系统也不可用。或许，将来 GNU/Linux 能有改进。</p>

<h4>2.Alias 方式</h4>
<p>第二个方式是在 Profile 层次上设置命令别名( alias ).
<pre>alias rm="rm -i"</pre><br />
这也是最常用的方式。如果脚本上直接调用了 rm  命令的全路径，还是不管用的。这其实也是<strong>如果功能上没办法完全禁止，那就提高用户的使用成本</strong> :)</p>

<h4>3.替代命令</h4>
<p>第三个方法是使用替代命令。如<a href="http://uvalug.ue8.org/wiki/Rm_alternative">用一个 del 命令来替代 rm</a>. 这个就要挑战用户的使用习惯了。真的会始终用替代命令麽? 这个方式需要注意的是，无论如何不要真的把 rm 命令挪走(比如物理的 rename 名字)，如果这样，是很糟糕的策略。</p>

<h4>4.修改权限</h4>
<p>也有不少人直接把 rm 的权限修改，比如只允许 root 用户而不允许普通用户执行命令。这在调用一些脚本或者编译文件的时候，很容易引来很多麻烦。</p>

<p>任何一种策略，如果要扩大应用到一个团队的话，还需要考虑使用习惯对其他成员带来的影响。毕竟，"不爽"也会让很多人更容易犯错。</p>

<p>最后，友情提示，有的人经常通过层层跳板 Login 到主机上，可能会因为忘记了"身在何处" 而犯错误，最管用的方式是设置一下 PS1 环境变量。比如我在 Dreamhost 上用这样的：</p>

<pre>PS1="\n\e[1;37m[\e[m\e[1;32m\u\e[m\e[1;33m@\e[m\e[1;35m\h\e[m \e[4m\`pwd\`\e[m\e[1;37m]\e[m\e[1;36m\n\e[m\\$ "</pre> 

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>Linux 的 多路径 IO 技术</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/linux_mpio.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1299" title="Linux 的 多路径 IO 技术" />
    <id>tag:www.dbanotes.net,2007://1.1299</id>
    
    <published>2007-12-10T12:51:40Z</published>
    <updated>2007-12-10T11:20:54Z</updated>
    
    <summary>作为 DBA，多多少少要关注点儿关于主机到存储这段链路上 IO 的可靠性问题，Multipath I/O(MPIO) 是需要要了解一下的。业界 MPIO 相关的软件不下几十种，但商业软件居多，开源的似乎只有 Device-Mapper，这也是 Linux Kernel 支持的多路径 IO 软件解决方案。

Redhat 应该是从  RHEL4 U2 开始正式增加的对 Device Multipath IO (MPIO) 的支持。SuSE Linux 则是在 SLES9.2 以后就提供支持了，谁先谁后我还真的不知道，不过SuSE 在这方面还真是一直比较激进，或许这也反映了追赶者的一些急躁心态。

关于如何设置 DM 可以参考 RedHat 站点上的一篇  FAQ：How do I setup device-mapper multipathing in Red Hat Enterprise Linux 4?。对于 RHEL 5 ，有一本 Using Device-Mapper Multipath 手册。另外，这里有篇中文的测试，步骤比较详细。 

有些存储厂商在 Linux 上没有自己专有的多路径工具，如果需要类似的功能一般是推荐用 DM，但是我对负载均衡算法还有些持保留意见。 IO 路径选择器只有默认的 round-robin 。在负载均衡配置下，似乎这东西每个路径 在 1000 个 IO 之上就会重新选择路径(这个地方我不确定，谁来澄清一下?)。没有最小 IO 队列算法和最小服务时间等算法可供选择。

涉及到的 Oracle 支持情况: Oracle ASM 支持 DM 映射出来的设备. 

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>作为 DBA，多多少少要关注点儿关于主机到存储这段链路上 IO 的可靠性问题，Multipath I/O(MPIO) 是需要要了解一下的。业界 MPIO 相关的软件不下<a href="http://en.wikipedia.org/wiki/Multipath_I/O">几十种</a>，但商业软件居多，开源的似乎只有 <a href="http://sourceware.org/dm/">Device-Mapper</a>，这也是 Linux Kernel 支持的多路径 IO 软件解决方案。</p>

<p>Redhat 应该是从  RHEL4 U2 开始正式增加的<a href="http://www.redhat.com/docs/manuals/enterprise/RHEL-4-Manual/release-notes/as-x86/RELEASE-NOTES-U2-x86-en.html">对 Device Multipath IO (MPIO) 的支持</a>。SuSE Linux 则是在 <a href="http://support.novell.com/techcenter/sdb/en/2005/04/sles_multipathing.html">SLES9.2 以后就提供支持了</a>，谁先谁后我还真的不知道，不过SuSE 在这方面还真是一直比较激进，或许这也反映了追赶者的一些急躁心态。</p>

<p>关于如何设置 DM 可以参考 RedHat 站点上的一篇  <a href="http://kbase.redhat.com/faq/FAQ_51_7170.shtm">FAQ：How do I setup device-mapper multipathing in Red Hat Enterprise Linux 4?</a>。对于 RHEL 5 ，有一本 <a href="http://www.redhat.com/docs/manuals/enterprise/RHEL-5-manual/en-US/RHEL510/DM_Multipath/index.html">Using Device-Mapper Multipath</a> 手册。另外，这里有篇<a href="http://mlsx.xplore.cn/read.php/342.htm">中文的测试</a>，步骤比较详细。 </p>

<p>有些存储厂商在 Linux 上没有自己专有的多路径工具，如果需要类似的功能一般是推荐用 DM，但是我对负载均衡算法还有些持保留意见。 IO 路径选择器只有默认的 <a href="http://lwn.net/Articles/123133/">round-robin</a> 。在负载均衡配置下，似乎这东西每个路径 在 1000 个 IO 之上就会重新选择路径(这个地方我不确定，谁来澄清一下?)。没有<strong>最小 IO 队列</strong>算法和<strong>最小服务时间</strong>等算法可供选择。</p>

<p>涉及到的 Oracle 支持情况: Oracle ASM 支持 DM 映射出来的设备. </p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>Linux 如何不重启而识别新增的 LUN</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/add_lun_without_reboot_linux.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1296" title="Linux 如何不重启而识别新增的 LUN" />
    <id>tag:www.dbanotes.net,2007://1.1296</id>
    
    <published>2007-12-07T14:59:54Z</published>
    <updated>2007-12-07T14:48:02Z</updated>
    
    <summary>有些 Linux 数据库服务器用的比较低端的存储，因为业务的变化，有时候需要新增一些 LUN。Linux 服务器添加 LUN 后必须要重启动 ? 有的时候存储厂商工程师也这么说，不过这似乎是一个一直被误解的信息。

从专攻存储的同事那里得知利用 QLogic FC HBA LUN Scan Utility 这个脚本即可无需重启动系统而识别新添加的 LUN。也无需对 QLogic FC driver 的重新 Load。

场景：Linux Server + QLogic 的 HBA 卡 。以 QLogic 的 Qla2340 HBA 卡为例。下载该脚本(顺便说一下，该页面的 QLogic FC HBA Information Utility 也比较有用)。然后看一下脚本说明文件。

用法最简单只需要运行： 
# ./ql-dynamic-tgt-lun-disc.sh

脚本会提示在没有活动 IO 的情况下运行。其实问题不大的了。 之后确认 OS 识别到新设备:

 # fdisk -l  

如果系统中有 PowerPath ,还需要运行： 

# powermt config 

OK。多少提高了一点系统可用性，你可以不用向老板申请停机维护了。 

附：另外一篇参考文档.

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<pre>插播一则广告：来自 <a href="http://www.itpub.net/">ITpub</a> 的朋友请帮忙<a href="http://www.itpub.net/thread-904138-1-1.html">投一票</a>。<br />拉票这事情我还真的干得不多，第一次搞，脸皮虽然厚也有些发烧，因为已经有DBA在说“熙熙攘攘"了。</pre>

<p>有些 Linux 数据库服务器用的比较低端的存储，因为业务的变化，有时候需要新增一些 LUN。Linux 服务器添加 LUN 后必须要重启动 ? 有的时候存储厂商工程师也这么说，不过这似乎是一个一直被误解的信息。</p>

<p>从专攻存储的同事那里得知利用 QLogic FC HBA LUN Scan Utility 这个脚本即可无需重启动系统而识别新添加的 LUN。也无需对 QLogic FC driver 的重新 Load。</p>

<p>场景：Linux Server + QLogic 的 HBA 卡 。以 QLogic 的 Qla2340 HBA 卡为例。下载<a href="http://support.qlogic.com/support/oem_product_detail.asp?p_id=253&oemid=65&oemname=QLA2340">该脚本</a>(顺便说一下，该页面的 QLogic FC HBA Information Utility 也比较有用)。然后看一下脚本<a href="http://download.qlogic.com/drivers/57612/README.qlscan.txt">说明文件</a>。</p>

<p>用法最简单只需要运行：</p> 
<pre># ./ql-dynamic-tgt-lun-disc.sh</pre>

<p>脚本会提示在没有活动 IO 的情况下运行。其实问题不大的了。 之后确认 OS 识别到新设备:</p>

<pre> # fdisk -l </pre> 

<p>如果系统中有 PowerPath ,还需要运行： </p>

<pre># powermt config </pre>

<p>OK。多少提高了一点系统可用性，你可以不用向老板申请停机维护了。</p> 

<p>附：另外一篇<a href="http://www.dice.inf.ed.ac.uk/groups/services/file_service/docs/adding-luns.html">参考文档</a>.</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>EMC CLARiiON 的 Alignment offset</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/emc_clariion_alignment_offset.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1287" title="EMC CLARiiON 的 Alignment offset" />
    <id>tag:www.dbanotes.net,2007://1.1287</id>
    
    <published>2007-11-29T16:08:22Z</published>
    <updated>2007-11-29T15:33:33Z</updated>
    
    <summary>今天参加了 EMC 组织的存储技术培训。因为频繁被电话打扰，导致听课效果并不是那么好。很多内容似曾相识，只是都断断续续的，几乎每次培训都是这样的，总有&quot;断点&quot;。

上午是 CLARiiON 的简单介绍，在模拟操作的时候我发现了以前漏掉的一个盲点：Binding LUN 的时候，那个 Alignment Offset 的选项到底是干啥的?  讲师简单说了一下，感觉不太对路子。刚才闲下来，查找了一下这个信息，大致搞明白了这个 ”Alignment offset“。

用 ”Alignment offset EMC“ 作关键字搜索到的第一篇文档是 Dell 工程师写的。这里面用了一个词 &quot;signature block&quot; , 莫名的一个词，我相信是 Dell 工程师自己发明的(用 Metadata 不就得了)。另外两个关键词是 &quot;Windows&quot; 和 &quot;31.5KB&quot; ，为啥是 31.5KB ，不知道。接下来在 EMC 的 Powerlink 网站上找到了比较详细的说明。

首先确定一下，这个问题更多是影响 Windows 系统。

老的 BIOS 代码，使用 ”柱面、磁头、扇区数“这一套机制而不是 LBA （Logical block addressing ）的模式来寻址。Linux  的 fdisk 工具还是 Windows 磁盘管理器，在每个格式化的设备上都放置一份 MBR 。这个 MBR 占用 63 个隐含扇区 (63*512=31.5KB, Bingo!)。这个问题在 Windows 上存在，在 VMware 上也存在，offset 同样是 63。 在有些 Linux 上，因为 Boot Loader 的不同，也会有类似的问题。

无视 Alignment offset 会导致的问题:



如图所示，一个 IO 会分裂到两个 Disk(Device/LUN) 上去，后果很严重。和我以前描述过的 4k Offset 问题本质上是一样的。只是这个是针对文件系统的。

那么，如何校正这个 ”对齐偏移量&quot; 呢?  

存储厂商的推荐是如果用 Snap View / SAN Copy 等存储级别的操作的话，不要折腾，用系统默认的就成，否则，用主机端的解决方案。

主机端的解决方案分为 Windows 32位、Windows 64 位、Linux、VMware 几种。

1） 对于 32 位的 Windows ，使用 Windows 系统资源包的 diskpar.exe  来设定 offset ( 据说 Windows 2003 SP1 上的 diskpart.exe 已经具备了 diskpar.exe 的功能。refer)

2）对于 64 位的 Windows ，GPT(GUID Partition Table)类型的分区默认有 32M 保留区，MBR 类型的分区自动校准。不存在这个问题。这就是 64位 的 Windows 众多优点之一啊。

3)  对于 Linux ，fdisk /dev/{devicename} 然后进入 expert 模式, 然后输入 b ...

4)  对于 VMware，分为两种情况。虚拟机层（用虚拟机下操作系统的方案) 以及 ESX 服务器层 (fdisk). 

上面几个步骤描述不详细，更详细的介绍你需要寻找一份白皮书： EMC CLARiion Best Practices for Fibre Channel Storage ，这个白皮书有针对 Flare 不同版本的，Flare 2.6 对这个问题有了比较好的改进。

是的，有的时候白皮书就在那里，只是没有人注意，没有看而已。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>今天参加了 EMC 组织的存储技术培训。因为频繁被电话打扰，导致听课效果并不是那么好。很多内容似曾相识，只是都断断续续的，几乎每次培训都是这样的，总有"断点"。</p>

<p>上午是 CLARiiON 的简单介绍，在模拟操作的时候我发现了以前漏掉的一个盲点：Binding LUN 的时候，那个 <strong>Alignment Offset </strong>的选项到底是干啥的?  讲师简单说了一下，感觉不太对路子。刚才闲下来，查找了一下这个信息，大致搞明白了这个 ”Alignment offset“。</p>

<p>用 ”Alignment offset EMC“ 作关键字搜索到的<a href="www.dell.com/downloads/global/power/ps4q04-20040149-Mehis.pdf">第一篇文档</a>是 Dell 工程师写的。这里面用了一个词 "signature block" , 莫名的一个词，我相信是 Dell 工程师自己发明的(用 Metadata 不就得了)。另外两个关键词是 "Windows" 和 "31.5KB" ，为啥是 31.5KB ，不知道。接下来在 EMC 的 Powerlink 网站上找到了比较详细的说明。</p>

<p>首先确定一下，<strong>这个问题更多是影响 Windows 系统</strong>。</p>

<p>老的 BIOS 代码，使用 ”柱面、磁头、扇区数“这一套机制而不是 LBA （Logical block addressing ）的模式来寻址。Linux  的 fdisk 工具还是 Windows 磁盘管理器，在每个格式化的设备上都放置一份 MBR 。这个 MBR 占用 63 个隐含扇区 (63*512=31.5KB, Bingo!)。这个问题在 Windows 上存在，在 VMware 上也存在，offset 同样是 63。 在有些 Linux 上，因为 Boot Loader 的不同，也会有类似的问题。</p>

<p>无视 Alignment offset 会导致的问题:</p>

<p><span class="mt-enclosure mt-enclosure-image"><img alt="alignment_offset.png" src="http://www.dbanotes.net/Images/alignment_offset.png" width="543" height="219" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span></p>

<p>如图所示，一个 IO 会分裂到两个 Disk(Device/LUN) 上去，后果很严重。和我以前描述过的 <a href="http://www.dbanotes.net/database/aix_raw_lvm_4k_offset.html">4k Offset</a> 问题本质上是一样的。只是这个是<strong>针对文件系统</strong>的。</p>

<p>那么，如何校正这个 ”对齐偏移量" 呢?  </p>

<p>存储厂商的推荐是如果用 Snap View / SAN Copy 等存储级别的操作的话，不要折腾，用系统默认的就成，否则，用主机端的解决方案。</p>

<p>主机端的解决方案分为 Windows 32位、Windows 64 位、Linux、VMware 几种。</p>

<p>1） 对于 32 位的 Windows ，使用 Windows 系统资源包的 diskpar.exe  来设定 offset ( 据说 Windows 2003 SP1 上的 diskpart.exe 已经具备了 diskpar.exe 的功能。<a href="http://geekswithblogs.net/ntpro/archive/2005/08/11/49948.aspx">refer</a>)</p>

<p>2）对于 64 位的 Windows ，GPT(GUID Partition Table)类型的分区默认有 32M 保留区，MBR 类型的分区自动校准。不存在这个问题。这就是 64位 的 Windows 众多优点之一啊。</p>

<p>3)  对于 Linux ，fdisk /dev/{devicename} 然后进入 expert 模式, 然后输入 b ...</p>

<p>4)  对于 VMware，分为两种情况。虚拟机层（用虚拟机下操作系统的方案) 以及 ESX 服务器层 (fdisk). </p>

<p>上面几个步骤描述不详细，更详细的介绍你需要寻找一份白皮书： EMC CLARiion Best Practices for Fibre Channel Storage ，这个白皮书有针对 Flare 不同版本的，Flare 2.6 对这个问题有了比较好的改进。</p>

<p>是的，有的时候白皮书就在那里，只是没有人注意，没有看而已。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>AIX 6 新特性关注点</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/aix_6_new_features.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1271" title="AIX 6 新特性关注点" />
    <id>tag:www.dbanotes.net,2007://1.1271</id>
    
    <published>2007-11-12T12:32:52Z</published>
    <updated>2007-11-12T11:28:25Z</updated>
    
    <summary>IBM 为配合 Power 6 CPU 而推出的 AIX 6 即将正式发布。在 AIX 5 的基础上学习 AIX 6，最好的入手点就是 IBM AIX Version 6.1 Differences Guide（PDF) 了。匆匆看了一下，记录几个比较感兴趣的点。

JFS2 的新特性
关掉 JFS2 的 Log: mount 的时候 log=NULL  可以关掉 JFS2 的日志。在一些特定的场合(如：恢复)会比较有用。另外一个特性是内部快照(internal snapshot)，即可以在同一文件系统上创建快照。

限制每进程的线程数
在以前的版本中这是做不到的，AIX 6 可以通过静态或者动态的方式修改每个进程的线程数量。属性由RLIMIT_THREADS 与 RLIMIT_NPROC 值控制. ulimit -a 可以查看值。

线程环境变量 pthread 1:1
pthread 也就是 POSIX Threads，AIX 6 对 &quot;contention scope&quot; 的 m:n 做了调整。

AIX 5 上 跑 Oracle RDBMS, Oracle  建议 export AIXTHREAD_SCOPE=S. 看来以后不用这么费事了。

补充一下这个 M:N ，一共有三种:

M:1 (Library) 模型：M:1 (库模型）,每个进程都有一个核心线程。竞争范围：process(本地) 
1:1 (Kernel)  模型：每个用户线程都有自己的核心线程。竞争范围：system (全局)
M:N (Hybrid) 模型：M 个 用户线程对应 N 个 Kernel 线程。默认是 8:1(AIXTHREAD_MNRATIO) 。竞争范围：以上两种方式混合)



这个变化多少了反映了 IBM 在计算模式变化的方向上的倾斜。

动态虚拟内存 Page Size 
AIX 6 支持四种值，4k、64K、16M、64GB. 一个新的需要知道的缩写：Dynamic variable page size support (VPSS)。VMM 可以动态修改 Page size ; 大的 page size 对应用是透明的(是不是会触发Bug，鬼才知道); 硬件支持(Power 6)的情况下 VPSS 是激活的。

”限制性可调“的核心参数
AIX 6 对一些比较关键的参数划了个类别：”限制性可调“(restriccted tunables) ，调整的时候会警告用户, 建议在厂商指导下进行:)

其他
安装程序更新了，现在是......图形化安装了

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>IBM 为配合 Power 6 CPU 而推出的 AIX 6 即将正式发布。在 AIX 5 的基础上学习 AIX 6，最好的入手点就是 <a href="http://www.redbooks.ibm.com/redpieces/pdfs/sg247559.pdf">IBM AIX Version 6.1 Differences Guide</a>（PDF) 了。匆匆看了一下，记录几个比较感兴趣的点。</p>

<h4>JFS2 的新特性</h4>
<p>关掉 JFS2 的 Log: mount 的时候 log=NULL  可以关掉 JFS2 的日志。在一些特定的场合(如：恢复)会比较有用。另外一个特性是<strong>内部快照</strong>(internal snapshot)，即可以在同一文件系统上创建快照。</p>

<h4>限制每进程的线程数</h4>
<p>在以前的版本中这是做不到的，AIX 6 可以通过静态或者动态的方式修改每个进程的线程数量。属性由RLIMIT_THREADS 与 RLIMIT_NPROC 值控制. ulimit -a 可以查看值。</p>

<h4>线程环境变量 pthread 1:1</h4>
<p>pthread 也就是 POSIX Threads，AIX 6 对 "contention scope" 的 m:n 做了调整。
<span class="mt-enclosure mt-enclosure-image"><img alt="aix_pthread.png" src="http://www.dbanotes.net/Images/aix_pthread.png" width="490" height="100" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span>
AIX 5 上 跑 Oracle RDBMS, Oracle  建议 export AIXTHREAD_SCOPE=S. 看来以后不用这么费事了。</p>

<p>补充一下这个 M:N ，一共有三种:</p>

<ul><li>M:1 (Library) 模型：M:1 (库模型）,每个进程都有一个核心线程。竞争范围：process(本地) </li>
<li>1:1 (Kernel)  模型：每个用户线程都有自己的核心线程。竞争范围：system (全局)</li>
<li>M:N (Hybrid) 模型：M 个 用户线程对应 N 个 Kernel 线程。默认是 8:1(AIXTHREAD_MNRATIO) 。竞争范围：以上两种方式混合)</li></ul>

<p><span class="mt-enclosure mt-enclosure-image"><img alt="pthread_scope.png" src="http://www.dbanotes.net/Images/pthread_scope.png" width="313" height="311" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span></p>

<p>这个变化多少了反映了 IBM 在计算模式变化的方向上的倾斜。</p>

<h4>动态虚拟内存 Page Size </h4>
<p>AIX 6 支持四种值，4k、64K、16M、64GB. 一个新的需要知道的缩写：Dynamic variable page size support (VPSS)。VMM 可以动态修改 Page size ; 大的 page size 对应用是透明的(是不是会触发Bug，鬼才知道); 硬件支持(Power 6)的情况下 VPSS 是激活的。<br /></p>

<h4>”限制性可调“的核心参数</h4>
<p>AIX 6 对一些比较关键的参数划了个类别：”限制性可调“(restriccted tunables) ，调整的时候会警告用户, 建议在厂商指导下进行:)</p>

<h4>其他</h4>
<p>安装程序更新了，现在是......图形化安装了</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>Amazon 的 Dynamo 架构</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/amazon_dynamo.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1245" title="Amazon 的 Dynamo 架构" />
    <id>tag:www.dbanotes.net,2007://1.1245</id>
    
    <published>2007-10-10T11:28:15Z</published>
    <updated>2007-10-10T11:28:36Z</updated>
    
    <summary>我在 DBAnotes.net 上记录过不少比较大的网站架构分析(eg: eBay [1], eBay [2]) ，Amazon 一直找不到太多的资料。国庆期间读到了一篇关于 Amazon Dynamo 的论文，非常精彩。Amazon Dynamo 这个高可用、可扩展存储体系支撑了Amazon 不少核心服务.

先看一个示意图:



从上图可以看出，Amazon 的架构是完全的分布式，去中心化。存储层也做到了分布式。

Dynamo 概述
Dynamo 的可扩展性和可用性采用的都比较成熟的技术，数据分区并用改进的一致性哈希(consistent hashing)方式进行复制，利用数据对象的版本化实现一致性。复制时因为更新产生的一致性问题的维护采取类似 quorum 的机制以及去中心化的复制同步协议。 Dynamo  是完全去中心化的系统，人工管理工作很小。

强调一下 Dynamo 的&quot;额外&quot;特点：
1) 总是可写
2) 可以根据应用类型优化

关键词
Key: Key 唯一代表一个数据对象，对该数据对象的读写操通过 Key 来完成.节点(node)：通常是一台自带硬盘的主机。每个节点有三个 Java 写的组件：请求协调器(request coordination)、成员与失败检测、本地持久引擎(local persistence engine)实例(instance)；每个实例由一组节点组成，从应用的角度看，实例提供 IO 能力。一个实例上的节点可能位于不同的数据中心内, 这样一个数据中心出问题也不会导致数据丢失。

上面提到的本地持久引擎支持不同的存储引擎。Dynamo 上最主要的引擎是 Berkeley Database Transactional Data Store(存储处理数百K的对象更为适合），其他还有 BDB Java Edition、MySQL 以及 一致性内存 Cache 等等。

三个关键参数 (N,R,W) 

第一个关键参数是 N，这个 N 指的是数据对象将被复制到 N 台主机上，N 在 Dynamo 实例级别配置，协调器将负责把数据复制到 N-1 个节点上。N 的典型值设置为 3. 

复制中的一致性，采用类似于 Quorum 系统的一致性协议实现。这个协议有两个关键值：R 与 W。R 代表一次成功的读取操作中最小参与节点数量，W 代表一次成功的写操作中最小参与节点数量。R +  W&gt;N ，则会产生类似 quorum 的效果。该模型中的读(写)延迟由最慢的 R(W)复制决定，为得到比较小的延迟，R 和 W 有的时候的和又设置比 N 小。

(N,R,W) 的值典型设置为 (3, 2 ,2),兼顾性能与可用性。R 和 W 直接影响性能、扩展性、一致性，如果 W 设置 为 1，则一个实例中只要有一个节点可用，也不会影响写操作，如果 R 设置为 1 ，只要有一个节点可用，也不会影响读请求，R 和 W 值过小则影响一致性，过大也不好，这两个值要平衡。对于这套系统的典型的 SLA 要求 99.9% 的读写操作在 300ms 内完成。


--待续--
</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>我在 <a href="http://dbanotes.net/">DBAnotes.net</a> 上记录过不少比较大的网站架构分析(eg: <a href="http://www.dbanotes.net/database/ebay_storage.html">eBay [1]</a>, <a href="http://www.dbanotes.net/database/ebay_database_scale_out.html">eBay [2]</a>) ，Amazon 一直找不到太多的资料。国庆期间读到了一篇<a href="http://www.allthingsdistributed.com/files/amazon-dynamo-sosp2007.pdf">关于 Amazon Dynamo 的论文</a>，非常精彩。Amazon Dynamo 这个<strong>高可用、可扩展存储体系</strong>支撑了Amazon 不少核心服务.</p>

<p>先看一个示意图:</p>

<p><span class="mt-enclosure mt-enclosure-image"><img alt="Amazon_sosp.png" src="http://www.dbanotes.net/Images/Amazon_sosp.png" width="311" height="400" class="mt-image-center" style="text-align: center; display: block; margin: 0 auto 20px;"/></span></p>

<p>从上图可以看出，Amazon 的架构是完全的分布式，去中心化。存储层也做到了分布式。</p>

<h4>Dynamo 概述</h4>
<p>Dynamo 的可扩展性和可用性采用的都比较成熟的技术，数据分区并用改进的一致性哈希(consistent hashing)方式进行复制，利用数据对象的版本化实现一致性。复制时因为更新产生的一致性问题的维护采取类似 quorum 的机制以及去中心化的复制同步协议。 Dynamo  是完全去中心化的系统，人工管理工作很小。</p>

<p>强调一下 Dynamo 的"额外"特点：<br />
1) <strong>总是可写</strong><br />
2) 可以根据应用类型优化</p>

<h4>关键词</h4>
<p><strong>Key</strong>: Key 唯一代表一个数据对象，对该数据对象的读写操通过 Key 来完成.<br /><strong>节点(node)</strong>：通常是一台自带硬盘的主机。每个节点有三个 Java 写的组件：请求协调器(request coordination)、成员与失败检测、本地持久引擎(local persistence engine)<br /><strong>实例(instance)</strong>；每个实例由一组节点组成，从应用的角度看，实例提供 IO 能力。一个实例上的节点可能位于不同的数据中心内, 这样一个数据中心出问题也不会导致数据丢失。</p>

<p>上面提到的本地持久引擎支持不同的存储引擎。Dynamo 上最主要的引擎是 Berkeley Database Transactional Data Store(存储处理数百K的对象更为适合），其他还有 BDB Java Edition、MySQL 以及 一致性内存 Cache 等等。</p>

<h4>三个关键参数 (N,R,W) </h4>

<p>第一个关键参数是 N，这个 N 指的是数据对象将被复制到 N 台主机上，N 在 Dynamo 实例级别配置，协调器将负责把数据复制到 N-1 个节点上。N 的典型值设置为 3. </p>

<p>复制中的一致性，采用类似于 Quorum 系统的一致性协议实现。这个协议有两个关键值：R 与 W。R 代表一次成功的读取操作中最小参与节点数量，W 代表一次成功的写操作中最小参与节点数量。R +  W>N ，则会产生类似 quorum 的效果。该模型中的读(写)延迟由最慢的 R(W)复制决定，为得到比较小的延迟，R 和 W 有的时候的和又设置比 N 小。</p>

<p>(N,R,W) 的值典型设置为 (3, 2 ,2),兼顾性能与可用性。R 和 W 直接影响性能、扩展性、一致性，如果 W 设置 为 1，则一个实例中只要有一个节点可用，也不会影响写操作，如果 R 设置为 1 ，只要有一个节点可用，也不会影响读请求，R 和 W 值过小则影响一致性，过大也不好，这两个值要平衡。对于这套系统的典型的 SLA 要求 99.9% 的读写操作在 300ms 内完成。</p>

<p><br />
--待续--<br />
</p>]]>
        
    </content>
</entry>

<entry>
    <title>如何确保 Shell 脚本只有一个实例运行</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/how_to_run_shell_script_only_on_instance.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1216" title="如何确保 Shell 脚本只有一个实例运行" />
    <id>tag:www.dbanotes.net,2007://1.1216</id>
    
    <published>2007-09-04T14:36:23Z</published>
    <updated>2007-09-07T08:05:49Z</updated>
    
    <summary>在做维护的时候，经常要写一些脚本定期检查一些状态信息，而比较糟的时候可能该脚本在执行周期内没完成，接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。

必需要承认，要做到 100% 的完美可能需要长篇大论才可以做到。如果对于粒度要求不高，这里总结两个粗糙的方法。

一个是在脚本执行的时候判断某个文件的存在，如果不存在，则 touch 创建该文件(该文件看作一个&quot;占座&quot;文件)，脚本执行完毕的时候删掉。第二个进程如果启动，判断有该文件存在，则退出或者是 sleep 几秒钟重新判断。这个方法的关键是在删掉&quot;占座&quot;文件的处理方式上。必需要考虑到程序异常、被 Kill 等多个情况。根据需要 trap 搞一下。

第二个方法是过滤脚本的名字(当然最好把脚本起个独特一点容易过滤的名字)，计数，如果存在一个或者多个 instance , 则退出或者 sleep 等待。否则执行脚本。这个方法最简单，但是移植性似乎要差一点，需要考虑不同平台或 Shell 上的表现。

这两个方法都太粗糙了，经不起考究，但是对于 99% 的系统可能都足够用了。反过来说，如果一个系统对于脚本运行的粒度要求非常高，需要考虑到操作的原子性，那么 Shell 或许并不适合完成这个任务。

解决问题就好，过分炫技不可取。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>在做维护的时候，经常要写一些脚本定期检查一些状态信息，而比较糟的时候可能该脚本在执行周期内没完成，接着第二个脚本又开始跑了。如何确保 Shell 脚本只有一个实例运行就成了一个比较有意思的话题。</p>

<p>必需要承认，要做到 100% 的完美可能需要长篇大论才可以做到。如果对于粒度要求不高，这里总结两个粗糙的方法。</p>

<p>一个是在脚本执行的时候判断某个文件的存在，如果不存在，则 touch 创建该文件(该文件看作一个"占座"文件)，脚本执行完毕的时候删掉。第二个进程如果启动，判断有该文件存在，则退出或者是 sleep 几秒钟重新判断。这个方法的关键是在删掉"占座"文件的处理方式上。必需要考虑到程序异常、被 Kill 等多个情况。根据需要 trap 搞一下。</p>

<p>trap  和 kill 命令的 -l 参数能够列出你想要的内容</p> 

<p>第二个方法是过滤脚本的名字(当然最好把脚本起个独特一点容易过滤的名字)，计数，如果存在一个或者多个 instance , 则退出或者 sleep 等待。否则执行脚本。这个方法最简单，但是移植性似乎要差一点，需要考虑不同平台或 Shell 上的表现。</p>

<p>这两个方法都太粗糙了，经不起考究，但是对于 99% 的系统可能都足够用了。反过来说，如果一个系统对于脚本运行的粒度要求非常高，需要考虑到操作的原子性，那么 Shell 或许并不适合完成这个任务。</p></p>

<p>解决问题就好，过分炫技不可取。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>FeedLounge 使用 PostgreSQL 的经验</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/feedlounge_postgresql.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1139" title="FeedLounge 使用 PostgreSQL 的经验" />
    <id>tag:www.dbanotes.net,2007://1.1139</id>
    
    <published>2007-06-15T10:38:41Z</published>
    <updated>2007-06-15T10:38:14Z</updated>
    
    <summary>这是我唯一看到的 Web 2.0 公司使用 PostgreSQL 的，可惜还失败了。

FeedLounge 是一个提供在线 RSS Reader 的站点。已经在今年 6 月 1 日黯然宣布失败。这里不去讨论他们失败的各种原因，只说说从他们 Blog 上看来的关于他们选择数据库的经验。

FeedLounge 在数据库的使用上路线是这样的：

MySQL(MyISAM) --&gt; MySQL(InnoDB) --&gt; PostgreSQL 

最初是 MyISAM 方式，迁移到 InnoDB ，数据库从大约 1G 膨胀超出了 10G，而且发现引发了新的性能问题，经过尝试发现不能解决后，迁移到 PostgreSQL，总存储从 InnoDB 方式的 34G 缩小到 9.6G,而且，恢复时间也只是原来的大约 1/5 (导出用 Mysqldump,载入用 psql ). 此外，关于内存利用方式上也有一些差异,  MySQL : innodb_buffer_pool 6GB + O_DIRECT flush, PostgreSQL 设置上限 2G，只用了 1.2 G。遗憾的是，看不到切换前后性能数据更为详细的对比。

FeedLounge 当时每天要处理的事务量：每天超过 400 万次查询，超过 200 万次的更新/插入操作，高峰期每秒钟有 2000 个更新/插入操作(这应该是批处理阶段)。硬件如何呢? 数据库服务器的硬件：两路 Opteron CPU，8 GB 内存， 6 SATA 7200RPM 16MB 硬盘， RAID 5 ，控制器有 128M. 可以看出来了吧， 7200 转的硬盘 + RAID 5 根本不适合这样的应用。从这一点上说，数据库类型切换其实解决不了本质的问题。

另外看到的有趣参考信息：

FeedDigest 在当时每天有超过 400 万次的查询，超过 200 万次插入，机器硬件只用了双奔四 CPU(2.8GHz) ，1G内存

--EOF--

</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>这是我唯一看到的 Web 2.0 公司使用 <a href="http://www.postgresql.org/">PostgreSQL</a> 的，可惜还失败了。</p>

<p><a href="http://feedlounge.com/">FeedLounge</a> 是一个提供在线 RSS Reader 的站点。已经在今年 6 月 1 日黯然<a href="http://feedlounge.com/blog/2007/06/01/all-subscriptions-cancelled/">宣布失败</a>。这里不去讨论他们失败的各种原因，只说说从他们 Blog 上看来的关于他们选择数据库的经验。</p>

<p>FeedLounge 在数据库的使用上路线是这样的：</p>

<pre>MySQL(MyISAM) --> MySQL(InnoDB) --> PostgreSQL </pre>

<p>最初是 MyISAM 方式，迁移到 InnoDB ，数据库从大约 1G 膨胀超出了 10G，而且发现引发了新的性能问题，经过尝试发现不能解决后，迁移到 PostgreSQL，总存储从 InnoDB 方式的 34G 缩小到 9.6G,而且，恢复时间也只是原来的大约 1/5 (导出用 Mysqldump,载入用 psql ). 此外，关于内存利用方式上也有一些差异,  MySQL : innodb_buffer_pool 6GB + O_DIRECT flush, PostgreSQL 设置上限 2G，只用了 1.2 G。遗憾的是，看不到切换前后性能数据更为详细的对比。</p>

<p>FeedLounge 当时每天要处理的事务量：每天超过 400 万次查询，超过 200 万次的更新/插入操作，高峰期每秒钟有 2000 个更新/插入操作(这应该是批处理阶段)。硬件如何呢? 数据库服务器的硬件：两路 Opteron CPU，8 GB 内存， 6 SATA 7200RPM 16MB 硬盘， RAID 5 ，控制器有 128M. 可以看出来了吧， <strong>7200 转的硬盘 + RAID 5 根本不适合这样的应用</strong>。从这一点上说，数据库类型切换其实解决不了本质的问题。</p>

<p>另外看到的有趣参考信息：</p>

<p>FeedDigest 在当时每天有超过 400 万次的查询，超过 200 万次插入，机器硬件只用了双奔四 CPU(2.8GHz) ，1G内存</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>用 Rsync(cwRsync)备份 Dreamhost 到 Windows 上</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/rsync_cwrsync_backup_dreamhost_to_windows.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1128" title="用 Rsync(cwRsync)备份 Dreamhost 到 Windows 上" />
    <id>tag:www.dbanotes.net,2007://1.1128</id>
    
    <published>2007-06-08T11:07:11Z</published>
    <updated>2007-06-08T10:12:19Z</updated>
    
    <summary>因为这次 Dreamhost 的安全问题，不得不考虑调整站点备份的周期。备份方式是利用 cxRsync 通过 SSH 通道备份数据到本地 Windows 上。Rsync 在 Windows 上的实现有好几个包装好的工具，比如 DeltaCopy 、Unison 等。经过比较还是觉得 cxRsync 最好用. 

cwRsync 的优点: 1) 配置简单。已经包装了 crgwin 库文件，下载安装就能直接调用命令进行同步。
2) 命令行即可操作. 与 Unix 上基本一样(DeltaCopy 则是图形化的，Unison 还需要熟悉后才可以)。

基本操作步骤:
1) 下载，安装 cwRsync.
2) (可选, Dreamhost 的安全都这样糟了，还不如直接用密码登录安全呢,嘿)创建 Key, 进入命令行模式, 调用 ssh-keygen 命令创建 Key. 公钥和私钥存储的位置就放在默认的位置即可。完成后将公钥串存入 ~/.ssh/authorized_keys 文件内。
3) 进入命令行模式, 调用 rsync 命令：
rsync  --exclude=&quot;/home/foo/tmp/&quot; -avz foo@www.foobar.net:foobar.net/ \ MySites\www.foobar.net\ 

说明: --exclude 过滤掉一些无关紧要的目录,比如 MT 目录下的 Cache 信息等，foo 和 foobar 请根据自己的情况做适当的替换。
 
最后，如果喜欢用 Windows 的任务调度的话，可以考虑调用。反正我是从来不用的。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>因为这次 <a href="http://www.dbanotes.net/sitelog/dreamhost_hacked.html">Dreamhost 的安全问题</a>，不得不考虑调整站点备份的周期。备份方式是利用 <a href="http://itefix.no/cwrsync/">cxRsync</a> 通过 SSH 通道备份数据到本地 Windows 上。Rsync 在 Windows 上的实现有好几个包装好的工具，比如 <a href="http://www.aboutmyip.com/AboutMyXApp/DeltaCopy.jsp">DeltaCopy</a> 、<a href="http://www.cis.upenn.edu/~bcpierce/unison/">Unison</a> 等。经过比较还是觉得 cxRsync 最好用. </p>

<h3>cwRsync 的优点: </h3><p>1) 配置简单。已经包装了 crgwin 库文件，下载安装就能直接调用命令进行同步。<br />
2) 命令行即可操作. 与 Unix 上基本一样(DeltaCopy 则是图形化的，Unison 还需要熟悉后才可以)。</p>

<h3>基本操作步骤:</h3>
<p>1) 下载，安装 cwRsync.<br />
2) (可选, Dreamhost 的安全都这样糟了，还不如直接用密码登录安全呢,嘿)创建 Key, 进入命令行模式, 调用 ssh-keygen 命令创建 Key. 公钥和私钥存储的位置就放在默认的位置即可。完成后将公钥串存入 ~/.ssh/authorized_keys 文件内。<br />
3) 进入命令行模式, 调用 rsync 命令：
<pre >rsync  --exclude="/home/foo/tmp/" -avz foo@www.foobar.net:foobar.net/ \ <br />MySites\www.foobar.net\ </pre></p>

<p>说明: --exclude 过滤掉一些无关紧要的目录,比如 MT 目录下的 Cache 信息等，foo 和 foobar 请根据自己的情况做适当的替换。</p>
 
<p>最后，如果喜欢用 Windows 的任务调度的话，可以考虑调用。反正我是从来不用的。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title> Bash Shell 快捷键的学习使用</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/shell_shortcut.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1116" title=" Bash Shell 快捷键的学习使用" />
    <id>tag:www.dbanotes.net,2007://1.1116</id>
    
    <published>2007-05-30T11:36:04Z</published>
    <updated>2007-05-30T12:55:06Z</updated>
    
    <summary>这篇 Bash Shell Shortcuts 的快捷键总结的非常好。值得学习。下面内容大多数是拷贝粘贴与总结.

CTRL 键相关的快捷键:

Ctrl + a - Jump to the start of the line
Ctrl + b - Move back a char
Ctrl + c - Terminate the command  //用的最多了吧?
Ctrl + d - Delete from under the cursor
Ctrl + e - Jump to the end of the line
Ctrl + f - Move forward a char
Ctrl + k - Delete to EOL
Ctrl + l - Clear the screen  //清屏，类似 clear 命令
Ctrl + r - Search the history backwards  //查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions 
Ctrl + z - Suspend/ Stop the command
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词 

ALT 键相关的快捷键:
平时很少用。有些和远程登陆工具冲突。
Alt +  - Move to the last line in the history
Alt + ? - Show current completion list
Alt + * - Insert all possible completions
Alt + / - Attempt to complete filename
Alt + . - Yank last argument to previous command
Alt + b - Move backward
Alt + c - Capitalize the word
Alt + d - Delete word
Alt + f - Move forward
Alt + l - Make word lowercase
Alt + n - Search the history forwards non-incremental
Alt + p - Search the history backwards non-incremental
Alt + r - Recall command
Alt + t - Move words around
Alt + u - Make word uppercase
Alt + back-space - Delete backward from cursor // SecureCRT 如果没有配置好，这个就很管用了。

其他特定的键绑定:
输入 bind -P 可以查看所有的键盘绑定。这一系列我觉得更为实用。
Here &quot;2T&quot; means Press TAB twice
$ 2T - All available commands(common) //命令行补全，我认为是 Bash 最好用的一点 
$ (string)2T - All available commands starting with (string)
$ /2T - Entire directory structure including Hidden one
$ ./2T - Only Sub Dirs inside including Hidden one
$ *2T - Only Sub Dirs inside without Hidden one
$ ~2T - All Present Users on system from &quot;/etc/passwd&quot; //第一次见到，很好用
$ $2T - All Sys variables //写Shell脚本的时候很实用
$ @2T - Entries from &quot;/etc/hosts&quot;  //第一次见到
$ =2T - Output like ls or dir //好像还不如 ls 快捷
补充:
Esc + T - 交换光标前面的两个单词

很多来自GNU 的 readline 库。另外一份总结也很好

记忆是所有技术人员的敌人。一次要把所有的都记住是不可能的。针对自己的使用习惯，对少数快捷键反复使用，短期内就会有效果。

你还知道那些好用的快捷键 ? 补充一下 ? 

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>这篇 <a href="http://linuxhelp.blogspot.com/2005/08/bash-shell-shortcuts.html">Bash Shell Shortcuts</a> 的快捷键总结的非常好。值得学习。下面内容大多数是拷贝粘贴与总结.</p>

<h4>CTRL 键相关的快捷键:</h4>

<pre>Ctrl + a - Jump to the start of the line
Ctrl + b - Move back a char
Ctrl + c - Terminate the command  //用的最多了吧?
Ctrl + d - Delete from under the cursor
Ctrl + e - Jump to the end of the line
Ctrl + f - Move forward a char
Ctrl + k - Delete to EOL
Ctrl + l - Clear the screen  //清屏，类似 clear 命令
Ctrl + r - Search the history backwards  //查找历史命令
Ctrl + R - Search the history backwards with multi occurrence
Ctrl + u - Delete backward from cursor // 密码输入错误的时候比较有用
Ctrl + xx - Move between EOL and current cursor position
Ctrl + x @ - Show possible hostname completions 
Ctrl + z - Suspend/ Stop the command
补充:
Ctrl + h - 删除当前字符
Ctrl + w - 删除最后输入的单词 </pre>

<h4>ALT 键相关的快捷键:</h4>
平时很少用。有些和远程登陆工具冲突。
<pre>Alt + < - Move to the first line in the history
Alt + > - Move to the last line in the history
Alt + ? - Show current completion list
Alt + * - Insert all possible completions
Alt + / - Attempt to complete filename
Alt + . - Yank last argument to previous command
Alt + b - Move backward
Alt + c - Capitalize the word
Alt + d - Delete word
Alt + f - Move forward
Alt + l - Make word lowercase
Alt + n - Search the history forwards non-incremental
Alt + p - Search the history backwards non-incremental
Alt + r - Recall command
Alt + t - Move words around
Alt + u - Make word uppercase
Alt + back-space - Delete backward from cursor <br />// SecureCRT 如果没有配置好，这个就很管用了。</pre>

<h4>其他特定的键绑定:</h4>
输入 bind -P 可以查看所有的键盘绑定。这一系列我觉得更为实用。
<pre>Here "2T" means Press TAB twice
$ 2T - All available commands(common) //命令行补全，我认为是 Bash 最好用的一点 
$ (string)2T - All available commands starting with (string)
$ /2T - Entire directory structure including Hidden one
$ ./2T - Only Sub Dirs inside including Hidden one
$ *2T - Only Sub Dirs inside without Hidden one
$ ~2T - All Present Users on system from "/etc/passwd" //第一次见到，很好用
$ $2T - All Sys variables //写Shell脚本的时候很实用
$ @2T - Entries from "/etc/hosts"  //第一次见到
$ =2T - Output like ls or dir //好像还不如 ls 快捷
补充:
Esc + T - 交换光标前面的两个单词</pre>

<p>很多来自GNU 的 <a href="http://tiswww.case.edu/~chet/readline/rltop.html">readline</a> 库。<a href="http://www.bigsmoke.us/readline/shortcuts">另外一份总结</a>也很好</p>

<p>记忆是所有技术人员的敌人。一次要把所有的都记住是不可能的。针对自己的使用习惯，对少数快捷键反复使用，短期内就会有效果。</p>

<p>你还知道那些好用的快捷键 ? 补充一下 ? </p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

<entry>
    <title>Crontab 笔记</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/crontab_tips.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1082" title="Crontab 笔记" />
    <id>tag:www.dbanotes.net,2007://1.1082</id>
    
    <published>2007-04-01T04:47:17Z</published>
    <updated>2007-04-01T09:05:26Z</updated>
    
    <summary>关于 Crontab ，维基百科上的词条 Crontab非常好。可惜这个地址在国内不用代理访问不到。

虽然关于 Crontab 的介绍到处都是，详细读了一遍这个词条，收获还是有的。Crontab 这个名字来自 &quot;chronos&quot;，一个古希腊语, “时间”的意思. 

常见陷阱
每个SA、DBA 或者是普通的 Unix 用户，在第一次使用 Crontab 的时候都会遇到问题. 运行 Crontab 的常见错误包括如下几种:

1) 出于测试目的新创建了一条 Cron JOB, 时间间隔必须超过两分钟，否则 JOB 将调度不到。如果必须忽略这两分钟的载入配置时间差，可以通过重新启动 Cron Daemon 做到。

2) 从 Crontab 中启动 X Window 程序需要注意的事项：所以要么在程序前初始化 &quot;DISPLAY=:0.0&quot;, 要么在应用程序后面追加参数 --display :0.0 

3) 命令中的 % 必须做转义处理: \% .我个人的意见是不要在命令行里带这个参数，干脆写到脚本里，然后调度该脚本即可。

其实我倒是认为使用 Crontab 最常见的一个问题往往是因为环境变量不对。经常会看到论坛里有人问：为什么我的 Crontab 创建了不执行? 准备创建一条 Cron JOB 的时候，很多人都喜欢在命令行下运行一遍，因为这个时候环境变量是随着 Shell 自动带进来，在 Crontab 中则可能因为找不到正确的环境变量，JOB 就不能执行。这个小问题就像出天花，一次教训之后就都记得了。

必须使用的一则技巧
每条 JOB 执行完毕之后，系统会自动将输出发送邮件给当前系统用户。日积月累，非常的多，甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的： &gt;/dev/null 2&gt;&amp;1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。

附: Crontab 的格式说明如下:

* 逗号(&apos;,&apos;) 指定列表值。如:  &quot;1,3,4,7,8&quot;
* 中横线(&apos;-&apos;) 指定范围值 如 &quot;1-6&quot;, 代表 &quot;1,2,3,4,5,6&quot;
* 星号 (&apos;*&apos;) 代表所有可能的值

Linux(开源系统似乎都可以)下还有个 &quot;/&quot; 可以用. 在 Minute 字段上，*/15 表示每 15 分钟执行一次. 而这个特性在商业 Unix ，比如 AIX 上就没有. 

# Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed

    </summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>关于 Crontab ，维基百科上的<a href="http://en.wikipedia.org/wiki/Crontab">词条 Crontab</a>非常好。可惜这个地址在国内不用代理访问不到。</p>

<p>虽然关于 Crontab 的介绍到处都是，详细读了一遍这个词条，收获还是有的。Crontab 这个名字来自 "chronos"，一个古希腊语, “时间”的意思. </p>

<h4>常见陷阱</h4>
每个SA、DBA 或者是普通的 Unix 用户，在第一次使用 Crontab 的时候都会遇到问题. 运行 Crontab 的常见错误包括如下几种:

<p>1) 出于测试目的新创建了一条 Cron JOB, <strong>时间间隔必须超过两分钟</strong>，否则 JOB 将调度不到。如果必须忽略这两分钟的载入配置时间差，可以通过重新启动 Cron Daemon 做到。</p>

<p>2) 从 Crontab 中启动 X Window 程序需要注意的事项：所以要么在程序前初始化 "DISPLAY=:0.0", 要么在应用程序后面追加参数 --display :0.0 </p>

<p>3) 命令中的 % 必须做转义处理: \% .我个人的意见是不要在命令行里带这个参数，干脆写到脚本里，然后调度该脚本即可。</p>

<p>其实我倒是认为使用 <strong>Crontab 最常见的一个问题往往是因为环境变量不对</strong>。经常会看到论坛里有人问：<strong>为什么我的 Crontab 创建了不执行</strong>? 准备创建一条 Cron JOB 的时候，很多人都喜欢在命令行下运行一遍，因为这个时候环境变量是随着 Shell 自动带进来，在 Crontab 中则可能因为找不到正确的环境变量，JOB 就不能执行。这个小问题就像出天花，一次教训之后就都记得了。</p>

<h4>必须使用的一则技巧</h4>
每条 JOB 执行完毕之后，系统会自动将输出发送邮件给当前系统用户。日积月累，非常的多，甚至会撑爆整个系统。所以每条 JOB 命令后面进行重定向处理是非常必要的： >/dev/null 2>&1 。前提是对 Job 中的命令需要正常输出已经作了一定的处理, 比如追加到某个特定日志文件。

<p>附: Crontab 的格式说明如下:</p>

<p>* 逗号(',') 指定列表值。如:  "1,3,4,7,8"<br />
* 中横线('-') 指定范围值 如 "1-6", 代表 "1,2,3,4,5,6"<br />
* 星号 ('*') 代表所有可能的值</p>

<p>Linux(开源系统似乎都可以)下还有个 "/" 可以用. 在 Minute 字段上，*/15 表示每 15 分钟执行一次. 而这个特性在商业 Unix ，比如 AIX 上就没有. </p>

<pre># Use the hash sign to prefix a comment
# +---------------- minute (0 - 59)
# |  +------------- hour (0 - 23)
# |  |  +---------- day of month (1 - 31)
# |  |  |  +------- month (1 - 12)
# |  |  |  |  +---- day of week (0 - 7) (Sunday=0 or 7)
# |  |  |  |  |
# *  *  *  *  *  command to be executed</pre>

<p>    </p>]]>
        
    </content>
</entry>

<entry>
    <title>重新安装系统后的几件事情</title>
    <link rel="alternate" type="text/html" href="http://www.dbanotes.net/techmemo/reinstall_xp_memo.html" />
    <link rel="service.edit" type="application/atom+xml" href="http://www.dbanotes.net/MT/mt-atom.cgi/weblog/blog_id=1/entry_id=1075" title="重新安装系统后的几件事情" />
    <id>tag:www.dbanotes.net,2007://1.1075</id>
    
    <published>2007-03-25T10:05:22Z</published>
    <updated>2007-03-25T11:19:50Z</updated>
    
    <summary>新的笔记本拿到了，旧系统上的很多信息要前一到新机器上来，还要作不少配置，系统才可以用起来得心应手。这些都做完了感觉还真的做了不少操作，记录一下供大家参考。

网上有一些经验可以介绍，比如这篇《重新安装系统后要做的十件大事》，但里面有几条随着 XP 的 SP2 发布后已不适用。

备份
需要备份的有：
收藏夹内容。IE 收藏夹内容备份比较好做。Firefox 的则需要在安装目录下寻找 bookmarks.htm 的文件，拷贝到目标机器上。
证书备份 我的机器上有两个需要备份的：招行专业版的证书，支付宝证书(参考)。
Outlook 配置信息备份 通过Office工具&quot;Microsoft Office 2003 用户设置保存向导&quot;来做，当然还需要备份邮件的数据文件
IM 工具的历史聊天记录。阿里旺旺的聊天记录备份只需要把安装目录中的 Users 文件夹复制到远程即可。MSN Messenger 的记录在“我的文档”里面。
此外还有 Flashget 下载的历史数据文件，SecureCRT 配置信息等等，IE 的 Cookie 也有必要导出并导入到新的环境。

打开 Windows XP SP2 的防火墙
先不要接入网络，打开 Windows XP SP2 的防火墙，这是重新安装系统后的第一件事情。否则如果感染病毒的话，就要反复折腾几次才能好。

关闭恼人的媒体自动播放功能
单击“开始→运行”，在“打开”框中，键入“gpedit.msc”，单击“确定”按钮，打开“组策略”窗口；在左窗格的“本地计算机策略”下，展开“计算机配置→管理模板→系统”，然后在右窗格的“设置”标题下，双击“关闭自动播放”；单击“设置”选项卡，选中“已启用”复选钮，然后在“关闭自动播放”框中单击“所有驱动器”，单击“确定”按钮，最后关闭“组策略”窗口。在“用户配置”中同样也存在这个“关闭自动播放”设置。但“计算机配置”中的设置比“用户配置”中的设置优先。

取消压缩文件夹支持
这条经验来自上面的“十件事”，运行命令：“regsvr32 /u zipfldr.dll” ，回车，出现提示窗口“zipfldr.dll中的Dll UnrgisterServer成功”即可取消Windows XP的压缩文件夹支持。另外，输入regsvr32 shdocvw.dll可以取消“图片和传真”与图片文件的关联。

微软的 Powertoys for Windows XP 工具中的 Tweak UI 也很好用的，做个性化设置可以尝试一下。

暂时记录这么多，随时补充。

--EOF--</summary>
    <author>
        <name>Fenng</name>
        <uri>http://www.dbanotes.net/</uri>
    </author>
    
        <category term="Tech.Memo" />
    
    <content type="html" xml:lang="en" xml:base="http://www.dbanotes.net/">
        <![CDATA[<p>新的笔记本拿到了，旧系统上的很多信息要前一到新机器上来，还要作不少配置，系统才可以用起来得心应手。这些都做完了感觉还真的做了不少操作，记录一下供大家参考。</p>

<p>网上有一些经验可以介绍，比如这篇<a href="http://www.blueidea.com/computer/system/2005/2726.asp">《重新安装系统后要做的十件大事》</a>，但里面有几条随着 XP 的 SP2 发布后已不适用。</p>

<h4>备份</h4>
需要备份的有：<br />
<strong>收藏夹</strong>内容。IE 收藏夹内容备份比较好做。Firefox 的则需要在安装目录下寻找 bookmarks.htm 的文件，拷贝到目标机器上。<br />
<strong>证书备份</strong> 我的机器上有两个需要备份的：招行专业版的证书，支付宝证书(<a href="http://help.alipay.com/support/help_detail.htm?help_id=3407">参考</a>)。<br />
<strong>Outlook 配置信息备份</strong> 通过Office工具"Microsoft Office 2003 用户设置保存向导"来做，当然还需要备份邮件的数据文件<br />
<strong>IM 工具的历史聊天记录</strong>。阿里旺旺的聊天记录备份只需要把安装目录中的 Users 文件夹复制到远程即可。MSN Messenger 的记录在“我的文档”里面。<br />
此外还有 Flashget 下载的历史数据文件，SecureCRT 配置信息等等，IE 的 Cookie 也有必要导出并导入到新的环境。

<h4>打开 Windows XP SP2 的防火墙</h4>
先不要接入网络，打开 Windows XP SP2 的防火墙，这是重新安装系统后的第一件事情。否则如果感染病毒的话，就要反复折腾几次才能好。

<h4>关闭恼人的媒体自动播放功能</h4>
<blockquote>单击“开始→运行”，在“打开”框中，键入“gpedit.msc”，单击“确定”按钮，打开“组策略”窗口；<br />在左窗格的“本地计算机策略”下，展开“计算机配置→管理模板→系统”，然后在右窗格的“设置”标题下，双击“关闭自动播放”；<br />单击“设置”选项卡，选中“已启用”复选钮，然后在“关闭自动播放”框中单击“所有驱动器”，单击“确定”按钮，最后关闭“组策略”窗口。<br />在“用户配置”中同样也存在这个“关闭自动播放”设置。但“计算机配置”中的设置比“用户配置”中的设置优先。</blockquote>

<h4>取消压缩文件夹支持</h4>
这条经验来自上面的“十件事”，运行命令：<blockquote>“regsvr32 /u zipfldr.dll” ，回车，出现提示窗口“zipfldr.dll中的Dll UnrgisterServer成功”即可取消Windows XP的压缩文件夹支持。另外，输入regsvr32 shdocvw.dll可以取消“图片和传真”与图片文件的关联。</blockquote>

<p>微软的 <a href="http://www.microsoft.com/windowsxp/downloads/powertoys/xppowertoys.mspx">Powertoys for Windows XP</a> 工具中的 Tweak UI 也很好用的，做个性化设置可以尝试一下。</p>

<p>暂时记录这么多，随时补充。</p>

<p>--EOF--</p>]]>
        
    </content>
</entry>

</feed> 

