oracle学习一

Posted ylpython

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了oracle学习一相关的知识,希望对你有一定的参考价值。

一、什么是Oracle数据库?

众所周知,Oracle DataBase是一款关系型数据库管理系统(不了解何谓关系型数据库的童鞋自行google,baidu),同类的产品还有mysql,sqlServer等,很多时候,我们会把那个承载我们核心数据的系统笼统地成为数据库服务器,但从严格意义上来讲Oracle DataBase是由两个部分组成:  

技术分享图片

  实例:实例是数据库启动时初始化的一组进程和内存结构

  数据库:数据库则指的是用户存储数据的一些物理文件

       正因为如此我们一般才会说 关闭和启动实例,加载卸载数据库,就是这个道理。

  从实例和数据库的概念上来看,我们能知道,实例暂时的,它不过是一组逻辑划分的内存结构和进程结构,它会随着数据库的关闭而消失,而数据库它其实就是一堆物理文件(控制文件,数据文件,日志文件等等),它是永久存在的(除非磁盘损坏)。数据库和实例通常是一对一的,这种结构我们成为单实例体系结构;当然还有一些复杂的分布式的结构,一个数据库可以对多个实例,像Oracle的RAC(有兴趣的童鞋可以了解下)。

二、交互流程

下面是从网上找的一张图,描述了单实例体系结构大致的交互流程    

 技术分享图片

 

1.用户和用户进程交互

用户进程可以是一般的客户端软件,像Oracle的sqlplus,sql developer,或者是一些驱动程序等等都属于用户进程。

2.用户进程和服务器进程交互

  服务器进程有时会称为前台进程,当然是相对于后台进程(后面会提到的数据库写入器,日志写入器等)来说的,服务器进程的主要作用就是处理连接到当前实例的用户进程的请求,对客户端发来的sql进行执行并返回执行结果。在专有服务器结构中,用户进程和服务器进程是一对一的,也就是说,当监听程序监听到客户端来了一个请求,会为其分配一个对应的服务器进程。还有一种结构为共享服务器,这种结构就不是一个用户进程对应一个服务器进程了,会通过调度程序进行协调处理,关于共享服务器连接,本文就不在赘述了。

3.服务器进程和实例进程交互

4.实例和数据库进程交互

上面描述了一些我们在进行数据库连接操作的时候,大致的交互流程是什么样的。下面,我们就来看看Oracle 的实例内存结构

三、实例内存结构和进程结构

oracle实例内存结构由两部分组成SGA(系统全局区)和PGA(用户全局区)组成,SGA是一块共享的内存区域,也是最大的一块内存区域;PGA则是用户会话专有的内存区域,每个会话在服务器端都有一块专有的内存区域就是PGA。本文主要对SGA进行分析描述。SGA组成如下

 

  技术分享图片

数据库缓冲区缓存&数据库写入器

缓冲区缓存 是Oracle用来执行sql 的工作区域,在更新数据时,用户会话不会直接去更新磁盘上的数据,想想,如果允许这么做,那么频繁的磁盘IO对于系统性能的影响是毁灭性的。所以,实际的处理流程是这样的:

1
select ename,salary from emp where name=‘东方不败‘;

  

  我们来看这么一条简单的查询语句,oracle是如何处理的。首先,当用户提交了该条sql语句,由对应的用户进程(比如我们常用的sql developer)将其发送给服务器,监听程序监听到该条请求,会为其建立一个对应的服务器进程,然后服务器进程会先扫描缓冲区中有没有包含关键行("东方不败")的数据块,如果有,这就算一次缓存命中了,然后相关行会传输到PGA进行进一步处理,最终经过格式化后展示给用户;如果没有命中,那么服务器进程会首先将对应行复制到缓冲区内,然后再返回给客户端。

       DML(insert,update,delete)操作同理,加入用户发送一条update语句,服务进程依然先去扫描缓冲区,如果缓存命中,则直接更新,数据变脏;如果没有命中,由服务器进程将对应数据块先从磁盘上复制到缓冲区内,再进行更新操作。

脏缓冲区

  如果缓冲区存储的块和磁盘上的块不一致,该缓冲区就叫做“脏缓冲区”,脏缓冲区最终会由数据库写入器(DBWn)写入到磁盘中去。

数据库写入器(DBWn)

  数据库写入器是Oracle的一个后台进程,所谓后台进程是相对于前台进程(服务器进程)来讲的。DBWn的"n"意味着一个实例是可以有多个数据库写入器的。

  作用:简而言之,DBWn的作用就是将变脏了的缓冲区从数据库缓冲区缓存中写入到磁盘中的数据文件中去。

  数据库缓冲区缓存这块内存区域和数据库写入器这块是比较重要的概念,别的数据库产品像mySql也都有对应的实现,只不过叫法不一样罢了。了解这块的时候,要时刻意识到会话是不会直接更新磁盘数据的,会话的更新,插入,删除包括查询等都是先作用到缓冲区上,随后,DBWn会将其中的脏缓冲区转储到磁盘上去。 

  DBWn什么时候写入?

DBWn是个比较懒的进程,它会尽可能少的进行写入,在以下四种情况它会执行写入:

