史上最全Oracle体系结构整理

本文对Oracle体系结构做了详细的整理汇总,供大家参考学习。

一、Oracle组成


oracle分两块,oracle数据库软件和oracle数据库。oracle数据库软件位置通过以下命令可以找到:

[oracle@redhat4 ~]$ cd $ORACLE_HOME
[oracle@redhat4 db_1]$ pwd
/u01/app/oracle/product/10.2.0/db_1
[oracle@redhat4 db_1]$ ls
assistants   has               listener.log  oracore           root.sh
bin          hs                log           oraInst.loc       root.sh.old
cdata        install           md            ord               slax
cfgtoollogs  install.platform  mesg          oui               sqlj
clone        inventory         mgw           owm               sqlnet.log
config       javavm            network       perl              sqlplus
crs          jdbc              nls           plsql             srvm
css          jdk               oc4j          precomp           startup.log
ctx          jlib              odbc          racg              sysman
dbs          jre               olap          rdbms             uix
demo         ldap              OPatch        redhat4_jiagulun  wwg
diagnostics  lib               opmn          relnotes          xdk

最后ls命令列出了数据库软件的内容。

oracle数据库的位置

[oracle@redhat4 db_1]$ cd $ORACLE_BASE
[oracle@redhat4 oracle]$ pwd
/u01/app/oracle
[oracle@redhat4 oracle]$ cd oradata/jiagulun
[oracle@redhat4 jiagulun]$ ls
control01.ctl  example01.dbf  redo03.log    temp01.dbf
control02.ctl  redo01.log     sysaux01.dbf  undotbs01.dbf
control03.ctl  redo02.log     system01.dbf  users01.dbf

ls命令显示了数据库的内容。

oracle数据库软件的文件和oracle数据库的文件可以分开存储到两个地方。

我们最常使用的几乎全部的在生产环境里面的存放结构是:oracle数据库软件存放在服务器本地硬盘上而oracle数据库存放在存储上。

oracle数据库讲的就是/u01/app/oracle/oradata/jiagulun目录下的文件。这些文件就组成了oracle数据库。有三类文件,ctl文件、log文件以及dbf文件。

二、Oracle实例


oracle数据库是实实在在存储在硬盘上的三类文件。oracle数据库可以启动起来,oracle启动起来以后,首先在内存划出一块空间出来,供oracle使用,这块内存叫oracle内存。第二件事情,启动一堆进程,我们把内存和进程统称oracle实例。

oracle数据库启动起来以后会产生一个oracle实例。oracle数据库关闭后就没有oracle实例了。oracle实例是oracle数据库内存和进程的总称。

实例和数据库一般情况是一个数据库对应一个实例 1:1的关系。当然也有一些特殊情况,一个数据库可以对应多个实例,如两个实例对应一个数据库,一般没有单数,现在生产环境用的比较多的是两个实例对应一个数据库,也有四个实例对应一个数据库,也有八个实例对应一个数据库,有八个的现在用的比较少,虽然oracle支持。

例子:

有两台服务器,一台存储。存储中放oracle数据库文件,每台服务器都装oracle数据库软件。每台服务器启动一个实例,两个实例都访问存储中的oracle,这就是1:2的关系一个数据库对应俩实例。两个实例同时都可以访问oracle数据库。

一个用户要访问数据库,它连接到的是实例,通过实例来访问数据库。

如:一个数据库有两个实例,假设有一百个用户要访问数据库,可以50个用户访问一个实例,另外50个用户访问另外一个实例。这是一种负载均衡的概念(使一起运行的设备负担的负载达到一个近似相同的状态),

可提高数据库性能和并发性。从理论上讲,数据库性能提高了两倍。实际上在生产环境里面我们会讲,这个技术就是oracle的RAC技术。

一般的学习环境下是一个数据库对应一个实例。

下面要用到两个linux命令:

1. ps命令

是Process Status的缩写,显示瞬间系统行程 (process) 的动态。它列出了系统中当前运行的进程,结果是个进程的快照,即执行ps命令的那个时刻的进程。

2. ipcs命令 

用途:报告进程间通信设施状态。共有三种设施类型:消息队列、共享内存和信号量

参数:默认列出全部三种设施信息

-m 输出有关共享内存(shared memory)的信息 -q 输出有关信息队列(message queue)的信息 -s 输出信号量(semaphore)的信息

1)数据库启动前

查看有没有oracle实例

