简述Oracle数据库RAC真实应用集群的工作原理

简述Oracle数据库RAC真实应用集群的工作原理,第1张

Oracle集群

Oracle集群,最早称作OPS(Oracle Parallel Server)出现在Oracle 7版本中,从Oracle 9i开始正式改称为Oracle RAC,RAC即Real Application Clusters的简写,译为“真正应用集群”;RAC 是Oracle新版数据库中采用的一项新技术,也是Oracle数据库支持网格计算环境的核心技术。 10g以前的OPS或者RAC都依赖于第三方集群软件(Vendor Clusterware)方能正常工作,在10g版本中Oracle推出了Oracle Clusterware集群软件以及ASM自动存储管理技术,换而言之10g以后版本的RAC不再依赖于第三方的集群软件(譬如IBM的HACMP,Veritas的VCS等),但必须安装Oracle自己的Clusterware集群软件。 Oracle RAC主要支持Oracle9i、10g、11g版本,可以可以支持24 x 7 有效的数据库应用 系统,在低成本服务器上构建高可用性数据库系统,并且自由部署应用,无需修改代码。 在Oracle RAC环境下,Oracle集成提供了集群软件和存储管理软件,为用户降低了应用成本。当应用规模需要扩充时,用户可以按需扩展系统,以保证系统的性能。 参考编辑本段Oracle集群参考文档

Oracle RAC一般也可构建于大型SMP主机,IBM的AIX系列服务器往往是其中高端平台,Intel Linux往往作为其低端平台。当AIX UNIX用来运行Oracle RAC作为大型数据库系统平台时,其集群系统构建、实施、运维、高可用设置,有其平台特点。可以参照《Oracle大型数据库系统在AIX/UNIX上的实战详解》,该书以AIX UNIX平台为主线,以其他UNIX系统为参照,描述了数据库系统Oracle 10g、Oracle 11g的RAC的构架方法和过程。在Linux平台,则《大话OracleRAC集群、高可用性、备份与恢复》有着很好的论述。

大家对通常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 scott.dept)

3 loop

4 insert into department

5 values(x.deptno,x.dname,x.loc)

6 insert into employee

7 select * from scott.emp

8 where deptno = x.deptno

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_rowid.rowid_block_number(department.rowid) dept_rid,

2 dbms_rowid.rowid_block_number(employee.rowid) emp_rid,department.deptid

3 from department,employee

4 where employee.deptid = department.deptid

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 rac(real application cluster)。

单实例的可以理解成 在一台机器上装一个单机的oracle

集群数据库 是 把很多个装有单机oracle数据库的 机器 通过配置给组合起来 ,来提高可用性等


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9872147.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存