﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-沉香江南-文章分类-转载文章</title><link>http://www.blogjava.net/lz408925352/category/45758.html</link><description /><language>zh-cn</language><lastBuildDate>Wed, 05 Jan 2011 22:02:52 GMT</lastBuildDate><pubDate>Wed, 05 Jan 2011 22:02:52 GMT</pubDate><ttl>60</ttl><item><title>运行效率高稳定性好的大型网站系统架构分析</title><link>http://www.blogjava.net/lz408925352/articles/342379.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Wed, 05 Jan 2011 13:29:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/342379.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/342379.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/342379.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/342379.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/342379.html</trackback:ping><description><![CDATA[<p><span style="color: #ff0000">转载</span><span style="color: #ff0000">：</span><font style="background-color: #cce8cf"><a href="http://hi.baidu.com/xjch666/blog/item/7bfddf4561459933869473bc.html">http://hi.baidu.com/xjch666/blog/item/7bfddf4561459933869473bc.html</a></font><font style="background-color: #cce8cf"><br />
<br />
随着中国大型IT企业信息化速度的加快，大部分应用的数据量和访问量都急剧增加，大型企业网站正面临性能和高数据访问量的压力，而且对存储、安全以及信息检索等等方面都提出了更高的要求。</font></p>
<p><font style="background-color: #cce8cf">千万人同时访问的网站，一般是有很多个数据库同时工作，说明白一点就是数据库集群和并发控制，这样的网站实时性也是相对的。这些网站都有一些共同的特点：数据量大，在线人数多，并发请求多，pageview高，响应速度快。总结了一下各个大网站的架构，主要提高效率及稳定性的几个地方包括：<br />
1、程序<br />
程序开发是一方面，系统架构设计（硬件+网络+软件）是另一方面。<br />
软件架构方面，做网站首先需要很多web服务器存储静态资源，比如图片、视频、静态页等，千万不要把静态资源和应用服务器放在一起。<br />
一个好的程序员写出来的程序会非常简洁、性能很好，一个初级程序员可能会犯很多低级错误，这也是影响网站性能的原因之一。<br />
网站要做到效率高，不光是程序员的事情，数据库优化、程序优化这是必须的，在性能优化上要数据库和程序齐头并进！缓存也是两方面同时入手。第一，数据库缓存和数据库优化，这个由dba完成（而且这个有非常大的潜力可挖，只是由于我们都是程序员而忽略了他而已）。第二，程序上的优化，这个非常的有讲究，比如说重要一点就是要规范ＳＱＬ语句，少用in 多用or，多用preparestatement，另外避免程序冗余如查找数据少用双重循环等。另外选用优秀的开源框架加以支持，我个人认为中后台的支持是最最重要的，可以选取spring＋ibatis。因为ibatis直接操作SQL并有缓存机制。spring的好处就不用我多说了，ＩＯＣ的机制可以避免new对象，这样也节省开销。据我分析，绝大部分的开销就是在NEW的时候和连接数据库时候产生的，请尽量避免。另外可以用一些内存测试工具来做一个demo说明hibernate和ibatis谁更快！前台你想用什么就用什么，struts,webwork都成，如果觉得自己挺牛X可以试试用tapestry。<br />
用数据库也未必不能解决访问量巨大所带来的问题，作成静态文件硬盘的寻址时间也未必少于数据库的搜索时间，当然对资料的索引要下一翻工夫。我自己觉得门户往往也就是当天、热门的资料点击率较高，将其做缓存最多也不过1~2G的数据量吧，举个例子：<br />
◎ 拿网易新闻来说[url]http://news.163.com/07/0606/09/3GA0D10N00011229.html[/url]<br />
格式化一下，方便理解：http://域名/年/月日/新闻所属分类/新闻ID.html <br />
可以把当天发布的、热门的、流揽量大的作个缓寸，用hashtable（key：年-月-日-分类-ID，value：新闻对象），静态将其放到内存（速度绝对快过硬盘寻址静态页面）。<br />
通常是采用oracle存储过程＋2个weblogic，更新机制也几乎一样每签发一条新闻，就会生成静态页面，然后发往前端的web服务器，前端的web都是做负载均衡的。另外还有定时的程序，每5-15分钟自动生成一次。在发布新闻的同时将数据缓存。当然缓存也不会越来越大，在个特定的时间段（如凌晨）剔除过期的数据。做一个大的网站远没有想象中那么简单，服务器基本就要百十个的。<br />
这样可以大大增加一台计算机的处理速度，如果一台机器处理不了，可以用httpserver集群来解决问题了。<br />
2、网络<br />
中国的网络分南北电信和网通，访问的ip就要区分南北进入不同的网络。<br />
3、集群<br />
通常会使用CDN与GSBL与DNS负载均衡技术，每个地区一组前台服务器群，例如：网易，百度使用了DNS负载均衡技术，每个频道一组前台服务器，一搜使用了DNS负载技术，所有频道共用一组前台服务器集群。<br />
网站使用基于Linux集群的负载均衡，失败恢复，包括应用服务器和数据库服务器，基于linux-ha的服务状态检测及高可用化。<br />
应用服务器集群可以采用apache+tomcat集群和weblogic集群等；web服务器集群可以用反向代理，也可以用NAT的方式，或者多域名解析都可以；Squid也可以，方法很多，可以根据情况选择。<br />
4、数据库<br />
因为是千万人同时访问的网站，所以一般是有很多个数据库同时工作的，说明白一点就是数据库集群和并发控制，数据分布到地理位置不同的数据中心，以免发生断电事故。另外还有一点的是，那些网站的静态化网页并不是真的，而是通过动态网页与静态网页网址交换做出现的假象，这可以用urlrewrite这样的开源网址映射器实现。这样的网站实时性也是相对的，因为在数据库复制数据的时候有一个过程，一般在技术上可以用到hibernate和ecache，但是如果要使网站工作地更好，可以使用EJB和websphere，weblogic这样大型的服务器来支持，并且要用oracle这样的大型数据库。<br />
大型门户网站不建议使用Mysql数据库，除非你对Mysql数据的优化非常熟悉。Mysql数据库服务器的master-slave模式，利用数据库服务器在主从服务器间进行同步，应用只把数据写到主服务器，而读数据时则根据负载选择一台从服务器或者主服务器来读取，将数据按不同策略划分到不同的服务器（组）上，分散数据库压力。<br />
大型网站要用oracle，数据方面操作尽量多用存储过程，绝对提升性能；同时要让DBA对数据库进行优化，优化后的数据库与没优化的有天壤之别；同时还可以扩展分布式数据库，以后这方面的研究会越来越多；<br />
5、页面<br />
从开始就考虑使用虚拟存储/簇文件系统。它能让你大量并行IO访问，而且不需要任何重组就能够增加所需要的磁盘。<br />
页面数据调用更要认真设计，一些数据查询可以不通过数据库的方式，实时性要求不高的可以使用lucene来实现，即使有实时性的要求也可以用lucene，lucene+compass还是非常优秀的。<br />
新闻类的网站可以用静态页存储，采用定时更新机制减轻服务器负担；首页每个小模块可以使用oscache缓存，这样不用每次都拉数据。<br />
前端的基于静态页面缓存的web加速器，主要应用有squid等。squid 将大部分静态资源(图片，js，css等）缓存起来，直接返回给访问者，减少应用服务器的负载<br />
网站的静态化网页并不是真的，而是通过动态网页与静态网页网址交换做出现的假象，这可以用urlrewrite这样的开源网址映射器实现，后缀名为htm或者html并不能说明程序生成了静态页面，可能是通过url重写来实现的，为的只不过是在搜索引擎中提升自己网站的覆盖面积罢了。<br />
生成静态页面的服务器和www服务器是两组不同的服务器，页面生成后才会到www服务器，一部分数据库并不是关系数据库，这样更适合信息衍生，www、mail服务器、路由器多，主要用负载平衡解决访问瓶颈。<br />
◎ 静态页面的缺点： <br />
1) 增加了程序的复杂度<br />
2) 不利于管理资料<br />
3) 速度不是最快<br />
4) 伤硬盘<br />
6、缓存<br />
从一开始就应该使用缓存，高速缓存是一个更好的地方存储临时数据，比如Web站点上跟踪一个特定用户的会话产生的临时文件，就不再需要记录到数据库里。<br />
不能用lucene实现的可以用缓存，分布式缓存可以用memcached，如果有钱的话用10来台机器做缓存，&gt; 10G的存储量相信存什么都够了；如果没钱的话可以在页面缓存和数据缓存上下功夫，多用OSCACHE和EHCACHE，SWARMCACHE也可以，不过据说同步性不是很好；<br />
可以使用Memcache进行缓存，用大内存把这些不变的数据全都缓存起来，而当修改时就通知cache过期，memcache是LJ开发的一款分布式缓存产品，很多大型网站在应用，我们可以把Cache Server与App Server装在一起。因为Cache Server对CPU消耗不大，而有了Cache Server的支援，App Server对内存要求也不是太高，所以可以和平共处，更有效的利用资源。</font></p>
<p><font style="background-color: #cce8cf">以上一些不太成熟的想法，可以从某一个层次开始，逐步细化，把产品的性能指标提高上去。<br />
以下内容为转载：浅析大型网站的架构<br />
一个小型的网站，比如个人网站，可以使用最简单的html静态页面就实现了，配合一些图片达到美化效果，所有的页面均存放在一个目录下，这样的网站对系统架构、性能的要求都很简单，随着互联网业务的不断丰富，网站相关的技术经过这些年的发展，已经细分到很细的方方面面，尤其对于大型网站来说，所采用的技术更是涉及面非常广，从硬件到软件、编程语言、数据库、WebServer、防火墙等各个领域都有了很高的要求，已经不是原来简单的html静态网站所能比拟的。<br />
大型网站，比如门户网站。在面对大量用户访问、高并发请求方面，基本的解决方案集中在这样几个环节：使用高性能的服务器、高性能的数据库、高效率的编程语言、还有高性能的Web容器。但是除了这几个方面，还没法根本解决大型网站面临的高负载和高并发问题。<br />
上面提供的几个解决思路在一定程度上也意味着更大的投入，并且这样的解决思路具备瓶颈，没有很好的扩展性，下面我从低成本、高性能和高扩张性的角度来说说我的一些经验。<br />
1、HTML静态化<br />
其实大家都知道，效率最高、消耗最小的就是纯静态化的html页面，所以我们尽可能使我们的网站上的页面采用静态页面来实现，这个最简单的方法其实也是最有效的方法。但是对于大量内容并且频繁更新的网站，我们无法全部手动去挨个实现，于是出现了我们常见的信息发布系统CMS，像我们常访问的各个门户站点的新闻频道，甚至他们的其他频道，都是通过信息发布系统来管理和实现的，信息发布系统可以实现最简单的信息录入自动生成静态页面，还能具备频道管理、权限管理、自动抓取等功能，对于一个大型网站来说，拥有一套高效、可管理的CMS是必不可少的。<br />
除了门户和信息发布类型的网站，对于交互性要求很高的社区类型网站来说，尽可能的静态化也是提高性能的必要手段，将社区内的帖子、文章进行实时的静态化，有更新的时候再重新静态化也是大量使用的策略，像Mop的大杂烩就是使用了这样的策略，网易社区等也是如此。<br />
同时，html静态化也是某些缓存策略使用的手段，对于系统中频繁使用数据库查询但是内容更新很小的应用，可以考虑使用html静态化来实现，比如论坛中论坛的公用设置信息，这些信息目前的主流论坛都可以进行后台管理并且存储再数据库中，这些信息其实大量被前台程序调用，但是更新频率很小，可以考虑将这部分内容进行后台更新的时候进行静态化，这样避免了大量的数据库访问请求。<br />
2、图片服务器分离<br />
大家知道，对于Web服务器来说，不管是Apache、IIS还是其他容器，图片是最消耗资源的，于是我们有必要将图片与页面进行分离，这是基本上大型网站都会采用的策略，他们都有独立的图片服务器，甚至很多台图片服务器。这样的架构可以降低提供页面访问请求的服务器系统压力，并且可以保证系统不会因为图片问题而崩溃，在应用服务器和图片服务器上，可以进行不同的配置优化，比如apache在配置ContentType的时候可以尽量少支持，尽可能少的LoadModule，保证更高的系统消耗和执行效率。<br />
3、数据库集群和库表散列<br />
大型网站都有复杂的应用，这些应用必须使用数据库，那么在面对大量访问的时候，数据库的瓶颈很快就能显现出来，这时一台数据库将很快无法满足应用，于是我们需要使用数据库集群或者库表散列。<br />
在数据库集群方面，很多数据库都有自己的解决方案，Oracle、Sybase等都有很好的方案，常用的MySQL提供的Master/Slave也是类似的方案，您使用了什么样的DB，就参考相应的解决方案来实施即可。<br />
上面提到的数据库集群由于在架构、成本、扩张性方面都会受到所采用DB类型的限制，于是我们需要从应用程序的角度来考虑改善系统架构，库表散列是常用并且最有效的解决方案。我们在应用程序中安装业务和应用或者功能模块将数据库进行分离，不同的模块对应不同的数据库或者表，再按照一定的策略对某个页面或者功能进行更小的数据库散列，比如用户表，按照用户ID进行表散列，这样就能够低成本的提升系统的性能并且有很好的扩展性。sohu的论坛就是采用了这样的架构，将论坛的用户、设置、帖子等信息进行数据库分离，然后对帖子、用户按照板块和ID进行散列数据库和表，最终可以在配置文件中进行简单的配置便能让系统随时增加一台低成本的数据库进来补充系统性能。<br />
4、缓存<br />
缓存一词搞技术的都接触过，很多地方用到缓存。网站架构和网站开发中的缓存也是非常重要。这里先讲述最基本的两种缓存。高级和分布式的缓存在后面讲述。<br />
架构方面的缓存，对Apache比较熟悉的人都能知道Apache提供了自己的缓存模块，也可以使用外加的Squid模块进行缓存，这两种方式均可以有效的提高Apache的访问响应能力。<br />
网站程序开发方面的缓存，Linux上提供的Memory Cache是常用的缓存接口，可以在web开发中使用，比如用Java开发的时候就可以调用MemoryCache对一些数据进行缓存和通讯共享，一些大型社区使用了这样的架构。另外，在使用web语言开发的时候，各种语言基本都有自己的缓存模块和方法，PHP有Pear的Cache模块，Java就更多了，.net不是很熟悉，相信也肯定有。<br />
5、镜像<br />
镜像是大型网站常采用的提高性能和数据安全性的方式，镜像的技术可以解决不同网络接入商和地域带来的用户访问速度差异，比如ChinaNet和EduNet之间的差异就促使了很多网站在教育网内搭建镜像站点，数据进行定时更新或者实时更新。在镜像的细节技术方面，这里不阐述太深，有很多专业的现成的解决架构和产品可选。也有廉价的通过软件实现的思路，比如Linux上的rsync等工具。<br />
6、负载均衡<br />
负载均衡将是大型网站解决高负荷访问和大量并发请求采用的终极解决办法。<br />
负载均衡技术发展了多年，有很多专业的服务提供商和产品可以选择，我个人接触过一些解决方法，其中有两个架构可以给大家做参考。<br />
硬件四层交换<br />
第四层交换使用第三层和第四层信息包的报头信息，根据应用区间识别业务流，将整个区间段的业务流分配到合适的应用服务器进行处理。　第四层交换功能就象是虚 IP，指向物理服务器。它传输的业务服从的协议多种多样，有HTTP、FTP、NFS、Telnet或其他协议。这些业务在物理服务器基础上，需要复杂的载量平衡算法。在IP世界，业务类型由终端TCP或UDP端口地址来决定，在第四层交换中的应用区间则由源端和终端IP地址、TCP和UDP端口共同决定。<br />
在硬件四层交换产品领域，有一些知名的产品可以选择，比如Alteon、F5等，这些产品很昂贵，但是物有所值，能够提供非常优秀的性能和很灵活的管理能力。Yahoo中国当初接近2000台服务器使用了三四台Alteon就搞定了。<br />
软件四层交换<br />
大家知道了硬件四层交换机的原理后，基于OSI模型来实现的软件四层交换也就应运而生，这样的解决方案实现的原理一致，不过性能稍差。但是满足一定量的压力还是游刃有余的，有人说软件实现方式其实更灵活，处理能力完全看你配置的熟悉能力。<br />
软件四层交换我们可以使用Linux上常用的LVS来解决，LVS就是Linux Virtual Server，他提供了基于心跳线heartbeat的实时灾难应对解决方案，提高系统的鲁棒性，同时可供了灵活的虚拟VIP配置和管理功能，可以同时满足多种应用需求，这对于分布式的系统来说必不可少。<br />
一个典型的使用负载均衡的策略就是，在软件或者硬件四层交换的基础上搭建squid集群，这种思路在很多大型网站包括搜索引擎上被采用，这样的架构低成本、高性能还有很强的扩张性，随时往架构里面增减节点都非常容易。这样的架构我准备空了专门详细整理一下和大家探讨。<br />
对于大型网站来说，前面提到的每个方法可能都会被同时使用到，我这里介绍得比较浅显，具体实现过程中很多细节还需要大家慢慢熟悉和体会，有时一个很小的squid参数或者apache参数设置，对于系统性能的影响就会很大，希望大家一起讨论，达到抛砖引玉之效。</font></p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/342379.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2011-01-05 21:29 <a href="http://www.blogjava.net/lz408925352/articles/342379.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Oracle中password file的作用及说明</title><link>http://www.blogjava.net/lz408925352/articles/340141.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Thu, 09 Dec 2010 06:25:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340141.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340141.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340141.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340141.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340141.html</trackback:ping><description><![CDATA[<p><span class="style23"><font face="Verdana">本文转载：链接：<a class="permalink" href="http://www.eygle.com/archives/2004/06/passwordfile.html">http://www.eygle.com/archives/2004/06/passwordfile.html</a> <br />
<br />
<br />
在数据库没有启动之前，数据库内建用户是无法通过数据库来验证身份的<br />
<br />
口令文件中存放sysdba/sysoper用户的用户名及口令<br />
允许用户通过口令文件验证，在数据库未启动之前登陆<br />
从而启动数据库<br />
<br />
如果没有口令文件，在数据库未启动之前就只能通过操作系统认证.<br />
<br />
使用Rman，很多时候需要在nomount,mount等状态对数据库进行处理<br />
所以通常要求sysdba权限如果属于本地DBA组，可以通过操作系统认证登陆<br />
如果是远程sysdba登陆，需要通过passwordfile认证.</font></span></p>
<p><font face="Verdana"><span class="style23">1.remote_login_passwordfile = NONE<br />
<br />
此时停用口令文件验证，Oracle数据库不允许远程SYSDBA/SYSOPER身份登录<br />
无法通过远程进行数据库起停等操作管理</span><br />
<br />
<font color="blue">local:</font><br />
</font></p>
<p>&nbsp;</p>
<pre>[oracle@jumper oracle]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.3.0 - Production on Thu Apr 15 09:58:45 2004
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
SQL&gt; alter user sys identified by oracle;
User altered.
SQL&gt; show parameter pass
NAME                      TYPE   VALUE
--------------------- ----------- ------------------------------
remote_login_passwordfile string NONE
</pre>
<p class="style23"><font face="verdana, arial, helvetica" size="2"><font color="blue">remote:</font><br />
</font></p>
<p>&nbsp;</p>
<pre><span class="style23"><font face="Verdana">E:\Oracle\ora92\bin&gt;sqlplus /nolog<br />
<br />
SQL*Plus: Release 9.2.0.4.0 -
Production on 星期四 4月 15 09:39:22 2004<br />
<br />
Copyright (c) 1982, 2002, Oracle
Corporation. All rights reserved.<br />
<br />
SQL&gt; connect sys/oracle@hsjf as
sysdba<br />
ERROR:<br />
<font color="red">ORA-01017: invalid username/password; logon denied</font></font></span><font size="2"><br />
<br />
</font></pre>
<p class="style23">此处实际上是无法通过口令文件验证</p>
<p class="style23"><font face="verdana, arial, helvetica" size="2">2.remote_login_passwordfile = exclusive<br />
</font></p>
<p class="style23">&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre>SQL&gt; alter system set remote_login_passwordfile=exclusive scope=spfile;
System altered.
SQL&gt; startup force;
ORACLE instance started.
Total System Global Area 131142648 bytes
Fixed Size 451576 bytes
Variable Size 104857600 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL&gt; show parameter pass
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile string EXCLUSIVE
SQL&gt; alter user sys identified by oracle;
User altered.
</pre>
<p><font face="verdana, arial, helvetica" size="2"><font color="blue">remote:</font> </font></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<pre><font face="verdana, arial, helvetica" size="2">E:\Oracle\ora92\bin&gt;sqlplus /nolog<br />
<br />
SQL*Plus: Release 9.2.0.4.0 -
Production on 星期四 4月 15 09:47:11 2004<br />
<br />
Copyright (c) 1982, 2002, Oracle
Corporation. All rights reserved.<br />
<br />
SQL&gt; connect sys/oracle@hsjf as
sysdba<br />
已连接。<br />
SQL&gt; show user<br />
USER 为"SYS"<br />
SQL&gt;<br />
</font></pre>
<p class="style23">&nbsp;</p>
<p class="style23">这实际上就是通过口令文件验证登录的 </p>
<p><font face="verdana, arial, helvetica" size="2">3.进一步测试<br />
<br />
如果此时我们删除passwdfile,sysdba/sysoper将无法认证，也就无法登陆数据库<br />
</font></p>
<p><font face="verdana, arial, helvetica" size="2"><font color="blue">Server:</font> </font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica" size="2">SQL&gt; !<br />
[oracle@jumper oracle]$ cd $ORACLE_HOME/dbs<br />
[oracle@jumper dbs]$ ls orapwhsjf<br />
orapwhsjf<br />
[oracle@jumper dbs]$ mv orapwhsjf orapwhsjf.bak<br />
[oracle@jumper dbs]$ <br />
</font><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p><font face="verdana, arial, helvetica" size="2"><br />
<br />
<font color="blue">Remote:</font> <br />
</font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica" size="2">E:\Oracle\ora92\bin&gt;sqlplus /nolog<br />
<br />
SQL*Plus: Release 9.2.0.4.0 - Production on 星期四 4月 15 09:50:14 2004<br />
<br />
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.<br />
<br />
SQL&gt; connect sys/oracle@hsjf as sysdba<br />
ERROR:<br />
<font color="red">ORA-01031: insufficient privileges</font><br />
<br />
<br />
SQL&gt;<br />
</font><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p><font face="verdana, arial, helvetica" size="2"><br />
<br />
这实际上就是无法通过口令文件验证身份</font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica" size="2">4.如果丢失了passwdfile<br />
<br />
如果使用passwdfile却意外丢失，此时将不能启动数据库</font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica" size="2"><br />
</font><font face="verdana, arial, helvetica" size="2"><br />
SQL&gt; startup force;<br />
ORACLE instance started.<br />
<br />
Total System Global Area 131142648 bytes<br />
Fixed Size 451576 bytes<br />
Variable Size 104857600 bytes<br />
Database Buffers 25165824 bytes<br />
Redo Buffers 667648 bytes<br />
<font color="red">ORA-01990: error opening password file '/opt/oracle/product/9.2.0/dbs/orapw'<br />
ORA-27037: unable to obtain file status<br />
Linux Error: 2: No such file or directory<br />
Additional information: 3</font></font></p>
<p><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p><font face="verdana, arial, helvetica" size="2"><br />
<br />
此时可以通过orapwd重建口令文件来解决<br />
此处我们恢复口令文件既可<br />
</font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica" size="2">SQL&gt; !<br />
[oracle@jumper oracle]$ mv $ORACLE_HOME/dbs/orapwhsjf.bak orapwhsjf<br />
[oracle@jumper oracle]$ exit<br />
exit<br />
<br />
SQL&gt; alter database open;<br />
<br />
Database altered.<br />
<br />
SQL&gt; </font></p>
<p><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p><font face="verdana, arial, helvetica"><br />
<br />
<br />
大致就是如此.</font></p>
<p>&nbsp;</p>
<p><font face="verdana, arial, helvetica">5. remote_login_passwordfile = shared</font></p>
<p><font face="verdana, arial, helvetica">我们看一下Oracle9i文档中的说明:</font></p>
<p class="style29">SHARED </p>
<p><font color="#0000ff"><font face="Verdana"><span class="style29">More than one database can use a password file. However, the only user recognized by the password file is SYS.</span><br />
</font></font></p>
<p class="style23">意思是说多个数据库可以共享一个口令文件,但是只可以识别一个用户:SYS</p>
<p>&nbsp;</p>
<p>SQL&gt; select * from v$pwfile_users;</p>
<p>USERNAME SYSDB SYSOP<br />
------------------------------ ----- -----<br />
SYS TRUE TRUE</p>
<p>SQL&gt; grant sysdba to eygle;<br />
grant sysdba to eygle<br />
*<br />
ERROR at line 1:<br />
<span class="style31"><font color="#ff0000">ORA-01994: </font></span>GRANT failed: cannot add users to public password file<br />
</p>
<p>SQL&gt; show parameter password</p>
<p>NAME TYPE VALUE<br />
------------------------------------ ----------- ------------------------------<br />
remote_login_passwordfile string SHARED</p>
<p><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p class="style23">我们看到,此时的口令文件中是不能添加用户的.</p>
<p class="style23">很多人的疑问在于:口令文件的缺省名称是orapw&lt;sid&gt;,怎么能够共享? </p>
<p class="style23">实际上是这样的: Oracle数据库在启动时,首先查找的是orapw&lt;sid&gt;的口令文件,如果该文件不存在,则开始查找,orapw的口令文件<br />
如果口令文件命名为orapw,多个数据库就可以共享.</p>
<p class="style23">我们看一下测试:</p>
<p>&nbsp;</p>
<pre>[oracle@jumper dbs]$ sqlplus "/ as sysdba"
SQL*Plus: Release 9.2.0.3.0 - Production on Tue Jul 6 09:40:34 2004
Copyright (c) 1982, 2002, Oracle Corporation.  All rights reserved.
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.3.0 - Production
With the Partitioning, OLAP and Oracle Data Mining options
JServer Release 9.2.0.3.0 - Production
SQL&gt; shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL&gt; !
[oracle@jumper dbs]$ ls
hsjf  initdw.ora  inithsjf.ora  init.ora  lkHSJF  orapwhsjf  spfilehsjf.ora
[oracle@jumper dbs]$ <span class="style30"><font color="#0000ff">mv orapwhsjf orapwhsjf.bak</font></span>
[oracle@jumper dbs]$ exit
exit
SQL&gt; startup
ORACLE instance started.
Total System Global Area  235999908 bytes
Fixed Size                   451236 bytes
Variable Size             201326592 bytes
Database Buffers           33554432 bytes
Redo Buffers                 667648 bytes
ORA-01990: error opening password file '<span class="style30"><font color="#0000ff">/opt/oracle/product/9.2.0/dbs/orapw</font></span>'--这是最后查找的文件
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
</pre>
<p><font face="verdana, arial, helvetica" size="2"><br />
</font></p>
<p class="style23">我们建立orapw口令文件,这时候可以打开数据库.</p>
<pre class="style23">SQL&gt; !
[oracle@jumper dbs]$ ls
hsjf  initdw.ora  inithsjf.ora  init.ora  lkHSJF  orapwhsjf.bak  spfilehsjf.ora
[oracle@jumper dbs]$ cp orapwhsjf.bak orapw
[oracle@jumper dbs]$ exit
exit
SQL&gt; alter database open;
Database altered.
SQL&gt; show parameter passw
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
remote_login_passwordfile            string      SHARED
SQL&gt;    </pre>
<p class="style23">&nbsp;</p>
<p class="style23">那么你可能会有这样的疑问,多个Exclusive的数据库是否可以共享一个口令文件(orapw)呢?</p>
<p class="style23">我们继续这个实验:</p>
<pre class="style23">SQL&gt; show parameter password</pre>
<p class="style23">NAME TYPE VALUE<br />
------------------------------------ ----------- ------------------------------<br />
remote_login_passwordfile string SHARED<br />
</p>
<p class="style23">[oracle@jumper dbs]$ strings orapw<br />
]\[Z<br />
ORACLE Remote Password file<br />
INTERNAL<br />
AB27B53EDC5FEF41<br />
8A8F025737A9097A</p>
<p class="style23"><font color="#000000"><font face="verdana, arial, helvetica" size="2">注意这里仅记录着INTERNAL/SYS的口令</font></font></p>
<p class="style23"><font face="verdana, arial, helvetica" size="2">REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE 时</font></p>
<pre class="style23">SQL&gt; alter system set remote_login_passwordfile=exclusive scope=spfile;</pre>
<p class="style23">System altered.</p>
<p class="style23">SQL&gt; startup force;<br />
ORACLE instance started.</p>
<p class="style23">Total System Global Area 235999908 bytes<br />
Fixed Size 451236 bytes<br />
Variable Size 201326592 bytes<br />
Database Buffers 33554432 bytes<br />
Redo Buffers 667648 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; !<br />
<br />
[oracle@jumper bin]$ cd $ORACLE_HOME/dbs<br />
[oracle@jumper dbs]$ strings orapw<br />
]\[Z<br />
ORACLE Remote Password file<br />
HSJF<br />
INTERNAL<br />
AB27B53EDC5FEF41<br />
8A8F025737A9097A<br />
[oracle@jumper dbs]$ exit<br />
exit</p>
<p class="style23"><font color="#000000"><font face="verdana, arial, helvetica" size="2">注意这里,以EXCLUSIVE 方式启动以后,实例名称信息被写入口令文件.</font></font></p>
<p class="style23">此时如果有其他实例以Exclusive模式启动仍然可以使用这个口令文件,口令文件中的实例名称同时被改写.</p>
<p class="style23"><font color="#000000"><font face="verdana, arial, helvetica" size="2">也就是说,数据库只在启动过程中才读取口令文件,数据库运行过程中并不锁定该文件,类似于pfile/spfile文件.<br />
</font></font></p>
<pre class="style23">SQL&gt; select * from v$pwfile_users;</pre>
<p class="style23">USERNAME SYSDB SYSOP<br />
------------------------------ ----- -----<br />
SYS TRUE TRUE</p>
<p class="style23">SQL&gt; grant sysdba to eygle;</p>
<p class="style23">Grant succeeded.</p>
<p class="style23">SQL&gt; select * from v$pwfile_users;</p>
<p class="style23">USERNAME SYSDB SYSOP<br />
------------------------------ ----- -----<br />
SYS TRUE TRUE<br />
EYGLE TRUE FALSE</p>
<p class="style23">SQL&gt; !<br />
[oracle@jumper bin]$ cd $ORACLE_HOME/dbs<br />
[oracle@jumper dbs]$ strings orapw<br />
]\[Z<br />
ORACLE Remote Password file<br />
HSJF<br />
INTERNAL<br />
AB27B53EDC5FEF41<br />
8A8F025737A9097A<br />
&gt;EYGLE<br />
B726E09FE21F8E83</p>
<p class="style23"><br />
注意此时可以增加SYSDBA用户，并且这些信息可以被写入到口令文件.</p>
<p class="style23">一旦口令文件中增加了其他SYSDBA用户,此文件不再能够被其他Exclusive的实例共享.<br />
</p>
<p class="style23">实际上，口令文件对于其他用户来说就是启到了一个 sudo 的作用.</p>
<p><font face="verdana, arial, helvetica">6.重建口令文件</font></p>
<p><span class="style26"><font face="Verdana">如果口令文件丢失,可以使用orapwd可以重建口令文件，语法如下:</font></span></p>
<pre class="style23">[oracle@jumper oracle]$ orapwd<br />
Usage: orapwd file=&lt;fname&gt; password=&lt;password&gt; entries=&lt;users&gt; </pre>
<p class="style23">where<br />
file - name of password file (mand),<br />
password - password for SYS (mand),<br />
entries - maximum number of distinct DBA and OPERs (opt), <br />
There are no spaces around the equal-to (=) character.</p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340141.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-09 14:25 <a href="http://www.blogjava.net/lz408925352/articles/340141.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 VMware Server 在 Linux 上安装 Oracle RAC 10g(三)</title><link>http://www.blogjava.net/lz408925352/articles/340122.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Thu, 09 Dec 2010 03:38:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340122.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340122.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340122.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340122.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340122.html</trackback:ping><description><![CDATA[. 探索 RAC 数据库环境
<p>现在，您已经成功安装了虚拟双节点 RAC 数据库，下面我们来探究一下您刚刚配置的环境。</p>
<strong>检查应用程序资源的状态。<br />
<br />
</strong>
<pre><font color="#ff0000">这个crs_stat 命令本来找不到,which后发现就在安装目录下面.于是env 查看环境变量,发现oracle_crs_home和ora_crs_home写的不对,改掉后ok.<br />
rac1-&gt; crs_stat -t</font><br />
Name           Type           Target    State     Host<br />
------------------------------------------------------------<br />
ora.devdb.db   application    ONLINE    ONLINE    rac1<br />
ora....b1.inst application    ONLINE    ONLINE    rac1<br />
ora....b2.inst application    ONLINE    ONLINE    rac2<br />
ora....SM1.asm application    ONLINE    ONLINE    rac1<br />
ora....C1.lsnr application    ONLINE    ONLINE    rac1<br />
ora.rac1.gsd   application    ONLINE    ONLINE    rac1<br />
ora.rac1.ons   application    ONLINE    ONLINE    rac1<br />
ora.rac1.vip   application    ONLINE    ONLINE    rac1<br />
ora....SM2.asm application    ONLINE    ONLINE    rac2<br />
ora....C2.lsnr application    ONLINE    ONLINE    rac2<br />
ora.rac2.gsd   application    ONLINE    ONLINE    rac2<br />
ora.rac2.ons   application    ONLINE    ONLINE    rac2<br />
ora.rac2.vip   application    ONLINE    ONLINE    rac2<br />
<br />
rac1-&gt; srvctl status nodeapps -n rac1<br />
VIP is running on node: rac1<br />
GSD is running on node: rac1<br />
Listener is running on node: rac1<br />
ONS daemon is running on node: rac1<br />
<br />
rac1-&gt; srvctl status nodeapps -n rac2<br />
VIP is running on node: rac2<br />
GSD is running on node: rac2<br />
Listener is running on node: rac2<br />
ONS daemon is running on node: rac2<br />
<br />
rac1-&gt; srvctl status asm -n rac1<br />
ASM instance +ASM1 is running on node rac1.<br />
<br />
rac1-&gt; srvctl status asm -n rac2<br />
ASM instance +ASM2 is running on node rac2. <br />
<br />
rac1-&gt; srvctl status database -d devdb<br />
Instance devdb1 is running on node rac1<br />
Instance devdb2 is running on node rac2<br />
<br />
rac1-&gt; srvctl status service -d devdb<br />
rac1-&gt;</pre>
<strong>检查 Oracle 集群件的状态。</strong>
<pre>rac1-&gt; crsctl check crs<br />
CSS appears healthy<br />
CRS appears healthy<br />
EVM appears healthy<br />
<br />
rac2-&gt; crsctl check crs<br />
CSS appears healthy<br />
CRS appears healthy<br />
EVM appears healthy</pre>
<p>在命令行执行 <tt><font face="新宋体">crsctl</font></tt> 以查看所有可用选项。</p>
<strong>列出 RAC 实例。</strong>
<pre>SQL&gt; select<br />
2  instance_name,<br />
3  host_name,<br />
4  archiver,<br />
5  thread#,<br />
6  status<br />
7  from gv$instance;<br />
<br />
INSTANCE_NAME  HOST_NAME             ARCHIVE  THREAD# STATUS<br />
-------------- --------------------- ------- -------- ------<br />
devdb1         rac1.mycorpdomain.com STARTED        1 OPEN<br />
devdb2         rac2.mycorpdomain.com STARTED        2 OPEN</pre>
<strong>检查连接。</strong>
<p>验证您能够连接到每个节点上的实例和服务。</p>
<pre>sqlplus system@devdb1<br />
sqlplus system@devdb2<br />
sqlplus system@devdb</pre>
<strong>检查数据库配置。</strong>
<pre>rac1-&gt; export ORACLE_SID=devdb1<br />
rac1-&gt; sqlplus / as sysdba<br />
<br />
SQL&gt; show sga<br />
<br />
Total System Global Area  209715200 bytes<br />
Fixed Size                  1218556 bytes<br />
Variable Size             104859652 bytes<br />
Database Buffers          100663296 bytes<br />
Redo Buffers                2973696 bytes<br />
<br />
<br />
SQL&gt; select file_name,bytes/1024/1024 from dba_data_files;<br />
<br />
FILE_NAME                                   BYTES/1024/1024<br />
------------------------------------------- ---------------<br />
+DG1/devdb/datafile/users.259.606468449                   5<br />
+DG1/devdb/datafile/sysaux.257.606468447                240<br />
+DG1/devdb/datafile/undotbs1.258.606468449               30<br />
+DG1/devdb/datafile/system.256.606468445                480<br />
+DG1/devdb/datafile/undotbs2.264.606468677               25<br />
<br />
<br />
SQL&gt; select<br />
2  group#,<br />
3  type,<br />
4  member,<br />
5  is_recovery_dest_file<br />
6  from v$logfile<br />
7  order by group#;<br />
<br />
GROUP# TYPE    MEMBER                                              IS_<br />
------ ------- --------------------------------------------------- ---<br />
1 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_1.257.606468581 YES<br />
1 ONLINE  +DG1/devdb/onlinelog/group_1.261.606468575          NO<br />
2 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_2.258.606468589 YES<br />
2 ONLINE  +DG1/devdb/onlinelog/group_2.262.606468583          NO<br />
3 ONLINE  +DG1/devdb/onlinelog/group_3.265.606468865          NO<br />
3 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_3.259.606468875 YES<br />
4 ONLINE  +DG1/devdb/onlinelog/group_4.266.606468879          NO<br />
4 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_4.260.606468887 YES<br />
<br />
<br />
rac1-&gt; export ORACLE_SID=+ASM1<br />
rac1-&gt; sqlplus / as sysdba<br />
<br />
SQL&gt; show sga<br />
<br />
Total System Global Area   92274688 bytes<br />
Fixed Size                  1217884 bytes<br />
Variable Size              65890980 bytes<br />
ASM Cache                  25165824 bytes<br />
<br />
<br />
SQL&gt; show parameter asm_disk<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
asm_diskgroups                 string      DG1, RECOVERYDEST<br />
asm_diskstring                 string<br />
<br />
<br />
SQL&gt; select<br />
2  group_number,<br />
3  name,<br />
4  allocation_unit_size alloc_unit_size,<br />
5  state,<br />
6  type,<br />
7  total_mb,<br />
8  usable_file_mb<br />
9  from v$asm_diskgroup;<br />
<br />
ALLOC                        USABLE<br />
GROUP                  UNIT                 TOTAL    FILE<br />
NUMBER NAME             SIZE STATE   TYPE       MB      MB<br />
------ ------------ -------- ------- ------ ------ -------<br />
1 DG1           1048576 MOUNTED NORMAL   6134    1868<br />
2 RECOVERYDEST  1048576 MOUNTED EXTERN   2047    1713<br />
<br />
<br />
SQL&gt; select<br />
2  name,<br />
3  path,<br />
4  header_status,<br />
5  total_mb free_mb,<br />
6  trunc(bytes_read/1024/1024) read_mb,<br />
7  trunc(bytes_written/1024/1024) write_mb<br />
8  from v$asm_disk;<br />
<br />
NAME  PATH       HEADER_STATU    FREE_MB    READ_MB   WRITE_MB<br />
----- ---------- ------------ ---------- ---------- ----------<br />
VOL1  ORCL:VOL1  MEMBER             3067        229       1242<br />
VOL2  ORCL:VOL2  MEMBER             3067        164       1242<br />
VOL3  ORCL:VOL3  MEMBER             2047         11        354</pre>
<strong>创建表空间。</strong>
<pre>SQL&gt; connect system/oracle@devdb<br />
Connected.<br />
SQL&gt; create tablespace test_d datafile '+DG1' size 10M;<br />
<br />
Tablespace created.<br />
<br />
SQL&gt; select<br />
2  file_name,<br />
3  tablespace_name,<br />
4  bytes<br />
5  from dba_data_files<br />
6  where tablespace_name='TEST_D';<br />
<br />
FILE_NAME                                TABLESPACE_NAME      BYTES<br />
---------------------------------------- --------------- ----------<br />
+DG1/devdb/datafile/test_d.269.606473423 TEST_D            10485760</pre>
<strong>创建在线重做日志文件组。</strong>
<pre>SQL&gt; connect system/oracle@devdb<br />
Connected.<br />
SQL&gt; alter database add logfile thread 1 group 5 size 50M;<br />
<br />
Database altered.<br />
<br />
SQL&gt; alter database add logfile thread 2 group 6 size 50M;<br />
<br />
Database altered.<br />
<br />
SQL&gt; select<br />
2  group#,<br />
3  thread#,<br />
4  bytes,<br />
5  members,<br />
6  status<br />
7  from v$log;<br />
<br />
GROUP#    THREAD#      BYTES    MEMBERS STATUS<br />
---------- ---------- ---------- ---------- ----------------<br />
1          1   52428800          2 CURRENT<br />
2          1   52428800          2 INACTIVE<br />
3          2   52428800          2 ACTIVE<br />
4          2   52428800          2 CURRENT<br />
5          1   52428800          2 UNUSED<br />
6          2   52428800          2 UNUSED<br />
<br />
SQL&gt; select<br />
2  group#,<br />
3  type,<br />
4  member,<br />
5  is_recovery_dest_file<br />
6  from v$logfile<br />
7  where group# in (5,6)<br />
8  order by group#;<br />
<br />
GROUP# TYPE    MEMBER                                               IS_<br />
------ ------- ---------------------------------------------------- ---<br />
5 ONLINE  +DG1/devdb/onlinelog/group_5.271.606473683           NO<br />
5 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_5.261.606473691  YES<br />
6 ONLINE  +DG1/devdb/onlinelog/group_6.272.606473697           NO<br />
6 ONLINE  +RECOVERYDEST/devdb/onlinelog/group_6.262.606473703  YES</pre>
<h2>10. 测试透明故障切换 (TAF)</h2>
<p>Oracle TAF 中的故障切换机制使任何失败的数据库连接能够重新连接到集群中的其他节点。故障切换对用户是透明的。Oracle 在故障切换实例上重新执行查询并继续向用户显示余下的结果。</p>
<p><strong>创建一个新的数据库服务。</strong>首先，创建一个名为 CRM 的新服务。可以使用 DBCA 或 srvctl 实用程序来创建数据库服务。这里，您将使用 DBCA 在 devdb1 上创建 CRM 服务。</p>
<br />
<table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
    <thead>
        <tr>
            <td bgcolor="#cccccc">服务名</td>
            <td bgcolor="#cccccc">数据库名</td>
            <td bgcolor="#cccccc">首选实例</td>
            <td bgcolor="#cccccc">可用实例</td>
            <td bgcolor="#cccccc">TAF 策略</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td valign="top">CRM</td>
            <td valign="top">devdb</td>
            <td valign="top">devdb1</td>
            <td valign="top">devdb2</td>
            <td valign="top">BASIC</td>
        </tr>
    </tbody>
</table>
<p>在 rac1 上，以 oracle 用户身份执行</p>
<pre>rac1-&gt; dbca</pre>
<ol>
    <li>欢迎页面：选择 <strong>Oracle Real Application Clusters database</strong>。</li>
    <li>操作：选择 <strong>Services Management</strong>。</li>
    <li>集群数据库列表：单击 <strong>Next</strong>。</li>
    <li>数据库服务：单击 <strong>Add</strong>。
    <ul>
        <li>添加服务：输入&#8220;CRM&#8221;。
        <ul>
            <li>选择 devdb1 作为首选实例。</li>
            <li>选择 devdb2 作为可用实例。</li>
            <li>TAF 策略：选择 <strong>Basic</strong>。</li>
        </ul>
        </li>
        <li>单击 <strong>Finish</strong>。</li>
    </ul>
    </li>
</ol>
<p><img height="466" alt="图 14" src="http://www.oracle.com/technology/pub/images/chan-ubl-f14.jpg" width="650" border="0" /></p>
<ol start="5">
    <li>数据库配置助手：单击 <strong>No</strong> 退出。</li>
</ol>
<p>数据库配置助手将在 tnsnames.ora 中创建以下 CRM 服务名项：</p>
<pre>CRM =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = rac1-vip)(PORT = 1521))<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = rac2-vip)(PORT = 1521))<br />
(LOAD_BALANCE = yes)<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = CRM)<br />
(FAILOVER_MODE =<br />
(TYPE = SELECT)<br />
(METHOD = BASIC)<br />
(RETRIES = 180)<br />
(DELAY = 5)<br />
)<br />
)<br />
)<br />
<br />
<br />
SQL&gt; connect system/oracle@devdb1<br />
Connected.<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb, CRM<br />
<br />
<br />
SQL&gt; connect system/oracle@devdb2<br />
Connected.<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb</pre>
<strong>使用 CRM 服务连接第一个会话。</strong>如果 failover_type 和 failover_mode 返回的输出为&#8220;NONE&#8221;，则验证是否在 tnsnames.ora 中正确配置了 CRM 服务。
<pre>SQL&gt; connect system/oracle@crm<br />
Connected.<br />
SQL&gt; select<br />
2  instance_number instance#,<br />
3  instance_name,<br />
4  host_name,<br />
5  status<br />
6  from v$instance;<br />
<br />
INSTANCE# INSTANCE_NAME    HOST_NAME             STATUS<br />
---------- ---------------- --------------------- ------------<br />
1 devdb1           rac1.mycorpdomain.com OPEN<br />
<br />
<br />
SQL&gt; select<br />
2  failover_type,<br />
3  failover_method,<br />
4  failed_over<br />
5  from v$session<br />
6  where username='SYSTEM';<br />
<br />
FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER<br />
------------- --------------- ----------------<br />
SELECT        BASIC           NO</pre>
<strong>从其他会话中关闭该实例。</strong>在 CRM 实例上以 sys 用户身份连接，并关闭该实例。
<pre>rac1-&gt; export ORACLE_SID=devdb1<br />
rac1-&gt; sqlplus / as sysdba<br />
<br />
SQL&gt; select<br />
2  instance_number instance#,<br />
3  instance_name,<br />
4  host_name,<br />
5  status<br />
6  from v$instance;<br />
<br />
<br />
INSTANCE# INSTANCE_NAME    HOST_NAME             STATUS<br />
---------- ---------------- --------------------- ------------<br />
1 devdb1           rac1.mycorpdomain.com OPEN<br />
<br />
SQL&gt; shutdown abort;<br />
ORACLE instance shut down.</pre>
<strong>验证会话已经完成故障切换。</strong>从您先前打开的同一 CRM 会话执行以下查询，以验证该会话已经故障切换到其他实例。
<pre>SQL&gt; select<br />
2  instance_number instance#,<br />
3  instance_name,<br />
4  host_name,<br />
5  status<br />
6  from v$instance;<br />
<br />
<br />
INSTANCE# INSTANCE_NAME    HOST_NAME             STATUS<br />
---------- ---------------- --------------------- ------------<br />
2 devdb2           rac2.mycorpdomain.com OPEN<br />
<br />
<br />
SQL&gt; select<br />
2  failover_type,<br />
3  failover_method,<br />
4  failed_over<br />
5  from v$session<br />
6  where username='SYSTEM';<br />
<br />
<br />
FAILOVER_TYPE FAILOVER_METHOD FAILED_OVER<br />
------------- --------------- ----------------<br />
SELECT        BASIC           YES</pre>
<strong>将 CRM 服务重新定位到首选实例。</strong>恢复 devdb1 之后，CRM 服务不会自动重新定位到首选实例。您必须手动将服务重新定位到 devdb1。
<pre>rac1-&gt; export ORACLE_SID=devdb1<br />
rac1-&gt; sqlplus / as sysdba<br />
<br />
SQL&gt; startup<br />
ORACLE instance started.<br />
<br />
Total System Global Area  209715200 bytes<br />
Fixed Size                  1218556 bytes<br />
Variable Size             104859652 bytes<br />
Database Buffers          100663296 bytes<br />
Redo Buffers                2973696 bytes<br />
Database mounted.<br />
Database opened.<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb<br />
<br />
<br />
rac2-&gt; export ORACLE_SID=devdb2<br />
rac2-&gt; sqlplus / as sysdba<br />
<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb, CRM<br />
<br />
<br />
rac1-&gt; srvctl relocate service -d devdb -s crm -i devdb2 -t devdb1<br />
<br />
<br />
SQL&gt; connect system/oracle@devdb1<br />
Connected.<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb, CRM<br />
<br />
<br />
SQL&gt; connect system/oracle@devdb2<br />
Connected.<br />
SQL&gt; show parameter service<br />
<br />
NAME                           TYPE        VALUE<br />
------------------------------ ----------- ------------------------<br />
service_names                  string      devdb</pre>
<h2>11. 数据库备份与恢复</h2>
<p>使用 Oracle 恢复管理器 (RMAN) 备份和恢复 Oracle RAC 数据库的过程与单实例数据库的备份和恢复过程相同。</p>
<p>在本部分中，您将看到一个非常简单的备份和恢复案例：</p>
<p>1. 执行完整的数据库备份。<br />
2. 在 test_d 表空间中创建 mytable 表。<br />
3. 在 t1 时间，向 mytable 中插入第一个记录。<br />
4 在 t2 时间，向 mytable 中插入第二个记录。<br />
5. 在 t3 时间，删除 mytable 表。<br />
6. 将 test_d 表空间恢复到某个时间点。<br />
7. 验证恢复结果。</p>
<h3>执行完整的数据库备份。</h3>
<pre>rac1-&gt; rman nocatalog target /<br />
<br />
Recovery Manager: Release 10.2.0.1.0 - Production on Mon Nov 13 18:15:09 2006<br />
<br />
Copyright (c) 1982, 2005, Oracle.  All rights reserved.<br />
<br />
connected to target database: DEVDB (DBID=511198553)<br />
using target database control file instead of recovery catalog<br />
<br />
RMAN&gt; configure controlfile autobackup on; <br />
<br />
RMAN&gt; backup database plus archivelog delete input;</pre>
<h3>在 test_d 表空间中创建 mytable 表。</h3>
<pre>19:01:56 SQL&gt; connect system/oracle@devdb2<br />
Connected.<br />
19:02:01 SQL&gt; create table mytable (col1 number) tablespace test_d;<br />
<br />
Table created.</pre>
<h3>在 t1 时间，向 mytable 中插入第一个记录。</h3>
<pre>19:02:50 SQL&gt; insert into mytable values (1);<br />
<br />
1 row created.<br />
<br />
19:02:59 SQL&gt; commit;<br />
<br />
Commit complete.</pre>
<h3>在 t2 时间，向 mytable 中插入第二个记录。</h3>
<pre>19:04:41 SQL&gt; insert into mytable values (2);<br />
<br />
1 row created.<br />
<br />
19:04:46 SQL&gt; commit;<br />
<br />
Commit complete.</pre>
<h3>在 t3 时间，删除 mytable 表。</h3>
<pre>19:05:09 SQL&gt; drop table mytable;<br />
<br />
Table dropped.</pre>
<h3>将 test_d 表空间恢复到某个时间点。</h3>
<p>为辅助数据库创建辅助目录。</p>
<pre>rac1-&gt; mkdir /u01/app/oracle/aux<br />
<br />
<br />
RMAN&gt; recover tablespace test_d<br />
2&gt; until time "to_date('13-NOV-2006 19:03:10','DD-MON-YYYY HH24:MI:SS')"<br />
3&gt; auxiliary destination '/u01/app/oracle/aux';<br />
<br />
RMAN&gt; backup tablespace test_d;<br />
<br />
RMAN&gt; sql 'alter tablespace test_d online';</pre>
<h3>验证恢复结果。</h3>
<pre>19:15:09 SQL&gt; connect system/oracle@devdb2<br />
Connected.<br />
19:15:16 SQL&gt; select * from mytable;<br />
<br />
COL1<br />
----------<br />
1</pre>
<h2>12. 探索 Oracle 企业管理器 (OEM) 数据库控制台</h2>
<p>Oracle 企业管理器数据库控制台提供了一个非常好的集成式综合 GUI 界面，用于管理集群数据库环境。您可以在控制台内执行几乎所有的任务。</p>
<p>要访问数据库控制台，请打开 Web 浏览器并输入下面的 URL。<br />
以 sysman 用户身份登录，并输入您先前在数据库安装期间选择的口令。</p>
<p>http://rac1:1158/em</p>
<p align="center"><img height="505" alt="图 15" src="http://www.oracle.com/technology/pub/images/chan-ubl-f15.jpg" width="650" border="0" /></p>
<h3>启动和停止数据库控制台。</h3>
<pre>rac1-&gt; emctl stop dbconsole<br />
TZ set to US/Eastern<br />
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0<br />
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />
http://rac1.mycorpdomain.com:1158/em/console/aboutApplication<br />
Stopping Oracle Enterprise Manager 10g Database Control ...<br />
...  Stopped.<br />
<br />
rac1-&gt; emctl start dbconsole<br />
TZ set to US/Eastern<br />
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0<br />
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />
http://rac1.mycorpdomain.com:1158/em/console/aboutApplication<br />
Starting Oracle Enterprise Manager 10g Database Control <br />
................... started.<br />
------------------------------------------------------------------<br />
Logs are generated in directory <br />
/u01/app/oracle/product/10.2.0/db_1/rac1_devdb1/sysman/log</pre>
<h3>验证数据库控制台的状态。</h3>
<pre>rac1-&gt; emctl status dbconsole<br />
TZ set to US/Eastern<br />
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0<br />
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />
http://rac1.mycorpdomain.com:1158/em/console/aboutApplication<br />
Oracle Enterprise Manager 10g is running.<br />
------------------------------------------------------------------<br />
Logs are generated in directory <br />
/u01/app/oracle/product/10.2.0/db_1/rac1_devdb1/sysman/log<br />
<br />
rac1-&gt; emctl status agent<br />
TZ set to US/Eastern<br />
Oracle Enterprise Manager 10g Database Control Release 10.2.0.1.0<br />
Copyright (c) 1996, 2005 Oracle Corporation.  All rights reserved.<br />
---------------------------------------------------------------<br />
Agent Version     : 10.1.0.4.1<br />
OMS Version       : 10.1.0.4.0<br />
Protocol Version  : 10.1.0.2.0<br />
Agent Home        : /u01/app/oracle/product/10.2.0/db_1/rac1_devdb1<br />
Agent binaries    : /u01/app/oracle/product/10.2.0/db_1<br />
Agent Process ID  : 10263<br />
Parent Process ID : 8171<br />
Agent URL         : http://rac1.mycorpdomain.com:3938/emd/main<br />
Started at        : 2006-11-12 08:10:01<br />
Started by user   : oracle<br />
Last Reload       : 2006-11-12 08:20:33<br />
Last successful upload                       : 2006-11-12 08:41:53<br />
Total Megabytes of XML files uploaded so far :     4.88<br />
Number of XML files pending upload           :        0<br />
Size of XML files pending upload(MB)         :     0.00<br />
Available disk space on upload filesystem    :    71.53%<br />
---------------------------------------------------------------<br />
Agent is Running and Ready</pre>
<h2>13. 常见问题</h2>
<p>下面是可能对您有用的问题和解决方法摘要列表。</p>
<p><strong>问题 1：无法激活以太网设备。</strong><br />
错误消息为&#8220;Cannot activate network device eth0!Device eth0 has different MAC address than expected, ignoring.&#8221;</p>
<p><strong>解决方法：</strong><br />
&#8220;ifconfig&#8221;报告的 MAC 地址与 /etc/sysconfig/network-scripts/ifcfg-eth0 不匹配。您可以使用新的 MAC 地址更新文件，或者只需通过 <tt><font face="新宋体">system-config-network</font></tt> 工具探测新的 MAC 地址。</p>
<br />
<p><strong>问题 2：无法生成 OCFS2 配置文件。</strong><br />
在尝试生成 OCFS2 配置文件时，出现错误消息&#8220;Could not start cluster stack.This must be resolved before any OCFS2 filesystem can be mounted&#8221;。</p>
<p><strong>解决方法：</strong><br />
以 root 用户身份（而非 oracle 用户身份）执行 ocfs2console。</p>
<br />
<p><strong>问题 3：无法在远程节点上安装 Oracle 集群件或 Oracle 数据库软件。</strong><br />
在 Oracle 集群件软件安装期间，出现错误消息&#8220;/bin/tar:./inventory/Components21/oracle.ordim.server /10.2.0.1.0:time stamp 2006-11-04 06:24:04 is 25 s in the future&#8221;。</p>
<p><strong>解决方法：</strong><br />
通过安装 VMware 工具来同步客户 OS 与主机 OS 的时间，并在 /boot/grub/grub.conf 中包含选项&#8220;clock<strong>=</strong>pit nosmp noapic nolapic&#8221;。请参阅第 3 部分，以获得更多信息。</p>
<br />
<p><strong>问题 4：无法挂载 OCFS2 文件系统。</strong><br />
在尝试挂载 ocfs2 文件系统时，出现错误消息&#8220;mount.ocfs2:Transport endpoint is not connected while mounting&#8221;。</p>
<p><strong>解决方法：</strong><br />
执行 <tt><font face="新宋体">/usr/bin/system-config-securitylevel</font></tt> 以禁用防火墙。</p>
<br />
<p><strong>问题 5：无法启动 ONS 资源。</strong><br />
当 VIPCA 尝试启动 ONS 应用程序资源时，出现错误消息&#8220;CRS-0215:Could not start resource &#8216;ora.rac2.ons&#8217;&#8221;。</p>
<p><strong>解决方法：</strong><br />
ONS 尝试访问本地主机，但无法解析 IP 地址。将以下项添加到 /etc/hosts 中。</p>
<p>127.0.0.1 localhost<br />
<br />
<br />
</p>
<h2>结论</h2>
<p>希望通过本指南的学习，您可以免费、快速地使用 VMware Server 构建集群 Oracle 数据库环境。利用免费软件，开始学习并试用 Enterprise Linux 上的 Oracle RAC！</p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340122.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-09 11:38 <a href="http://www.blogjava.net/lz408925352/articles/340122.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 VMware Server 在 Linux 上安装 Oracle RAC 10g(二)</title><link>http://www.blogjava.net/lz408925352/articles/340121.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Thu, 09 Dec 2010 03:37:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340121.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340121.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340121.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340121.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340121.html</trackback:ping><description><![CDATA[<h2>4. 创建并配置第二个虚拟机</h2>
<p>要创建第二个虚拟机，只需关闭第一个虚拟机，将 d:vmracrac1 中的所有文件复制到 d:vmracrac2，然后更改几个配置即可。</p>
<strong>修改网络配置。</strong>
<ol>
    <li>在 rac1 上，以 root 用户身份执行<br />
    <tt><font face="新宋体"># shutdown &#8211;h now</font></tt></li>
    <li>在主机系统上，将 rac1 文件夹中的所有文件复制到 rac2。<br />
    <tt><font face="新宋体">D:&gt;copy d:vmracrac1 d:vmracrac2</font></tt></li>
    <li>在 VMware Server 控制台上，按 CTRL-O 打开第二个虚拟机 d:racrac2Red Hat Enterprise Linux 4.vmx。</li>
    <li>VMware Server 控制台：
    <ul>
        <li>将虚拟机名称从 rac1 重命名为 rac2。右键单击您刚才打开的新 <strong>rac1</strong> 选项卡，然后选择 <strong>Settings</strong>。
        <ul>
            <li>选择 <strong>Options</strong> 选项卡。<br />
            1. 虚拟机名称：输入&#8220;rac2&#8221;。</li>
        </ul>
        </li>
    </ul>
    </li>
