oracle学习day1

一。内部结构

  • 内部结构也即逻辑结构,描述oracle中数据的组成关系
  • oracle的内部结构包含关系如下:一个数据库(Database)对应多个表空间(Tablespace),一个表空间对应多个段(Segment),一个段对应多个区(Extent),一个区对应多个数据块(Data Block),真正的数据就保存在数据块中
  • 当创建一张表(Table)的时候,会为其指定表空间,一旦表成功创建,数据库系统就要为表提供磁盘空间。Oracle数据库会自动为一张表分配一个Segment(段),这个Segment称为Data Segment(数据段)
  • 一张表只能被分配一个数据段。Oracle一共有四种类型的段,分别是Data Segment(数据段),Index Segment(索引段),Rollback Segment(回滚段)和Temp Segment(临时段)。当为表分配的数据段全部写满的时候,数据库管理系统会为这个数据段增加新的区(Extent),也就是说,数据段空间分配完后并不是需要多少空间就为段增加多少空间,也不是直接在区中增加数据块,而是一次性增加一个Extent(这样做避免了频繁的Segment扩容),Extent是空间分配的最小单位,而且Extent在表空间中的各个容器上是均衡分配的。另外,数据块(页)是最小的存储单位,也即最小的I/O单位,所有数据都是按块(页)存储,读出的时候也是直接将整个数据块(页)读入内存中的。

行链接与行迁移

  • 行链接( Row Chaining ):如果我们往数据库中插入( INSERT )一行数据,这行数据很大,以至于一个数据块存不下一整行, Oracle 就会把一行数据分作几段存在几个数据块中,这个过程叫行链接( Row Chaining )。
  • 如果一行数据是普通行,这行数据能够存放在一个数据块中;如果一行数据是链接行,这行数据存放在多个数据块中。行链接又称为行跨页

用户与方案

  • schema(方案)为数据库对象的集合,为了区分各个集合,我们须要给这个集合起个名字,这些名字就是我们在企业管理器的 schema 下看到的很多类似username的节点,这些类似username的节点事实上就是一个schema,schema 里面包括了各种对象如:tables,views,sequences,stored procedures,synonyms,indexes,clusters,and database links。
  • 一个用户对应着一个方案,在创建一个用户时,oracle会为该用户创建一个同名方案
  • 建立一个 user 后就可以得到一个 schema,如:HR 用户建立后便有 HR 方案,接下来建立表、索引等数据库对象时,要指定其属于哪个 schema,也要指定其存放在哪个 tablespace 里。也能够这样理解,schema 是数据库对象的逻辑归属和分类,而 tablespace 是数据库对象的物理和实际存放位置。
  • 在多个用户共用一个表空间时,也正是通过方案来区别各个用户所使用的数据库对象。比方我们在訪问数据库时,訪问 scott 用户下的 emp 表,通过select * from emp; 事实上,这 sql 语句的完整写法为 select * from scott.emp。在数据库中一个对象的完整名称为 schema.object,而不属 user.object。类似假设我们在创建对象时不指定该对象的 schema,在该对象的 schema 为 user 的缺省 schema。这就像一个 user 有一个缺省的 tablespace,可是该 user 还能够使用其它的 tablespace,假设我们在创建对象时不指定 tablespace,则对象存储在缺省 tablespace 中,要想让对象存储在其它 tablespace 中,我们须要在创建对象时指定该对象的 tablespace。
  • Schema 与tablespace之间没有什么联系,同一个schema的对象能够存储在不同的表空间中,同一个表空间中能够存储不同schema的对象。比如一个方案下的某张表的索引存储在xxx_DATA表空间,而它的索引存储在xxx_IDX表空间

用户与权限

  • 刚刚创建的用户是没有任何权限的,因此,需要dba给该用户授权。权限则分为系统权限和对象权限。系统权限指的是登录数据库,创建表、序列等数据库对象的权限。对象权限就是增删改查等操作的权限。

