先来看张直观的图:
oracle 11g 体系结构图
理解Oracle体系结构要充分理解三个概念:数据库(database),数据库实例(instance),会话(session),一定不要把这三个概念弄混。
数据库的概念
(A) 物理存储结构由数据文件、控制文件、重做日志文件组成:
1. 数据文件(datafile)
select * from dba_data_files;
数据文件包括存储表和索引数据,以及排序和散列等操作的中间结果。一个数据文件只能属于一个数据库,一个数据库可以包含多个数据文件。
2. 控制文件(controlfile)
select * from v$controlfile;
控制文件记录了数据库的物理存储结构和其他控制信息,如数据库名称、创建数据库的时间戳、组成数据库的各个数据文件和重做日志文件的存储路径及名称、系统的检查点信息等。
控制文件的作用:
Oracle数据库打开时(mount到open阶段),必须先打开控制文件,从中读取数据文件和重做日志文件信息。如果控制文件损坏,就会是数据库无法打开,导致用户无法访问存储在数据库中的信息。
在实例恢复过程中,控制文件检查点信息决定Oracle实例怎样使用重做日志文件恢复数据库。
3. 重做日志文件(redo logfile)
select * from v$logfile;
select * from v$log;
重做日志文件记录了数据库所产生的所有变化信息。在实例或者介质失败时,可以用重做日志恢复数据库。
重做日志文件组存储数据库重做日志信息,这组重做日志文件被称作联机重做日志文件。每个数据库必须至少拥有两组重做日志文件。Oracle实例以循环写入的方式使用数据库的重做日志文件组。
在归档模式下,在发生日志文件切换后,填满的重做日志文件被复制到其他地方保存。这些日志文件副本被称作归档日志文件。
(B)逻辑结构由表空间(tablespace)、段(segment)、区间(extent)、数据块(data block)组成
一个表空间包含多个段,一个段包含多个区间,一个区间包含多个数据块。
表空间:
表空间是一个逻辑容器,它位于逻辑存储结构的顶层。表空间内的数据被物理存放在数据文件中。一个表空间可以包含一个或多个数据文件。但是一个数据文件只能属于一个表空间。
Oracle 11g系统默认创建的表空间有:
SYSTEM:系统表空间。用于存储整个数据库的数据定义信息。
SYSAUX:系统表空间的辅助表空间,用于存储一些组件和产品的数据,以减轻SYSTEM表空间的负载。
TEMP:临时表空间。用于存储SQL语句处理过程中产生的临时数据。
UNDOTBS1:UNDO表空间,Oracle数据库用它来存储还原信息,实现回滚等操作。
USER:默认的用户表空间。用于存储永久用户对象和数据。
段:
段是占用存储空间的数据库对象,用于存储和隔离不同数据库对象的数据。
表段:即数据段。
索引段
回滚段:用于数据库还原信息
临时段
区间:
区间是Oracle存储空间最小的分配单位。
数据块:
数据块是Oracle最小的I/O单位。
Oracle数据库物理存储结构和逻辑存储结构关系如下图:
数据库实例(instance)
Oracle数据库实例由内存结构和后台进程组成。
1. 系统全局区SGA(system global area)
(a) 数据缓冲区data buffer cache
为了减少数据库的物理I/O次数,提高性能,Oracle从磁盘数据文件检索数据之后或将数据块写入磁盘之前,都要将数据块缓存到数据缓冲区中。
Oracle数据库数据块可以使用8KB(标准块),2KB、4KB、16KB、32KB。数据缓存区也分为标准块缓存区和非标准块缓存区。
SQL> show parameter db_block_size
NAME TYPE VALUE
------------------------------------ -----------
db_block_size integer 8192
备注:保持池、循环池、默认池都属于data_buffer_cache
(b) 共享池(shared pool)
共享池大小有参数shared_pool_size参数指定,它又分为数据字典缓存、库缓存、服务器结果缓存。
数据字典缓存(dictionary cache):首次执行的SQL代码,服务器进程首先要解析代码,生成执行计划。在解析过程中需要检索SQL语句操作的数据库对象及其定义、用户和权限等信息。这些信息存储在数据库的数据库字典内。
库缓存(Library cache):用以缓存解析过的SQL语句的执行计划。服务器进行在执行SQL代码时,首先从库缓存查找其执行计划,如果找到,则重用该代码,这称为软解析或库缓存命中。否则进行硬解析。
服务器结果缓存:用于缓存SQL语句查询结果集合和PL/SQL函数的结果集。(缓存数据块)
(c) 重做日志缓冲区(redo log buffer)
服务器进程把执行数据修改(insert、update、delete)过程中产生的重做日志写入重做日志缓冲区,然后日志写入进程lgwr把日志缓冲区内的重做日志写入磁盘中的联机重做日志文件。
(d) 大池(Large pool)
大池是一个可选的内存区域,它是由large_pool_size参数设置,用于分配不使用于在共享池内分配的大块内存。如RMAN备份所需要的缓冲区、语句并行执行所使用的缓冲区。
(e) JAVA池(java pool)
(f) 流池(stream pool)
关于SGA可以查询一个视图
select * from v$sga_dynamic_components;
2. 后台进程(background process)
(a) 进程监视进程PMON(process monitor)
l 监视其他后台进程、服务器进程、调度进程的运行情况。当它们异常中断时,重启这些进程或者终止实例运行。
l 在用户进程异常中断后,负责清理数据库缓冲区缓存,释放用户进程锁定的资源。
l 向正在运行的监听注册数据库实例。
(b) 系统监视进程SPOM (system monitor)
SMON负责大量系统级的清理工作:
l 实例启动时,如果需要,SMON执行实例恢复。
l 清理不在使用的临时段
l 合并字典管理表空间内的相邻空闲区
(c) 数据库写入进程DBWR ( database writer )
负责将SGA内数据缓冲区缓存中修改过的数据块写入数据文件。
(d) 日志写入进程 LGWR ( log writer )和归档进程ARCH
负责把日志缓冲区缓存的重做日志写入重做日志文件。
在归档模式下,在发生日志文件切换后,填满的重做日志文件被复制到其他地方保存。这些日志文件副本被称作归档日志文件。
(e) 检查点进程 CKPT ( checkpoint process )
在Oracle数据块内,检查点进程会定期启动,它把检查点信息写入控制文件和数据文件头部,并通知DBWn进程把脏数据写入数据文件。DBWn进程的运行又会启动LGWR进程将重做日志文件缓存区中的内容写入重做日志文件。