</ol>
<p><img height="475" alt="图 5" src="http://www.oracle.com/technology/pub/images/chan-ubl-f5.jpg" width="617" border="0" /></p>
<ul type="circle">
    <li>单击 <strong>Start this virtual machine</strong> 启动 rac2，保留 rac1 为电源关闭状态。</li>
    <li>rac2 — 虚拟机：选择 <strong>Create a new identifier</strong>。</li>
</ul>
<ol start="5">
    <li>以 root 用户身份登录并执行 system-config-network，以修改网络配置。
    <p><strong>IP 地址：</strong>双击每个以太网设备，并使用下面的表进行必要的更改。</p>
    <table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
        <thead>
            <tr>
                <td bgcolor="#cccccc">设备</td>
                <td bgcolor="#cccccc">IP 地址</td>
                <td bgcolor="#cccccc">子网掩码</td>
                <td bgcolor="#cccccc">默认网关地址</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td valign="top">eth0</td>
                <td valign="top">192.168.2.132</td>
                <td valign="top">255.255.255.0</td>
                <td valign="top">192.168.2.1</td>
            </tr>
            <tr>
                <td valign="top">eth1</td>
                <td valign="top">10.10.10.32</td>
                <td valign="top">255.255.255.0</td>
                <td valign="top">&lt;保留空白&gt;</td>
            </tr>
        </tbody>
    </table>
    <p><strong>MAC 地址：</strong>导航到 <strong>Hardware Device</strong> 选项卡，并探测每个以太网设备的新 MAC 地址。</p>
    <p><strong>主机名和 DNS：</strong>使用下面的表对 DNS 选项卡中的项进行必要的更改，然后按 CTRL-S 保存。</p>
    <table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
        <thead>
            <tr>
                <td bgcolor="#cccccc">主机名</td>
                <td bgcolor="#cccccc">首选 DNS</td>
                <td bgcolor="#cccccc">备用 DNS</td>
                <td bgcolor="#cccccc">DNS 搜索路径</td>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td valign="top">rac2.mycorpdomain.com</td>
                <td valign="top">输入 DNS IP 地址或保留空白。</td>
                <td valign="top">输入 DNS IP 地址或保留空白。</td>
                <td valign="top">接受默认设置或保留空白。</td>
            </tr>
        </tbody>
    </table>
    <p>最后，激活每个以太网设备。</p>
    </li>