二。外部结构

  • 外部结构也即物理结构,描述oracle中的数据在操作系统层面被如何存放。主要分为三种文件:数据文件、重做日志文件、控制文件
  • oracle中的数据被存放在一个个的数据文件中,后缀为.dbf。一个数据文件只属于一个数据库,也只属于一个表空间,不能分割一个数据文件存放到不同的表空间,但是一个数据库对象的不同数据文件可以存放到不同的表空间,比如一张表的表数据文件存放到表数据专用的空间,而索引文件存放到索引专用的表空间
  • 重做日志文件则记录了对数据的所有更改信息,并提供了一种数据恢复机制,确保在系统崩溃或其他意外出现后重新恢复数据库,oracle会将所有数据库事务存放到重做日志文件中,后缀名为.log。一个是数据库至少需要两个重做日志文件,oracle会循环向文件中写入事务数据,当最后一个文件写满了后回到第一个文件,用新的事务数据覆写。这里也就存在旧数据被覆写的问题,所以oralce中还提供了归档日志文件,对即将被覆写的事务数据进行备份
  • 控制文件则记录了oracle整个的外部结构,包含oracle数据库名与建立时间、数据文件与重做日志文件名与所在位置、日志记录序列号,后缀名为.ctl。在数据库被尝试激活时,数据库会在实例启动后立即读取控制文件内容,获取当前数据库所有的外部结构信息后,数据库才会完全启动。

三。实例

  • Oracle实例是后台进程和内存结构的集合,必须启动实例才能访问数据库中的数据。
  • Oracle实例启动时,将分配一个系统全局区(SGA)并启动一系列Oracle后台进程。
  • Oracle实例有两种类型:单进程实例和多进程实例,单进程Oracle实例使用一个进程执行Oracle的全部操作,在单进程环境下的Oracle实例仅允许一个用户可存取;多进程Oracle实例(又称多用户Oracle)使用多个进程来执行Oracle的不同部分,对于每个连接的用户都有一个进程。

四。内存结构

内存划分
oracle中主要有三种内存划分:SGA、PGA、UGA
专用服务器模式与共享服务器模式

  • 专用服务器模式指一个用户进程与oracle实例建立连接时,实例会创建一个专用的服务器进程来处理这个用户进程的操作请求。
  • 共享服务器模式则可以说是连接池模式,事先创建好固定数量的服务器进程。用户进程与实例建立连接后,会进入到SGA请求队列中,由调度程序控制服务器进程来处理排队的用户请求。

详解

  • oracle在实例启动后,内存中首先划分出一块区域存储各个用户进程共用的区域-SGA。Oracle实例的SGA用来存储数据库信息,并由多个数据库进程共享。当数据库实例启动时,SGA的内存被自动分配。SGA是数据库中占用服务器内存最大的一个区域,也是影响数据库性能的一个重要指标。SGA按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和Java池等。
  • PGA则是一个服务器进程专属一个,一个PGA是一块独占内存区域,Oracle进程以专有的方式用它来存放数据和控制信息。当Oracle进程启动时,PGA也就由Oracle数据库创建了。当用户进程连接到数据库并创建一个对应的会话时,Oracle服务进程会为这个用户专门设置一个PGA区,用来存储这个用户会话的相关内容。当这个用户会话终止时,系统会自动释放这个PGA区所占用的内存。
  • UGA在专属服务器模式下,存放在服务器进程的PGA中,保存当前连接的多次会话信息。在共享服务器模式下,则存放在SGA的大池中,如果没有大池或者大池空间不够,则分配到SGA的共享池中。

