大家对通常oracle中的cluster的理解是不准确的,经常和sql server中的cluster index混淆。Cluster是存储一组table的一种方法,这些table共享同一数据块中的某些相同column,并把不同table在这一共享column上值相同的data row存储到同一block上。在sql server中的cluster index强制行根据index key按存储顺序存储,这一点和oracle中的IOT类似。
从下图中我们可以清楚的看到cluster 和非cluster 的一组table的物理存储的区别。在cluster中,单个block上的数据可能来自多个table,概念上可以存储“预连接”的数据。单个table也可以使用cluster,即根据某些column按组存储数据。如图中,所有部门ID为 20和 110的部门信息和员工信息的数据都将存储在同一block。注意,这里存储的并不是排序的数据(那是IOT的任务),存储的是按部门ID分组集合的数据,是以heap的方式存储的。因此,部门20刚好和部门110相邻,而部门99和部门100相距很远(硬盘的物理位置)。
当单个block放不下时,额外的block将链接到最初的block,来包容溢出的数据,这种方式和在IOT中溢出block非常相似。
现在我们看看如何创建一个cluster。在cluster中创建一系列table是很简单的,对象存储定义如PCTFREE,PCTUSED,INITIAL都是和cluster相关的,而不是和table相关。这是因为在cluster中存储了若干table,每个table在同一个block中拥有不同的PCTFREE没有意义。
SQL> create cluster e_d_cluster
2 (deptid number(2))
3 size 1024
4 /
Cluster created
这里首先创建了一个index cluster。这个cluster的key为 deptid,在table中这个列可以不命名为deptid,但数据类型number(2)必须匹配。Size选项是用来告诉oracle预计有1024
字节数据和每个cluser key相关。Oracle将使用这个信息来计算每个block能容纳的最大cluster key数目。因此size太高,在每一block将得到很少的key,并且将使用比需要的更多的空间;设置容量太低,将得到过多的数据连接,这将偏离使用cluster的目的。Size是cluster的重要参数。
现在我们来创建cluster index。在把数据放入之前,需要索引cluster。Cluster index的作用是存储一个cluster key,并且返回包含该key的block的地址。
SQL> create index e_d_cluster_idx
2 on cluster e_d_cluster
3 /
Index created
Cluster key 的index可以使用index所有的正常的存储参数,并且可以位于另一个tablespace。它是一个正常的index,能够索引到一个cluster,并且也包含一个完全null的条目。
我们在cluster中创建table:
SQL> create table department
2 (deptid number(2) primary key,
3 dname varchar2(14),
4 loc varchar2(13))
5 cluster e_d_cluster(deptid);
Table created
SQL> create table employee
2 (empid number primary key,
3 ename varchar2(10),
4 job varchar2(10),
5 mgr number,
6 hiredate date,
7 sal number,
8 comm number,
9 deptid number(2) references department(deptid))
10 cluster e_d_cluster(deptid);
Table created
这里创建table与普通的table唯一的区别就是使用了cluster关键字,我们往table中装载数据:
SQL> begin
2 for x in(select from scottdept)
3 loop
4 insert into department
5 values(xdeptno,xdname,xloc);
6 insert into employee
7 select from scottemp
8 where deptno = xdeptno;
9 end loop;
10 end;
11 /
PL/SQL procedure successfully completed
我们可以看到目前table中装载了如下数据:
SQL> select from department;
DEPTID DNAME LOC
------ -------------- -------------
10 ACCOUNTING NEW YORK
20 RESEARCH DALLAS
30 SALES CHICAGO
40 OPERATIONS BOSTON
SQL> select from employee;
EMPID ENAME JOB MGR HIREDATE SAL COMM DEPTID
---------- ---------- ---------- ---------- ----------- ---------- ---------- ------
7782 CLARK MANAGER 7839 1981-6-9 2450 10
7839 KING PRESIDENT 1981-11-17 5000 10
7934 MILLER CLERK 7782 1982-1-23 1300 10
7369 SMITH CLERK 7902 1980-12-17 800 20
7566 JONES MANAGER 7839 1981-4-2 2975 20
7788 SCOTT ANALYST 7566 1982-12-9 3000 20
7876 ADAMS CLERK 7788 1983-1-12 1100 20
7902 FORD ANALYST 7566 1981-12-3 3000 20
7499 ALLEN SALESMAN 7698 1981-2-20 1600 300 30
7521 WARD SALESMAN 7698 1981-2-22 1250 500 30
7654 MARTIN SALESMAN 7698 1981-9-28 1250 1400 30
7698 BLAKE MANAGER 7839 1981-5-1 2850 30
7844 TURNER SALESMAN 7698 1981-9-8 1500 0 30
7900 JAMES CLERK 7698 1981-12-3 950 30
现在我们看看这两个table数据存储的位置:
SQL> select dbms_rowidrowid_block_number(departmentrowid) dept_rid,
2 dbms_rowidrowid_block_number(employeerowid) emp_rid,departmentdeptid
3 from department,employee
4 where employeedeptid = departmentdeptid;
DEPT_RID EMP_RID DEPTID
---------- ---------- ------
5587 5587 10
5587 5587 10
5587 5587 10
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 20
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30
5587 5587 30
可以看到部门ID相同的数据存储在一个block上。我们为什么推荐上述方法对cluster进行最初的装载呢?这样能够保证如果有些cluster key的相关数据超过了size,仍能使大部分数据聚集在一个block上。这只适用于最初的数据装载,在这以后,可以使用事务对cluster中的table insert数据。
由于cluster中的特殊的数据存储方式,出现了这样一个问题,rowid出现了重复,现在rowid只能在一个table中唯一标识一行数据了(另一种rowid重复出现在transport tablespace的 *** 作后)。
SQL> select rowid from department
2 intersect
3 select rowid from employee;
ROWID
------------------
AAAGWQAADAAABXTAAA
AAAGWQAADAAABXTAAB
AAAGWQAADAAABXTAAC
AAAGWQAADAAABXTAAD
柏携手Oracle推出集群解决方案
来源:计算机世界
为了帮助企业用户简单、快速地部署集群系统,康柏电脑公司近日推出两个新的集群方案:运行在AlphaServer系统上的基于Oracle9i RAC(真正应用集群)的康柏Database Utility方案,以及应用于康柏ProLiant服务器的业界第一个基于Windows 2000的Oracle9i RAC认证配置。康柏Database Utility包括预安装、预调试的Oracle9i RAC软件,使用户能够立即装载数据,有效简化了数据库解决方案的部署过程,从而减少了部署时间,这对于希望减少复杂性和部署成本的用户来说是非常关键的。Database Utility的基本配置包括Tru64 UNIX、TruCluster Server软件、两个4GB内存和07TB 存储容量的AlphaServer ES45系统,可以进一步扩展到8个节点、每个节点配置2~4个CPU、4~32GB内存,存储容量可以从07TB增加到46TB,从而能够消除单点故障,确保数据和应用的正常运行。Database Utility提供了一个简单的命令集,使Tru64 UNIX用户能够快速在Oracle9i RAC系统中增加AlphaServer系统和存储子系统,而且在此过程中无需中断系统中的应用。康柏基于Windows 2000的Oracle9i RAC认证配置方案使用户能够在工业标准服务器环境下,高效率部署总拥有成本更低、高可用、高可伸缩的数据库平台。与此同时,康柏全球服务和Oracle支持服务紧密合作,共同提供24×7的联合服务,确保集群系统的无缝 *** 作
与一般的集群产品一样,ORACLE RAC实现需要考虑以下几个问题:
1,并发管理,当集群中多个节点同时接受外部客户端访问,如何使每个客户端得到的数据一样,这就需要保证在集群中每个节点看到的数据都要一样的,这就是在节点中如何保持数据一致性的问题。ORACLE RAC主要是使用DLM(分布式锁管理器)来保证集群节点之间的数据一致性
2,健忘症,如我们需要修改集群配置时,只是在集中一台节点上修改,这一台节点会自动把配置信息分发到其他的节点。考虑一种这样的情形,在节点A上修改了集群配置,而这时候节点B处理关机状态。当节点B开始的时候,并不知道配置已经发生了改变,这种情形称为健忘症,在ORACLE RAC中,主要通过把SPFILE存放在共享存储上来解决配置丢失的问题。
3,脑裂症,在一个共享存储的集群中,当集群中hearbeat丢失时,如果各节点还是同时对共享存储去进行 *** 作,那么在这种情况下所引发的情况是灾难的。ORACLE RAC采用投票算法来解决这个问题,思想是这样的:每个节点都有一票,考虑有A,B,C三个节点的集群情形,当A节点由于各种原因不能与B,C节点通信时,那么这集群分成了两个DOMAIN,A节点成为一个DOMAIN,拥有一票;B,C节点成为一个DOMAIN拥有两票,那么这种情况B,C节点拥有对集群的控制权,从而把A节点踢出集群,对要是通IO FENCING来实现。如果是两节点集群
,则引入了仲裁磁盘,当两个节点不能通信时,请求最先到达仲裁磁盘的节点拥用对集群的控制权。
一个数据库可以有一个或多个实例(RAC集群模式); 一个实例只属于一个数据库。 所以不会有多个数据库共有一个实例的情况。但是可以在数据库里配置对方数据库的db_link信息 在一个实例里就可以访问对方数据库了
你还是找专门的DBA来装吧,看你的情况对AIX和数据库都不是很了解啊。。。有了HACMP一般就不用RAC了。双机互备,两边跑不通的oracle 实例,遇到问题HA把一边的数据库直接切到另一边就好了。这个安装的过程牵涉到的不仅是oracle的安装,还有vg的划分,资源组的配置和hacmp里的各种设置。你现在的情况搞不定的。
以上就是关于Oracle中的cluster是什么意思,它有什么作用全部的内容,包括:Oracle中的cluster是什么意思,它有什么作用、有什么高性能的ORACLE集群方案、oracle rac 多个数据库共用一个集群服务吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)