</ol>
<p><strong>修改 /etc/hosts。</strong>将以下项添加到 /etc/hosts 中。</p>
<p>127.0.0.1 localhost<br />
<br />
稍后，在 Oracle 集群件软件安装期间，VIPCA 将尝试使用回送地址。</p>
<p><strong>修改 /export/home/oracle/.profile。</strong>用 devdb2 替换 ORACLE_SID 的值。</p>
<p><strong>使用 SSH 建立用户等效性。</strong>在集群就绪服务 (CRS) 和 RAC 安装过程中，Oracle Universal Installer (OUI) 必须能够以 oracle 的身份将软件复制到所有 RAC 节点，而不提示输入口令。在 Oracle 10<em>g</em> 中，可以使用 ssh 代替 rsh 完成此操作。</p>
<p>要建立用户等效性，请在两个节点上以 oracle 用户身份生成用户的公钥和私钥。打开 rac1 的电源，在这两个节点上执行以下任务。<br />
在 rac1 上执行</p>
rac1-&gt; mkdir ~/.ssh<br />
rac1-&gt; chmod 700 ~/.ssh<br />
rac1-&gt; ssh-keygen -t rsa<br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/export/home/oracle/.ssh/id_rsa):<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /export/home/oracle/.ssh/id_rsa.<br />
Your public key has been saved in /export/home/oracle/.ssh/id_rsa.pub.<br />
The key fingerprint is:<br />
87:54:4f:92:ba:ed:7b:51:5d:1d:59:5b:f9:44:da:b6 oracle@rac1.mycorpdomain.com<br />
rac1-&gt; ssh-keygen -t dsa<br />
Generating public/private dsa key pair.<br />
Enter file in which to save the key (/export/home/oracle/.ssh/id_dsa):<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /export/home/oracle/.ssh/id_dsa.<br />
Your public key has been saved in /export/home/oracle/.ssh/id_dsa.pub.<br />
The key fingerprint is:<br />
31:76:96:e6:fc:b7:25:04:fd:70:42:04:1f:fc:9a:26 oracle@rac1.mycorpdomain.com <br />
<p>在 rac2 上执行</p>
rac2-&gt; mkdir ~/.ssh<br />
rac2-&gt; chmod 700 ~/.ssh<br />
rac2-&gt; ssh-keygen -t rsa<br />
Generating public/private rsa key pair.<br />
Enter file in which to save the key (/export/home/oracle/.ssh/id_rsa):<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /export/home/oracle/.ssh/id_rsa.<br />
Your public key has been saved in /export/home/oracle/.ssh/id_rsa.pub.<br />
The key fingerprint is:<br />
29:5a:35:ac:0a:03:2c:38:22:3c:95:5d:68:aa:56:66 oracle@rac2.mycorpdomain.com<br />
rac2-&gt; ssh-keygen -t dsa<br />
Generating public/private dsa key pair.<br />
Enter file in which to save the key (/export/home/oracle/.ssh/id_dsa):<br />
Enter passphrase (empty for no passphrase):<br />
Enter same passphrase again:<br />
Your identification has been saved in /export/home/oracle/.ssh/id_dsa.<br />
Your public key has been saved in /export/home/oracle/.ssh/id_dsa.pub.<br />
The key fingerprint is:<br />
4c:b2:5a:8d:56:0f:dc:7b:bc:e0:cd:3b:8e:b9:5c:7c oracle@rac2.mycorpdomain.com<br />
<p>在 rac1 上执行</p>
rac1-&gt; cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />
rac1-&gt; cat ~/.ssh/id_dsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />
rac1-&gt; ssh rac2 cat ~/.ssh/id_rsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />
The authenticity of host 'rac2 (192.168.2.132)' can't be established.<br />
RSA key fingerprint is 63:d3:52:d4:4d:e2:cb:ac:8d:4a:66:9f:f1:ab:28:1f.<br />
Are you sure you want to continue connecting (yes/no)? yes<br />
Warning: Permanently added 'rac2,192.168.2.132' (RSA) to the list of known hosts.<br />
oracle@rac2's password:<br />
rac1-&gt; ssh rac2 cat ~/.ssh/id_dsa.pub &gt;&gt; ~/.ssh/authorized_keys<br />
oracle@rac2's password:<br />
rac1-&gt; scp ~/.ssh/authorized_keys rac2:~/.ssh/authorized_keys<br />
oracle@rac2's password:<br />
authorized_keys 100% 1716 1.7KB/s 00:00<br />
<p><font color="#000000">在每个节点上测试连接。验证当您再次运行以下命令时，系统是否不提示您输入口令。</font></p>
<font color="#000000">ssh rac1 date<br />
ssh rac2 date<br />
ssh rac1-priv date<br />
ssh rac2-priv date<br />
ssh rac1.mycorpdomain.com date<br />
ssh rac2.mycorpdomain.com date<br />
ssh rac1-priv.mycorpdomain.com date<br />
ssh rac2-priv.mycorpdomain.com date</font><br />
<font color="#ff0000">一定要确认不需要密码就能执行 否则后面从rac1远程安装cluster ware到rac2上的时候会报错.</font><br />
<br />
<h2>5. 配置 Oracle 自动存储管理 (ASM)</h2>
<p>Oracle ASM 与 Oracle 数据库紧密集成在一起，并与 Oracle 的数据管理工具套件配合工作。它可以简化数据库存储管理，并提供原始磁盘 I/O 的性能。</p>
<p><strong>配置 ASMLib。</strong><font color="#ff0000">以 root 用户身份在两个节点上配置 ASMLib。</font></p>
<pre># /etc/init.d/oracleasm configure<br />
Configuring the Oracle ASM library driver.<br />
<br />
This will configure the on-boot properties of the Oracle ASM library<br />
driver.  The following questions will determine whether the driver is<br />
loaded on boot and what permissions it will have.  The current values<br />
will be shown in brackets ('[]').  Hitting <enter></enter> without typing an<br />
answer will keep that current value.  Ctrl-C will abort.<br />
<br />
Default user to own the driver interface []: oracle<br />
Default group to own the driver interface []: dba<br />
Start Oracle ASM library driver on boot (y/n) [n]: y<br />
Fix permissions of Oracle ASM disks on boot (y/n) [y]: y<br />
Writing Oracle ASM library driver configuration:           [  OK  ]<br />
Loading module "oracleasm":                                [  OK  ]<br />
Mounting ASMlib driver filesystem:                         [  OK  ]<br />
Scanning system for ASM disks:                             [  OK  ]</pre>
<p><strong>创建 ASM 磁盘。</strong>以 root 用户身份在任何一个节点上创建 ASM 磁盘。</p>
<pre># /etc/init.d/oracleasm createdisk VOL1 /dev/sdc1<br />
Marking disk "/dev/sdc1" as an ASM disk:                   [  OK  ]<br />
# /etc/init.d/oracleasm createdisk VOL2 /dev/sdd1<br />
Marking disk "/dev/sdd1" as an ASM disk:                   [  OK  ]<br />
# /etc/init.d/oracleasm createdisk VOL3 /dev/sde1<br />
Marking disk "/dev/sde1" as an ASM disk:                   [  OK  ]<br />
Verify that the ASM disks are visible from every node. <br />
# /etc/init.d/oracleasm scandisks<br />
Scanning system for ASM disks:                      [  OK  ]<br />
# /etc/init.d/oracleasm listdisks<br />
VOL1<br />
VOL2<br />
VOL3<br />
VOL4</pre>
<h2>6. 配置 Oracle 集群文件系统 (OCFS2)</h2>
<p>OCFS2 是 Oracle 开发的一个通用集群文件系统，与 Enterprise Linux 内核集成在一起。它允许所有节点在集群文件系统上同时共享文件，因而消除了管理原始设备的需求。这里，您将在 OCFS2 文件系统中寄宿 OCR 和表决磁盘。您可以从 OCFS2 用户指南获取有关 OCFS2 的其他信息。</p>
<p>在 Enterprise Linux 安装期间，您应该已经安装了 OCFS2 RPM。验证 RPM 是否已经安装在两个节点上。</p>
<pre>rac1-&gt; rpm -qa | grep ocfs<br />
<font color="#ff0000">ocfs2-tools-1.2.2-2<br />
ocfs2console-1.2.2-2<br />
ocfs2-2.6.9-42.0.0.0.1.ELsmp-1.2.3-2<br />
要去oracle 下载<br />
</font></pre>
<p><strong>创建 OCFS2 配置文件。</strong><font color="#ff0000"> 在 rac1 上，以 root 用户身份执行</font></p>
<pre># ocfs2console</pre>
<ol>
    <li>OCFS2 控制台：选择 <strong>Cluster</strong>，然后选择 <strong>Configure Nodes</strong>。</li>
    <li>&#8220;集群堆栈已经启动&#8221;：单击 <strong>Close</strong>。</li>
    <li>节点配置：单击 <strong>Add</strong>。</li>
    <li>新增节点：添加以下节点，然后单击 <strong>Apply</strong>。
    <ul>
        <li>名称：rac1</li>
        <li>IP 地址： 192.168.2.131</li>
        <li>IP 端口： 7777</li>
        <li>名称：rac2</li>
        <li>IP 地址： 192.168.2.132</li>
        <li>IP 端口： 7777</li>
    </ul>
    </li>
    <li>验证生成的配置文件。
    <pre># more /etc/ocfs2/cluster.conf<br />
    node:<br />
    ip_port = 7777<br />
    ip_address = 192.168.2.131<br />
    number = 0<br />
    name = rac1<br />
    cluster = ocfs2<br />
    <br />
    node:<br />
    ip_port = 7777<br />
    ip_address = 192.168.2.132<br />
    number = 1<br />
    name = rac2<br />
    cluster = ocfs2<br />
    <br />
    cluster:<br />
    node_count = 2<br />
    name = ocfs2</pre>
    </li>
    <li>将配置文件传播到 rac2。您可以在 rac2 上重新运行上述步骤以生成配置文件，或者在 rac1 的 OCFS2 控制台上选择 <strong>Cluster</strong> 和 <strong>Propagate Configuration</strong> 以将配置文件传播到 rac2。</li>