SGA的组成
SGA按其作用不同,可分为共享池、数据缓冲区、重做日志缓冲区、大池和Java池等。

  • 共享池是对SQL、PL/SQL程序进行语法分析、编译、执行时用到的内存区域。共享池由库缓存和数据字典缓存组成。库缓存含有最近执行的SQL、PL/SQL语句的分析码和执行计划。数据字典缓存含有从数据字典中得到的表、索引、列定义、权限信息和其他一些数据库对象的定义,如果Oracle缓存了这些信息,那么无疑是缩短了查询的响应时间。
  • 数据缓冲区用于存储从磁盘数据文件中读入的数据,供所有用户共享。修改数据时,首先要从数据文件中取出数据,存储于数据缓冲区中。修改的数据,插入的数据都被存储于数据缓冲区中,修改完成和其他条件满足时,数据才被写入数据文件中。Oracle服务器进程在处理一个查询时,首先查找内存中是否存在所需的数据块。如果在数据缓冲区中没有找到需要的块,服务器进程就从数据文件中读取此块,并保存在缓冲区中。当后续的请求需要读取这些块时,便可以在内存中找到,因此这些请求不需要从磁盘中读取,从而提高了读取速度。数据缓冲区的大小对数据库的读取速度有直接的影响。
  • 当用户执行了如INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等操作时,数据发生了变化,这些变化了的数据在写入数据缓存之前先要写入重做日志缓冲区,同时变化之前的数据也放入重做日志缓存,这样在数据恢复时Oracle就知道哪些资源需要提交,哪些资源需要撤回。相对于数据缓冲区,日志缓冲区对数据库的性能影响较小。
  • 大池由初始化参数LARGE_POOL_SIZE确定大小,可以使用ALTER SYSTEM语句来动态改变大池的大小,是可选项,DBA可以根据实际业务需要来决定是否在SGA区中创建大池。如果没有创建大池,则需要大量内存空间的操作将占用共享池的内存, 将对SHARED POOL造成一定的性能影响,而LARGE POOL是起着这种功能隔离作用的一块区域。
  • 在SGA中,Java池也是一个可选的缓冲区,但是在安装Java或者使用Java程序时必须设置Java池,用于编译Java语言编写的指令。

PGA
主要包含排序区、会话区、堆栈区和游标区四个部分的内容,他们各司其职,完成用户进程与数据库之间的会话。

五。进程结构

  • Oracle中有几种不同类型的进程:用户进程、服务器进程和后台进程。
  • 用户进程:在数据库用户请求连接Oracle服务器时启动
  • 服务器进程:在用户建立会话并连接Oracle实例时启动
  • 后台进程:在Oracle实例启动时启动
  • 用户进程是一个需要与Oracle服务器进程交互的程序。当数据库用户运行一个应用程序准备向数据库服务器发送请求时,即创建了用户进程。例如:用户启动数据库工具Sqlplus时,系统将自动建立一个用户进程。
  • 服务器进程用于处理连接到实例的用户进程的请求。当用户建立与数据库的连接时,即产生服务器进程。服务器进程和用户进程通信并为所连接的用户请求服务。服务器进程直接与Oracle数据库交互,实现调用和返回结果的目的。服务器进程及可以处理一个用户进程的请求,也可以处理多个用户进程的请求。
  • 在Oracle数据库中,为了使系统性能更好地协调多个用户,实例系统中使用的一些附加进程,称为后台进程。这些后台进程存在于操作系统中,在实例启动时自动启动。其中有五个进程是必须要启动的,否则数据库实例无法启动。这五个重要且必需的后台进程为进程监控(Process Monitor,PMON)进程、系统监控(System Monitor,SMON)进程、数据写入(Database Writer,DBWR)进程、日志写入(Log Writer,LGWR)进程、检查点(Check Point,CKPT)进程。

PMON进程
PMON进程在用户连接意外中断后执行资源清理工作,包括以下任务:

  • 释放所有当前挂起的锁
  • 回滚用户当前事务处理
  • 释放用户当前使用的资源;
  • 监控服务器进程和其他后台进程,出现故障时重启它们

SMON进程
SMON进程执行以下任务:

  • 在实例启动时执行实例恢复。实例恢复包括三个步骤:
    ①前滚以恢复未写入的数据文件但已记入联机日志文件的数据;

②打开数据库,以便用户能登录并访问数据;

③回滚为提交的事务处理;

  • 整理数据文件的自由空间
  • 释放不再使用的临时段

DBWR进程

  • 管理数据缓冲区,以便能找到空闲的缓冲区读入数据文件的数据
  • 将所有修改后的缓冲区数据写入数据文件
  • 使用LRU算法经最近使用过的块保留在内存中
  • 通过延迟写入优化磁盘I/O读写

