终于到了正文了,好久没有写了,这段时间比较忙,非常惭愧!
提起Oracle的体系结构,离不开下面这张图:
大家知道,在Oracle的服务器环境中,Oracle服务器由两个部分组成,分别是:Oracle的实例和Oracle的database,呵呵,实例和database,这两个词感觉简单,但是又感觉那么的抽象,我们需要先把这两个词搞定.
先说database吧,一直以来我们都知道Database就是数据库的意思,数据库又是什么呢?就是为了某种目的而特定组合到一起的数据集合,这个解释太不好理解了,这么说吧,数据库是存放数据的,那么数据在什么地方存储呢,在硬盘的文件上,呵呵,对了,Database就是实实在在的物理存在,说白了就是组成Oracle的数据库文件,大体上来说,这些文件有:控制文件,数据文件,redoLog日志文件,除了这些之外,还有:归档日志文件,口令文件,初始化参数文件等等。这些文件可以在数据库的数据目录的SID目录下找到,比如你的数据库数据文件位置D:\oracle\oradata,SID是xaccp那么你的数据库文件就可以在D:\oracle\oradata\xaccp下找到(默认是这个,当然当你在建立表空间时可以在其他地方放置数据文件)。因此可以说:Oracle的database是由那么一些硬盘上的文件组成的。
接下来我们说说实例,刚刚接触Oracle时,这个实例是不容易理解的,想想在Java中,我们定义一个对象,然后再实例化该对象,这里的实例化,就是把对象建立在内存中,也就是说申请一块内存来运行程序 ,这里有2个名称我们不陌生,内存以及程序,好了,在Oracle中,实例就是指运行Oracle需要的内存以及运行在Oracle中的后台进程。官方一点的话说:Oracle实例由Oracle的内存结构以及后台进程组成 。
Oracle的内存结构由那些内存组成呢?又都有那些后台进程呢?我们又遇到了一些新的问题,下面我们慢慢的解释。
先说说内存结构吧,内存结构主要由SGA(系统全局区),以及PGA组成,我们主要说说SGA中的主要内容:
可以通过命令看看SGA内容:
SQL> show sga
Total System Global Area 135338868 bytes
Fixed Size 453492 bytes
Variable Size 109051904 bytes
Database Buffers 25165824 bytes
Redo Buffers 667648 bytes
SQL>
共享池:
共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。
共享池由库缓存和数据字典缓存组成。库缓存中放的是什么呢?用户每次对服务器进行sql操作时,Oracle都要对sql语句进行语法坚持以及对sql语句进行编译,Oracle会把编译后的sql语句放在库缓存中,以供将来快速使用,数据字典缓存就是存放Oracle的数据字典(表现形式是数据字典视图)以及动态性能表(以V$开头的系统表,记录数据库的实时信息。)
共享池的大小直接影响数据库的性能。
数据缓冲区:
用于存储从磁盘数据文件中读入的数据,所有用户共享。
服务器进程将读入的数据保存在数据缓冲区中,当后续的请求需要这些数据时可以在内存中找到,不需要再从磁盘读取,提高了读取速度。
数据缓冲区的大小对数据库的读取速度有直接的影响。
日志缓冲区:
日志记录数据库的所有修改信息,日志信息首先产生于日志缓冲区。
当日志缓冲区的日志数据达到一定数量时,由后台进程将日志数据写入日志文件中。
相对来说,日志缓冲区对数据库的性能影响较小。
其他的缓存大家google一下吧。
后台进程是干啥的?其实用户对服务器的操作就是服务器进程对数据库的操作,其实操作的是内存,比如一个insert语句,当数据进入数据缓冲区后,就说明数据库插入成功,至于什么时候与数据文件交互,是后台进程的事情,后台进程还要对系统管理,系统监控,数据同步,5日志读写等等。
可以通过命令来查看已经启动的后台进程:
select * from v$bgprocess where paddr<>'00' --paddr如果不等于00,就说明该进程已经启动
关于具体的后台进程,我们后面在讨论吧,老婆催我休息了,最后总结一下,接下来的介绍都是围绕这个体系结构进行的。