</ol>
<p><strong>配置 O2CB 驱动程序。</strong>O2CB 是一组集群服务，负责管理节点与集群文件系统之间的通信。下面是对各个服务的说明：</p>
<ul>
    <li>NM：用于跟踪 cluster.conf 中的所有节点的节点管理器</li>
    <li>HB：当节点加入或离开集群时向上/向下发出通知的心跳服务</li>
    <li>TCP：处理节点之间的通信</li>
    <li>DLM：用于跟踪所有锁、这些锁的所有者以及状态的分布式锁管理器</li>
    <li>CONFIGFS：在 /config 中挂载的用户空间驱动的配置文件系统</li>
    <li>DLMFS：用户空间与内核空间 DLM 的接口</li>
</ul>
<p>在两个节点上执行下面的过程，将 O2CB 配置为在引导时启动。</p>
<p>当系统提示您指定心跳死亡阈值时，您必须指定一个大于 7 的值，以防止节点由于较慢的 IDE 磁盘驱动器而崩溃。心跳死亡阈值是一个用于计算隔离时间的变量。</p>
<pre>Fence time (seconds) = (heartbeat dead threshold -1) * 2</pre>
<p>在我们的环境中，120 秒的隔离时间很合适。两个节点上的心跳死亡阈值应该完全相同。</p>
<p>以 root 用户身份执行</p>
<pre># /etc/init.d/o2cb unload<br />
Stopping O2CB cluster ocfs2: OK<br />
Unmounting ocfs2_dlmfs filesystem: OK<br />
Unloading module "ocfs2_dlmfs": OK<br />
Unmounting configfs filesystem: OK<br />
Unloading module "configfs": OK<br />
<br />
# /etc/init.d/o2cb configure<br />
Configuring the O2CB driver.<br />
<br />
This will configure the on-boot properties of the O2CB driver.<br />
The following questions will determine whether the driver is loaded on<br />
boot.  The current values will be shown in brackets ('[]').  Hitting<br />
<enter></enter> without typing an answer will keep that current value.  Ctrl-C<br />
will abort.<br />
<br />
Load O2CB driver on boot (y/n) [y]: y<br />
Cluster to start on boot (Enter "none" to clear) [ocfs2]:<br />
Specify heartbeat dead threshold (&gt;=7) [7]: 61<br />
Writing O2CB configuration: OK<br />
Loading module "configfs": OK<br />
Mounting configfs filesystem at /config: OK<br />
Loading module "ocfs2_nodemanager": OK<br />
Loading module "ocfs2_dlm": OK<br />
Loading module "ocfs2_dlmfs": OK<br />
Mounting ocfs2_dlmfs filesystem at /dlm: OK<br />
Starting O2CB cluster ocfs2: OK</pre>
<p><strong>格式化文件系统。</strong>在格式化和挂载文件系统之前，应验证 O2CB 在两个节点上均联机；O2CB 心跳当前没有活动，因为文件系统未挂载。</p>
<pre><font color="#ff0000"># /etc/init.d/o2cb status<br />
(很重要的命令,重新启动后应该首先判断这个服务是否开启,状态如何,特别是heartbeat是不是active<br />
一般都是ocfs没有mount上的原因造成没有启动)<br />
<br />
</font>Module "configfs": Loaded<br />
Filesystem "configfs": Mounted<br />
Module "ocfs2_nodemanager": Loaded<br />
Module "ocfs2_dlm": Loaded<br />
Module "ocfs2_dlmfs": Loaded<br />
Filesystem "ocfs2_dlmfs": Mounted<br />
Checking O2CB cluster ocfs2: Online<br />
Checking O2CB heartbeat: Not active</pre>
<p>您只需在一个节点上格式化文件系统。在 rac1 上，以 root 用户身份执行</p>
<pre># ocfs2console</pre>
<ol>
    <li>OCFS2 控制台：选择 <strong>Tasks、Format</strong>。</li>
    <li>格式：
    <ul>
        <li>可用设备：/dev/sdb1</li>
        <li>卷标：oracle</li>
        <li>集群大小：Auto</li>
        <li>节点插槽数量： 4</li>
        <li>块大小：Auto</li>
    </ul>
    </li>
    <li>OCFS2 控制台：按 CTRL-Q 退出。</li>
</ol>
<p><strong>挂载文件系统。</strong>要挂载文件系统，在两个节点上执行以下命令。</p>
<pre><font color="#ff0000"># mount -t ocfs2 -o datavolume,nointr /dev/sdb1 /ocfs</font></pre>
<p>要在引导时挂载文件系统，在两个节点的 /etc/fstab 中添加以下行。</p>
<p><strong>/etc/fstab</strong></p>
<pre>/dev/sdb1 /ocfs ocfs2 _netdev,datavolume,nointr 0 0</pre>
<p><strong>创建 Oracle 集群件目录。</strong>在 OCR 和表决磁盘将驻留的 OCFS2 文件系统中创建目录。</p>
<p>在 rac1 上执行</p>
<pre># mkdir /ocfs/clusterware<br />
# chown -R oracle:dba /ocfs</pre>
<p>现在，您已经完成了 OCFS2 的设置。验证您可以在两个节点的共享集群文件系统上读写文件。</p>
<h2>7. 安装 Oracle 集群件</h2>
<p><font color="#ff0000">下载后，</font><font color="#ff0000">在 rac1 上以 oracle 用户身份执行(注销切换到oracle ,这样起安装图形就没有问题)</font></p>
<p><font color="#ff0000">安装之前最好是用安装目录下的检测工具来检查是否满足安装的要求</font></p>
<p><font color="#ff0000">../. cluvfy stage -pre crsinst -n rac1,rac2</font></p>
<pre><font color="#ff0000">我安装的时候还差几个gcc 的包 安装好了就可以了<br />
检查的时候会报vips的错误可以忽略,等cluster安装后了以后再设置.<br />
</font></pre>
<pre>rac1-&gt; /u01/staging/clusterware/runInstaller</pre>
<ol>
    <li>欢迎页面：单击 <strong>Next</strong>。</li>
    <li>指定 Inventory 目录和证书：
    <ul>
        <li>输入 inventory 目录的完整路径：/u01/app/oracle/oraInventory。</li>
        <li>指定操作系统组名：oinstall。</li>
    </ul>
    </li>
    <li>指定 Home 详细内容：
    <ul>
        <li>名称：OraCrs10g_home</li>
        <li>/u01/app/oracle/product/10.2.0/crs_1</li>
    </ul>
    </li>
    <li>特定于产品的必要条件检查：
    <ul>
        <li>忽略有关物理内存要求的警告。</li>
    </ul>
    </li>
    <li><font color="#000000">指定集群配置：单击 <strong>Add</strong>。 </font>
    <ul>
        <li><font color="#000000">公共节点名称：rac2.mycorpdomain.com</font></li>
        <li><font color="#000000">专用节点名称：rac2-priv.mycorpdomain.com</font></li>
        <li><font color="#000000">虚拟主机名称：rac2-vip.mycorpdomain.com</font></li>
        <li><font color="#ff0000">最好这里直接用rac1,rac1-priv,rac1-vip来指名节点<br />
        </font></li>
    </ul>
    </li>
    <li>指定网络接口用法：
    <ul>
        <li>接口名称：eth0</li>
        <li>子网： 192.168.2.0</li>
        <li><font color="#ff0000">接口类型：Public</font></li>
        <li>接口名称：eth1</li>
        <li>子网： 10.10.10.0</li>
        <li><font color="#ff0000">接口类型：Private</font></li>
    </ul>
    </li>
    <li>指定 Oracle 集群注册表 (OCR) 位置：选择 <strong>External Redundancy</strong>。<br />
    为了简单起见，这里将不镜像 OCR。在生产环境中，您可能会考虑复用 OCR 以实现更高的冗余。
    <ul>
        <li>指定 OCR 位置：/ocfs/clusterware/ocr</li>
    </ul>
    </li>
    <li>指定表决磁盘位置：选择 <strong>External Redundancy</strong>。<br />
    同样，为了简单起见，我们选择不镜像表决磁盘。
    <ul>
        <li>表决磁盘位置：/ocfs/clusterware/votingdisk</li>
    </ul>
    </li>
    <li>摘要：单击 <strong>Install</strong>。</li>
    <li>执行配置脚本：以 root 用户身份按顺序执行以下脚本（一次执行一个）。在当前脚本完成后，再继续执行下一个脚本。
    <ul>
        <li>在 rac1 上执行 /u01/app/oracle/oraInventory/orainstRoot.sh。</li>
        <li>在 rac2 上执行 /u01/app/oracle/oraInventory/orainstRoot.sh。</li>
        <li>在 rac1 上执行 /u01/app/oracle/product/10.2.0/crs_1/root.sh。</li>
        <li>在 rac2 上执行 /u01/app/oracle/product/10.2.0/crs_1/root.sh。</li>
    </ul>
    rac2 上的 root.sh 脚本会自动调用 VIPCA，但会因为&#8220;The given interface(s), "eth0" is not public.Public interfaces should be used to configure virtual IPs.&#8221;错误而失败。如果您的公共接口使用不可路由的 IP 地址 (192.168.x.x)，则 Oracle 集群验证实用程序 (CVU) 将无法找到合适的公共接口。一种解决方法是手动运行 VIPCA。</li>
    <li>以 root 用户身份在第二个节点上手动调用 VIPCA。<br />
    <tt><font face="新宋体"># /u01/app/oracle/product/10.2.0/crs_1/bin/vipca</font></tt></li>
    <li>欢迎页面：单击 <strong>Next</strong>。</li>
    <li>网络接口：选择 <strong>eth0</strong>。</li>
    <li>集群节点的虚拟 IP：
    <ul>
        <li>节点名称：rac1</li>
        <li>IP 别名：rac1-vip</li>
        <li>IP 地址： 192.168.2.31</li>
        <li>子网掩码： 255.255.255.0</li>
        <li>节点名称：rac2</li>
        <li>IP 别名：rac2-vip</li>
        <li>IP 地址： 192.168.2.32</li>
        <li>子网掩码： 255.255.255.0</li>
    </ul>
    </li>
    <li>摘要：单击 <strong>Finish</strong>。
    <p><img height="350" alt="图 6" src="http://www.oracle.com/technology/pub/images/chan-ubl-f6.jpg" width="525" border="0" /></p>
    </li>
    <li>配置助手进度对话框：配置完成后，单击 <strong>OK</strong>。</li>
    <li>配置结果：单击 <strong>Exit</strong>。</li>
    <li>返回到 rac1 的执行配置脚本屏幕，然后单击 <strong>OK</strong>。
    <p><img height="447" alt="图 7" src="http://www.oracle.com/technology/pub/images/chan-ubl-f7.jpg" width="552" border="0" /></p>
    </li>
    <li>配置助手：验证所有检查均成功。OUI 在最后会执行集群件安装后检查。如果 CVU 失败，请更正问题，并以 oracle 用户身份重新运行以下命令：
    <pre>rac1-&gt; /u01/app/oracle/product/10.2.0/crs_1/bin/cluvfy stage <br />
    -post crsinst -n rac1,rac2<br />
    <br />
    Performing post-checks for cluster services setup<br />
    <br />
    Checking node reachability...<br />
    Node reachability check passed from node "rac1".<br />
    <br />
    Checking user equivalence...<br />
    User equivalence check passed for user "oracle".<br />
    <br />
    Checking Cluster manager integrity...<br />
    <br />
    Checking CSS daemon...<br />
    Daemon status check passed for "CSS daemon".<br />
    <br />
    Cluster manager integrity check passed.<br />
    <br />
    Checking cluster integrity...<br />
    <br />
    Cluster integrity check passed<br />
    <br />
    Checking OCR integrity...<br />
    <br />
    Checking the absence of a non-clustered configuration...<br />
    All nodes free of non-clustered, local-only configurations.<br />
    <br />
    Uniqueness check for OCR device passed.<br />
    <br />
    Checking the version of OCR...<br />
    OCR of correct Version "2" exists.<br />
    <br />
    Checking data integrity of OCR...<br />
    Data integrity check for OCR passed.<br />
    <br />
    OCR integrity check passed.<br />
    <br />
    Checking CRS integrity...<br />
    <br />
    Checking daemon liveness...<br />
    Liveness check passed for "CRS daemon".<br />
    <br />
    Checking daemon liveness...<br />
    Liveness check passed for "CSS daemon".<br />
    <br />
    Checking daemon liveness...<br />
    Liveness check passed for "EVM daemon".<br />
    <br />
    Checking CRS health...<br />
    CRS health check passed.<br />
    <br />
    CRS integrity check passed.<br />
    <br />
    Checking node application existence...<br />
    <br />
    Checking existence of VIP node application (required)<br />
    Check passed.<br />
    <br />
    Checking existence of ONS node application (optional)<br />
    Check passed.<br />
    <br />
    Checking existence of GSD node application (optional)<br />
    Check passed.<br />
    <br />
    Post-check for cluster services setup was successful.</pre>
    </li>
    <li>安装结束：单击 <strong>Exit</strong>。</li>
</ol>
<br />
<h2>8. 安装 Oracle 数据库 10<em>g</em> 第 2 版</h2>
<p>下载后，在 rac1 上以 oracle 用户身份执行</p>
<pre>rac1-&gt; /u01/staging/database/runInstaller</pre>
<ol>
    <li>欢迎页面：单击 <strong>Next</strong>。</li>
    <li>选择安装类型：
    <ul>
        <li>选择 <strong>Enterprise Edition</strong>。</li>
    </ul>
    </li>
    <li>指定 Home 详细内容：
    <ul>
        <li>名称：OraDb10g_home1</li>
        <li>路径：/u01/app/oracle/product/10.2.0/db_1</li>
    </ul>
    </li>
    <li>指定硬件集群安装模式：
    <ul>
        <li>选择 <strong>Cluster Installation</strong>。</li>
        <li>单击 <strong>Select All</strong>。</li>
    </ul>
    </li>
    <li>特定于产品的必要条件检查：
    <ul>
        <li>忽略有关物理内存要求的警告。</li>
    </ul>
    </li>
    <li>选择配置选项：
    <ul>
        <li>创建数据库。</li>
    </ul>
    </li>
    <li>选择数据库配置：
    <ul>
        <li>选择 <strong>Advanced</strong>。</li>
    </ul>
    </li>
    <li>摘要：单击 <strong>Install</strong>。</li>
    <li>数据库模板：
    <ul>
        <li>选择 <strong>General Purpose</strong>。</li>
    </ul>
    </li>
    <li>数据库标识：
    <ul>
        <li>全局数据库名称：devdb</li>
        <li>SID 前缀：devdb</li>
    </ul>
    </li>
    <li>管理选项：
    <ul>
        <li>选择 <strong>Configure the Database with Enterprise Manager</strong>。</li>
    </ul>
    </li>
    <li>数据库证书：
    <ul>
        <li>针对所有帐户使用相同的口令。</li>
    </ul>
    </li>
    <li>存储选项：
    <ul>
        <li>选择 <strong>Automatic Storage Management (ASM)</strong>。</li>
    </ul>
    </li>
    <li>创建 ASM 实例：
    <ul>
        <li>SYS 口令：&lt;输入 SYS 口令&gt;。</li>
        <li>选择 <strong>Create initialization parameter file (IFILE)</strong>。</li>
    </ul>
    </li>
    <li>ASM 磁盘组：
    <ul>
        <li>单击 <strong>Create New</strong>。</li>
    </ul>
    </li>
    <li>创建磁盘组：<br />
    创建两个磁盘组 — DG1 和 RECOVERYDEST。<br />
    <ul>
        <li>磁盘组名称：DG1</li>
        <li>选择 <strong>Normal</strong> 冗余。</li>
        <li>选择磁盘路径 ORCL:VOL1 和 ORCL:VOL2。如果您已经使用标准 Linux I/O 配置了 ASM 磁盘，则请选择 /u01/oradata/devdb/asmdisk1 和 /u01/oradata/devdb/asmdisk2。</li>
        <li>单击 <strong>OK</strong>。</li>
    </ul>
    </li>
</ol>
<p><img height="500" alt="图 8" src="http://www.oracle.com/technology/pub/images/chan-ubl-f8.jpg" width="650" border="0" /></p>
<blockquote>
<ul type="circle">
    <li>磁盘组名称：RECOVERYDEST。</li>
    <li>选择 <strong>External</strong> 冗余。</li>
    <li>选择磁盘路径 ORCL:VOL3。如果您已经使用标准 Linux I/O 配置了 ASM 磁盘，则请选择 /u01/oradata/devdb/asmdisk3。</li>
    <li>单击 <strong>OK</strong>。</li>
</ul>
</blockquote>
<p><img height="500" alt="图 9" src="http://www.oracle.com/technology/pub/images/chan-ubl-f9.jpg" width="650" border="0" /></p>
<ol start="17">
    <li>ASM 磁盘组：单击 <strong>Next</strong>。</li>
</ol>
<p><img height="458" alt="图 10" src="http://www.oracle.com/technology/pub/images/chan-ubl-f10.jpg" width="650" border="0" /></p>
<ol start="18">
    <li>数据库文件位置：
    <ul>
        <li>选择 <strong>Use Oracle-Managed Files</strong>。
        <ul>
            <li>数据库区域：+DG1</li>
        </ul>
        </li>
    </ul>
    </li>
    <li>恢复配置：
    <ul>
        <li>选择 <strong>Specify Flash Recovery Area</strong>。
        <ul>
            <li>闪回恢复区：+RECOVERYDEST</li>
            <li>闪回恢复区大小：1500M</li>
        </ul>
        </li>
        <li>选择 <strong>Enable Archiving</strong>。</li>
    </ul>
    </li>
    <li>数据库内容：
    <ul>
        <li>选择或取消选择示例模式。</li>
    </ul>
    </li>
    <li>数据库服务：
    <ul>
        <li>单击 <strong>Next</strong>。稍后，您可以使用 DBCA 或 srvctl 创建或修改其他服务。</li>
    </ul>
    </li>
    <li>初始化参数：
    <ul>
        <li>选择 <strong>Custom</strong>。
        <ul>
            <li>共享内存管理：Automatic</li>
            <li>SGA 大小：200MB</li>
            <li>PGA 大小：25MB</li>
        </ul>
        </li>
        <li>b. 根据需要修改其余参数。</li>
    </ul>
    </li>
    <li>数据库存储：单击 <strong>Next</strong>。</li>
    <li>创建选项：
    <ul>
        <li>选择 <strong>Create Database</strong>。</li>
        <li>单击 <strong>Finish</strong>。</li>
    </ul>
    </li>
    <li>摘要：单击 <strong>OK</strong>。</li>
    <li>数据库配置助手：单击 <strong>Exit</strong>。</li>
</ol>
<p><img height="375" alt="图 11" src="http://www.oracle.com/technology/pub/images/chan-ubl-f11.jpg" width="550" border="0" /></p>
<p><img height="140" alt="图 12" src="http://www.oracle.com/technology/pub/images/chan-ubl-f12.jpg" width="400" border="0" /></p>
<ol start="27">
    <li>执行配置脚本：以 root 用户身份执行下面的脚本。
    <ul>
        <li>在 rac1 上执行 /u01/app/oracle/product/10.2.0/db_1/root.sh。</li>
        <li>在 rac2 上执行 /u01/app/oracle/product/10.2.0/db_1/root.sh。</li>
    </ul>
    </li>
    <li>返回到 rac1 的执行配置脚本屏幕，然后单击 <strong>OK</strong>。</li>
    <li>安装结束：单击 <strong>Exit</strong>。</li>
</ol>
<p><img height="507" alt="图 13" src="http://www.oracle.com/technology/pub/images/chan-ubl-f13.jpg" width="650" border="0" /></p>
<p>恭喜，您已经在 Enterprise Linux 上成功安装了 Oracle RAC 数据库 10<em>g</em>！</p>
<p><font color="#ff0000">我装的还是比较顺利的,主要是cluster ware那里因为节点名字的原因导致在远程ssh 安装的时候要输入密码.所以远程安装失败.要么保证那几个ssh xx date命令都需要密码,要么就直接用最简单的节点名字.</font></p>
<p><font color="#ff0000"><font color="#000000">其它参考：</font></font></p>
<p><font color="#ff0000"><font color="#000000">Oracle Enterprise Linux 和 iSCSI 上构建您自己的 Oracle RAC 集群</font></font></p>
<p><font color="#ff0000"><a href="http://www.oracle.com/technology/global/cn/pub/articles/hunter_rac11gr1_iscsi.html">http://www.oracle.com/technology/global/cn/pub/articles/hunter_rac11gr1_iscsi.html</a></font></p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340121.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-09 11:37 <a href="http://www.blogjava.net/lz408925352/articles/340121.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 VMware Server 在 Linux 上安装 Oracle RAC 10g(一)</title><link>http://www.blogjava.net/lz408925352/articles/340119.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Thu, 09 Dec 2010 03:36:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340119.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340119.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340119.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340119.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340119.html</trackback:ping><description><![CDATA[<div class="cnt" id="blog_text">
<p>如下文档摘自oracle官方网.</p>
<h1><em style="font-style: italic">作者：Vincent Chan </em></h1>
<h4><span class="legalese">2007 年 1 月发表</span></h4>
<p>于 10 月份 Oracle OpenWorld 2006 上推介的 Oracle 坚不可摧的 Linux 旨在为 Red Hat Linux 提供企业级支持服务，更快地修复错误，以及显著降低支持价格。此外，Oracle 自己的 Enterprise Linux（基于包含额外错误修补的 Red Hat Advanced Server 第 4 版 (Update 4)）提供免费<a class="bodylink" href="http://edelivery.oracle.com/linux">下载</a>。</p>
<p>因此，现在可以通过 VMware Server（VMware 提供的一个免费虚拟环境）在家用电脑上免费使用运行在 Red Hat Advanced Server 上的 Oracle 真正应用集群 (RAC) 10<em>g</em>。</p>
<p>VMware Server 允许您在一台物理计算机上运行多个操作系统。每个虚拟机都是一个独立的操作环境，并带有一组自己的虚拟组件，如磁盘、处理器和内存。虚拟技术在计算环境中 十分有用，它允许您在同一物理主机上独立地开发和测试软件以防止数据或软件损坏。VMware 软件广泛地用于服务器整合，以降低总拥有成本并加快应用程序开发和测试周期。</p>
<p>在本指南中，您将了解如何安装和配置两个在 Enterprise Linux 和 VMware Server 上运行 Oracle RAC 10<em>g</em> 第 2 版的节点。注意，本指南仅用于教学/评估目的；Oracle 及其他供应商不会为本配置提供支持。<br />
<br />
本指南分为以下几个部分：</p>
<ol>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#1">硬件要求和概述</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#2">配置第一个虚拟机</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#3">在第一个虚拟机上配置 Enterprise Linux</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#4">创建并配置第二个虚拟机</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#5">配置 Oracle 自动存储管理 (ASM)</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#6">配置 Oracle 集群文件系统 (OCFS2)</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#7">安装 Oracle 集群件</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#8">安装 Oracle 数据库 10<em>g</em> 第 2 版</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#9">探索 RAC 数据库环境</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#10">测试透明应用程序故障切换 (TAF)</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#11">数据库备份与恢复</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#12">探索 Oracle 企业管理器 (OEM) 数据库控制台</a></li>
    <li><a class="bodylink" href="http://www.oracle.com/technology/global/cn/pub/articles/chan-ubl-vmware.html#13">常见问题</a></li>
