oracle体系结构:带着四个问题来学习这门课
1、告诉你数据后台都有什么
2、数据库中有哪些主键
3、每个主键都有哪些作用
4、将来怎么管理这些主键
======================================================
首先,数据库在操作系统下有一个软件,这个软件我们管理不了,软件引擎是花钱买的, Oracle数据库不是开源的,
所以核心代码都是封装好的,我们拿过来用就是了,没有机会对它更改。
我们能管理的是由该软件创建出来的数据库。
那么我们在做添删改查的时候到底都由哪些主键参与工作:
一、:外围主键
1、当你从终端启动的,一个能写sql语句的,与oracle服务器进行交互的小程序,我们叫它用户进程,
即sqlplus、sqldevloper,无论哪一个都属于user process。也就是接口程序的意思。通常在client端。
2、一个用户进程怎么去访问磁盘上的海量数据呢?
一个用户进程如果想工作,所发出的命令都要传给服务端的一个进程,叫做server process,
即必须用服务进程来解析发出的这条语句后,才能工作。
也就是说服务进程是帮我们处理sql命令、解析sql,帮助我们做提交和回退,帮助我们到硬盘中读取所需要的数据块。
3、那么服务进程是如何从硬盘中找到我们所需要的数据呢?
我们最终的数据是放在二进制文件中,这是物理库在磁盘中存在的我们能看的见的文件,我们叫它database
但是硬盘中的数据我们常常无法直接对他操作,需要把它先加载到内存中,如果直接到硬盘中读数据,硬盘慢cpu快,
就会出现cpu一直空闲,硬盘在不断工作,效率太低。
为了缓冲IO瓶颈,Oracle在操作数据库的时候把经常访问的数据都加在到内存当中。Oracle为了便于我们学习,
把自己这套软件在内存当中所加载的所有模块统称为实例instance。
Oracle给实例下的定义是:实例是访问数据库的手段,必须通过实例才能访问物理库。
===========================================================================
实例由两部分部分组成
即由一块内存加一组后台进程组成的实例这个主键。实例这个主键将来能操作物理库。
Oracle有150多个后台进程,但是默认启动也就20多个,这么多后台进程中只有五个叫核心后台进程,
非主要核心进程即使崩溃了,Oracle也有能力去重新启动。
介绍实例:
由服务进程来直接和实例交互
实例的这块内存,Oracle称为sga(系统全局区或共享全局区)
sga这块内存主键,Oracle把它隔离成若干个内存池。虽然叫sga,但是里边由很多小的模块组成。
具体如下:
1、共享池 share pool
共享池中Oracle又把它分为两个小模块
1)、liberay cache库高速缓存
2)、data dictionary cache 数据字典缓冲区高速缓存
2、database buffer cache 数据库缓冲区高速缓存
3、large pool大池
4、java pool java池
5、streams pool流池
6、redo log buffer重做日志缓冲区
user process写sql语句------>server process处理sql语句----->对数据库的操作通过实例
|
|
(六个模块)内存<----------->进程
--------------------------------------------------------------------------------------------------------------
各个内存模块的作用:
share poor共享池
共享池的作用实际就是liberay cache和data dictionary cache的作用。
liberay cache库高速缓存
里边存的sql语句和PL/SQL块,你所运行的SQL语句,你所调用的PL/SQL块都会缓存到这块内存中,目的是减少SQL语句的重解析。
目的:oracle数据库在工作时如果每时每刻运行的SQL都是不相同的,我们就无法优化了。所以系统下将来所接受的SQL语句大多情况下是相同或相似的。
oracle为了加速SQL语句的运行,就会把运行过的SQL语句在内存中缓存一份,以便于以后这条语句再次执行的时候起到加速效果。1、硬解析:一次硬解析的过程如下
1)、语法分析:如果是一条新SQL,数据库会先对其做语法分析,是否满足oracle的SQL语法规则。
2)、语意分析:校验SQL语句中所涉及的对象、用户、列名等属性信息的存在否及有效性等。数据库缓冲区高速缓存database buffer cache
作用:减少IO瓶颈即减少与硬盘的交互。但是减少了物理IO次数,以后再读取该数据就不用再与硬盘交互了。
===========================================================================------------------------------------------------------------------------------------------------------------------------------
java poor
如果前端有一些java代码的编译需求需要加载到内存中去做,就需要开这个池------------------------------------------------------------------------------------------------------------------------------
流池streams pool
到oracle11G,流复制技术已经停止开发使用。------------------------------------------------------------------------------------------------------------------------
redo log buffer重做日志缓冲区
记录的是所有数据块的变化即redo条目。数据块的修改将来是要写盘的,但是不能一有日志就写盘或者说一有变化就写盘,这样IO太频繁。作用: 1、监控其它的非主要核心进程,如果非主要核心进程意外终止,由PMON负责重启。
2、清理由意外终止的连接在服务器端遗留的垃圾资源。例如:有的时候一些会话可能在服务器上加了一些锁,做了一些数据修改,把一些数据在内存中给冻结了。即insert、update、delete,还没有提交,也没有回退,这时候突然网络断了,或者突然死机了,这些都属于user process意外终止,那你刚才做了修改,肯定破坏了数据,而你有没有机会提交和回退,这时候就由PMON把这些数据做rollback。把遗留的资源释放。
3、在网络环境中,将实例的信息注册到监听程序,注册周期60秒即60秒做一次。4、在集群环境,以60秒为单位,收集当前节点的CPU压力。将来会以cpu压力信息来做负载均衡。
二、DBWN---数据写进程,把脏块写到数据文件。这个N是取值范围(0-9、A-J)
作用:把内存(database buffer cache)中的脏数据回写到硬盘,即做数据同步。什么时候会触发该进程去写盘:(9种情况触发数据写)
1、检查点checkpoint,如果产生检查点,后台就会触发日志写。2、脏数据达到预值,default值是10%,会触发。
3、扫描整个database buffer cache没有空闲空间可用。4、timeout,default值是3秒,老版本有,oracle10之后去掉了。
5、集群环境下的ping请求---RAC request触发数据写。集群环境如果想协同工作,多个实例的数据要一致,即一号机修改二号 要可见,二号机修改一号也得可见。实现原理:oracle在后台发出一个ping事件,触发多实例的数据同步,即把数据修改都写到磁盘阵列,然后在数据库里边重新分发,这样来实现双节点的数据同步。
6、表级别的drop、truncate----drop table、truncate table。7、tablespace readonly,即表空间只读触发。
8、tablespace offline,即表空间离线触发。9、热备份命令触发,即begin backup。
三、SMON---系统监控程序1、前滚
2、回滚3、释放资源
当系统掉电,实例意外终止。因为数据修改是在实例当中去做的,而数据修改的写盘动作不是时时刻刻在做的,因此可能存在已经提交还没写盘的数据就需要前滚。也可能出现未提交但是数据修改已经写盘,那么重启时就需要还原,既然没提交就会有老镜像,那么由SMON把老镜像拿回来做回滚恢复,最后把所有的锁资源释放。这就是实例恢复的三个动作。
四、CKPT---检查点进程1、调度数据写
2、把已经完成的检查点写入到数据文件头3、将完成的检查点写入到控制文件
五、LGWR---日志写进程