[oracle@redhat4 db_1]$ ps -ef|grep ora
root      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]
oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1
oracle    1794  1793  0 07:34 pts/1    00:00:00 -bash
oracle    3906  1794  0 07:52 pts/1    00:00:00 ps -ef
oracle    3907  1794  0 07:52 pts/1    00:00:00 grep ora

结果中没有oracle的进程

查看内存状态

[oracle@redhat4 ~]$ ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status

------ Semaphore Arrays --------
key        semid      owner      perms      nsems
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

没有Oracle使用的内存

2)数据库启动后

[oracle@redhat4 db_1]$ ps -ef|grep ora
root      1744  6071  0 07:34 ?        00:00:00 sshd: oracle [priv]
oracle    1793  1744  0 07:34 ?        00:00:00 sshd: oracle@pts/1
oracle    1794  1793  0 07:34 pts/1    00:00:00 -bash
oracle    3964     1  0 07:54 ?        00:00:00 ora_pmon_jiagulun
oracle    3966     1  0 07:54 ?        00:00:00 ora_psp0_jiagulun
oracle    3968     1  0 07:54 ?        00:00:00 ora_mman_jiagulun
oracle    3970     1  0 07:54 ?        00:00:00 ora_dbw0_jiagulun
oracle    3972     1  0 07:54 ?        00:00:00 ora_lgwr_jiagulun
oracle    3974     1  0 07:54 ?        00:00:00 ora_ckpt_jiagulun
oracle    3976     1  0 07:54 ?        00:00:00 ora_smon_jiagulun
oracle    3978     1  0 07:54 ?        00:00:00 ora_reco_jiagulun
oracle    3980     1  0 07:54 ?        00:00:00 ora_cjq0_jiagulun
oracle    3982     1  0 07:54 ?        00:00:00 ora_mmon_jiagulun
oracle    3984     1  0 07:54 ?        00:00:00 ora_mmnl_jiagulun
oracle    3986     1  0 07:54 ?        00:00:00 ora_d000_jiagulun
oracle    3988     1  0 07:54 ?        00:00:00 ora_s000_jiagulun
oracle    3994     1  0 07:55 ?        00:00:00 ora_qmnc_jiagulun
oracle    4009     1  0 07:55 ?        00:00:00 ora_j000_jiagulun
oracle    4013     1  0 07:55 ?        00:00:00 ora_q000_jiagulun
oracle    4015     1  0 07:55 ?        00:00:00 ora_q001_jiagulun
oracle    4031  1794  0 07:55 pts/1    00:00:00 ps -ef
oracle    4032  1794  0 07:55 pts/1    00:00:00 grep ora

结果中有了很多oracle的实例的进程,如ora_pmon_jiagulun 等以ora_开头的进程。

内存状态

[oracle@redhat4 ~]$ ipcs
------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status
0x36010028 360448     oracle    640        287309824  23
------ Semaphore Arrays --------
key        semid      owner      perms      nsems
0x7df2e688 229376     oracle    640        154
------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages

内存中出现了oracle使用的内存块:

0x36010028 360448     oracle    640        287309824  23

有了一块280M的内存给了oracle。这是oracle启动起来以后在内存里面划了一块比较大的空间。oracle启动起来以后会占用内存和产生进程,这个得到了验证。

三、oracle内存结构


oracle数据库启动起来以后oracle会在内存里面划出一部分空间,这块空间被oracle所独享所使用。这块内存oracle给它起名叫SGA。一般译为:system global area 或shared global area。

当启动Oracle数据库时,系统会先在内存内规划一个固定区域,用来储存用户需要的数据,以及Oracle运行时必备的系统信息。是Oracle Instance的基本组成部分,在实例启动时分配。

SGA我们通常叫系统全局区,或共享全局区。这块内存有六大块。对我们来讲最重要的是三块:共享池、数据库缓冲区高速缓存、重做日志缓冲区。对应的英文名:shared pool,database buffer cache,redo log buffer,这三块空间是我们着重要讨论和关心的,而这三块最容易出问题的是 shared pool和buffer cache,所以我们更加关注共享池和数据库缓冲区高速缓存。

oracle启动起来以后有两大内存结构,一大块叫SGA,一大块叫PGA。SGA是共享的,PGA是给进程使用的。PGA(Program Global Area程序全局区)是一块包含一个服务进程的数据和控制信息的内存区域。sga有六大块组成:shared pool,java pool,large pool,buffer cache,redo log,stream pool.

oracle数据库启动起来以后还会启动一堆进程。这些进程分两大类,前台进程和后台进程。

如ps命令的结果中:

oracle   16269     1  0 10:59 ?        00:00:00 ora_pmon_jiagulun
oracle   16271     1  0 10:59 ?        00:00:00 ora_psp0_jiagulun
oracle   16273     1  0 10:59 ?        00:00:00 ora_mman_jiagulun
oracle   16275     1  0 10:59 ?        00:00:00 ora_dbw0_jiagulun
oracle   16277     1  0 10:59 ?        00:00:00 ora_lgwr_jiagulun
oracle   16279     1  0 10:59 ?        00:00:00 ora_ckpt_jiagulun
oracle   16281     1  0 10:59 ?        00:00:00 ora_smon_jiagulun
oracle   16283     1  0 10:59 ?        00:00:00 ora_reco_jiagulun
oracle   16285     1  0 10:59 ?        00:00:00 ora_cjq0_jiagulun
oracle   16287     1  0 10:59 ?        00:00:00 ora_mmon_jiagulun
oracle   16289     1  0 10:59 ?        00:00:00 ora_mmnl_jiagulun
oracle   16291     1  0 10:59 ?        00:00:00 ora_d000_jiagulun
oracle   16293     1  0 10:59 ?        00:00:00 ora_s000_jiagulun

这些是后台进程;

oracle   16298 16154  0 10:59 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

是前台进程。

在实际生产中,前台进程的数量要远远大于后台进程的数量。因为对oracle数据库的每一个连接都会产生一个前台进程,一般的对数据库来讲都有上百个连接,至少前台进程上百个,后台进程就十几个,所以就oracle数据库来讲前台进程的数量要远远大于后台进程的数量。

对于SGA来讲,所有的内存空间对所有的进程来讲是共享的,每个进程可以访问SGA所有的内存空间。所以说SGA是所有进程共享的一个内存空间。

实际的工作中,可能有些进程主要使用buffer cache,有些进程主要使用redo log,有一些单个内存池的单独分配。但我们认为,oracle数据库的所有进程共享内存SGA中的六大空间。

对单个进程来讲,它除了能够访问这一大块SGA以外,单个进程它有自己的进程空间,也是一块内存空间,这块空间从PGA来。

oracle新的版本里面,oracle有一个大的PGA空间,oracle每启一个进程就从这个大的PGA空间拿出一块来给这个进程。对这个进程来讲,它会把一些公共的信息写到SGA里面去, 这个进程所独有的私有的信息写到自己的PGA里面去,每个进程都这样从PGA分一块。

四、oracle的进程结构


以上所说前台进程就是说的oracle的服务器进程server process,如我们用ps命令得到的结果中的一个进程:

oracle   22727 22726  0 15:24 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

就是服务器进程,就是前台进程,也叫server process。

下面讲一下oracle数据库中的在工作中的一个连接结构。

运行环境中,数据库服务器上有 数据库、数据库实例,要连接数据库必须连接实例。

运行环境中还有一个应用服务器,如weblogic,websphere,jboss等应用服务器。应用服务器上有用户开发的应用,如基于java的和基于web的应用。

我们的客户端通过ie浏览器连接web服务器,web服务器同时又是一个应用服务器。

web服务器是给浏览器提供网页的服务。而应用服务器可以给访问程序提供更多的数据,它可以拥有和访问数据库等资源并可以对自己得到的数据进行处理并返回给访问它需要它的程序。web服务器实际是应用服务器的一个特例,在网络上它使用的最多。

在web服务器及应用服务器(如weblogic)启动起来以后,会建立一个到oracle数据库实例的一堆连接。

与我们在客户端使用sqlplus / as sysdba命令建立的连接类似,这个命令就是建立了一个到oracle数据库的连接。如:

客户端执行sqlplus / as sysdba

ps结果中对应的进程为

oracle   22727 22726  0 15:24 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOC       AL=YES)(ADDRESS=(PROTOCOL=beq)))

建立了一个连接,有了一个server process;我们再模拟几个这样的连接

在客户端执行sqlplus system/oracle

我们在看ps的结果会又出现一个新的进程

oracle   25733 25732  0 16:18 ?        00:00:00 oraclejiagulun (DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))

我们有两个连接,oracle就起了两个进程。如果是一百个连接就是一百个进程。

weblogic启动起来以后,会主动的发起对oracle数据库实例的n个连接,数量可以在weblogic里面设置,这n个连接叫连接池。然后我们看oracle数据库实例,它针对weblogic的每一个连接,这个实例会建立一个相应的进程和它对应。也就是说weblogic向oracle实例建立了一百个连接,这个时候oracle实例就会针对这一百个连接启动一百个oracle前台进程。也就是一百个server process,也就是一百个服务器进程,这时候,oracle实例里面凭空多了一百个server process。

