引用:http://oracle.chinaitlab.com/serial/38165.html 此处较为详细:
http://blog.youkuaiyun.com/truexf/archive/2006/07/05/881726.aspx
一、 数据库、表空间、数据文件
1.数据库数据库是数据集合 。
Oracle是一种数据库管理系统,是一种关系型的数据库管理系统。从物理上看,数据库是由控制文件,重做日志文件,初始化参数文件等操作系统文件组成。
从逻辑上看,数据库由系统的、用户的表空间组成。
通常情况了我们称的“ 数据库 ” ,并不仅指物理的数据集合,他包含物理数据、数据库管理系统。也即物理数据、内存、操作系统进程的组合体。
数据库的数据存储在表中。数据的关系由列来定义,即通常我们讲的字段,每个列都有一个列名。数据以行( 我们通常称为记录 ) 的方式存储在表中。表之间可以相互关联。
2. 表空间、文件
数据库结构提供对数据文件的逻辑映射,允许不同类型的数据分开存储。这些逻辑划分称作表空间。
表空间(tablespace) 是数据库的逻辑划分,每个数据库至少有一个表空间(称作 SYSTEM 表空间)。为了便于管理和提高运行效率,可以使用一些附加表空间来划分用户和应用程序。例如: USER 表空间供一般用户使用, RBS 表空间供回滚段使用。一个表空间只能属于一个数据库。
每个表空间由同一磁盘上的一个或多个文件组成,这些文件叫数据文件(datafile) 。一个数据文件只能属于一个表空间。在 Oracle7.2 以后,数据文件创建可以改变大小。创建新的表空间需要创建新的数据文件。
数据文件一旦加入到表空间中,就不能从这个表空间中移走,也不能与其它表空间发生联系。
如果数据库存储在多个表空间中,可以将它们各自的数据文件存放在不同磁盘上来对其进行物理分割。在规划和协调数据库I/O 请求的方法中,上述的数据分割是一种很重要的方法。数据库、表空间、文件之间的关系如下图所示:
任何方案对象(包括定义、数据)都被逻辑的存储在表空间中,同时又被物理的存储在数据文件中。方案对象的定义和其数据被分别存储。方案对象的定义被统一、单独的存储在表空间system 中,其数据被存储在该方案的表空间中(可以被存在该表空间的多个数据文件中)
一个数据库可以包含对个表空间(tablespace) ,一个表空间可以有对个数据文件( datafile ),可以有多个段( segment ),但是一个段只能存在于一个单独的表空间中。一个段可以分布在对个数据文件中,一个数据文件也可以存在多个段中;一个段由一个或多个区( extent )组成,区不能跨越在多个数据文件上,一个数据文件可以包含多个区;一个区由若干个连续的块( block )组成,故一个区包含多个 os 块。
系统表空间
主要存放数据字典和内部系统表基表
查看数据数据字典的SQL select * from dict
查看内部系统表的SQL select*fromv$fixed_view_definition
DBA对系统的系统表中的数据字典必须有一个很深刻的了解,他们必须准备一些基础的 SQL 语句,通过这些 SQL 可以立即了解系统的状况和数据库的状态,这些基本的 SQL 包括
系统的剩余空间
系统的SGA
状态系统的等待
用户的权限
当前的用户锁
缓冲区的使用状况等
在成为DBA 的道路上我们不建议你过分的依赖于 OEM/Quest 等优秀的数据库管理工具,因为他们不利于你对数据数据字典的理解, SQL 语句可以完成几乎全部的数据库管理工作。 大量的读少量的写是该表空间的一个显著的特点
二、 Oracle的外部结构
1.重做日志文件
Oracle保存所有数据库事务的日志。这些事务被记录在联机重做日志文件 (onlineredologfile) 中。当数据库被破坏时,这些日志文件能够以正确顺序恢复数据库事务。重做日志文件信息存储在数据库数据文件的外部。
重做日志文件也可以让oracle 优化向磁盘写入数据的方式。当数据库中出现一个事务时,就把该事务输入到重做日志缓冲区;同时受该事务影响的数据块不会立即写入磁盘。
每个oracle 数据库都有两个或更多的联机重做日志文件。 oracle 以循环方式向联机重做日志文件写入:第一个日志文件被填满后,就向第二个日志文件写入,然后依次类推。当所有联机重做日志文件都被填满时,就又回到第一个日志文件,用新事务的数据对其进行重写。如果数据库正以 ARCHIVELOG 模式运行,在重写联机重做日志文件前,数据库将先对其进行备份。任何时候都可以用这些归档重做日志文件来恢复数据库的任何部分。
重做日志文件可以被数据库镜像( 复制 ) 。镜像联机重做日志文件不依赖操作系统或操作环境的硬件性能就可以对重做日志文件进行镜像。如 E:\Oracle\orcl\REDO01.LOG
通过v$log 可以查看日志组, v$logfile 可以查看具体的成员文件
2. 控制文件
数据库的全局物理结构由其控制文件(controlfile) 维护。控制文件记录数据库中所有文件的控制信息。控制文件维护内部的一致性并引导恢复操作。只有控制文件正常,才能 “ 装载 ” 、 “ 打开 ” 数据库。本人装完之后的文件: E:\Oracle\orcl\CONTROL01.CTL
由于控制文件对数据库至关重要,所以联机存储着多个拷贝来保护控制文件,或采用RAID 来保护控制文件。这些文件一般存储在各个不同的磁盘上,以便将因磁盘失效引起的潜在危险降至最低限度。创建数据库时,同时就提供与之对应的控制文件。
数据库控制文件的名字通过init.ora 文件的 CONTTROL_FILES 参数规定。尽管这是一个 init.ora 参数,但是 CONTROL_FILES 参数通常用 config.ora 文件规定,因为它很少变化。如果需要给数据库添加一个新的控制文件,可关闭实例,把已存在的一个控制文件复制到新的地址,把新的地址添加到 CONTTROL_FILES 参数设置值上,并重新启动这个实例。
控制文件包括如下主要信息
数据库的名字,检查点信息,数据库创建的时间戳
所有的数据文件,联机日志文件,归档日志文件信息
备份信息等控制文件信息可以从V$Controlfile 中查询获得
3. 数据文件(datafile )
*.DBF结尾的文件。如 E:\Oracle\orcl\EXAMPLE01.DBF 其对应表空间 EXAMPLE
可以通过如下方式查看数据文件 SQL>selectnamefromv$datafile;
3. 跟踪文件与警告日志
在实例中运行的每一个后台进程都有一个跟踪文件与之相连。跟踪文件记载后台进程遇到的重大事件的信息。除了跟踪文件外,oracle 还有一个称作警告日志 (alertlog) 的文件,警告日志记录数据库文件运行中主要事件的命令及结果。例如,表空间的创建、重做日志的转换、操作系统的恢复、数据库的建立等信息都记录在警告日志中。警告日志是数据库每日管理的重要资源,当需要查找主要失败原因时,跟踪文件就非常有用。
应经常监控警告日志。警告日志的条目将通知你数据库操作期间遇到的任何问题,其中包括出现的任何ORA_0600 内部错误。为使警告日志便于使用,最好是每天能自动对其重新命名。例如,如果警告日志称作 alert_orcl.log ,可以对它重新命名,以便其文件名包括当前日期。下次 oracle 要写该警告日志时,将找不到具有 alert_orcl.log 文件名的文件,因此数据库将创建一个新的文件名。这样,除了有以前的警告日志外,还有一个当前的警告日志 (alert_orcl.log) 。用这种方式区分警告日志条目就可以使对警告日志条目的分析更有效。
三、 数据库实例
为了访问数据库中的数据,Oracle 使用一组所有用户共享的后台进程。此外,还有一些存储结构 ( 统称为 SystemGloablArea, 即 SGA) ,用来存储最近从数据库查询的数据。数据块缓存区和 SQL 共享池 (SharedSQLPool) 是 SGA 的最大部分,一般占 SGA 内存的 95 %以上。通过减少对数据文件的 I/O 次数,这些存储区域可以改善数据库的性能。
数据库实例(instance) 也称作服务器 (server) ,是用来访问数据库文件集的存储结构及后台进程的集合。一个数据库可以被多个实例访问(这是 Oracle 并行服务器选项)。实例与数据库的关系如下图所示:
决定实例大小及组成的参数存储的init.ora 文件中(在 9i 中是 spfile )。实例启动时需要读这个文件,并且在运行时可以由数据库管理员修改。对该文件的任何修改都只有在下一次启动时才启作用。实例的 init.ora 文件件通常包含实例的名字 : 如果一个实例名为 orcl, 那么 init.ora 文件通常被命名为 initorcl.ora 。另一个配置文件 config.ora 用来存放在数据库创建后就不再改变的变量值 ( 如数据库的块大小 ) 。实例的 config.ora 文件通常也包含该实例的名字:如果实例的名字为 orcl ,则 config.ora 一般将被命名为 configorcl.ora 。为了便于使用 config.ora 文件的设置值,在实例的 init.ora 文件中,该文件必须通过 IFILE 参数作为包含文件列出。
SystemGlobalArea(SGA)和 BackgroundProcess 称为数据库的实例
通过以上对数据库及实例的介绍,Oracle 数据库结构可分为三个范畴:
数据库内部结构( 如表 )
存储区内部的结构(包括共享存储区和进程)
数据库的外部结构
三、 数据库的内部结构
即Oracle 数据的逻辑表现层,也称 oracleschema, 包括以下这些内容:表、列、约束条件、数据类型 ( 包括抽象数据类型 ) 分区与子分区用户与模式索引、簇和散列簇视图序列过程、函数、软件包和触发器同义词权限及角色数据库链接段、盘区和块回滚段快照与显形图
四、 Oracle内部存储结构
包括内存缓冲池与后台进程:
1. 系统全局区(SGA ) ,主要包括:
a.数据块缓存区数据块缓存区 (datablockbuffercache)是 SGA 中的一个高速缓存区域,用来存储从数据库中读取数据段的数据块 ( 如表、索引和簇 ) 。数据块缓存区的大小由数据库服务器 init.ora 文件中的 DB_LOCK_BUFFERS 参数决定 ( 用数据库块的个数表示 ) 。在调整和管理数据库时,调整数据块缓存区的大小是一个重要的部分。
因为数据块缓存区的大小固定,并且其大小通常小于数据库段所使用的空间,所以它不能一次装载下内存中所有的数据库段。通常,数据块缓存区只是数据库大小的1% ~ 2% , oracle 使用最近最少使用 (LRU , leastrecentlyused) 算法来管理可用空间。当存储区需要自由空间时,最近最少使用块将被移出,新数据块将在存储区代替它的位置。通过这种方法,将最频繁使用的数据保存在存储区中。
然而,如果SGA 的大小不足以容纳所有最常使用的数据,那么,不同的对象将争用数据块缓存区中的空间。当多个应用程序共享同一个 SGA 时,很有可能发生这种情况。此时,每个应用的最近使用段都将与其他应用的最近使用段争夺 SGA 中的空间。其结果是,对数据块缓存区的数据请求将出现较低的命中率,导致系统性能下降。
SQL>select*fromv$sga
更详细的信息可以参考V$sgastat 、 V$buffer_pool
b. 字典缓存区
数据库对象的信息存储在数据字典表中,这些信息包括用户帐号数据、数据文件名、段名、盘区位置、表说明和权限,当数据库需要这些信息( 如检查用户查询一个表的授权 ) 时,将读取数据字典表并且将返回的数据存储在字典缓存区的 SGA 中。
数据字典缓存区通过最近最少使用(LRU) 算法来管理。字典缓存区的大小由数据库内部管理。字典缓存区是 SQL 共享池的一部分,共享池的大小由数据库文件 init.ora 中的 SHARED_POOL_SIZE 参数来设置。
如果字典缓存区太小,数据库就不得不反复查询数据字典表以访问数据库所需的信息,这些查询称为循环调用(recuesivecall) ,这时的查询速度相对字典缓存区独立完成查询时要低。
c. 重做日志缓冲区
重做项描述对数据库进行的修改。它们写到联机重做日志文件中,以便在数据库恢复过程中用于向前滚动操作。然而,在被写入联机重做日志文件之前,事务首先被记录在称作重做日志缓冲区(redologbuffer) 的 SGA 中。数据库可以周期地分批向联机重做日志文件中写重做项的内容,从而优化这个操作。
重做日志缓冲区的大小( 以字节为单位 ) 由 init.ora 文件中的 LOG_BUFFER 参数决定。
d.SQL共享池
SQL共享池存储数据字典缓存区及库缓存区 (librarycache) ,即对数据库进行操作的语句信息。当数据块缓冲区和字典缓存区能够共享数据库用户间的结构及数据信息时,库缓存区允许共享常用的 SQL 语句。
SQL共享池包括执行计划及运行数据库的 SQL 语句的语法分析树。在第二次运行 ( 由任何用户 ) 相同的 SQL 语句时,可以利用 SQL 共享池中可用的语法分析信息来加快执行速度。
SQL共享池通过 LRU 算法来管理。当 SQL 共享池填满时,将从库缓存区中删掉最近最少使用的执行路径和语法分析树,以便为新的条目腾出空间。如果 SQL 共享池太小,语句将被连续不断地再装入到库缓存区,从而影响操作性能。
当一个用户提交一个SQL 语句, Oracle 会将这句 SQL 进行分析 (parse) ,这个过程类似于编译,会耗费相对较多的时间。在分析完这个 SQL , Oracle 会把他的分析结果给保存在 Sharedpool 的 LibraryCache 中,当数据库第二次执行该 SQL 时, Oracle 自动跳过这个分析过程,从而减少了系统运行的时间。这也是为什么第一次运行的 SQL 比第二次运行的 SQL 要慢一点的原因
SQL共享池的大小 ( 以字节为单位 ) 由 init.ora 文件参数 SHARED_POOL_SIZE 决定。
e.大池大池 (LargePool)
是一个可选内存区。如果使用线程服务器选项或频繁执行备份/ 恢复操作,只要创建一个大池,就可以更有效地管理这些操作。大池将致力于支持 SQL 大型命令。利用大池,就可以防止这些 SQL 大型命令把条目重写入 SQL 共享池中,从而减少再装入到库缓存区中的语句数量。大池的大小 ( 以字节为单位 ) 通过 init.ora 文件的 LARGE_POOL_SIZE 参数设置,用户可以使用 init.ora 文件的 LARGE_POOL_MIN_ALLOC 参数设置大池中的最小位置。 oracle8i 已不用这个参数。
作为使用LargePool 的一种选择方案,可以用 init.ora 文件的 SHARED_POOL_RESERVED_SIZE 参数为 SQL 大型语句保留一部分 SQL 共享池。
f.Java池
Java池为 Java 命令提供语法分析。 Java 池的大小 ( 以字节为单位 ) 通过在 oracle8i 引入的 init.ora 文件的 JAVA_POOL_SIZE 参数设置。 init.ora 文件的 JAVA_POOL_SIZE 参数缺省设置为 10MB 。
g.多缓冲池
可以在SGA 中创建多个缓冲池,能够用多个缓冲池把大数据集与其他的应用程序分开,以减少它们争夺数据块缓存区内相同资源的可能性。对于创建的每一个缓冲池,都要规定其 LRU 锁存器的大小和数量。缓冲区的数量必须至少比 LRU 锁存器的数量多 50 倍。
创建缓冲池时,需要规定保存区(keeparea) 的大小和再循环区 (recyclearea) 的大小。与 SQL 共享池的保留区一样,保存区保持条目,而再循环区则被频繁地再循环使用。可以通过 BUFFER_POOL_KEEP 参数规定来保存区的大小。例如:保存和再循环缓冲池的容量减少了数据块缓冲存储区中的可用空间 ( 通过 DB_BLOCK_BUFFERS 参数设置 ) 。对于使用一个新缓冲池的表,通过表的 storage 子句中的 buffer_pool 参数来规定缓冲池的名字。例如,如果需要从内存中快速删除一个表,就把它赋予 RECYCLE 池。缺省池叫作 DEFAULT ,这样就能在以后用 altertable 命令把一个表转移到 DEFAULT 池。
2. 程序全局区(PGA) 。
程序全局区(PGA , ProgramGlobalArea) 是存储区中的一个区域,由一个 oracle 用户进程所使用, PGA 中的内存不能共享。 3. 堆栈区
4. 后台进程
数据库拥有多个后台进程,其数量取决于数据库的配置。这些进程由数据库管理,它们只需要进行很少的管理。每个后台进程创建一个跟踪文件。在实例操作期间保存跟踪文件。后台进程跟踪文件的命名约定和位置随操作系统和数据库版本而不同。一般来说,跟踪文件含有后台进程名或后台进程的操作系统进程ID 。可以设置初始化参数文件的 BACKGROUND_DUMP_DEST 参数来规定后台进程跟踪文件的位置,但是有些版本的 oracle 忽略这种设置。排除数据库故障时,跟踪文件就显得非常重要。影响后台进程的严重问题通常记录在数据库的警告日志上。警告日志通常位于 BACKGROUND_DUMP_DEST 目录下。一般来说,这个目录是 ORACLE_BASE 目录下的 /ADMIN/INSTANCE_NAME/BDUMP 目录。
a. SMON
当启动一个数据库时,SMON(SystemMonitor ,系统监控程序 ) 进程执行所需的实例恢复操作 ( 使用联机重做日志文件 ) ,它也可以清除数据库,取消系统不再需要的事务对象。 SMON 的另一个用途是:将邻接的自由盘区组成一个较大的自由盘区。对于某些表空间,数据库管理员必须手工执行自由空间合并; SMON 只合并表空间中的自由空间,这些表空间的缺省 pctincrease 存储值为非零。
b.PMON
PMON( process monitor进程监控程序 ) 后台进程清除失败用户的进程,释放用户当时正在使用的资源。当一个持有锁的进程被取消时,其效果是显而易见的, PMON 负责释放锁并使其可以被其他用户使用。同 SMON 一样, PMON 周期性地唤醒检测它是否需要被使用。
c.DBW n
DBWR(database writer数据库写入程序 ) 后台进程负责管理数据块缓存区及字典缓存区的内容。它以批方式把修改块从 SGA 写到数据文件中。
尽管每一个数据库实例只有一个SMON 和一个 PMON 进程在运行,但是根据平台和操作系统的不同,用户可以同时拥有多个 DBWR 进程。使用多个 DBWR 进程有助于在进行大的操作期间减少 DBWR 中的