LGWR进程
LGWR进程负责将重做日志缓冲区中的日志数据写入日志文件组。数据库在运行时,如果对数据进行修改,则产生日志信息,日志信息首先产生于重做日志缓冲区中。此缓冲器按照“先进先出”的原则进行操作,当日志信息满足一定条件是,由LGWR进程将日志数据写入日志文件。系统通常有多个日志文件,日志写入进程以循环的方式将数据写入文件。
CKPT进程
CKPT进程是确保数据缓冲区中所有修改过的数据块都写入数据文件的机制。当检查点完成后,CKPT进程负责更新数据文件头和控制文件、保存检查点信息,以保证数据库日志文件和数据文件同步。在数据库恢复时只需要找到CKPT保存的最后一次检查点,就可以根据它确定日志文件中恢复数据的开始位置,然后重新执行其之后的日志记录即可。
ARCn进程
ARCn进程即归档日志进程,是一个可选进程,只有在打开日志归档时才有该进程。该进程的主要作用是发生日志切换时将写满的联机日志文件复制到归档目录。

1.当一条查询sql执行时,会访问SGA区的共享池,该SQL会通过HASH值查找是否有相同的HASH值,如果没有,首先查询自己的语法是否正确(比如from是否写成form),语义是否正确(比如id字段根本就不存在)、是否有权限,这些都没有问题情况下,唯一的HASH值就被存储下来。
2.然后解析sql语句生成执行计划,并将执行计划与SQL语句的hash值对应在一起
3.然后到数据缓冲区找数据,找到了就返回,没找到就到数据文件区加载数据到缓冲区再返回
4.当一个事务提交后,CKPT进程会先触发LGWR进程先将本次事务产生的日志从日志缓冲区写到磁盘的重做日志文件中,保证可以恢复数据,然后再触发DBWR进程将数据缓冲区中的数据写到磁盘的数据文件中。不过如果LBWR写入日志失败,DBWR也不会写入数据

1.想更新object_id=29的记录首先就需要查找object_id=29的记录,检查object_id=29是否在数据缓冲区,不存在则从磁盘读取到数据缓冲区。
2.在回滚事务表上分配事务槽,从而在回滚表空间分配到空间。该动作需要记录日志写入日志缓冲区。
3.在数据缓冲区创建object_id=29前镜像,前镜像的数据也会写磁盘的数据文件,由缓冲区写入磁盘的规律由CKPT决定,这些动作都会写记录日志,并将其写入日志缓存区LGWR将日志缓存区的数据写入磁盘形成redo。
4.前端步骤没问题,才允许将object_id=29修改为object_id=92,这个显然也要记录进日志缓存区的。
5.此时如果用户执行了提交,日志缓冲区立即要记录这个提交信息,然后就把回滚段事务标记为非激活INACTIVE状态,表示允许重写。
6.如果是执行了回滚,Oracle需要从回滚段中将前镜像的object_id=29读出来,修改数据缓存区,完成回滚。这个过程也产生日志,要写进数据缓存区。

六。杂谈

物理读
从磁盘读取数据块到内存的操作叫物理读,当SGA里的高速缓存(Cache Buffer)里面不存在这些数据块时,就会产生物理读,另外。像全表扫描、磁盘排序等操作也可能产生物理读,原因也是因为ORACLE数据库需要访问的数据块较多,而有些数据块不在内存当中,需要从磁盘读取。
简述:sql语句需要操作的数据块不在数据缓冲区中
逻辑读

  • 概念1:逻辑读指ORACLE从内存读到的数据块数量。一般来说, logical reads = db block gets + consistent gets
  • 概念2:逻辑读指的就是从Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为当前模式读(Current Read)和一致性读(Consistent Read)。
  • 当前模式读:又叫current mode , 不管这个块上的数据是否可能存在 before image ,也就是说不管是否存在回滚数据,只看见当前最新块的数据,即使别人正在更新,也看不见别人更新状态的数据,比如dml的时候就不需要看见别人更改前的数据,而是看见正在更改的,当然同时,若操作相同数据则被lock住。也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode。
  • 当前模式读也可以说有些时候就是由一致性读来保证的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值