oracle在实际工作中的结构中包含连接池。

比如我们访问淘宝网站,我们通过ie浏览器连接到淘宝的web服务器上,也就是它的应用服务器上。然后我们要买鞋子,比如要买什么厂商的鞋子,我们在网上选中搜索条件以后点击搜索。对淘宝来讲所有鞋子的信息在数据库里面没有在web服务器上,所有商品包括商品价格、商品的图片 等等所有信息都在数据库里面。

web服务器上面没有信息。

用户连接到应用服务器上以后,它会进行一些操作,它要搜鞋子,鞋子的信息在数据库里面。当这个用户想要搜鞋子信息的时候,应用服务器会做一件事情,会从应用服务器与数据库建立的这n个连接里面,随机的选择其中的一个连接,应用服务器会产生一条SQL语句,一个对鞋子访问的SQL语句,通过这个连接送到oracle;oracle接到这个SQL语句以后,就会对它解析执行,然后获取数据;然后再通过这个连接返给应用服务器。应用服务器接收到所有的鞋子信息以后,就会以web界面的方式,再返给用户。

我们用户无形中访问了oracle数据库,但是用户没有体会到,用户也不需要oracle数据库的知识。

它只需要通过浏览器,连接到web上,根据自己查询的条件,比如它要寻找某个牌子,寻找李宁牌运动鞋,码在37到42之间,类型是篮球运动鞋。

浏览器有了这些条件有了以后,一点搜索,web服务器、应用服务器会自动的从众多的连接中找一个空闲的连接,同时会产生一个带条件的,对鞋子访问的一个SQL语句。SQL语句通过连接发到数据库实例。oracle数据库会接到这个SQL语句,然后对SQL语句解析执行,获取到数据,通过连接再传给应用服务器。应用服务器接到以后,然后再传给我们的消费者。

这就是整个的一个过程。

如果你站在oracle数据库的上方,你会发现:这一百条连接,就像一百条高速公路一样。高速公路另一端是应用服务器,你会看到大量的SQL语句,通过连接送过来。同时你低头再看看,你会发现数据库在处理大量的SQL语句。处理完了以后,将所有的结果,通过相应的连接再送回去。

也就是说,我们的oracle数据库,实际上在大量的接受SQL,在解析SQL,然后执行SQL,然后获取数据。把数据再返给应用服务器。这就是从宏观上去看,oracle日常的工作状态。

用户进程就是在用户客户端产生的进程,我们根本不关心这个。我们只关心oracle数据库里面的最前端的服务器进程,每个服务器进程都对应一个PGA,我们还关心SGA和后台进程。但是要知道用户进程是用户端的进程。

五、oracle整体的体系结构


oracle实例有SGA,SGA中有六个池子,还有五个后台进程。

oracle有三大文件,控制文件、数据文件、重做日志文件。还有归档日志文件。

oracle有六大内存块,共享池、streams池、大型池、java池、数据库缓冲区高速缓存、重做日志缓冲区。

有五大后台进程,检查点(CKPT)、系统监视器(SMON)、进程监视器(PMON)、数据库写进程(DBWn)、日志写进程(LGWR)。以下简单讲五大进程作用。

三类文件里面分别放的信息

控制文件存放的了很多信息,先简单的讲两类信息:

1. 整个数据库的物理结构信息,在控制文件里面记录着。

所谓的物理结构,主要是数据库有多少数据文件,数据文件分别放在什么位置。oracle数据库有多少redolog文件,这些文件分别放在什么位置。

2. 控制文件中还记录着数据库当前运行的一些状态信息。

比如说那个数据文件是在线正常的,哪些数据文件是离线不正常的。

oracle数据库当前正在使用着众多重做日志文件的哪一个,哪一些日志文件有一些问题。

数据库当前运行的一些状态信息,也记录在控制文件中。

控制文件我们目前主要讲两类信息:

1. 数据库的物理结构信息。

2. 数据库的当前运行的一些状态信息。

数据文件里面放的是oracle实在的数据文件数据。oracle数据主要放的是表,表信息就放在数据文件里面,控制文件会很小,但是数据文件会很大。因为oracle所有的数据全部放在数据文件里面。

重做日志文件

日志文件里放的是日志。日志记录的是,oracle对数据库、对数据文件所做的所有的修改,全部会以日志的方式记录在日志文件中。它记录的是数据文件的变化过程。

这是三大类文件。

oracle数据库接收到的是SQL语句,对SQL语句进行处理、执行,执行完以后会获取到数据,再返给用户。