a.没有任何可用缓冲区(不得不写啊)

b.脏缓冲区过多

c.3秒超时(最晚3秒会执行一次写入)

d.遇到检查点,即checkPoint(检查点),检查点是个Oracle事件,遇到检查点,DBWn会执行写入。比如实例有序关闭的时候会有检查点,DBWn会将所有脏缓冲区写入到磁盘上去的,这很容易理解,要保持数据文件的一致性。

    注意:

  从上述DBWn的几个写入时机,我们能意识到,DBWn的写入不是直接依赖于会话的更新操作的。不是一有脏缓冲区,它就执行写入。而且,DBWn执行写入跟commit操作也没有任何关系,不要以为commit操作的影响结果会实时流入到磁盘中去。

  DBWn采用极懒算法进行写入,原因我们应该要清楚:频繁的磁盘IO对系统的压力很大,如果DBWn很积极地去写入磁盘,那对系统性能的影响就太大了,换个角度想,如果DBWn很勤快的写磁盘,那么数据库缓冲区存在的意义也就不大了。

当然,讲到这儿,我们可能会意识到一个问题,DBWn如此懒地进行数据转储,如果在某一时刻,数据库缓冲区缓存内存在着大量的脏缓冲区(生产环境中,这是常态),也就是有大量的未commit和已commit的数据还在内存中,没有持久化到磁盘中,然后突然系统断电了,这种情况下,数据是不是就丢掉了?数据当然不会丢失,这就引出了重做日志(redo log)的概念,接下来,我们就来谈谈对应重做日志的内存结构和后台进程。

日志缓冲区&日志写入器

       当我们执行一些DML操作(insert,update,delete),数据块发生改变了,产生的变更向量则会写入到重做日志文件中去。有了这些记录,当系统由于断电等因素突然宕掉,数据库缓冲区缓存内的大量脏数据还没来得及写入到数据文件中去,在重新启动的时候,会有一个实例恢复的过程,在此过程中就应用了重做日志记录来使数据保持一致;或者数据库遭遇了物理损坏,比如磁盘损坏了,此时可以通过Oracle的备份恢复工具(如RMAN)进行数据恢复,原理就是 提取备份集-->应用重做日志文件中的变更记录。

  

日志缓冲区

日志缓冲区是一块比较小的内存区域,它是用来短期存储将写入到磁盘中的重做日志文件中的变更向量的。

日志缓冲区存在的意义依然是为了减少磁盘IO,减少用户的等待时间,试想下,如果每一次用户DML操作都要进行等待重做记录被写入到磁盘中去,体验会有多差劲。

日志写入器(LGWR)

顾名思义,日志写入器(LGWR)就是把日志缓冲区内的内容写入到磁盘的重做日志文件中去,相比数据库写入器(DBWn),日志写入器就勤快多了。

以下三种情况LGWR会执行写入:

a.commit时写入

  前面提过,DBWn的写入和commit没有任何关系,如果commit时数据库没有任何记录,那数据就真的丢失了,Oracle 的重做日志就是为了保证数据安全而存在的,commit时,会话会先挂起,等待LGWR将这些记录写入到磁盘上的重做日志文件中,才会通知用户提交完成。所以,LGWR在commit时执行写入,是为了确保事务永不丢失。

b.日志缓冲区的占用率达到1/3。

c.DBWn要写入脏缓冲区前

这个写入是为了数据回滚考虑的。DBWn完全可能写入还没提交的事务(参照上面提到的写入时机),那如何保证事务回滚呢?

  首先要知道,DBWn除了写入实际的数据,还会写入撤销数据(不了解的同学可参考我的另一篇博文中对于撤销段的描述 Oracle闪回技术详解。)简单说,事务回滚需要撤销数据,在写入撤销数据前,会先写入针对撤销数据的日志记录(有点绕),若用户要进行事务回滚,就可以应用这些日志记录来构造撤销数据,然后进行回滚。

我们对这两块最重要的内存区域和对应的后台进程做个总结:

  数据库缓冲区缓存和日志缓冲区都是为了提高性能,避免频繁IO而存在的。日志缓冲区相比数据库缓冲区缓存要小的多,并且不能进行自动管理,对于日志缓冲区的修改需要重启实例,数据库缓冲区缓存可进行自动管理。作用在数据库缓冲区缓存上的DBWn进程,为了避免频繁的磁盘IO导致系统性能下降,会尽可能少地执行写入,且DBWn的写入和commit操作没有任何关系;

  而作用在日志缓冲区上的LGWR进程,则会非常积极地进行写入,一般情况下,它几乎是实时地将重做日志记录转储到磁盘中去。LGWR是Oracle体系结构中最大的瓶颈之一。DML的速度不可能超过LGWR将变更向量写入磁盘的速度。

 

以上是关于oracle学习一的主要内容,如果未能解决你的问题,请参考以下文章

oracle学习笔记2

Java 基础学习总结(200)—— GraalVM 为什么能被称为下一代虚拟机

Java 基础学习总结(200)—— GraalVM 为什么能被称为下一代虚拟机

一步一图一代码,一定要让你真正彻底明白红黑树

Oracle在中国三十年养废了一代工程师

sql Oracle代码片段