</ol>
<h2>1. 硬件要求和概述</h2>
<p><font color="#ff0000">我使用的环境是:</font></p>
<p><font color="#ff0000">1 Red Hat Enterprise Linux AS 4 Update 7</font></p>
<p><font color="#ff0000">2 Visual machine:vmware serve 1.0</font></p>
<p><font color="#ff0000">3 Host: Winxp</font></p>
<p><font color="#ff0000">4 Acer laptop 5580 3G</font></p>
<p>在本指南中，您将安装 32 位 Linux 客户操作系统。只有在主机上运行的以下 64 位处理器支持 64 位客户操作系统：</p>
<ul>
    <li>AMD Athlon 64 修订版 D 或更高版本</li>
    <li>AMD Opteron 修订版 E 或更高版本</li>
    <li>AMD Turion 64 修订版 E 或更高版本</li>
    <li>AMD Sempron 64-bit-capable 修订版 D 或更新的 Intel EM64T VT-capable 处理器</li>
</ul>
<p>如果您决定安装 64 位客户操作系统，请确定上面列出了您的处理器。您还需要确保在 BIOS 中启用了虚拟技术 (VT)。一些主流制造商在默认情况下禁用了该技术。<a class="bodylink" href="http://www.vmware.com/pdf/processor_check.pdf" target="_blank">此处</a>提供了有关处理器兼容性的其他信息。<br />
要验证您的处理器是否受支持，请从 VMware 网站<a class="bodylink" href="http://www.vmware.com/download/ws/drivers_tools.html" target="_blank">下载</a>处理器兼容性检查工具。</p>
<p>为每个虚拟机至少分配 700MB 内存；为所有虚拟机预留至少 30GB 磁盘空间。</p>
<p>主机操作系统环境概况：</p>
<table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
    <thead>
        <tr>
            <td bgcolor="#cccccc">主机名</td>
            <td bgcolor="#cccccc">操作系统</td>
            <td bgcolor="#cccccc">处理器</td>
            <td bgcolor="#cccccc">内存</td>
            <td bgcolor="#cccccc">磁盘</td>
            <td bgcolor="#cccccc">网卡</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td valign="top">pacu</td>
            <td valign="top">Windows XP Professional Service Pack 2（32 位）</td>
            <td valign="top">Intel Pentium 4 550, 3.4MHz, HT</td>
            <td valign="top">2 GB DDR2 SDRAM, 533 MHz</td>
            <td valign="top">250 GB, Ultra ATA/133, 7200 RPM</td>
            <td valign="top">Intel Pro/1000 MT</td>
        </tr>
    </tbody>
</table>
<p>客户操作系统环境概况：</p>
<table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
    <thead>
        <tr>
            <td bgcolor="#cccccc">主机名</td>
            <td bgcolor="#cccccc">操作系统</td>
            <td bgcolor="#cccccc">处理器</td>
            <td bgcolor="#cccccc">内存</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td valign="top">rac1</td>
            <td valign="top">Oracle Enterprise Linux 4（32 位）</td>
            <td valign="top">1</td>
            <td valign="top">700 MB</td>
        </tr>
        <tr>
            <td valign="top">rac2</td>
            <td valign="top">Oracle Enterprise Linux 4（32 位）</td>
            <td valign="top">1</td>
            <td valign="top">700 MB</td>
        </tr>
    </tbody>
</table>
<p>虚拟磁盘布局概况：</p>
<table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
    <thead>
        <tr>
            <td bgcolor="#cccccc">主机操作系统上的虚拟磁盘</td>
            <td bgcolor="#cccccc">客户操作系统上的虚拟磁盘</td>
            <td bgcolor="#cccccc">虚拟设备节点</td>
            <td bgcolor="#cccccc">大小 (MB)</td>
            <td bgcolor="#cccccc">描述</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td valign="top">d:vmraclocaldisk.vmdk</td>
            <td valign="top">/dev/sda1<br />
            /dev/sda2<br />
            /dev/sda3</td>
            <td valign="top">SCSI 0:0</td>
            <td valign="top">20</td>
            <td valign="top">&#8220;/&#8221;挂载点<br />
            交换空间 <br />
            Oracle 二进制文件</td>
        </tr>
        <tr>
            <td valign="top">d:vmracsharedstorageocfs2disk.vmdk</td>
            <td valign="top">/dev/sdb</td>
            <td valign="top">SCSI 1:0</td>
            <td valign="top">512</td>
            <td valign="top">OCFS2 磁盘</td>
        </tr>
        <tr>
            <td valign="top">d:vmracsharedstorageasmdisk1.vmdk</td>
            <td valign="top">/dev/sdc</td>
            <td valign="top">SCSI 1:1</td>
            <td valign="top">3072</td>
            <td valign="top">ASM 磁盘组 1</td>
        </tr>
        <tr>
            <td valign="top">d:vmracsharedstorageasmdisk2.vmdk</td>
            <td valign="top">/dev/sdd</td>
            <td valign="top">SCSI 1:2</td>
            <td valign="top">3072</td>
            <td valign="top">ASM 磁盘组 1</td>
        </tr>
        <tr>
            <td valign="top">d:vmracsharedstorageasmdisk3.vmdk</td>
            <td valign="top">/dev/sde</td>
            <td valign="top">SCSI 1:3</td>
            <td valign="top">2048</td>
            <td valign="top">ASM 闪回恢复区</td>
        </tr>
    </tbody>
</table>
<p>（要配置共享存储，客户 OS 不能与共享存储共享同一个 SCSI 总线。指定客户 OS 使用 SCSI0，共享磁盘使用 SCSI1。）</p>
<p>RAC 数据库环境概况：</p>
<table class="bodycopy" cellspacing="0" cellpadding="4" width="80%" border="1">
    <thead>
        <tr>
            <td bgcolor="#cccccc">主机名</td>
            <td bgcolor="#cccccc">ASM 实例名</td>
            <td bgcolor="#cccccc">RAC 实例名</td>
            <td bgcolor="#cccccc">数据库名</td>
            <td bgcolor="#cccccc">数据库文件存储</td>
            <td bgcolor="#cccccc">OCR 与表决磁盘 (Voting Disk)</td>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td valign="top">rac1</td>
            <td valign="top">+ASM1</td>
            <td valign="top">devdb1</td>
            <td valign="top">devdb</td>
            <td valign="top">ASM</td>
            <td valign="top">OCFS2</td>
        </tr>
        <tr>
            <td valign="top">rac2</td>
            <td valign="top">+ASM2</td>
            <td valign="top">devdb2</td>
            <td valign="top">devdb</td>
            <td valign="top">ASM</td>
            <td valign="top">OCFS2</td>
        </tr>
    </tbody>
</table>
<p>您将在每个节点上安装 Oracle 主目录供冗余使用。每个节点上的 ASM 和 Oracle RAC 实例共享同一个 Oracle 主目录。</p>
<h2>2. 配置第一个虚拟机</h2>
<p>要创建和配置第一个虚拟机，您需要添加虚拟硬件设备，如磁盘和处理器。在继续执行安装之前，请创建以下 windows 文件夹以存放虚拟机和共享存储。</p>
<pre>D:&gt;mkdir vmracrac1<br />
D:&gt;mkdir vmracrac2<br />
D:&gt;mkdir vmracsharedstorage</pre>
<p>双击桌面上的 VMware Server 图标以启动应用程序：</p>
<ol>
    <li>按 CTRL-N 创建一个新的虚拟机。</li>
    <li>新建虚拟机向导：单击 <strong>Next</strong>。</li>
    <li>选择适当的配置：
    <ol type="a">
        <li>虚拟机配置：选择 <strong>Custom</strong>。</li>
    </ol>
    </li>
    <li>选择客户操作系统：
    <ol type="a">
        <li>客户操作系统：选择 <strong>Linux</strong>。</li>
        <li>版本：选择 <strong>Red Hat Enterprise Linux 4</strong>。</li>
    </ol>
    </li>
    <li>命名虚拟机：
    <ol type="a">
        <li>虚拟机名称：输入&#8220;rac1&#8221;。</li>
        <li>位置：输入&#8220;d:vmracrac1&#8221;。</li>
    </ol>
    </li>
    <li>设置访问权限：
    <ol type="a">
        <li>访问权限：选择 <strong>Make this virtual machine private</strong>。</li>
    </ol>
    </li>
    <li>启动/关闭选项：
    <ol type="a">
        <li>虚拟机帐户：选择 <strong>User that powers on the virtual machine</strong>。</li>
    </ol>
    </li>
    <li>处理器配置：
    <ol type="a">
        <li>处理器：选择一个处理器。</li>
    </ol>
    </li>
    <li>虚拟机内存：
    <ol type="a">
        <li>内存：选择 <strong>700MB</strong>。<font color="#ff0000">(最好1G)</font></li>
    </ol>
    </li>
    <li>网络类型：
    <ol type="a">
        <li>网络连接：选择 <strong>Use bridged networking</strong>。</li>
    </ol>
    </li>
    <li>选择 I/O 适配器类型：
    <ol type="a">
        <li>I/O 适配器类型：选择 <strong>LSI Logic</strong>。</li>
    </ol>
    </li>
    <li>选择磁盘：
    <ol type="a">
        <li>磁盘：选择 <strong>Create a new virtual disk</strong>。</li>
    </ol>
    </li>
    <li>选择磁盘类型：
    <ol type="a">
        <li>虚拟磁盘类型：选择 <strong>SCSI (Recommended)</strong>。</li>
    </ol>
    </li>
    <li>指定磁盘容量：
    <ol type="a">
        <li>磁盘容量：输入&#8220;20GB&#8221;。</li>
        <li>取消选择 <strong>Allocate all disk space now</strong>。为了节省空间，您现在不必分配所有磁盘空间。</li>
    </ol>
    </li>
    <li>指定磁盘文件：
    <ol type="a">
        <li>磁盘文件：输入&#8220;localdisk.vmdk&#8221;。</li>
        <li>单击 <strong>Finish</strong>。</li>
    </ol>
    </li>
</ol>
<p>重复步骤 16-24 以创建四个虚拟 SCSI 硬盘 — ocfs2disk.vmdk (512MB)、asmdisk1.vmdk (3GB)、asmdisk2.vmdk (3GB) 和 asmdisk3.vmdk (2GB)。</p>
<ol start="16">
    <li>VMware Server 控制台：单击 <strong>Edit virtual machine settings</strong>。</li>
    <li>虚拟机设置：单击 <strong>Add</strong>。</li>
    <li>新增硬件向导：单击 <strong>Next</strong>。</li>
    <li>硬件类型：
    <ol type="a">
        <li>硬件类型：选择 <strong>Hard Disk</strong>。</li>
    </ol>
    </li>
    <li>选择磁盘：
    <ol type="a">
        <li>磁盘：选择 <strong>Create a new virtual disk</strong>。</li>
    </ol>
    </li>
    <li>选择磁盘类型：
    <ol type="a">
        <li>虚拟磁盘类型：选择 <strong>SCSI (Recommended)</strong>。</li>
    </ol>
    </li>
    <li>指定磁盘容量：
    <ol type="a">
        <li>磁盘容量：输入&#8220;0.5GB&#8221;。</li>
        <li>选择 <strong>Allocate all disk space now</strong>。 如果您希望节省空间，则不必分配所有磁盘空间。出于性能方面的考虑，您需要为每个虚拟共享磁盘预先分配所有磁盘空间。特别是在 Oracle 数据库创建期间或者当数据库的 DML 活动较频繁时，如果共享磁盘的大小增长快速，虚拟机可能会间歇挂起一段较短的时间甚至崩溃（这种情况很少见）。</li>
    </ol>
    </li>
    <li>指定磁盘文件：
    <ol type="a">
        <li>磁盘文件：输入&#8220;d:vmracsharedstorageocfs2disk.vmdk&#8221;。</li>
        <li>单击 <strong>Advanced</strong>。</li>
    </ol>
    </li>
    <li>新增硬件向导：
    <ol type="a">
        <li>虚拟设备节点：选择 <strong>SCSI 1:0</strong>。</li>
        <li>模式：选择 <strong>Independent</strong>，针对所有共享磁盘选择 <strong>Persistent</strong>。</li>
        <li>单击 <strong>Finish</strong>。</li>
    </ol>
    </li>
</ol>
<p>最后，额外添加一个虚拟网卡以用于专用互联，并移除软盘驱动器（如果有）。</p>
<ol start="25">
    <li>VMware Server 控制台：单击 <strong>Edit virtual machine settings</strong>。</li>
    <li>虚拟机设置：单击 <strong>Add</strong>。</li>
    <li>新增硬件向导：单击 <strong>Next</strong>。</li>
    <li>硬件类型：
    <ol type="a">
        <li>硬件类型：以太网适配器。</li>
    </ol>
    </li>
    <li>网络类型：
    <ol type="a">
        <li>主机模式：与主机共享的专用网络<font color="#ff0000"> (注意这里添加的额外的网卡用的时HOST ONLY模式,前面的是使用bridge模式)</font></li>
        <li>单击 <strong>Finish</strong>。</li>
    </ol>
    </li>
    <li>虚拟机设置：
    <ol type="a">
        <li>选择 <strong>Floppy</strong> 并单击 <strong>Remove</strong>。</li>
    </ol>
    </li>
    <li>虚拟机设置：单击 <strong>OK</strong>。</li>
</ol>
<p><img height="473" alt="图 1" src="http://www.oracle.com/technology/pub/images/chan-ubl-f1.jpg" width="650" border="0" /></p>
<p><strong>修改虚拟机配置文件。</strong>还需要设置其他参数以启用两个虚拟 RAC 节点之间的磁盘共享。打开配置文件 d:vmracrac1Red Hat Enterprise Linux 4.vmx，并添加下面列出的粗体参数。</p>
<pre>config.version = "8"<br />
virtualHW.version = "4"<br />
scsi0.present = "TRUE"<br />
scsi0.virtualDev = "lsilogic"<br />
memsize = "700"<br />
scsi0:0.present = "TRUE"<br />
scsi0:0.fileName = "localdisk.vmdk"<br />
ide1:0.present = "TRUE"<br />
ide1:0.fileName = "auto detect"<br />
ide1:0.deviceType = "cdrom-raw"<br />
floppy0.fileName = "A:"<br />
Ethernet0.present = "TRUE"<br />
displayName = "rac1"<br />
guestOS = "rhel4"<br />
priority.grabbed = "normal"<br />
priority.ungrabbed = "normal"<br />
<br />
<strong>disk.locking = "FALSE"<br />
diskLib.dataCacheMaxSize = "0"<br />
scsi1.sharedBus = "virtual"</strong><br />
<br />
scsi1.present = "TRUE"<br />
scsi1:0.present = "TRUE"<br />
scsi1:0.fileName = "D:vmracsharedstorageocfs2disk.vmdk"<br />
scsi1:0.mode = "independent-persistent"<br />
<strong>scsi1:0.deviceType = "disk"</strong><br />
scsi1:1.present = "TRUE"<br />
scsi1:1.fileName = "D:vmracsharedstorageasmdisk1.vmdk"<br />
scsi1:1.mode = "independent-persistent"<br />
<strong>scsi1:1.deviceType = "disk"</strong><br />
scsi1:2.present = "TRUE"<br />
scsi1:2.fileName = "D:vmracsharedstorageasmdisk2.vmdk"<br />
scsi1:2.mode = "independent-persistent"<br />
<strong>scsi1:2.deviceType = "disk"</strong><br />
scsi1:3.present = "TRUE"<br />
scsi1:3.fileName = "D:vmracsharedstorageasmdisk3.vmdk"<br />
scsi1:3.mode = "independent-persistent"<br />
<strong>scsi1:3.deviceType = "disk"</strong><br />
scsi1.virtualDev = "lsilogic"<br />
ide1:0.autodetect = "TRUE"<br />
floppy0.present = "FALSE"<br />
Ethernet1.present = "TRUE"<br />
Ethernet1.connectionType = "hostonly"</pre>
<h2>3. 在第一个虚拟机上安装并配置 Enterprise Linux</h2>
<font color="#ff0000">因为是安装的Red Hat Enterprise Linux AS 4 Update 7,所以后来需要添加很多需要的package(oracle EL自带了很多包)<br />
</font><br />
<p><a class="bodylink" href="http://edelivery.oracle.com/linux" target="_blank">从 Oracle 网站下载 Enterprise Linux</a> 并解压缩文件：</p>
<ul>
    <li>Enterprise-R4-U4-i386-disc1.iso</li>
    <li>Enterprise-R4-U4-i386-disc2.iso</li>
    <li>Enterprise-R4-U4-i386-disc3.iso</li>
    <li>Enterprise-R4-U4-i386-disc4.iso</li>
</ul>
<ol>
    <li>在 VMware Server 控制台上，双击右面板上的 CD-ROM 设备，然后选择第 1 张磁盘的 ISO 镜像 Enterprise-R4-U4-i386-disc1.iso。</li>
    <li>VMware Server 控制台：<font color="#ff0000">(最好以Iinux text 安装会快很多,不要期图形界面)</font><br />
    <ul>
        <li>单击 <strong>Start this virtual machine</strong>。</li>
    </ul>
    </li>
    <li>按 <strong>Enter</strong> 键以图形模式安装。</li>
    <li>跳过介质测试并启动安装。</li>
    <li>欢迎使用 Enterprise Linux：单击 <strong>Next</strong>。</li>
    <li>语言选择：&lt;选择语言首选项&gt;。</li>
    <li>键盘配置：&lt;选择键盘首选项&gt;。</li>
    <li>安装类型：自定义。</li>
    <li>磁盘分区设置：使用 Disk Druid 进行手动分区。
    <ul>
        <li>警告：单击 <strong>Yes</strong> 将初始化每个设备 — sda、sdb、sdc、sdd 和 sde。</li>
    </ul>
    </li>
    <li>磁盘设置：通过双击挂载点（/ 和 /u01）和交换空间的 /dev/sda 可用空间来分配 sda 驱动器上的磁盘空间。您稍后将为 OCFS2 和 ASM 配置其余驱动器。
    <ul>
        <li>添加分区：
        <ul>
            <li>挂载点： /</li>
            <li>文件系统类型：ext3</li>
            <li>开始柱面： 1</li>
            <li>结束柱面： 910</li>
        </ul>
        <ul>
            <li>文件系统类型：Swap</li>
            <li>开始柱面： 911</li>
            <li>结束柱面： 1170</li>
        </ul>
        <ul>
            <li>挂载点：/u01</li>
            <li>文件系统类型：ext3</li>
            <li>开始柱面： 1171</li>
            <li>结束柱面： 2610</li>
        </ul>
        </li>
    </ul>
    </li>
