1.1 Oracle结构概述
Oracle体系包括:
1)实例instance( SGA系统全局区 + N多后台进程)
2)数据库(Datafile, control file, redo log file)
3)用户进程(每个用户连接Oracle数据库,都会启动一个用户进程)
4)系统进程
5)其他文件(参数文件parameter file, 密码文件passwordfile, 归档日志文件Archived log file等)
SGA本质,就是一大块内存,根据作用细分为多个Pool和Cache。被Instance中的多个后台进程共享使用;
用户对database的数据写入和其他操作,都是通过Instance完成
参数文件,会保存oracle数据库的一些参数:SGA大小,数据库实例名,支持的最大用户进程数等
密码文件,保存Orace数据库用户的密码信息
1.2 实例Instance
Instance在启动Oracle数据库的时候就会启动,本质上就是 后台进程 +共享内存区(SGA)
后台进程中的 SMON,PMON,CKPT,DBWR、LGWR必须启动,而ARCH(归档进程)以及其他后台进程可以根据实际情况停止
数据库和实例间的对应关系:1个实例,只能对应1个数据库;1个数据库,可以对应多个实例(oracle RAC,主备)
1.3 数据库Database(的物理文件构成)
Oracle数据库,也就是我们常说的Database,本质上是由3类物理文件组成
*数据文件data file: 数据的最终存储位置
*控制文件controlfile: 含有维护数据库和验证数据库完整性的信息,二进制文件(10字符串)
*重做日志 redofile: 记录了数据库发生的变更,用于数据库恢复(可以理解成对数据库的操作记录),oracle会先将数据库变更记录在redo log buffer cache, 再满足一定条件后(checkpoint产生),将cache中的变更记录写入redofile
在启动并打开数据库的过程中,实例会先根据参数文件,找到该数据库的控制文件,然后通过控制文件打开数据文件
意味着:如果数据库的控制文件出现问题,会导致数据库无法打开
1.4 参数文件和密码文件
参数文件和密码文件,虽然不属于Database的组成(不是Database文件),但却是两个必不可少的文件
*参数文件:定义了数据库实例Instance的特性。含有SGA内存结构的大小参数,Instance名称等;参数文件是一个文本文件,可以通过文本编辑器进行查看
*密码文件:用于授权用户启动、连接、读写数据库。在安装Oracle数据库软件的过程中,会创建SYS等默认用户,这些用户的密码也记录在这里,Orace根据这个文件来判定用户是否有相应的操作权限
*归档日志文件:是redo log file的脱机备份。数据恢复时,如果数据库启用了归档,就可以使用归档文件来进行数据库恢复
1.5 数据库连接connection和会话session
数据库连接connection, 指的是用户和数据库服务器间的通信;1个连接,可以有多个会话;oracle提供了3种连接方式
1)基于主机的连接(host-based):用户(客户端)和oracle服务端位于同一主机
2)Client-Server方式:用户(客户端)和oracle服务端,位于不同主机;客户通过网络连接oracle服务端
3)client-应用服务器-数据库服务器: 用户访问应用服务器,由应用服务器来连接oracle服务端。很多应用系统都是这种架构(客户端使用浏览器,后台连接数据库)
会话Session
会话,指一个明确的数据库连接;一旦用户使用3种连接方式中的一种,和oracle服务端建立好了连接,我们就将这个连接成为一个会话
1.6 Oracle数据库内存结构(先有大概概念)
共享池
是将解析后的SQL代码结果存放在这里,PL/SQL代码不仅是存放,还能够共享
共享池由两部分组成:库高速缓存 +数据字典高速缓存
*库高速缓存:存储了最近使用过的SQL和PL/SQL语句,能存放的数量当然是有限的;Oracle通过一种LRU(least recently used)算法
来管理库高速缓存(缓存哪些语句)
*数据字典高速缓存:和数据字典相关的一个缓冲区。存储了数据文件datafile、表table、索引index、列colume、用户user、权限信息等。在SQL语句的解析阶段,oracle需要这些信息来进行用户名、用户访问权限的解析。当这些信息被缓存,就能够提高速度
重做日志缓冲区
当用户执行了insert,delete, update等操作,导致实际数据发生变化时,变化后的数据在写入数据库高速缓存之前,会先写入到redo log buffer cache, 同时变化前的数据也会写入redo log buffer cache. 这样oracle就知道变化前和变化后的数据,从而得知哪些数据发生了变更,应该如何恢复数据
大池(large pool)和java池(Java pool)
大池是SGA的一个可选内存区,在共享服务器环境下才会考虑分配大池,用户进程区PGA将会在大池中分配;
在大规模输入输出、备份过程中,也需要大池作为缓存空间
java池,也是一个SGA的一个可选内存区;当安装了Java或者使用了java程序,就需要配置java池,用于编译java语言编写的指令
流池StreamPool
是oracle stream专用的内存缓冲区,stream是oralce数据库中的一个数据共享,大小可以通过stream_pool_size来调整
进程全局区PGA
服务器进程或者后台进程的专有内存区域,随着进程的启动而进行内存分配,非共享;(每个服务器进程、后台进程会有一段自己专门的内存区,
1.7 Oracle数据库的后台进程
*SMON:System Monitor 系统监控进程,主要作用是:数据库实例Instance恢复
当OS故障,突然断电,数据库系统重新启动时SMON会尝试恢复Instance(之前在pool中的数据因为没有写入磁盘,都丢失了),有3个z主要步骤:
1)将所有写入redo log, 而没有写入datafile的数据(已经提交的操作),写入到datafile
2)打开数据库,方便用户登录查询;此时1)的操作可能还没有完成
3)回滚没有提交的事务(写入了redo log,但没有提交的操作)
*PMON:Process Monitor 进程监控,主要作用是:服务器进程的监控和维护(连接异常或进程失败时,进行清理工作)
清理工作包括:
1)回滚没有提交的事务
2)释放进程所持有的表或行锁
3)释放进程占用的SGA资源
4)监视其他oracle后台进程,必要的时候进行进程重启
5)向oracle监听器(OracleTNS)注册刚启动的实例。如果TNS已经启动,则传递相应参数;如果TNS没有启动,则定期尝试连接TNS来注册实例
*DBWR:数据库写进程
脏数据:用户更改了,但没有提交的数据(数据库高速缓存的数据是已经更改的数据,数据文件中的是原始数据,两者不一致)
脏数据必须在一定的条件下,写入到datafile,这就是DBWR的作用
为什么数据要先写入数据库高速缓存,再通过DBWR写入datafile?
主要目的是减少磁盘IO的次数,异步写入,提高写入效率;每次磁盘写入--异步的批量磁盘写入
什么时候,DBWR会将脏数据写入到datafile
发生检查点事件
脏数据库量,到达门限
数据库缓冲区没有足够的空间
表空间处于热备份状态
表空间被置为离线状态
表空间被置为只读状态
删除表或者截断表
超时
归档日志进程ARCH
首先,归档日志进程ARCH是一个可选的后台进程,并不是随着Instance的启动而自动启动
其次,ARCH的作用是将数据库文件中的redo log file (写满的),写到归档日志
再次,归档日志用于数据库恢复
检查点进程 CKPT
首先,什么叫检查点CheckPoint
CheckPoint是Oralce数据库的一个内部事件(需要进行数据写入datafile的操作)。当checkpoint出现时,CKPT进程就被唤醒,它来通知DBWR进程将脏数据写入数据文件(这里的脏数据包括提交的和未提交的,有办法可以区分出来),写入完成后,CKPT将此次checkpoint已经完成的信息写入到Controlfile,同时写入到数据文件的文件头head
也就是说,controlfile中会记录各个checkpoint的信息,当CKPT被激活时,会先从controlfile中读取上一次的检查点,然后告诉DBWR,将本次checkpoint和上一次checkpoint之间的脏数据全部写入datafile.
简单来说,checkpoint可以理解为一个“写入时间点”,controlfile会记录每个“写入时间点”, DBWR负责将本次写入时间点和上一次写入时间点之间的脏数据,写入到datafile