再谈Oracle数据库结构
之前写了一篇文章《Oracle-知识结构漫谈》 粗略的介绍了Oracle数据库接口,在这里再更加详细的描述一下,当做是对原有知识的巩固,温故知新。
Oracle体系结构
数据库的体系结构是从某一个角度来分析和考察数据库的组成、工作过程与原理,以及数据在数据库中的组织与管理机制。
Oracle数据库是一个逻辑概念,而不是一个运行数据库服务器的计算机系统或者一台Oracle服务器。
基本术语
1 Oracle实例 、Oracle数据库
一般Oracle数据库 可以分为两部分:
- 实例 Instance
实例是一个非固定的,基于内存的基本进程与内存结构。 当服务器关闭之后,实例也就不存在了。
- 数据库 Database
数据库指的是固定的、基于磁盘的数据文件、控制文件、日志文件、参数文件和归档日志文件等。
一般情况下,Oracle数据库都是一个数据库包含一个实例。
2 数据库服务器
数据库服务器DatabaseServer 一般指的是数据库各软件部件(如sqlplus、oem、exp/imp等) 、 实例 及 数据库 3个主要部分, 是由安装在服务器上的所有的软件(包括各种类型的文件)及启动成功后的实例组成。
体系结构图解
如上图,我们可以看出 SQL命令从客户端发出后,由Oracle的服务器进行响应,在内存区域中进行语法分析、编译、执行,将修改后的数据写入数据库文件,数据库的修改信息写入日志文件,再将SQL的执行结果返回给客户端。
表空间与数据文件
在Oracle系统中,表空间和数据文件是Oracle数据库结构的基本要素.
1 表空间
在Oracle数据库中,用于存放数据库表、索引、回滚段等对象的磁盘逻辑空间叫做表空间。 如上所示。
一般在完成Oracle系统的安装并创建Oracle实例后,Oracle系统会自动创建多个表空间。
SYSTEM表空间
- SYSTEM表空间存放Oracle系统内部表和数据字典的数据,比如表名、列名、用户名等。
- 不赞成用户创建的表、索引等存放在SYSTEM表空间。
- SYSTEM表空间对应的数据文件是system01.dbf ,如果有表空间对应的数据文件比较小,可追加另外一个新的数据文件,比如system02.dbf
alter tablespace system add datafile '/data/cc/system02.dbf' size 10240M
SYSAUX表空间
- SYSAUX表空间是Oracle 11g新增加的表空间,主要用于存放Oracle系统内部的常用样例用户的对象。
- SYSAUX一般不存放用户的数据,由Oracle系统内部自动维护
- SYSAUX对应的数据文件为 sysaux01.dbf
UDNO表空间
- 列表内容UNDO表空间用于存储撤销信息的表空间
- 当我们对数据库进行修改(包括INSERT、UPDATE、DELETE操作)时, Oracle会自动使用UNDO表空间来存放修改前的数据
- 当操作完成并提交后,Oracle系统会根据细腰保留修改前数据时间长短来释放UNDO表空间的部分空间。
- 默认的数据文件为undotbs01.dbf
USERS表空间
- USER是Oracle建议用户使用的表空间,可以在这这个表空间上创建跟踪对象。
- Oracle的基本样例用户SCOTT的对象就存放在USERS表空间中。
- 一般USERS的表空间对应的数据文件是users01.dbf
总结:
除了Oracle系统默认创建的表空间外,用户可以根据应用的规模及其所要存放的对象类型创建多个表空间,以区分用户数据与系统数据、索引和数据。
此外,不同应用的数据应将不同表空间的文件放在不同的盘上,减少I/O冲突。
2 数据文件
数据文件DataFile是用于保存应用数据和Oracle系统内部数据的文件。
Oracle数据库由表空间组成,每个表空间可以包含一或者多个数据文件
系统数据
管理用户数据和Oracle系统本身的数据,这些数据被自动存放在系统表空间对应的system01.dbf中。
二Oracle系统内部的数据字典、表如DBA_USERS、DBA_DATA_FILES等说存放的岠属于Oracle系统的内部数据,这也数据也存放在系统表空间对应的system01.dbf中。
用户数据
用户数据是指用户应用系统的数据,包括与应用系统先关的信息。
select tablespace_name, file_id, file_name, round(bytes / (1024 * 1024*1024), 0) || 'G' total_space from dba_data_files order by tablespace_name;
从上面的查询结果看出来: 表空间和数据文件是一对不可分离的数据库实体。
- 表空间是一个数据库的逻辑去
- 每个表空间由一个或者多个数据文件组成
- 一个数据文件只能属于一个表空间
临时表空间与临时文件
- Oracle系统中用于存放和排序有关的特殊表空间。
- 当需要排序时,Oracle就将排序的数据存放在该表空间内,排序完成后即可释放数据所占的空间,因此称之为临时表空间。
- 临时表空间也可以对应一个或者多个临时文件(Tempfile)
- oracle9i后,Oracle将临时表空间所对应的临时数据文件与一般数据文件分开, dba_temp_files数据字典中可以查询临时表空间和临时数据文件的信息
select tablespace_name,file_name,bytes/1024/1024 "file_size(M)",autoextensible from dba_temp_files;• 1
Oracle存储结构介绍
无论是普通的表空间还是临时表空间,当创建时至少需要一个数据文件。
Oracle创建数据文件时,实际上是将磁盘的操作系统重新格式化成Oracle数据块,并且每个Oracle数据块都有唯一标示。
一般情况下,Oracle数据块是操作系统块的倍数,比如操作系统块大小2048B,而Oracle数据块大小为8192B(DB_BLOCK_SIZE=8192)
SQL> show param db_block NAME TYPE VALUE --------------- ----------- -------- db_block_buffers integer 0 db_block_checking string FALSE db_block_checksum string TYPICAL db_block_size integer 8192
一般的,我们在设计数据库结构时需要将表、索引或者簇(Cluster)存储到一个已经存在的表空间上, 而表、索引或者簇都是占用空间的对象,Oracle把占空间的对象统一称为段(Segment)。
段是有多个区间(Extent)构成,而区间是由多个连续(块的编号地址相邻)的Oracle数据块构成。
所以Oracle中,数据块是一个基本的处理单位
控制文件
- 控制文件是一个存储Oracle实例信息、数据文件和日志文件信息的内部二进制文件。
- 控制文件一般在Oracle系统安装时自动创建。
- 控制文件的存放路径由服务器参数文件SPFILEsid.ora的control files的参数值来决定。
因为控制文件中存放数据文件、日志文件等信息,所以Oracle实例在启动的时候必须访问控制文件。
Oracle实例在正常启动时,首先要访问的初始化参数文件SPFILE, 然后Oracle会为系统全局区(SGA)分配内存,这是Oracle实例处于安装状态,控制文件处于打开状态; 接下来,Oracle会自动读出控制文件中的所有数据文件和日志文件信息,并打开所有的数据文件及日志文件信息以便用户访问.
控制文件内部出了存放ORACLE实例及创建日期、数据文件、日志文件外,在系统运行的过程中,还存放系统更改号、检查点信息,及归档的当前状态信息等,如果开启了RMAN备份,还会存放RMAN的备份信息。
Oracle系统处于安全的考虑,建议在 系统安装时 指定多个控制文件,并将它们存放在不同的磁盘路径下。
查询数据库实例包含的控制文件信息路径
select name, status from v$controlfile;
日志文件
Oracle日志文件分为 重做日志文件 和 归档日志文件。
特别是重做日志文件,是Oracle数据库系统正常提供服务不可或缺的。
联机重做日志文件(Online Redo Log File)
Online Redo log file 是用来记录数据库所发生过的交易的信息及有Oracle内部行为引起的数据库变化信息。
在数据库恢复时,可以从该日志文件中读取出原来交易的数据。 在数据库运行期间,当用户发出commit命令时,数据库会将每笔交易记录到日志文件中,写入日志文件成功后,才会把信息传给用户程序。所以,在日志文件中可以随时督促信息以恢复某些交易数据。
当对表或者整个表空间设置了NOLOGGING属性时,基于表或表空间中所有表的DML操作都不会生成日志信息,当然也就减少了日志信息的产生。
重做日志文件的作用
- 记录所有数据的改变
- 提供恢复机制
- 组方式管理(最少两组,默认为3组,每组一个重做日志文件,Oracle官方建议,所有的每组重做日志文件大小最好相同;当然如果是为重做日志文件组添加成员的时候不能指定大小,因为每个重做日志文件相互冗余,所以必须一致)
重做日志文件的状态
- unused:说明此重做日志文件组没被用过
- current:说明是当前重做日志组,lgwr正在写
- active:说明此重做日志文件组刚写完,记录在重做日志文件组中的事务所造成的数据块的改变,没有完全从缓冲区写入到数据文件,重做日志文件组属于这种状态,是不允许被覆盖的,一旦写完成,就变问inactive状态。
- inactive:说明记录在重做日志文件组中的事务所造成的数据块的改变,已经从缓冲区写入到数据文件,这种状态允许被覆盖。
上面4中状态是重做日志文件常见的状态,下面两种状态是在重做日志组损坏或者特殊情况下的状态。 - clearing:说明该重做日志文件正被重建(重建后状态变为unused)
- clearing_cyrrent:说明此重做日志文件重建是出现错误
为确保数据库系统的安全,每个Oracle实例用一个日志线程(Thread)来近路数据库的变化。 日志线程由若干日志组构成,日志组又由一个或者多个日志成员构成(当然也可以包括一个)。
可以从v$logfile数据字典中查询
select group#,status , member from v$logfile ;
可以根据 v$log_history 这个动态视图查询日志切换的频率,判断日志的大小是否合适。 日志组空间太小的话,第一会导致dbwr写的频率增加,增加了i/o;第二会造成事务的等待,延长事务周期,导致数据库假死。
按照官方建议,日志切换时间一般在10-15分钟比较适合。
Oracle实例在运行中产生日志信息,首先被记录在SGA中的日志缓冲区中, 当发出commit命令后(或者日志缓冲区信息满1/3或者3S过去)时,LGWR进程将日志信息从日志缓冲区中读出并写到日志文件组序列号小的文件中, 一个日志组写满后接着写另外一组。
在DBWR工作之前,LGWR首先将事务变化写入到重做日志。
LGWR工作触发条件:
1、提交事务(commit)
2、每隔3秒钟
3、当重做日志信息超过1M
4、重做日志缓冲区超过1/3满
5、SCN(System Change Number)
当LGWR进程将所有能用的日志文件都使用过一次后,它将再次转向第一个日志组重新覆写。
Oracle用日志文件序列号来跟踪不同的日志文件,当LGWR进程写满第一个日志组而转向另外一组时,称之为日志切换。
当日志发生切换时,Oracle会往警告日志文件(alter_sid.log) 记录相应的信息,以帮助用户观察各日志组的使用情况。
归档日志文件
oracle系统运行有两种模式——归档模式和非归档模式。
非归档模式
非归档模式就是在系统运行期间,所产生的日志信息不断的记录到各日志文件组中,当所有的重做日志组被写满年后又重新从第一个日志组开始覆写日志信息内容。
归档模式
归档模式就是在各日志文件(成员)都写满即将被覆盖前,现有归档进程(ARCH)将即将被覆盖的日志文件中的日志信息读取出来并写到归档日志文件中,以便后面的恢复操作时查找。
默认情况下,Oracle系统不采用归档运行模式。
查看数据库是否处于归档模式
SQL> SELECT log_mode FROM v$database; LOG_MODE ------------ NOARCHIVELOG
如果将数据库设置为归档模式下运行, 归档日志的领有服务器参数文件SPFILE的log_archive_dest参数确定。
SQL> show param log_archive_dest NAME TYPE VALUE --------------- ----------- ------------------------------ log_archive_dest string log_archive_dest_1 string LOCATION=/ccarch/cc valid_for=(all_logfiles,all_roles) db_unique_name=pr_cc
服务器参数文件
服务器参数文件SPFILE(Server Parmater File)是二进制文件,用来记录Oracle实例的基本参数信息,包括数据库实例名、控制文件所在路径、进程等。
服务器参数文件在Oracle安装时已默认的方式创建, 文件名为 SPFILEsid.ora , 其中sid为数据库实例名。
SPFILE中的参数由oracle系统自动维护,如过要修改某些参数,不能对SPFILE进行直接编辑, 需要通过alter system命令来修改。
密码文件、跟踪文件、警告日志
密码文件
作用:主要进行DBA权限的身份认证
密码文件的位置:
$ORACLE_HOME/dbs/orapw$ORACLE_SID
密码文件查找的顺序
--->orapw<sid>--->orapw--->Failure
- 使用与操作系统集成的身份验证
- 使用Oracle数据库的密码文件进行身份认证
两种认证方式, 决定在两个参数中
创建Oracle密码文件的命令
orapwd file=<fname> password=<password> entries=<users> force=<y/n>
- file - name of password file (mand), 密码文件的名字orapw
- password - password for SYS (mand), sys用户的密码
- entries - maximum number of distinct DBA
- force - whether to overwrite existingfile (opt),10g新增的参数,默认值为n ,y表示允许覆盖
警告日志文件
告警日志文件是一个存放在Oracle系统目录下的特殊文本文件(trace file),用来记录数据库运行期间错误信息。
告警日志文件命名一般为alert_.log
,其中SID为ORACLE数据库实例名称。
10G中告警日志的路径 由Oracle系统的background_dump_dest参数指定。
SQL> show parameter background_dump_dest NAME TYPE VALUE ------------------- ----------- -------------------- background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace
11G及12C中,引入了ADR(Automatic Diagnostic Repository:一个存放数据库诊断日志、跟踪文件的目录),关于ADR对应的目录位置可以通过查看v$diag_info系统视图
SQL> select * from v$diag_info;
Diag Trace对应的目录为文本格式的告警日志文件所在的目录,而Diag Alert对应的目录为XML格式的警告日志(对应为log_x.xml)
SELECT VALUE FROM V$DIAG_INFO WHERE NAME = 'Default Trace File';
这里的Default Trace File就是缺省的会话跟踪文件名称
后台跟踪文件和用户跟踪文件
跟踪文件(trace file)的作用,通常是一个服务器进程对某种异常错误条件做出响应时创建的诊断文件。
路径由服务器参数文件SPFILEsid.ora的user_dump_dest参数指定。
SQL>show parameter DUMP_DEST NAME TYPE VALUE ---------------- ----------- ------------------------------ background_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace core_dump_dest string /oracle/diag/rdbms/pr_cc/cc/cdump user_dump_dest string /oracle/diag/rdbms/pr_cc/cc/trace
background_dump_dest(后台转储)
core_dump_dest(内核转储)
user_dump_dest(用户转储)
跟踪文件名形:SID名+进程名+进程ID
Oracle服务器结构
Oracle服务器与Oracle实例
Oracle服务器是由Oracle实例+Oracle数据库组成。
Oracle实例是有SGA+后台进程组成。 每一个Oracle实例都有自己的SGA和独立的Oracle进程集。
物理结构与逻辑结构的关系
系统全局区(SGA)
之前的博客 Oracle-内存管理解读
- SGA = 数据高速缓冲区+ 重做日志缓冲区+ 共享池+ 大池+ Java 池+ 流池
- 系统全局区是动态的,由参数SGA_MAX_SIZE决定。
查看当前系统的SGA大小:
SQL>show parameter sga_max_size NAME TYPE VALUE ------------------ ----------- ---------------------------- sga_max_size big integer 116992M
修改当前系统的SGA大小:
alter system set sga_max_size=1024m scope=spfile;
因为实例内存的分配是在数据库启动时进行的,所以要让修改生效,要重启数据库。
数据高速缓冲区(Data Buffer Cache)
存储Oracle系统中最近使用过的数据块(即用户的高速缓冲区)
数据告诉缓冲区有3种类型
- 脏区Dirty Buffers
- 自由区Free Buffers
- 保留区Pinned Bffer
大小由db_cache_size 决定
查看:
SQL> show parameter db_cache_size NAME TYPE VALUE -------------- ----------- ------------------------- db_cache_size big integer 99G
修改:
SQL>alter system set db_cache_size=1024m;
重做日志缓冲区(Redo Log Buffer)
在这些日志在写入重做日志文件之前, 必须先写入到从昨日之缓冲区,然后由LGWR进程将它写入磁盘,大小由LOG_BUFFER决定
共享池(Share Pool)
- 共享池是SGA的保留区, 用于存储SQL、PL/SQL、包、数据字典、锁、字符集 安全属性等。
- 共享池包含库高速缓冲区(Library Cache) 和 指点高速缓冲区(Dictionary Cache)
- 库缓存大小由shared_pool_size 决定
查看:
SQL>show parameter shared_pool_size NAME TYPE VALUE --------------------- ----------- ------------------------ shared_pool_size big integer 10G
修改:
SQL>alter system set shared_pool_size=120m;
大池(Large Pool)
是一个可选的区域,用于一些大型的进程如Oracle的备份恢复操作、IO服务器进程等
Java 池
该程序缓冲区就是为Java 程序保留的。如果不用Java程序没有必要改变该缓冲区的默认大小
流池(Stream pool)
被Oracle流所使用
后台进程
SQL>select name description from v$bgprocess
数据库写入器(DBwn)
Database Writer 数据库写。主要作用是将Database buffer cache(数据库缓冲区)里那些被更新过、但还没有被写入数据文件的数据写入到数据文件中。这里的n表示可以有多个数据库写操作.
可以修改SPFILE的DB_WRITER_PROCESSES参数,以允许使用多个DBWR进程,进程的名字分别为 DBW0、DBW1、DBW2等…
SQL>alter system set db_writer_processes=3 scope=spfile;
检查点进程(CKPT)
可选进程。
可以通过SPFILE中的CHECKPOINT_PROCESS参数为TRUE来启动检查点进程
日志写入器(LGWR)
日志文件写进程:是日志缓冲区的治理进程,负责把日志缓冲区中的日志项写入磁盘中的日志文件上。每个实例只有一个LGWR进程.
系统监控器(SMON)
System Monitor,负责完成自动实例恢复和回收分类(sort)表空间。
进程监控器(PMON)
PRocess monitor ,实现用户进程故障恢复、清理内存区和释放该进程所需资源等。
清除失败的进程
回滚事务
释放锁
释放其他资源
归档器(ARCH)
archiver process
把已经填满的在线日志文件拷贝到一个指定的存储设备上。仅当日志文件组开关(switch)出现时,才进行ARCH操作。ARCH不是必须的,而只有当自动归档可使用或者当手工归档请求时才发出。
锁(LCKn)
可选进程
封锁进程:用于并行服务器系统,主要完成实例之间的封锁。
调度(Dnnn)
可选进程
恢复器(RECO)
负责解决分布事物中的故障。Oracle可以连接远程的多个数据库,当由于网络问题,有些事物处于悬而未决的状态。
RECO进程试图建立与远程服务器的通信,当故障消除后,RECO进程自动解决所有悬而未决的会话。
快照进程(SNPn)
负责出护理数据库快照的自动刷新,并通过dbms_job包运行预定的数据库存储过程.
并行查询进程(Pnnn)
程序全局区(PGA)
与SGA不同,PGA是一个私有区。
http://blog.csdn.net/yangshangwei/article/details/53124044#t25
SQL> show parameter pga NAME TYPE VALUE ------------------ ----------------- ------------------ pga_aggregate_target big integer 10G
Oracle数据字典
之前的博客 Oracle-数据字典解读
Oracle数据字典的构成
Oracle常用的数据字典
基本的数据字典
与数据库组建相关的数据字典
Oracle常用的动态性能视图
总结