Oracle体系结构:
可扩充性:Oracle系统有能力承担增长的工作负荷,能相应的扩充系统资源。
可靠性:无论是出现系统崩溃,断电还是系统故障,依然可以对Oracle进行配置。
以保证检索用户数据事务处理的时候,不受到影响。
可管理性:数据库管理员可以微调Oracle使用内存的方式,以及Oracle向磁盘写入数据
的频率。可以调整数据库为链接到数据库的用户分配操作系统进程的方式。
Oracle数据库体系结构由数据库实例和物理存储结构组成:
数据库:实例。
实例:SGA 和后台进程。
SGA:数据高速缓冲区,日志缓冲区,共享池,大型池,Java池,流池,其它。
后台进程:SMON,PMON,DBWR,CKPT,LGWR,ARCH,其它。
ARCH:归档文件。
LGWR:重做日志文件。
CKPT:重做日志文件,控制文件,数据文件
DBWR:数据文件。
在Oracle数据库中的存储结构包括物理结构和逻辑存储结构:
1.物理存储结构主要用于描述Oracle数据库外部数据的存储,即在操作系统中如何组织和管理数据,
与具体的操作系统有关。
2.逻辑存储结构主要描述Oracle数据库内部数据的组织和管理方式,与操作系统无关。
3.物理存储结构是逻辑存储结构在物理上的、可见的、可操作的、具体的体现形式。
逻辑结构:表空间,段,区,块。
物理结构:控制文件,数据文件,重做日志文件,OS块。
Oracle物理存储结构:
数据库:数据文件,控制文件,重做日志文件,归档文件,初始化参数文件,跟踪文件,口令文件,警告文件,
备份文件,其它文件。
数据文件:用于存储数据库的所有数据。
控制文件:用于记录和描述数据库的物理存储结构信息。
重做日志文件:用于记录外部程序(用户)对数据库的改变操作。
归档文件:用于保存已经写满的重做日志文件。
初始化参数文件:用于设置数据库启动时的参数参数初始值。
跟踪文件:用于记录用户进程、数据库后台进程等的运行情况。
口令文件:用于保存具有SYSDBA,SYSOPER权限的,用户名和SYS用户口令。
警告文件:用于记录书库库的重要活动以及发生的错误。
备份文件:用于存放数据备份所产生的文件。
数据文件的内容:
1.用于保存数据库中所有的数据的文件。
2.临时数据文件是一种特殊的数据文件,其存储内容是临时性的,在一定条件下自动释放。
3.Oracle数据库中的每个数据文件都具有两个文件号,称为绝对文件号和相对文件号,用于唯一地确定
一个数据文件。其中,绝对文件号用于在整个数据库范围内唯一标识一个数据文件,相对文件号用于在
表空间方位内唯一标识一个数据文件。
数据文件与表空间的关系:
1.一个表空间可以包含几个数据文件。
2.一个数据文件只能从属于一个表空间。
数据文件的管理策略:
1.由于对数据库的操作最总转换为对数据文件的操作,因此在数据库运行过程中对数据文件进行频繁的
读写操作。为了提高I/O效率,应该合理的分配数据文件的存储位置。
2.把不同存储内容的数据文件放置在不同的硬盘上,可以并行访问数据,提高系统读写的效率。
3.初始化参数文件、控制文件、重做日志文件最好不要与数据文件存放在同一个磁盘上,以免数据库发生
介质故障,无法恢复数据库。
创建数据库文件:
1.数据文件依附于表空间而存在,创建数据文件就是向表空间添加文件。
2.在创建数据文件时应该根据文件数据量的大小确定文件的大小以及文件的增长方式。
向数据库的USER表空间添加一个大小为10MB的数据文件。
ALTER TABLESPACE USERS ADD DATAFILE
为数据库的USERS表空间添加一个自动增长的数据文件:
1.ALTER TABLESPACE USERS ADD DATAFILE
Oracle数据库八个主要的后台进程:
PMON,SMON,LCKn,RECO与共享池,数据缓冲区,日志缓冲区有关。
数据库缓冲区关联DBWR,DBWR->CKPT.
日Hi缓冲区->LGWR->日志文件->ARCH->存储介质。
PMON含义为Processes Monitor,是进程监视器。在执行某些跟新语句,未提交时进程崩溃了,这个时候
PMON会自动的回滚该操作,无需人工去执行ROLLBACK命令。除此之外还可以干预后台进程,比如RECO
异常失败了,此时PMON会重启RECO进程,如果遇到LGWR进程失败这样的严重问题,PMON会做出终止
实例这个激烈的动作,用于防止数据错乱。
SMON的含义为System Moniter,理解为系统监视器,与PMON不同的是,SMON关注的是系统的操作而非
单个进程,重点在于intance recovery,除此之外还有清理临时表空间、清理回滚段表空间、合并空闲空间,等等。
LCKn仅使用与RAC数据库,最多可有10个进程(LCK0,LCK1,...),用于实例间的封锁。
RECO用于分布式数据库的恢复,全称是Distributed Database Recovery,使用与两阶段提交的应用场景。
比如我们面临多个数据库A,B,C,某个应用跨越三个数据库,在发起的过程中,需要A,B,C库都提交成功,只要
有一次失败,就必须全部回滚。
CKTP进程由FAST_START_MTTR_TARGET参数控制,用于触发DBWR从数据缓冲区中写出数据到磁盘。
CKPT执行越频繁,DBWR写出越频繁,DBWR写出越频繁越不能显示批量特性,性能就越低,但是数据库异常恢复的
时候就会越迅速。
DBWR是Oracle最核心的进程之一,负责把数据缓存区写到磁盘里,该进程和CKPT相扑想成,因为是
CKPT促成DBWR去写的。不过DBWR也和LGWR密切相关,因为DBWR想将数据缓存区数据写到磁盘的时候,
必须通知LGWR先完成日志缓冲区写到磁盘的动作后,方可开工。
LGWR就是把日志缓存区的数据从内存写到磁盘的REDO文件里,完成数据库对象创建、跟新数据等操作
过程的记录。这个REDO的记录很关键,可以用来做数据库的异常恢复,只要保护好了这些REDO文件和后续
对应的归档文件,从理论上来说,即使数据文件被删除光了,还是可以让数据库根据这些日志记录,把所有的
在数据库上中曾经发生的事情全部重新做一遍,从而保证了数据库的安全。
LGWR必须记录下所有从数据缓存区写进书库文件的动作,工作任务相当繁重。要顺序记录,因此LGWR
只能采取单进程。LGWR:1.每隔3秒,LGWR运行一次。2.任何COMMIT触发LGWR运行一次。3.DBWR要把
数据从数据缓存写到磁盘,触发LGWR运行一次。4.日志缓冲区满三分之一或记录满1MB,触发LGWR运行一次。
5.联机日志文件切换也将触发LGWR。
ARCH作用是在LGWR写日志到需要覆盖重写的时候,触发ARCH进程去转移日志文件,复制出去形成归档
日志文件,以免日志丢失。
回滚过程:例子执行update table set obj_id = 111 where obj_id = 11后,如果执行一个ROLLBACK,数据
库依然不会将obj_id = 11改为111。过程如下:
1.更新obj_id=11,先查到这条记录,查询obj_id = 11 是否在数据缓冲区里,不存在则从磁盘中读取到数据缓冲
区,和普通的查询语句类似。
2.如果不是查询语句而是更新语句,于是要做一件和查询语句很不同的事,在回滚表空间的相应回滚段事务上
分配事务槽,从而在回滚表空间分配到空间。该动作要需要记录日志写进日志缓存区。
3.在数据缓存区中创建obj_id=11的前镜像,前镜像数据也会写进磁盘的数据文件里(回滚表空间的数据文件),
从缓存区写进磁盘,由CKPT决定,当然这些动作都是会记录日志,并将其写进日志缓存区。
4.以上步骤做好了,才允许将obj_id=11修改为obj_id=111,这个显然也是要记录进日志缓存区的。
5.此时如果用户提交了,日志缓存区立即要记录这个提交信息,然后就把回滚事务记为非激活状态INCTIVE状态,
表示允许重写。
6.如果是执行了回滚,Oracle需要从回滚段中将前镜像obj_id=11的数据读取出来,修改数据缓存区,完成回滚。这个
过程依然要产生日志,要写数据进日志缓存区。
Oracle查询一致读的原理:就是查询的记录由查询的这一时间点决定,后面即便变化了,也要根据回滚段保存的前镜像记录,
取到那个时间点的数据。(1)了解数据库的SCN,SCN全称是System Change Number,这是一个只会增加不会减少的递增
数字,存在于Oracle的最小单位块里,当某块改变是SCN就会递增。(2)数据库的回滚记录事务槽(回滚的时候,事务槽
是用来分配回滚空间的),如果你更新了某块,事务就被写进事务槽里。如果未提交或者回滚,该块就存在活动事务,
数据库读到此块可以识别到这种情况的存在。