</ol>
<p><img height="545" alt="图 2" src="http://www.oracle.com/technology/pub/images/chan-ubl-f2.jpg" width="603" border="0" /></p>
<ol start="11">
    <li>引导加载程序配置：仅选择默认的 /dev/sda1，其余选项均保留未选中状态。</li>
    <li>网络配置：
    <ol type="a">
        <li>网络设备
        <ul>
            <li>选择并编辑 eth0
            <ol>
                <li>取消选择 <strong>Configure Using DHCP</strong>。</li>
                <li>选择 <strong>Activate on boot</strong>。</li>
                <li>IP 地址：输入&#8220;192.168.2.131&#8221;。</li>
                <li>网络掩码：输入&#8220;255.255.255.0&#8221;。</li>
            </ol>
            </li>
            <li>选择并编辑 eth1
            <ol>
                <li>取消选择 <strong>Configure Using DHCP</strong>。</li>
                <li>选择 <strong>Activate on boot</strong>。</li>
                <li>IP 地址：输入&#8220;10.10.10.31&#8221;。</li>
                <li>网络掩码：输入&#8220;255.255.255.0&#8221;。</li>
            </ol>
            </li>
        </ul>
        </li>
        <li>主机名
        <ul>
            <li>选择 <strong>manually</strong> 并输入&#8220;rac1.mycorpdomain.com&#8221;。</li>
        </ul>
        </li>
        <li>杂项设置
        <ul>
            <li>网关：输入&#8220;192.168.2.1&#8221;。</li>
            <li>首选 DNS：&lt;可选&gt;</li>
            <li>备用 DNS：&lt;可选&gt;</li>
        </ul>
        </li>
    </ol>
    </li>
    <li>防火墙配置：
    <ol type="a">
        <li>选择 <strong>No Firewall</strong>。如果启用了防火墙，当您稍后在设置期间尝试挂载 ocfs2 文件系统时，可能会遇到错误&#8220;mount.ocfs2:Transport endpoint is not connected while mounting&#8221;。</li>
        <li>启用 SELinux 吗？：Active。</li>
    </ol>
    </li>
    <li>警告 — 无防火墙：单击 <strong>Proceed</strong>。</li>
    <li>其他语言支持：&lt;选择所需的语言&gt;。</li>
    <li>时区选择：&lt;选择您的时区&gt;</li>
    <li>设置 Root 口令：&lt;输入您的 root 口令&gt;</li>
    <li>程序包组选择：<font color="#ff0000"><span style="background-color: rgb(255,255,255)">(最好全选)</span></font>
    <ol type="a">
        <li>选择 <strong>X Window System</strong>。</li>
        <li>选择 <strong>GNOME Desktop Environment</strong>。</li>
        <li>选择 <strong>Editors</strong>。
        <ul>
            <li>单击 <strong>Details</strong> 并选择您偏好的文本编辑器。</li>
        </ul>
        </li>
        <li>选择 <strong>Graphical Internet</strong>。</li>
        <li>选择 <strong>Text-based Internet</strong>。</li>
        <li>选择 <strong>Office/Productivity</strong>。</li>
        <li>选择 <strong>Sound and Video</strong>。</li>
        <li>选择 <strong>Graphics</strong>。</li>
        <li>选择 <strong>Server Configuration Tools</strong>。</li>
        <li>选择 <strong>FTP Server</strong>。</li>
        <li>选择 <strong>Legacy Network Server</strong>。
        <ul>
            <li>单击 <strong>Details</strong>。
            <ol>
                <li>选择 <strong>rsh-server</strong>。</li>
                <li>选择 <strong>telnet-server</strong>。</li>
            </ol>
            </li>
        </ul>
        </li>
        <li>选择 <strong>Development Tools</strong>。</li>
        <li>选择 <strong>Legacy Software Development</strong>。</li>
        <li>选择 <strong>Administration Tools</strong>。</li>
        <li style="background-color: rgb(255,255,255)"><font color="#ff0000">选择 <strong>System Tools</strong>。(这些包都要去oracle 自己下)<br />
        </font>
        <ul>
            <li><font color="#000000">单击 <strong>Details</strong>。除了默认选中的程序包外，再选择以下程序包。 </font>
            <ol>
                <li><font color="#000000">选择 <strong>ocfs-2-2.6.9-42.0.0.0.1EL</strong>（UP 内核驱动程序），或者选择 <strong>ocfs-2-2.6.9-42.0.0.0.1ELsmp</strong>（SMP 内核驱动程序）。</font></li>
                <li><font color="#000000">选择 <strong>ocfs2-tools</strong>。</font></li>
                <li><font color="#000000">选择 <strong>ocfs2console</strong>。</font></li>
                <li><font color="#000000">选择 <strong>oracle oracleasm-2.6.9-42.0.0.0.1EL</strong>（UP 内核驱动程序），或者选择 <strong>oracleasm-2.6.9-42.0.0.0.1ELsmp</strong>（SMP 内核驱动程序）。</font></li>
                <li><font color="#000000">选择 <strong>sysstat</strong>。</font></li>
            </ol>
            </li>
        </ul>
        </li>
        <li>选择 <strong>Printing Support</strong>。</li>
    </ol>
    </li>
    <li>准备安装：单击 <strong>Next</strong>。</li>
    <li>所需的安装介质：单击 <strong>Continue</strong>。</li>
    <li>更 改 CD-ROM：在 VMware Server 控制台上，按 CTRL-D 显示 Virtual Machine Settings。单击 CD-ROM 设备并选择第 2 张磁盘的 ISO 镜像 Enterprise-R4-U4-i386-disc2.iso，然后是第 3 张磁盘的 ISO 镜像 Enterprise-R4-U4-i386-disc3.iso。</li>
    <li>安装结束时：
    <ol type="a">
        <li>在 VMware Server 控制台上，按 CTRL-D 显示 Virtual Machine Settings。单击 CD-ROM 设备并选择 <strong>Use physical drive</strong>。</li>
        <li>单击 <strong>Reboot</strong>。</li>
    </ol>
    </li>
    <li>欢迎页面：单击 <strong>Next</strong>。</li>
    <li>许可协议：选择 <strong>Yes, I agree to the License Agreement</strong>。</li>
    <li>日期和时间：设置日期和时间。</li>
    <li>显示：&lt;选择所需的分辨率&gt;。</li>
    <li>系统用户：保留项目为空并单击 <strong>Next</strong>。</li>
    <li>其他 CD：单击 <strong>Next</strong>。</li>
    <li>完成设置：单击 <strong>Next</strong>。</li>
</ol>
<p><img height="545" alt="图 3" src="http://www.oracle.com/technology/pub/images/chan-ubl-f3.jpg" width="607" border="0" /></p>
<p>恭喜，您已经在 VMware Server 上安装了 Enterprise Linux！</p>
<p><strong>安装 VMware 工具。</strong>VMware 工具要求同步主机和客户机的时间。</p>
<p>在 VMware 控制台上，以 root 用户身份登录。</p>
<ol>
    <li>单击 <strong>VM</strong>，然后选择 <strong>Install VMware Tools</strong>。</li>
    <li>rac1 — 虚拟机：单击 <strong>Install</strong>。</li>
    <li>双击桌面上的 VMware Tools 图标。</li>
    <li>cdrom：双击 <strong>VMwareTools-1.0.1-29996.i386.rpm</strong>。</li>
</ol>
<p><img height="545" alt="图 4" src="http://www.oracle.com/technology/pub/images/chan-ubl-f4.jpg" width="603" border="0" /></p>
<ol start="5">
    <li>完成系统准备：单击 <strong>Continue</strong>。</li>
    <li>打开一个终端并执行 <strong>vmware-config-tools.pl</strong>。
    <ul>
        <li>输入所需的显示大小。</li>
    </ul>
    </li>
</ol>
<br />
<strong>同步客户 OS 与主机 OS 的时间。</strong>在安装 Oracle 集群件和 Oracle 数据库软件时，Oracle 安装程序将首先在本地节点上安装软件，然后再将软件远程复制到远程节点。如果两个 RAC 节点的日期和时间未同步，您可能会收到类似于以下内容的错误。 <br />
<pre>"/bin/tar: ./inventory/Components21/oracle.ordim.server/10.2.0.1.0: time <br />
stamp  2006-11-04 06:24:04 is 25 s in the future"</pre>
要确保成功安装 Oracle RAC，虚拟机上的时间必须与主机上的时间同步。执行下面的步骤，以 root 用户身份同步时间。
<ol>
    <li>执行&#8220;vmware-toolbox&#8221;以显示 VMware Tools Properties 窗口。在 Options 选项卡下，选择 <strong>Time synchronization between the virtual machine and the host operating system</strong>。您应该发现 tools.syncTime = "TRUE" 参数已经追加到虚拟机配置文件 d:vmracrac1Red Hat Enterprise Linux 4.vmx 中。</li>
    <li>编辑 /boot/grub/grub.conf，并将选项&#8220;clock=pit nosmp noapic nolapic&#8221;添加到读取内核 /boot/ 的那一行。您已经将选项添加到两个内核，现在只需对特定内核进行更改。
    <pre>#boot=/dev/sda<br />
    default=0<br />
    timeout=5<br />
    splashimage=(hd0,0)/boot/grub/splash.xpm.gz<br />
    hiddenmenu<br />
    title Enterprise (2.6.9-42.0.0.0.1.ELsmp)<br />
    root (hd0,0)<br />
    kernel /boot/vmlinuz-2.6.9-42.0.0.0.1.ELsmp ro <br />
    root=LABEL=/ rhgb quiet clock=pit nosmp noapic nolapic<br />
    initrd /boot/initrd-2.6.9-42.0.0.0.1.ELsmp.img<br />
    title Enterprise-up (2.6.9-42.0.0.0.1.EL)<br />
    root (hd0,0)<br />
    kernel /boot/vmlinuz-2.6.9-42.0.0.0.1.EL ro root=LABEL=/ <br />
    rhgb quiet clock=pit nosmp noapic nolapic<br />
    initrd /boot/initrd-2.6.9-42.0.0.0.1.EL.img</pre>
    </li>
    <li>重新引导 rac1。
    <pre># reboot</pre>
    </li>
</ol>
<strong>创建 oracle 用户。</strong> 以 root 用户身份执行<br />
<pre># groupadd oinstall<br />
# groupadd dba<br />
# mkdir -p /export/home/oracle /ocfs<br />
# useradd -d /export/home/oracle -g oinstall -G dba -s /bin/ksh oracle<br />
# chown oracle:dba /export/home/oracle /u01<br />
# passwd oracle<br />
New Password:<br />
Re-enter new Password:<br />
passwd: password successfully changed for oracle</pre>
<strong>创建 oracle 用户环境文件。</strong>
<p><strong>/export/home/oracle/.profile</strong></p>
<pre>export PS1="`/bin/hostname -s`-&gt; "<br />
export EDITOR=vi<br />
export ORACLE_SID=devdb1<br />
export ORACLE_BASE=/u01/app/oracle<br />
export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/db_1<br />
export ORA_CRS_HOME=$ORACLE_BASE/product/10.2.0/crs_1<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib<br />
export PATH=$ORACLE_HOME/bin:$ORA_CRS_HOME/bin:/bin:<br />
/usr/bin:/usr/sbin:/usr/local/bin:/usr/X11R6/bin<br />
umask 022</pre>
<strong>创建文件系统目录结构。</strong>以 oracle 用户身份执行
<pre>rac1-&gt; mkdir p $ORACLE_BASE/admin <br />
rac1-&gt; mkdir p $ORACLE_HOME<br />
rac1-&gt; mkdir p $ORA_CRS_HOME<br />
rac1-&gt; mkdir -p /u01/oradata/devdb</pre>
<p><strong>提高 Oracle 用户的 shell 限制。</strong>使用文本编辑器将下面列出的行添加到 /etc/security/limits.conf、/etc/pam.d/login 和 /etc/profile。其他信息可以从<a class="bodylink" href="http://download.oracle.com/docs/cd/B19306_01/install.102/b14203/prelinux.htm#BABFEHIA" target="_blank">文档</a>中获得。</p>
<p><strong>/etc/security/limits.conf</strong></p>
<pre>oracle soft nproc 2047<br />
oracle hard nproc 16384<br />
oracle soft nofile 1024<br />
oracle hard nofile 65536</pre>
<strong>/etc/pam.d/login</strong>
<pre>session required /lib/security/pam_limits.so</pre>
<strong>/etc/profile</strong>
<pre>if [ $USER = "oracle" ]; then<br />
if [ $SHELL = "/bin/ksh" ]; then<br />
ulimit -p 16384<br />
ulimit -n 65536<br />
else<br />
ulimit -u 16384 -n 65536<br />
fi<br />
fi</pre>
<strong>安装 Enterprise Linux 软件程序包。</strong>安装 Oracle 软件需要以下附加程序包。如果您已经安装了 64 位版本的 Enterprise Linux，则安装程序应该已安装了这些程序包。
<ul>
    <li>libaio-0.3.105-2.i386.rpm</li>
    <li>openmotif21-2.1.30-11.RHEL4.6.i386.rpm</li>
</ul>
<p>从 ISO CD 解压缩这些程序包，并以 root 用户身份执行下面的命令。</p>
<pre># ls<br />
libaio-0.3.105-2.i386.rpm  openmotif21-2.1.30-11.RHEL4.6.i386.rpm<br />
#<br />
# rpm -Uvh *.rpm<br />
warning: libaio-0.3.105-2.i386.rpm: V3 DSA signature: NOKEY, key ID b38a8516<br />
Preparing...                <br />
########################################### [100%]<br />
1:openmotif21            <br />
########################################### [ 50%]<br />
2:libaio                 <br />
########################################### [100%]</pre>
<strong>配置内核参数。</strong>使用文本编辑器将下面列出的行添加到 /etc/sysctl.conf。要使更改立即生效，请执行 <tt><font face="新宋体">/sbin/sysctl &#8211;p</font></tt>。
<pre># more  /etc/sysctl.conf<br />
kernel.shmall                = 2097152<br />
kernel.shmmax                = 2147483648<br />
kernel.shmmni                = 4096<br />
kernel.sem                   = 250 32000 100 128<br />
fs.file-max                  = 65536<br />
net.ipv4.ip_local_port_range = 1024 65000<br />
net.core.rmem_default        = 1048576<br />
net.core.rmem_max            = 1048576<br />
net.core.wmem_default        = 262144<br />
net.core.wmem_max            = 262144</pre>
<strong>修改 /etc/hosts 文件。</strong>
<pre># more /etc/hosts<br />
127.0.0.1               localhost<br />
192.168.2.131           rac1.mycorpdomain.com        rac1<br />
192.168.2.31            rac1-vip.mycorpdomain.com    rac1-vip<br />
10.10.10.31             rac1-priv.mycorpdomain.com   rac1-priv<br />
192.168.2.132           rac2.mycorpdomain.com        rac2<br />
192.168.2.32            rac2-vip.mycorpdomain.com    rac2-vip<br />
10.10.10.32             rac2-priv.mycorpdomain.com   rac2-priv</pre>
<strong>配置 hangcheck timer 内核模块。</strong>hangcheck timer 内核模块可监控系统的运行情况，并重新启动出现故障的 RAC 节点。它使用两个参数，即 hangcheck_tick（定义系统检查频率）和 hangcheck_margin（定义在重置 RAC 节点前的最大挂起延时）来确定节点是否出现故障。
<p>在 /etc/modprobe.conf 中添加以下行，以设置 hangcheck 内核模块参数。</p>
<p><strong>/etc/modprobe.conf</strong><br />
<tt><font face="新宋体">options hangcheck-timer hangcheck_tick=30 hangcheck_margin=180</font></tt></p>
<p>要立即加载模块，执行&#8220;<tt><font face="新宋体">modprobe -v hangcheck-timer</font></tt>&#8221;。</p>
<p><strong>为 OCFS2 和 Oracle ASM 创建磁盘分区。</strong>为 OCFS2 (/dev/sdb) 和 Oracle ASM（/dev/sdc、/dev/sdd、/dev/sde）准备一组原始磁盘。</p>
<p>在 rac1 上，以 root 用户身份执行</p>
<p><strong># fdisk /dev/sdb</strong></p>
<pre>Command (m for help): n<br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
p<br />
Partition number (1-4): 1<br />
First cylinder (1-512, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-512, default 512):<br />
Using default value 512<br />
<br />
Command (m for help): w<br />
The partition table has been altered!<br />
<br />
Calling ioctl() to re-read partition table.<br />
Syncing disks.</pre>
<p><strong># fdisk /dev/sdc</strong></p>
<pre>Command (m for help): n<br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
p<br />
Partition number (1-4): 1<br />
First cylinder (1-391, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-391, default 391):<br />
Using default value 391<br />
<br />
Command (m for help): w<br />
The partition table has been altered!<br />
<br />
Calling ioctl() to re-read partition table.<br />
Syncing disks.</pre>
<p><strong># fdisk /dev/sdd</strong></p>
<pre>Command (m for help): n<br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
p<br />
Partition number (1-4): 1<br />
First cylinder (1-391, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-391, default 391):<br />
Using default value 391<br />
<br />
Command (m for help): w<br />
The partition table has been altered!<br />
<br />
Calling ioctl() to re-read partition table.<br />
Syncing disks.</pre>
<p><strong># fdisk /dev/sde</strong></p>
<pre>Command (m for help): n<br />
Command action<br />
e   extended<br />
p   primary partition (1-4)<br />
p<br />
Partition number (1-4): 1<br />
First cylinder (1-261, default 1):<br />
Using default value 1<br />
Last cylinder or +size or +sizeM or +sizeK (1-261, default 261):<br />
Using default value 261<br />
<br />
Command (m for help): w<br />
The partition table has been altered!<br />
<br />
Calling ioctl() to re-read partition table.<br />
Syncing disks.</pre>
<p><strong># fdisk -l</strong></p>
<pre>Disk /dev/sda: 21.4 GB, 21474836480 bytes<br />
255 heads, 63 sectors/track, 2610 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br />
<br />
Device Boot      Start         End      Blocks   Id  System<br />
/dev/sda1   *           1         910     7309543+  83  Linux<br />
/dev/sda2             911        1170     2088450   82  Linux swap<br />
/dev/sda3            1171        2610    11566800   83  Linux<br />
<br />
Disk /dev/sdb: 536 MB, 536870912 bytes<br />
64 heads, 32 sectors/track, 512 cylinders<br />
Units = cylinders of 2048 * 512 = 1048576 bytes<br />
<br />
Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdb1               1         512      524272   83  Linux<br />
<br />
Disk /dev/sdc: 3221 MB, 3221225472 bytes<br />
255 heads, 63 sectors/track, 391 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br />
<br />
Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdc1               1         391     3140676   83  Linux<br />
<br />
Disk /dev/sdd: 3221 MB, 3221225472 bytes<br />
255 heads, 63 sectors/track, 391 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br />
<br />
Device Boot      Start         End      Blocks   Id  System<br />
/dev/sdd1               1         391     3140676   83  Linux<br />
<br />
Disk /dev/sde: 2147 MB, 2147483648 bytes<br />
255 heads, 63 sectors/track, 261 cylinders<br />
Units = cylinders of 16065 * 512 = 8225280 bytes<br />
<br />
Device Boot      Start         End      Blocks   Id  System<br />
/dev/sde1               1         261     2096451   83  Linux</pre>
<strong>安装 oracleasmlib 程序包。</strong> 从 OTN <a class="bodylink" href="http://www.oracle.com/technology/software/tech/linux/asmlib/rhel4.html">下载</a> ASM 库，并以 root 用户身份安装 ASM RPM。<br />
<pre># rpm -Uvh oracleasmlib-2.0.2-1.i386.rpm<br />
Preparing...                <br />
########################################### [100%]<br />
1:oracleasmlib           <br />
########################################### [100%]</pre>
<p>在这个阶段，您应该已经安装了以下 ASM 程序包。</p>
<pre>[root@rac1 swdl]# rpm -qa | grep oracleasm<br />
<font color="#ff00ff"><font color="#ff0000">oracleasm-support-2.0.3-2<br />
oracleasm-2.6.9-42.0.0.0.1.ELsmp-2.0.3-2<br />
oracleasmlib-2.0.2-1<br />
三个都要从oracle 下载</font><br />
</font></pre>
<strong>为 ASM 磁盘映射原始设备。</strong><em>仅当</em>您打算使用标准 Linux I/O 创建 ASM 磁盘时，才需要原始设备映射。创建 ASM 磁盘的另一个方法是使用 Oracle 提供的 ASM 库驱动程序。稍后，您将使用 ASM 库驱动程序配置 ASM 磁盘。
<p>执行以下任务，将原始设备映射到先前创建的共享分区。每次引导集群节点时，原始设备都必须与块设备绑定。</p>
<p>将以下行添加到 /etc/sysconfig/rawdevices 中。</p>
<p><strong>/etc/sysconfig/rawdevices</strong></p>
<pre>/dev/raw/raw1 /dev/sdc1<br />
/dev/raw/raw2 /dev/sdd1<br />
/dev/raw/raw3 /dev/sde1</pre>
要使映射立即生效，以 root 用户身份执行以下命令：
<pre># /sbin/service rawdevices restart<br />
Assigning devices:<br />
/dev/raw/raw1  --&gt;   /dev/sdc1<br />
/dev/raw/raw1:  bound to major 8, minor 33<br />
/dev/raw/raw2  --&gt;   /dev/sdd1<br />
/dev/raw/raw2:  bound to major 8, minor 49<br />
/dev/raw/raw3  --&gt;   /dev/sde1<br />
/dev/raw/raw3:  bound to major 8, minor 65<br />
done<br />
<br />
# chown oracle:dba /dev/raw/raw[1-3]<br />
# chmod 660 /dev/raw/raw[1-3]<br />
# ls -lat /dev/raw/raw*<br />
crw-rw----  1 oracle dba 162, 3 Nov  4 07:04 /dev/raw/raw3<br />
crw-rw----  1 oracle dba 162, 2 Nov  4 07:04 /dev/raw/raw2<br />
crw-rw----  1 oracle dba 162, 1 Nov  4 07:04 /dev/raw/raw1</pre>
<p>以 oracle 用户身份执行</p>
<pre>rac1-&gt; ln -sf /dev/raw/raw1 /u01/oradata/devdb/asmdisk1<br />
rac1-&gt; ln -sf /dev/raw/raw2 /u01/oradata/devdb/asmdisk2<br />
rac1-&gt; ln -sf /dev/raw/raw3 /u01/oradata/devdb/asmdisk3</pre>
<p><strong>修改 /etc/udev/permissions.d/50-udev.permissions。</strong>原 始设备在引导时会重新映射。默认情况下，在引导时原始设备的拥有者将更改为 root 用户。如果拥有者不是 oracle 用户，则 ASM 在访问共享分区时会出现问题。在 /etc/udev/permissions.d/50-udev.permissions 中为原始行&#8220;raw/*:root:disk:0660&#8221;添加注释，然后添加一个新行&#8220;raw/*:oracle:dba:0660&#8221;。</p>
<p><strong>/etc/udev/permissions.d/50-udev.permissions</strong></p>
<pre># raw devices<br />
ram*:root:disk:0660<br />
#raw/*:root:disk:0660<br />
raw/*:oracle:dba:0660</pre>
</div>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340119.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-09 11:36 <a href="http://www.blogjava.net/lz408925352/articles/340119.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>RHEL3 上配置 Oracle 10g Data Guard </title><link>http://www.blogjava.net/lz408925352/articles/340096.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Wed, 08 Dec 2010 12:53:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340096.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340096.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340096.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340096.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340096.html</trackback:ping><description><![CDATA[<font face="宋体" color="#000000" size="2">本文转载于：<a href="http://wxy0327.itpub.net/post/16888/92718">http://wxy0327.itpub.net/post/16888/92718</a><br />
一、 环境配置<br />
primary：<br />
IP：192.168.0.120 <br />
CPU：2个Intel(R) Xeon(TM) CPU 2.80GHz （HT）Mem：2G<br />
Swap：4G<br />
Disk：130G<br />
<br />
DB：Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod<br />
OS：Linux oracle 2.4.21-20.ELsmp #1 SMP<br />
<br />
standby：<br />
IP：192.168.0.101 <br />
Cup：2个Intel(R) Xeon(TM) CPU 2.40GHz （HT） <br />
Mem：2G<br />
Swap：2G<br />
Disk：66G<br />
<br />
DB：Oracle Database 10g Enterprise Edition Release 10.1.0.3.0 - Prod<br />
OS：Linux boss-3 2.4.21-15.ELsmp #1 SMP <br />
<br />
Primary为正在使用的生产数据库，standby安装oracle软件，但不建立数据库。<br />
<br />
<br />
二、 建立物理备用数据库<br />
1． 准备主库的oracle环境：<br />
编辑oracle用户的$HOME/.bash_profile文件，oracle相关环境变量如下：<br />
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE<br />
ORACLE_SID=BOSS; export ORACLE_SID<br />
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1; export ORACLE_HOME<br />
export PATH=$ORACLE_HOME/bin:$PATH:<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib<br />
DISPLAY=10.1.9.59:0.0; export DISPLAY<br />
NLS_LANG=american_america.ZHS16CGB231280; export NLS_LANG<br />
<br />
2． 修改主库为归档模式<br />
建立归档目录：<br />
mkdir -p /u02/oradata/BOSS/arch<br />
修改归档模式：<br />
archive log list;<br />
create pfile from spfile;<br />
编辑$ORACLE_HOME/dbs/initBOSS.ora<br />
添加下面一行<br />
log_archive_dest_1='location=/u02/oradata/BOSS/arch'<br />
<br />
sqlplus /nolog<br />
conn sys as sysdba<br />
shutdown immediate;<br />
create spfile from pfile;<br />
startup nomount;<br />
alter database mount;<br />
alter database archivelog;<br />
alter database open;<br />
<br />
3. 对主数据库做一次完整热备份，获得备用数据库数据<br />
RMAN&gt;connect target<br />
RMAN&gt; backup database format='/home/oracle/%U_%s.bak';<br />
RMAN&gt; sql "Alter System Archive Log Current";<br />
RMAN&gt; Backup filesperset 10 ArchiveLog all format='/home/oracle/%U_%s.bak';<br />
<br />
cd /home/oracle<br />
scp *.bak 192.168.0.101:/home/oracle/<br />
<br />
<br />
4. 在standby服务器准备环境与primary相同<br />
编辑oracle用户的$HOME/.bash_profile文件，oracle相关环境变量如下：<br />
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE<br />
ORACLE_SID=BOSS; export ORACLE_SID<br />
ORACLE_HOME=$ORACLE_BASE/product/10.1.0/Db_1; export ORACLE_HOME<br />
export PATH=$ORACLE_HOME/bin:$PATH:<br />
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib<br />
DISPLAY=10.1.9.59:0.0; export DISPLAY<br />
NLS_LANG=american_america.ZHS16CGB231280; export NLS_LANG<br />
<br />
5. 准备相应目录，如日志文件路径，归档路径，参数文件路径，数据文件准备存放路径等<br />
$mkdir -p /u02/oradata/BOSS<br />
$mkdir -p /u02/oradata/BOSS /arch<br />
$mkdir -p $ORACLE_BASE/admin/BOSS<br />
$mkdir -p $ORACLE_BASE/admin/BOSS/bdump<br />
$mkdir -p $ORACLE_BASE/admin/BOSS/cdump<br />
$mkdir -p $ORACLE_BASE/admin/BOSS/udump<br />
<br />
6. 建立备用数据库参数文件<br />
主库的参数如下：<br />
BOSS.__db_cache_size=339738624<br />
BOSS.__java_pool_size=33554432<br />
BOSS.__large_pool_size=4194304<br />
BOSS.__shared_pool_size=218103808<br />
*.background_dump_dest='/u01/app/oracle/admin/BOSS/bdump'<br />
*.compatible='10.1.0.2.0'<br />
*.control_files='/u02/oradata/BOSS/control01.ctl','/u02/oradata/BOSS/control02.ctl','/u02/oradata/BOSS/control03.ctl'<br />
*.core_dump_dest='/u01/app/oracle/admin/BOSS/cdump'<br />
*.db_block_size=8192<br />
*.db_domain=''<br />
*.db_file_multiblock_read_count=16<br />
*.db_name='BOSS'<br />
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'<br />
*.db_recovery_file_dest_size=2147483648<br />
*.db_writer_processes=4<br />
*.dispatchers='(PROTOCOL=TCP) (SERVICE=BOSSXDB)'<br />
*.global_names=FALSE<br />
*.java_pool_size=32M<br />
*.job_queue_processes=10<br />
*.license_max_users=250<br />
*.log_archive_dest_1='location=/u02/oradata/BOSS/arch'<br />
*.log_archive_dest_2='SERVICE=dbstandby LGWR'<br />
*.open_cursors=300<br />
*.pga_aggregate_target=199229440<br />
*.processes=150<br />
*.remote_login_passwordfile='EXCLUSIVE'<br />
*.sga_target=598736896<br />
*.undo_management='AUTO'<br />
*.undo_tablespace='UNDOTBS1'<br />
*.user_dump_dest='/u01/app/oracle/admin/BOSS/udump'<br />
*.utl_file_dir='/u01/app/oracle/admin/BOSS/bdump'<br />
<br />
与主数据库不一样的参数如下：<br />
#standby database parameter<br />
standby_file_management=AUTO<br />
remote_archive_enable=TRUE<br />
standby_archive_dest='/u02/oradata/BOSS/arch'<br />
fal_server='DBPRIMARY'<br />
fal_client='DBSTANDBY'<br />
<br />
7. 从主服务器拷贝口令文件到备用服务器<br />
$cd $ORACLE_HOME/dbs/<br />
$scp orapwBOSS 192.168.0.101: /u01/app/oracle/product/10.1.0/Db_1/dbs<br />
<br />
8. 配置网络连接<br />
修改主服务器的<br />
/u01/app/oracle/product/10.1.0/Db_1/network/admin/listener.ora文件如下：<br />
LISTENER =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />
)<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))<br />
)<br />
)<br />
)<br />
<br />
SID_LIST_LISTENER =<br />
(SID_LIST =<br />
(SID_DESC =<br />
(SID_NAME = PLSExtProc)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)<br />
(PROGRAM = extproc)<br />
)<br />
(SID_DESC =<br />
(GLOBAL_DBNAME = BOSS)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)<br />
(SID_NAME = BOSS)<br />
)<br />
)<br />
<br />
<br />
LISTENERDB =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1522))<br />
)<br />
)<br />
)<br />
<br />
SID_LIST_LISTENERDB =<br />
(SID_LIST =<br />
(SID_DESC =<br />
(GLOBAL_DBNAME = BOSS)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)<br />
(SID_NAME = BOSS)<br />
)<br />
)<br />
$lsnrctl start<br />
$lsnrctl status 查看监听状态.<br />
<br />
修改主服务器的<br />
/u01/app/oracle/product/10.1.0/Db_1/network/admin/tnsnames.ora文件如下：<br />
BOSS =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle)(PORT = 1521))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = BOSS)<br />
)<br />
)<br />
<br />
EXTPROC_CONNECTION_DATA =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))<br />
)<br />
(CONNECT_DATA =<br />
(SID = PLSExtProc)<br />
(PRESENTATION = RO)<br />
)<br />
)<br />
<br />
DBPRIMARY =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1521))<br />
)<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = BOSS)<br />
)<br />
)<br />
<br />
DBSTANDBY =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = BOSS)<br />
)<br />
)<br />
<br />
修改备用服务器的<br />
/u01/app/oracle/product/10.1.0/Db_1/network/admin/listener.ora文件如下：<br />
LISTENER =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1521))<br />
)<br />
)<br />
)<br />
<br />
SID_LIST_LISTENER =<br />
(SID_LIST =<br />
(SID_DESC =<br />
(GLOBAL_DBNAME = BOSS)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)<br />
(SID_NAME = BOSS)<br />
)<br />
)<br />
<br />
LISTENERDB =<br />
(DESCRIPTION_LIST =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))<br />
)<br />
)<br />
)<br />
<br />
SID_LIST_LISTENERDB =<br />
(SID_LIST =<br />
(SID_DESC =<br />
(GLOBAL_DBNAME = BOSS)<br />
(ORACLE_HOME = /u01/app/oracle/product/10.1.0/Db_1)<br />
(SID_NAME = BOSS)<br />
)<br />
)<br />
<br />
修改备用服务器的<br />
/u01/app/oracle/product/10.1.0/Db_1/network/admin/tnsnames.ora文件如下：<br />
DBPRIMARY =<br />
(DESCRIPTION =<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.120)(PORT = 1521))<br />
)<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = BOSS)<br />
)<br />
)<br />
<br />
DBSTANDBY =<br />
(DESCRIPTION =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.101)(PORT = 1522))<br />
(CONNECT_DATA =<br />
(SERVER = DEDICATED)<br />
(SERVICE_NAME = BOSS)<br />
)<br />
)<br />
<br />
在这里配置两个监听，一个用于主服务器到备用服务器的连接，端口是1522，<br />
另外一个用于日后的切换需要，默认端口1521。<br />
启动1522 的端口<br />
$lsnrctl start listenerdb<br />
$lsnrctl status listenerdb 查看1522 端口上监听的状态.<br />
<br />
测试:<br />
在主和备用机上分别执行<br />
tnsping dbprimary<br />
tnsping dbstandby<br />
<br />
9. 在主数据库创建备用服务器控制文件<br />
alter database create standby controlfile as '/home/oracle/standby.ctl';<br />
创建后将控制文件cp(rcp or scp)到备用数据库所在的控制文件目录下。<br />
如$ scp control01.ctl 192.168.0.101:/u02/oradata/BOSS/<br />
cp /u02/oradata/BOSS/control01.ctl /u02/oradata/BOSS/control02.ctl<br />
cp /u02/oradata/BOSS/control01.ctl /u02/oradata/BOSS/control03.ctl<br />
<br />
10. 启动备用数据库<br />
conn sys as sysdba<br />
create spfile from pfile;<br />
startup nomount;<br />
alter database mount standby database;<br />
恢复数据库:<br />
RMAN&gt; connect target;<br />
RMAN&gt; restore database;<br />
RMAN&gt; restore archivelog all;<br />
<br />
如果有恢复的日志并想手工恢复，可以运行如下命令<br />
SQL&gt;recover automatic standby database;<br />
如果过程中出现如下类似错误，则可以忽略<br />
ORA-00279: change 50775 generated at 06/08/2004 21:57:21 needed for thread 1<br />
ORA-00289: suggestion : /u01/oracle/oradata/tbdb/archive/1_5.dbf<br />
ORA-00280: change 50775 for thread 1 is in sequence #5<br />
ORA-00278: log file '/u01/oracle/oradata/tbdb/archive/1_5.dbf' no longer needed<br />
for this recovery<br />
ORA-00308: cannot open archived log '/u01/oracle/oradata/tbdb/archive/1_5.dbf'<br />
ORA-27037: unable to obtain file status<br />
Linux Error: 2: No such file or directory<br />
Additional information: 3<br />
因为最后需要的日志根本没有从主数据库送过来<br />
<br />
<br />
进入到后台管理恢复状态<br />
SQL&gt;alter database recover managed standby database disconnect from session;<br />
<br />
<br />
三、采用Lgwr进程传递联日志机的最大性能模式<br />
1. 在备用数据库上创建备用日志<br />
alter database recover managed standby database cancel;<br />
alter database add standby LOGFILE GROUP 5 ('/u02/oradata/BOSS/stdy_redo05.log') size 10m;<br />
alter database add standby LOGFILE GROUP 6 ('/u02/oradata/BOSS/stdy_redo06.log') size 10m;<br />
alter database add standby LOGFILE GROUP 7 ('/u02/oradata/BOSS/stdy_redo07.log') size 10m;<br />
alter database add standby LOGFILE GROUP 8 ('/u02/oradata/BOSS/stdy_redo08.log') size 10m;<br />
alter database recover managed standby database disconnect from session;<br />
<br />
2. 修改主库的归档路径<br />
alter system set LOG_ARCHIVE_DEST_2='SERVICE=dbstandby LGWR' scope=both;<br />
另外，如果考虑到以后该库可能被切换到备用数据库，也可以创建同样的备用日志<br />
组:<br />
alter database add standby LOGFILE GROUP 5 ('/u02/oradata/BOSS/stdy_redo05.log') size 10m;<br />
alter database add standby LOGFILE GROUP 6 ('/u02/oradata/BOSS/stdy_redo06.log') size 10m;<br />
alter database add standby LOGFILE GROUP 7 ('/u02/oradata/BOSS/stdy_redo07.log') size 10m;<br />
alter database add standby LOGFILE GROUP 8 ('/u02/oradata/BOSS/stdy_redo08.log') size 10m;<br />
<br />
四、验证备用服务器是否工作<br />
在主库上：<br />
create user test identified by ftp123;<br />
grant connect,resource to test;<br />
conn test/ftp123@primary;<br />
create table test(name varchar2(20));<br />
insert into test values('hi, Data Guard');<br />
commit;<br />
conn / as sysdba;<br />
alter system switch logfile;<br />
<br />
查看从库日志<br />
以只读方式打开从库查看 insert into test values('hi, Data Guard'); 已经生效。<br />
conn / as sysdba;<br />
alter database recover managed standby database cancel;<br />
alter database open read only;<br />
conn test/ftp123<br />
select * from test;<br />
<br />
再次设置从库在恢复模式：<br />
alter database recover managed standby database disconnect from session;<br />
<br />
五、日常管理<br />
1. 备用服务器的管理模式与只读模式<br />
（1）启动到管理模式<br />
SQL&gt;shutdown immediate;<br />
SQL&gt;startup nomount;<br />
SQL&gt;alter database mount standby database;<br />
SQL&gt;alter database recover managed standby database disconnect from session;<br />
（2）启动到只读方式<br />
SQL&gt;shutdown immediate;<br />
SQL&gt;startup nomount;<br />
SQL&gt;alter database mount standby database;<br />
SQL&gt;alter database open read only;<br />
（3）如果在管理恢复模式下到只读模式<br />
SQL&gt;recover managed standby database cancel;<br />
SQL&gt;alter database open read only;<br />
这个时候，可以给数据库增加临时数据文件（这个在热备份的时候是没有备份过来的）<br />
如<br />
alter tablespace temp add tempfile '/u02/oradata/BOSS/temp01.dbf' size 100M;<br />
（4）从只读方式到管理恢复方式<br />
SQL&gt;recover managed standby database disconnect from session;<br />
<br />
2. 备用服务器日志删除<br />
备用服务器的日志删除也必须小心，因为如果有些日志还没有被备用服务器应用而该日志被<br />
删除的话，将引起备用数据库无法往下应用新的日志。<br />
删除备用服务器的日志的脚本为：<br />
#!/bin/sh<br />
<br />
# set env<br />
cd $HOME<br />
. .bash_profile<br />
<br />
# start remove<br />
cd $HOME/dbbat<br />
grep "Media Recovery Log" $ORACLE_BASE/admin/$ORACLE_SID/bdump/alert_${ORACLE_SID}.log | awk '{print $4}'|sed -e 's/^/rm /' &gt; rmarch<br />
log.sh<br />
chmod +x ./rmarchlog.sh<br />
./rmarchlog.sh<br />
cd $ORACLE_BASE/admin/$ORACLE_SID/bdump<br />
cat alert_${ORACLE_SID}.log &gt;&gt;alert_${ORACLE_SID}.log.bak<br />
echo ''&gt;alert_${ORACLE_SID}.log<br />
rm -f ./rmarchlog.sh<br />
<br />
3. 日志延迟检查<br />
备用服务器可能有这样的情况发生，因为日志块逻辑损坏，所以必须对日志应用进行检查，<br />
防止日志应用被停止，防患于未然，当然我们可以手工检查，但是以下脚本则可以实现自动<br />
检查（放到cron中）<br />
#!/bin/bash<br />
<br />
# set env<br />
cd $HOME<br />
. .bash_profile<br />
<br />
# start check<br />
DATE=`date +%Y-%m-%d:%H:%M:%S`<br />
filepath=/u02/oradata/$ORACLE_SID/arch/<br />
logpath=$ORACLE_BASE/admin/$ORACLE_SID/bdump<br />
remotefile=`ssh oracle@192.168.0.120 "ls -t /u02/oradata/BOSS/arch/*|head -1|sed -e 's/.*_1_//g' |sed -e 's/.arc$//g'"`<br />
<br />
echo "CHECK TIME:"${DATE}<br />
echo<br />
echo "remote file : "$remotefile<br />
<br />
cd $filepath<br />
varfile=`ls -t | head -1|sed -e 's/.*_1_//g' |sed -e 's/.arc$//g'`<br />
echo "archive file : "$filepath$varfile<br />
<br />
cd $logpath<br />
varlog=`grep "Media Recovery Log" alert_${ORACLE_SID}.log | awk '{print $4}' | tail -1 |sed -e 's/.*_1_//g' | sed -e 's/.arc$//g'`<br />
echo "applice file : "$varlog<br />
<br />
echo<br />
<br />
echo &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo "CHECK TIME:"${DATE} &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo "remote file : "$remotefile &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo "archive file : "$filepath$varfile &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo "applice file : "$varlog &gt;&gt; $HOME/dblog/check_DG_log.log<br />
echo &gt;&gt; $HOME/dblog/check_DG_log.log<br />
<br />
六、主库与备库的正常切换<br />
注意：Swithover时只能先从Primary切到Standby，再从Standby切到Primary.<br />
以下顺序不能颠倒，如果采用standby redo log的需要注意在切换前在主数据库创建同样的standby redo log。<br />
1．切换之前先要准备init参数文件<br />
最简单的办法就是把两个数据库的文件互换，在一个机器上同时保留主数据库的初始化文件<br />
与备用数据库的初始化文件。<br />
<br />
2. 从Primary切换到standby的脚本：<br />
[oracle@db worksh]$ more swithstandby.sh<br />
#!/bin/bash<br />
cd $HOME<br />
. .bash_profile<br />
sqlplus /nolog &lt;<eof /> connect / as sysdba<br />
alter database commit to switchover to physical standby with session shutdown;<br />
shutdown immediate;<br />
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbsdby.ora';<br />
startup nomount;<br />
alter database mount standby database;<br />
recover managed standby database disconnect;<br />
exit<br />
EOF<br />
lsnrctl stop<br />
lsnrctl start listenerdb<br />
<br />
3. 修改主端的tnsnames.ora 将主库IP：192.168.0.120 与备库IP：192.168.0.101 对换(即120 与 101 对调即可)<br />
<br />
4. 从standby切换到primary的脚本：<br />
$ more switchprimary.sh<br />
#!/bin/bash<br />
cd $HOME<br />
. .bash_primary<br />
sqlplus /nolog &lt;<eof /> connect / as sysdba<br />
alter database commit to switchover to primary;<br />
shutdown immediate;<br />
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';<br />
startup;<br />
exit<br />
EOF<br />
lsnrctl stop listenerdb<br />
lsnrctl start<br />
<br />
5. 修改备用端的tnsnames.ora 将主库IP：192.168.0.120 与备库IP：192.168.0.101 对换(即 120 与 101 对调即可)<br />
这样切换的要求是主机和备机各有两个listener, listener 监听1521，listenerdb 监听1522（见<br />
上面的配置过程），任何一个节点，在primary期间启动listener, standby 期间启动listenerdb。<br />
连接data guard的客户端的tnsnames配置，这样就可以实现失败切换，对客户端是透明的：<br />
BOSS =<br />
(DESCRIPTION =<br />
(failover = on )<br />
(ADDRESS_LIST =<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 主)(PORT = 1521))<br />
(ADDRESS = (PROTOCOL = TCP)(HOST = 备)(PORT = 1521))<br />
)<br />
(CONNECT_DATA =<br />
(SID = BOSS)<br />
)<br />
<br />
七、备库的失败切换<br />
1. 失败切换<br />
一般指主服务器已经不能使用，必须切换到备用服务器，所以，只操作备用服务器这一<br />
端，以下提供一切换脚本<br />
$ more switchprimary.sh<br />
#!/bin/bash<br />
cd $HOME<br />
. .bash_profile<br />
sqlplus /nolog &lt;<eof /> connect / as sysdba<br />
recover managed standby database cancel;<br />
-- if standby have Standby redo logfile<br />
--alter database recover managed standby database finish;<br />
-- else<br />
alter database recover managed standby database finish skip standby logfile;<br />
-- switch<br />
alter database commit to switchover to primary;<br />
-- open<br />
shutdown immediate;<br />
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';<br />
startup;<br />
exit<br />
EOF<br />
lsnrctl stop listenerdb<br />
lsnrctl start<br />
最后改tnsnames.ora 将主库IP：192.168.0.120 与备库IP：192.168.0.101 对换(即120 与101 对调即可)<br />
说明：<br />
（1）如果在备用端有活动的未归档的日志，或者有从主数据库拷贝过来的联机日志，可以采<br />
用如下的办法注册并恢复<br />
SQL&gt; ALTER DATABASE REGISTER LOGFILE '/u01/oracle/oradata/tbdb/archive/1_87.dbf';<br />
SQL&gt;recover standby database;<br />
（2）如果有活动日志，必须用<br />
alter database recover managed standby database finish;<br />
否则用<br />
alter database recover managed standby database finish skip standby logfile;<br />
这样切换的备用服务器可以避免最小的数据丢失和不用resetlogs，特别是对于用多个备<br />
用服务器的时候，该服务器可以马上作为主服务器而不用重新创建备用服务器。<br />
<br />
2. 强行切换（激活）<br />
这样的切换是以激和备用服务器来完成的，在重新启动数据库的时候，备用机会<br />
resetlogs，这样会影响到其它备用服务器而且必须重新在主服务器上重新构造备用服务器，<br />
一般不建议这样做。<br />
$ more activeprimary.sh<br />
#!/bin/bash<br />
#swith to primary with cancel<br />
cd $HOME<br />
. .bash_profile<br />
#cancel and startup database<br />
sqlplus /nolog &lt;<eof /> connect / as sysdba<br />
alter system archive log current;<br />
recover managed standby database cancel;<br />
alter database activate standby database;<br />
shutdown immediate;<br />
create spfile from '/u01/app/oracle/product/10.1.0/Db_1/dbs/inittbdbprim.ora';<br />
startup;<br />
exit<br />
EOF<br />
lsnrctl stop listenerdb<br />
lsnrctl start<br />
<br />
八、备用库的备份与恢复<br />
1. 从备用库上恢复主库的数据文件<br />
在某些情况下，主服务器可能损坏一个或两个数据文件，如果从主数据库上的备份恢复，理<br />
论上也是可以的，但是可能会因为需要应用到太多的日志，实际耗时太大，这个时候，我们<br />
可以考虑从备份服务器上恢复该数据文件，因为备份服务器与主数据库一般只相差一个日志<br />
文件左右。<br />
（1）关闭备用数据库<br />
recover managed standby database cancel;<br />
shutdown immediate;<br />
（2）拷贝或FTP损坏的数据文件到主数据库<br />
（3）在主数据库recover database datafile '文件名'即可。<br />
<br />
2. 在备用数据库上进行备份<br />
如果想减轻主库的压力，可以在备用数据库上进行备份，因为备用控制文件的特性关系，在<br />
对standby的rman备份中，不能修改rman的配置，所以没有办法自动备份控制文件。<br />
可以采用如下的方法备份：<br />
（1）备份备用数据库，可以停止恢复进程，跳转到read only模式下，通过backup database来备份数据库，这样的数据库处于一致性的模式下。<br />
（2）采用恢复目录备份standby数据库<br />
rman target sys@dbstandby<br />
backup database format '/u02/oradata/rman_backup/full_%d_%T_s%s_p%p';<br />
backup archivelog all delete input format '/u02/oradata/rman_backup/arc_%d_%T_s%s_p%p';<br />
（3）如果采用控制文件做恢复目录，注意<br />
alter database backup controlfile to '/u02/oradata/rman_backup/ctl_%d_%T_s%s_p%p';<br />
<br />
</font>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340096.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-08 20:53 <a href="http://www.blogjava.net/lz408925352/articles/340096.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>百万级访问网站前期的技术准备（中）</title><link>http://www.blogjava.net/lz408925352/articles/340093.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Wed, 08 Dec 2010 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340093.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340093.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340093.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340093.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340093.html</trackback:ping><description><![CDATA[<h3>七、数据库</h3>
<p>几乎所有操作最后都要落到数据库身上，它又最难扩展（存储也挺难）。对于mysql，什么样的表用myisam，什么样的表用innodb，在开发之前要确定。复制策略、分片策略，也要确定。表引擎方面，一般，更新不多、不需要事务的表可以用myisam，需要行锁定、事务支持的，用innodb。myisam的锁表不一定是性能低下的根源，innodb也不一定全是行锁，具体细节要多看相关的文档，熟悉了引擎特性才能用的更好。现代WEB应用越来越复杂了，我们设计表结构时常常设计很多冗余，虽然不符合传统范式，但为了速度考虑还是值得的，要求高的情况下甚至要杜绝联合查询。编程时得多注意数据一致性。<br />
<br />
复制策略方面，多主多从结构也最好一开始就设计好，代码直接按照多主多从来编写，用一些小技巧来避免复制延时问题，并且还要解决多数据库数据是否一致，可以自己写或者找现成的运维工具。</p>
<p>分片策略。总会有那么几个表数据量超大，这时分片必不可免。分片有很多策略，从简单的分区到根据热度自动调整，依照具体业务选择一个适合自己的。避免自增ID作为主键，不利于分片。</p>
<p>用存储过程是比较难扩展的，这种情形多发生于传统C/S，特别是OA系统转换过来的开发人员。低成本网站不是一两台小型机跑一个数据库处理所有业务的模式，是机海作战。方便水平扩展比那点预分析时间和网络传输流量要重要的多的多。</p>
<p>NoSQL。这只是一个概念。实际应用中，网站有着越来越多的密集写操作、上亿的简单关系数据读取、热备等，这都不是传统关系数据库所擅长的，于是就产生了很多非关系型数据库，比如Redis/TC&amp;TT/MongoDB/Memcachedb等，在测试中，这些几乎都达到了每秒至少一万次的写操作，内存型的甚至5万以上。例如MongoDB，几句配置就可以组建一个复制+自动分片+failover的环境，文档化的存储也简化了传统设计库结构再开发的模式。很多业务是可以用这类数据库来替代mysql的。</p>
<h3>八、缓存。</h3>
<p>数据库很脆弱，一定要有缓存在前面挡着，其实我们优化速度，几乎就是优化缓存，能用缓存的地方，就不要再跑到后端数据库那折腾。缓存有持久化缓存、内存缓存，生成静态页面是最容易理解的持久化缓存了，还有很多比如varnish的分块缓存、前面提到的memcachedb等，内存缓存，memcached首当其冲。缓存更新可用被动更新和主动更新。被动更新的好处是设计简单，缓存空了就自动去数据库取数据再把缓存填上，但容易引发雪崩效应，一旦缓存大面积失效，数据库的压力直线上升很可能挂掉。主动缓存可避免这点但是可能引发程序取不到数据的问题。这两者之间如何配合，程序设计要多动脑筋。</p>
<h3>九、队列。</h3>
<p>用户一个操作很可能引发一系列资源和功能的调动，这些调动如果同时发生，压力无法控制，用户体验也不好，可以把这样一些操作放入队列，由另几个模块去异步执行，例如发送邮件，发送手机短信。开源队列服务器很多，性能要求不高用数据库当做队列也可以，只要保证程序读写队列的接口不变，底层队列服务可随时更换就可以，类似Zend Framework里的Zend_Queue类，java.util.Queue接口等。</p>
<h3>十、文件存储。</h3>
<p>除了结构化数据，我们经常要存放其他的数据，像图片之类的。这类数据数量繁多、访问量大。典型的就是图片，从用户头像到用户上传的照片，还要生成不同的缩略图尺寸。存储的分布几乎跟数据库扩展一样艰难。不使用专业存储的情况下，基本都是靠自己的NAS。这就涉及到结构。拿图片存储举例，图片是非常容易产生热点的，有些图片上传后就不再有人看，有些可能每天被访问数十万次，而且大量小文件的异步备份也很耗费时间。</p>
<p>为了将来图片走cdn做准备，一开始最好就将图片的域名分开，且不用主域名。很多网站都将cookie设置到了.domain.ltd，如果图片也在这个域名下，很可能因为cookie而造成缓存失效，并且占多余流量，还可能因为浏览器并发线程限制造成访问缓慢。</p>
<p>如果用普通的文件系统存储图片，有一个简单的方法。计算文件的hash值，比如md5，以结果第一位作为第一级目录，这样第一级有16个目录。从0到F，可以把这个字母作为域名，0.yourimg.com到f.yourimg.com（客户端dns压力会增大），还可以扩展到最多16个NAS集群上。第二级可用年月例如，201011，第三级用日，第四级可选，根据上传量，比如am/pm，甚至小时。最终的目录结构可能会是 e/201008/25/am/e43ae391c839d82801920cf.jpg。rsync备份时可以用脚本只同步某年某日某时的文件，避免计算大量文件带来的开销。当然最好是能用专门的分布式文件系统或更专业点的存储解决方案。</p>
<p>下面，我们要谈谈代码了。</p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340093.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-08 19:58 <a href="http://www.blogjava.net/lz408925352/articles/340093.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>百万级访问网站前期的技术准备（下）</title><link>http://www.blogjava.net/lz408925352/articles/340094.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Wed, 08 Dec 2010 11:58:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340094.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340094.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340094.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340094.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340094.html</trackback:ping><description><![CDATA[<p>这一系列的最后一篇写给普通编程人员，如果不感兴趣可直接看本文最后几段。</p>
<p>开始设计代码结构之前，先回顾一下之前准备过的事情：我们有负载均衡的WEB服务器，有主从DB服务器并可能分片，有缓存，有可扩展的存储。在组织代码的各个方面，跟这些准备息息相关，我一二三的列出来分别说，并且每一条都以&#8220;前面讲到&#8221;这个经典句式开头，为了方便对照。<br />
<br />
别着急看经典句式，我思维跳跃了，插一段。实际开发中，我们总会在性能和代码优雅性上作折中。对于当今的计算机和语言解释器，多几层少几层对象调用、声明变量为Map还是HashMap这种问题是最后才需要考虑的问题，永远要考虑系统最慢的部分，从最慢的部分解决。例如看看你用的ORM是不是做了很多你用不到的事情，是不是有重复的数据调用。我们做的是web应用开发，不是底层框架API，代码易读易懂是保证质量很重要的一方面，你的程序是为了什么而设计，有不同的方法&#8230;&#8230;算了，这个话题另起一篇文章来说，扯远了，想交流可关注我的微博 <a href="http://t.sina.com.cn/liuzhiyi" target="_blank">http://t.sina.com.cn/liuzhiyi</a>，咱继续&#8230;&#8230;</p>
<p><a href="http://zhiyi.us/internet/thinking-twice-before-building-your-site-one.html" target="_blank">前面讲到</a>，WEB服务器是要做负载均衡的，图片服务器是要分开的。对于这点，代码在处理客户端状态时，不要把状态放到单机上，举例，不要用文件session，嗯，常识。如果有可能，最好在一开始就做好用户单点认证的统一接口，包括跨域如何判断状态、静态页面如何判断状态，需要登录时的跳转和返回参数定义，底层给好接口，应用层直接就用（可参考<a href="http://code.google.com/intl/zh-CN/appengine/" target="_blank">GAE</a>的user服务）。登录方面的设计要考虑移动设备的特性，比如电脑可以用浮动层窗口，但NOKIA自带的浏览器或UCWEB就无法处理这种表现形式，程序一定既能处理AJAX请求又能直接通过URL来处理请求。图片服务器分开，资源文件最好也布局到图片服务器，也就是WEB服务器只服务动态程序。虽然开发测试时稍微复杂（因为需要绝对URI才能访问），但将来页面前端优化上会轻松许多，并且你的WEB服务器IO优化也轻松许多。程序引用资源文件时，要有一个统一的处理方法，在方法内部可以自动完成很多事情，例如将css/js根据组合，拼成一个文件，或者自动在生成的URI后面加上QUERYSTRING，如果将来前端用了缓存服务，那生成QUERYSTRING是最简单的刷新服务端缓存和客户端缓存的办法。</p>
<p><a href="http://zhiyi.us/internet/thinking-twice-before-building-your-site-two.html" target="_blank">前面讲到</a>，数据库会有复制，可能会多主多从，可能会分片。我们程序在处理数据的过程中，最好能抽象出来单独放做一层。拿现在流行的MVC模式来说，就是在M层下方再放一个数据层，这个数据层不是通常所说的JDBC/PDO/ActiveRecord等，而是你自己的存取数据层，仅对外暴露方法，隐藏数据存取细节。这个数据层内部不要怕写的难看，但一定要提供所有的数据存储功能，其他任何层次不要看到跟数据库打交道的字眼。之所以这样做，是因为在单关系数据库的情况下，可能会SELECT&#8230;JOIN&#8230;或直接INSERT&#8230;INTO&#8230;，可你可能会将一些表放到key-value数据库里存储，或者分片，这么做之后原来的语句和方式要全部改变，如果过于分散，则移植时会耗费很大精力，或得到一个很大的Model。在数据层面的设计上，尽量避免JOIN查询，我们可以多做冗余，多做缓存，每种数据尽量只需要一次查询，然后在你的程序里面进行组合。对于比较复杂的数据组合，在实时性要求不高的情况下，可采用异步处理，用户访问时只取处理后的结果。在对于主键的处理上，避免使用自增ID，可以用一定规则生成的唯一值当做主键，这种主键是最简单的分片分布策略。即使用自增ID，也最好用一个自增ID发生器，否则从数据库不小心被写了一下，那主键很容易冲突。</p>
<p>前面讲到，咱数据库前面还有某些缓存挡着。别把mysql的query cache当缓存，应用稍复杂的时候QUERY CACHE反而会成为累赘。缓存跟数据库和业务结合的很紧密，正因为跟业务关系紧密，所以这点没有放之四海而皆准的方法。但我们还是有一些规则可参照。规则一：越接近前端，缓存的颗粒度越大。例如在WEB最前端缓存整个页面，再往后一层缓存部分页面区域，再往后缓存区域内的单条记录。因为越靠近后端，我们的可操作性越灵活，并且变化最多的前端代码也比较方便编写。在实践中，因为产品需求变化速度非常快，迭代周期越来越短，有时很难将Controller和Model分的那么清楚，Controller层面处理部分缓存必不可免，但要保证如果出现这种情况，Controller所操作的缓存一定不要影响其他数据需求方，也就是要保证这个缓存数据只有这一个Controller在用。规则二：没有缓存时程序不能出错。在不考虑缓存失效引发的雪崩效应时，你的程序要有缓存跟没缓存一个样，不能像新浪微博一样，缓存一失效，粉丝微博全空，整个应用都乱套了。在缓存必不可少的情况下，给用户出错信息都比给一个让人误解的信息强。规则三，缓存更新要保证原子性或称作线程安全，特别是采用被动缓存的方式时，很可能两个用户访问时导致同一个缓存被更新，通常情况这不是大问题，可缓存失效后重建时很可能是引发连锁反应的原因之一。规则四：缓存也是有成本的。不只是技术成本，还有人工时间成本。如果一个功能使用缓存和不使用，在可预见的访问量情况下区别微小，但使用缓存会使复杂度增加，那就不用，我们可以加个TODO标注，在下次迭代的时候加上缓存处理。</p>
<p>前面讲到，文件存储是独立的，那么所有的文件操作就都是远程调用。可以在文件服务器上提供一个很简单的RESTful接口，也可以提供xmlrpc或json serveice，WEB服务器端所生成和处理的文件，全部通过接口通知文件服务器去处理，WEB服务器本身不要提供任何文件存储。你会发现很多大网站的上传图片跟保存文章是分两步完成的，就是基于这个原因。</p>
<p>以上几条&#8220;前面讲到&#8221;，其实无数人都讲过，我也只是结合前几篇文章用自己的话重复了一遍，真正分析起来精髓很简单——除了良好的功能逻辑分层，我们还要为数据库存储、缓存、队列、文件服务等程序外层资源调用单独设计接口，你可以把你的程序想象成是运行在 Amazon EC2 上并用他的所有web service服务，你的数据库就是它的<a href="http://aws.amazon.com/simpledb/" target="_blank">SimpleDB</a>，你的队列就是他的<a href="http://aws.amazon.com/sqs/" target="_blank">SQS</a>，你的存储就是他的<a href="http://aws.amazon.com/s3/" target="_blank">S3</a>，唯一不同是amazon的接口是远程调用，你的是内部调用。</p>
<p>将支撑服务接口化，意味着将MySQL更换到<a href="http://www.postgresql.org/" target="_blank">PostgreSQL</a>不需要更改业务处理程序，移植团队甚至不需要跟业务开发团队过多沟通；意味着业务开发团队是对接口编程而不是对数据库编程；意味着不会因为某个业务开发人员的失误而拖垮性能。</p>
<p><strong>对程序扫盲不感兴趣的直接看这里——</strong></p>
<p>产品设计完了，程序框架搭完了，可能有矛盾在这个节骨眼儿产生了。不断有产品设计抱怨说他的创意没实现到预期效果，有程序员抱怨说产品设计不切实际。这种抱怨多缘于产品人员不懂技术，技术人员不理解产品。从广义上来讲，产品包含市场策略、营销手段、功能设计，产品和技术在争论时往往把焦点放在功能上，而实际重点是，实现这个功能所消耗的成本跟能这个功能带来的利益能否换算，能否取其轻重。若可以，争议解决。若不能，则抛硬币看运气。因为一个功能的加强而引发指标井喷，或因项目拖延而导致贻误战机的例子比比皆是。激进的决策者注重利益，保守的决策者注重损失，聪明的决策者会考虑这个问题是否真的那么严重。</p>
<p>关系到未来的事情谁都说不准，要不怎么说创业一半靠运气呢。不过总有能说的准的事情，那就得靠数据说话。</p>
<p>没有100%也有99.9%的网站安装了访问统计代码，连我的 <a href="http://zhiyi.us/" target="_blank">http://zhiyi.us</a> 也不例外，新闻联播也总说科学决策科学发展的。有了统计，能确定的事情就很多了。例如，可以根据来源-目标转化率来分析哪类渠道的人均获取成本低，根据来源-内容访问猜测用户跳出率原因，根据用户点击行为判断链接位置是否合理等。将数据以不同方式组合起来，找到内在联系，分析内因外因，制定对应策略，减少拍脑门决策。靠数据支撑运营是个非常专业的事情，虽然不懂深奥的数学模型不会复杂的公式计算，渐渐学会因为A所以B，因为A和B所以C还是相对简单的。<br />
<br />
转载请注明出处 <a href="http://zhiyi.us/internet/thinking-twice-before-building-your-site-final.html" target="_blank">http://zhiyi.us/internet/thinking-twice-before-building-your-site-final.html</a></p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340094.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-08 19:58 <a href="http://www.blogjava.net/lz408925352/articles/340094.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>百万级访问网站前期的技术准备（上）</title><link>http://www.blogjava.net/lz408925352/articles/340092.html</link><dc:creator>沉香江南</dc:creator><author>沉香江南</author><pubDate>Wed, 08 Dec 2010 11:57:00 GMT</pubDate><guid>http://www.blogjava.net/lz408925352/articles/340092.html</guid><wfw:comment>http://www.blogjava.net/lz408925352/comments/340092.html</wfw:comment><comments>http://www.blogjava.net/lz408925352/articles/340092.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/lz408925352/comments/commentRss/340092.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/lz408925352/services/trackbacks/340092.html</trackback:ping><description><![CDATA[<p>开了自己域名的博客，第一篇就得来个重磅一点的才对得起这4美金的域名。作为一个技术从业者十年，逛了十年发现有些知识东一榔头西一棒槌的得满世界看个遍才整理出个头绪，那咱就系统点的从头一步一步的说，一个从日几千访问的小小网站，到日访问一两百万的小网站，怎么才能让它平滑的度过这个阶段，别在技术上出现先天不足，写给一些技术人员，也写给不懂技术的创业者。</p>
<p>转载请注明出自 <a href="http://zhiyi.us/">http://zhiyi.us</a> ，假如您还想从这转到好文章的话。</p>
<p>对互联网有了解的人都有自己的想法，有人就把想法付诸实现，做个网站然后开始运营。其实从纯网站技术上来说，因为开源模式的发展，现在建一个小网站已经很简单也很便宜。当访问量到达一定数量级的时候成本就开始飙升了，问题也开始显现了。因为带宽的增加、硬件的扩展、人员的扩张所带来的成本提高是显而易见的，而还有相当大的一部分成本是因为代码重构、架构重构，甚至底层开发语言更换引起的，最惨的就是数据丢失，辛辛苦苦好几年，一夜回到创业前。</p>
<p>减少成本就是增加利润。很多事情，我们在一开始就可以避免，先打好基础，往后可以省很多精力，少操很多心。</p>
<p>假设你是一个参与创业的技术人员，当前一穷二白，什么都要自己做，自己出钱，初期几十万的资金，做一个应用不是特别复杂的网站，那么就要注意以下几点：<br />
</p>
<h3>一、开发语言</h3>
<p>一般来说，技术人员（程序员）创业都是根据自己技术背景选择自己最熟悉的语言，不过考虑到不可能永远是您一个人写程序，这点还得仔细想想。无论用什么语言，最终代码质量是看管理，所以我们还是从纯语言层面来说实际一点。现在流行的<a href="http://www.java.com/zh_CN/" target="_blank">java</a>、<a href="http://www.php.net/" target="_blank">php</a>、<a href="http://www.microsoft.com/net/" target="_blank">.net</a>、<a href="http://www.python.org/" target="_blank">python</a>、<a href="http://www.ruby-lang.org/en/" target="_blank">ruby</a>都有自己的优劣，python和ruby，现在人员还是相对难招一些，性能优化也会费些力气，.net平台买不起windows server。java、php用的还是最多。对于初期，应用几乎都是靠前端支撑的网站来说，php的优势稍大一些，入门简单、设计模式简单、写起来快、性能足够等，不过不注重设计模式也是它的劣势，容易变得松散，隐藏bug稍多、难以维护。java的优势在于整套管理流程已经有很多成熟工具来辅助，强类型也能避免一些弱智BUG，大多数JAVA程序员比较注重设计模式，别管实不实际，代码格式看起来还是不错的。这也是个劣势，初学者可能太注重模式而很难解决实际需求。</p>
<p>前端不只是html、css这类。整个负责跟用户交互的部分都是前端，包括处理程序。这类程序还是建议用php，主要原因就是开发迅速、从业人员广泛。至于后端例如行为分析、银行接口、异步消息处理等，随便用什么程序，那个只能是根据不同业务需求来选择不同语言了。</p>
<h3>二、代码版本管理</h3>
<p>如果开发人员之间的网络速度差不多，就<a href="http://subversion.apache.org/" target="_blank">SVN</a>；比较分散例如跨国，就<a title="Mercurial SCM(hg)" href="http://mercurial.selenic.com/" target="_blank">hg</a>。大多数人还是svn的.</p>
<p>假设选了svn，那么有几点考虑。一是采用什么树结构。初期可能只有一条主干，往后就需要建立分支，例如一条开发分支，一条上线分支，再往后，可能要每个小组一个分支。建议一开始人少时选择两条分支，开发和线上，每个功能本地测试无误后提交到开发分支，最后统一测试，可以上线时合并到上线分支。如果喜欢把svn当做移动硬盘用，写一点就commit一次也无所谓，就是合并的时候头大一些，这些人可以自己建个分支甚至建立个本地代码仓库，随便往自己的分支提交，测试完毕后再提交到开发分支上。</p>
<p>部署，可以手工部署也可以自动部署。手工部署相对简单，一般是直接在服务器上svn update，或者找个新目录svn checkout，再把web root给ln -s过去。应用越复杂，部署越复杂，没有什么统一标准，只要别再用ftp上传那种形式就好，一是上传时文件引用不一致错误率增加，二是很容易出现开发人员的版本跟线上版本不一致，导致本来想改个错字结果变成回滚的杯具。如果有多台服务器还是建议自动部署，更换代码的机器从当前服务池中临时撤出，更新完毕后再重新加入。</p>
<p>不管项目多小，养成使用版本管理的好习惯，最起码还可以当做你的备份，我的 <a href="http://zhiyi.us/">http://zhiyi.us</a> 虽然就是一个wordpress，可还是svn了，只改动一两句css那也是劳动成果。</p>
<h3>三、服务器硬件</h3>
<p>别羡慕大客户和有钱人，看看机房散户区，一台服务器孤独的支撑的网站数不清。如果资金稍微充足，建议至少三台的标准配置，分别用作web处理、数据库、备份。web服务器至少要8G内存，双sata raid1，如果经济稍微宽松，或静态文件或图片多，则15k sas raid1+0。数据库至少16G内存，15k sas raid 1+0。备份服务器最好跟数据库服务器同等配置。硬件可以自己买品牌的底板，也就是机箱配主板和硬盘盒，CPU内存硬盘都自己配，也可以上整套品牌，也可以兼容机。三台机器，市场行情6、7万也就配齐了。</p>
<p>web服务器可以既跑程序又当内存缓存，数据库服务器则只跑主数据库（假如是<a title="MySQL Standard Edition" href="http://www.mysql.com/products/standard/" target="_blank">MySQL</a>的话），备份服务器干的活就相对多一些，web配置、缓存配置、数据库配置都要跟前两台一致，这样WEB和数据库任意一台出问题，把备份服务器换个ip就切换上去了。备份策略，可以<a title="DRBD" href="http://www.drbd.org/" target="_blank">drbd</a>，可以<a title="rsync" href="http://samba.anu.edu.au/rsync/" target="_blank">rsync</a>，或者其他的很多很多的开源备份方案可选择。rsync最简单，放cron里自己跑就行。备份和切换，建议多做测试，选最安全最适合业务的，并且尽可能异地备份。</p>
<h3>四、机房</h3>
<p>三种机房尽量不要选：联通访问特别慢的电信机房、电信访问特别慢的联通机房、电信联通访问特别慢的移动或铁通机房。那网通机房呢？亲，网通联通N久以前合并改叫联通了。多多寻找，实地参观，多多测试，多方打探，北京、上海、广州等各个主节点城市，还是有很多优质机房的，找个网络质量好，管理严格的机房，特别是管理要严格，千万别网站无法访问了，打个电话过去才知道别人维护时把你网线碰掉了，这比DOS都头疼。自己扯了几根光纤就称为机房的，看您抗风险程度和心理素质了。机房可以说是非常重要，直接关系到网站访问速度，网站访问速度直接关系到用户体验，我可以翻墙看风景，但买个网游vpn才能打开你这个还不怎么知名的网站就有难度了。或许您网站的ajax很出色，可是document怎么也不ready，一些代码永远绝缘于用户。</p>
<h3>五、架构</h3>
<p>初期架构一般比较简单，web负载均衡+数据库主从+缓存+分布式存储+队列。大方向上也确实就这几样东西，细节上也无数文章都重复过了，按照将来会有N多WEB，N多主从关系，N多缓存，N多xxx设计就行，基本方案都是现成的，只是您比其他人厉害之处就在于设计上考虑到缓存失效时的雪崩效应、主从同步的数据一致性和时间差、队列的稳定性和失败后的重试策略、文件存储的效率和备份方式等等意外情况。缓存总有一天会失效，数据库复制总有一天会断掉，队列总有一天会写不进去，电源总有一天会烧坏。根据墨菲定律，如果不考虑这些，网站早晚会成为茶几。</p>
<h3>六、服务器软件</h3>
<p>Linux、<a title="nginx" href="http://nginx.org/" target="_blank">nginx</a>、php、mysql，几乎是标配，我们除了看名字，还得选版本。Linux发行版众多，只要没特殊要求，就选个用的人最多的，社区最活跃的，配置最方便的，软件包最全最新的，例如<a title="Debian" href="http://www.debian.org/" target="_blank">debian</a>、<a title="Ubuntu" href="http://www.ubuntu.com/" target="_blank">ubuntu</a>。至于RHEL之类的嘛，你用只能在RHEL上才能运行的软件么？剩下的nginx、php、mysql、activemq、其他的等等，除非你改过这些软件或你的程序真的不兼容新版本，否则尽量版本越新越好，版本新，意味着新特性增多、BUG减少、性能增加。总有些道听途说的人跟你说老的版本稳定。所谓稳定，是相对于特殊业务来说的，而就一个php写的网站，大多数人都没改过任何服务器软件源代码，绝大多数情况是能平稳的升级到新版本的。类似于jdk5到jdk6，python2到python3这类变动比较大的升级还是比较少见的。看看ChangeLog，看看升级说明，结合自己情况评估一下，越早升级越好，别人家都用php6写程序了这边还php4的逛游呢。优秀的开源程序升级还是很负责任的，看好文档，别怕。</p>
<p>以上这六点准备完毕，现在我们有了运行环境，有了基本架构骨架，有了备份和切换方案，应该开始着手设计开发方面的事情了。开发方面的事情无数，下一篇会先说一些重点。</p>
<img src ="http://www.blogjava.net/lz408925352/aggbug/340092.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/lz408925352/" target="_blank">沉香江南</a> 2010-12-08 19:57 <a href="http://www.blogjava.net/lz408925352/articles/340092.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>