简谈Oracle体系结构


 觉得老师在讲Oracle数据库时,底层的只是介绍特别少,Oracle数据库的体系基本完全不明白,完全不明白Oracle的工作机制和过程,在此通过看一些书籍,总结一下:

1.  查看一些数据文件的基本信息
   desc dba_data_files;  //查看数据文件的结构
   select * from dba_data_files;  查看一些基本的信息
   
   select name from v$controlfile; //查看控制文件的name
   
   select group#,status from v$log;  //查看日志文件的组合状态
   
   其他文件还有参数文件,备份文件,归档重做日志文件,以及警告,跟踪文件等等。
   1)参数文件:参数文件用于记录Oracle数据库的一些基本参数信息,主要包括数据库名和控制文件所在路径等等,参数文件分为文本参数文件(PFILE)和服务器参数文件(SPFILE)。
   
   2)备份文件: 文件受损时,可以借助备份文件对受损文件进行数据的恢复,对文件进行还原的过程,就是用备份文件替换该文件的过程。
   
   3)归档重做日志文件:该文件用于对写满的日志文件进行赋值并保存,具体功能由归档进程ARCn实现,该进程负责将写满的重做日志文件复制到归档日志文件中
   
   4)警告,跟踪日志文件
   当一个进程发现了一个内部错误的时候,可以将错误的信息存储到该进程的跟踪文件中,而警告文件则是一种特殊的跟踪文件,它包含错误事件的说明,而随之产生的跟踪文件则记录了错误的详细信息。
   
   
   
 2.
   逻辑存储结构:
   数据块--》区--》段--》表空间--》数据库
   1)表空间:
   这个是Oracle中最大的逻辑存储结构,它与物理上的数据文件相对应,每个Oracle数据库都至少有一个表空间,每个表空间均可以对应多个数据文件,表空间的大小等于构成该表空间的所有数据文件的大小之和。
   select table_name from dba_tablespace;  //查看表空间的名称
   会显示:
   SYSTEM  --系统表空间,用于存储系统的数据字典,系统的管理信息和用户数据等
   SYSAUX  --辅助系统表空间。用于减少系统表空间的符合,提高系统的作业效率
   UNDOTBS1  --撤销表空间。用于在自动撤销管理方式下存储撤销消息
   TEMP  --临时表空间,用于存储临时的数据,例如存储排序时产生的临时数据
   USERS  --用户表空间。用于存储永久性用户对象和私有信息
   EXAMPLE  --实例表空间。用于存放实例数据库的模式对象信息等
   
   2)段
   段是一组盘区,它不再是存储空间的分配单位,而是一个独立的逻辑存储结构。对于具有独立存储结构的对象,它的数据全部存放在保存它的段中,一个段只属于一个特定的数据库对象,每当创建一个具有独立段的数据库对象时Oracle会为它创建一个段。
  
  3)区
  这个是磁盘空间分配的最小单位,由一个或者多个数据块组成。每当一个段中的所有空间爱你被使用完后,系统将自动为该段分配一个新的区。  一个或多个区组成一个段,所以段的大小由区的个数决定,但是一个数据段可以包含区的大小并不是无限制的,它由以下两个参数决定:
  MIN_EXTENTS: 定义段初始分配的区的个数,也就是段最少可分配的个数
  MAX_EXTENTS: 定义一个段最多可以分配的区的个数
   select table_name,min_extents,max_extents from dba_tablespace;  //查看表的最大和最小区的个数
   
   4)块
   数据块是用来管理存储空间的最基本单位,也是最小的逻辑存储单位。Oracl数据库都是以数据块为单位进行逻辑的读写操作。在数据块中可以存储不同类型的数据,如表数据,索引数据等,但是没个数据块都具有相同的结构。
   一个数据块主要由头部,表目录,行目录,空闲空间和行空间组成
   块头部: 包含数据块中一般的属性信息,如数据块的物理地址,所属段的类型
   表目录: 如果数据块中存储的数据是某一个表的数据,则关于该表的信息将会存放在目录中
   行目录: 用来存储数据块中有效的行目录
   空闲空间: 数据块中还没有使用的存储空间
  行空间: 表或者索引的数据存储在行空间中,因此行空间是数据块中已经使用的存储空间。
   
   
   
 3.Oracle的进程结构
  在Oracle数据库启动时候,首先启动Oracle实例,系统建好自动分配SGA(系统全局区)并启动多个后台进程,在启动后台进程后一步的为所有数据库用户执行不同的任务。通过系统查询字典V$BGPROCESS,可以了解数据库中所有的后台进程信息。其中Oracle数据库实例的后台进程主要有DBWin进程,SMON进程,PMON进程,ARCn进程,RECO进程,LCKn进程,Dnnn进程以及SNPn进程。
  
  1.DBWn进程,是数据库采用LRU算法将数据缓冲区的数据写入数据文件的进程。
  
  DBWn进程的作用主要有一下几个方面:
  管理数据缓冲区,以便用户进程能够找到空闲的缓冲区;
  将所有修改后的缓冲区数据写入数据文件
  使用LRU算法将最近使用过得块保留在内存中
  通过延迟写来优化磁盘IO读写
  
  DBWn进程的工作流程如下:
  (1)当一个用户进程产生后,服务器进程就从数据文件中查找是存在用户进程所需要的数据
  
  (2)如果内存中没有需要的数据,服务器进程就从数据文件中读取数据。此时,服务器进程会首先从LRU中查找是否有存放数据的空闲块
  
  (3)如果LRU中没有空闲块,则将LRU中的DIRTY数据块移入DIRTY LIST
  
  (4)如果DIRTYLIST超长,服务器进程通知DBWn进程将数据写入磁盘,并刷新缓冲区
  
  (5)当LRU中有空闲块后,服务器进程从磁盘的数据文件中读取数据并存放到数据缓冲区
  
  其他进程简单的了解一下:
  LGWR 进程
  负责将日志缓冲区中的日志数据写入到磁盘的日志文件中,Oracle数据库运行时,对数据库的修改操作将被记录到日志文件信息中,而这些日志信息将首先保存在日志缓冲区中,当日志信息达到一定量时,由LGWR进程将日志数据写入日志文件。 日志缓冲区是一个循环缓冲区,当LGWR进程将日志缓冲区的日志数据写入日志文件后,服务器进程又可以将新的日志数据保存到日志缓冲区。
  
  SMON进程
  用于数据库实例出现故障或系统崩溃的时候,通过联机重做日志文件中的条目应用于数据库文件来执行崩溃恢复,SMON进程一般用于定期合并字典管理的表空间中的空闲空间,此外,它还用于在系统重新启动期间清理所有表空间的临时字段。
  
  PMON进程
  用于清理失效的用户进程,释放用户进程所用的资源,PMON周期性的检查调度进程和服务器的状态,如果发现进程已死,则重新启动它,PMON进程被有规律的唤醒,检查是否需要使用,或者其他进程发现需要时也可以调用此进程
  
  ARCn进程
  这个有两种运行方式,分别是归档方式和非归档方式,当且仅当Oracle数据库运行在归档模式下时才产生ARCn进程,该进程主要用于将写满的日志文件复制到归档日志文件中,防止日志文件组中的信息由于日志文件的循环使用而被覆盖。
  在一个Oracle数据库实例中,允许请的ARCn进程的个数由参数LOG_ARCHIVE_MAX_PROCESS 决定,可通过SHOW PARAMETER语句查询该参数
  show parameter log_archive_max_process 得出结果为4
  
  
  RECH进程
  存在于分布式数据库系统中,主要负责在分布式数据库环境中自动回复那些失败的分布式事务。
  
  LCKn进程
  LCKn进程 用于实现实例间的封锁,它存在于并行服务器系统中。在一个Oracle数据库实例中,最多可以启动10个LCKn进程,进程名称分别是LCK0,LCK1....LCK9
  
  Dnnn进程
  用于将多个用户进程连接到服务器进程,它存在于多线程服务器结构体系中Dnnn可以启动多个,其名称分别为D001,D002.....
  
  SNPn进程
  用于处理数据库快照的自动刷新,在Oracle数据库中,通过参数JOB_QUEUE_PROCESS来设置快照进程的个数。通过SHOW PAREMETER JOB_QUEUE_PROCESS语句,可以了解参数信息。
  
5.  Oracle内存结构
  1) 系统全局区域 SGA
  全局区域由一块内存结构组成,他是所有用户进程共享的一块内存区域,可以包含一个数据库实例的数据或控制信息,在一个数据库实例中,可以有多个用户进程,这些用户进程共享系统全局区域中的数据,因此在系统全局区域中又称为共享区域。 它的大小由sga_max_size决定
  
  在系统全局区中,可以按照不同的作用分为数据缓冲区,日志缓冲区和共享池。
  (1)数据缓冲区用于存放最近访问的数据块信息,当用户想数据库请求数据时,如果所需的数据已经位于数据库缓冲区,则Oracle将直接从数据缓冲区中提取信息并返回给用户,而不必再从数据文件中国读取数据。它供所有用户共享 大小youdb_cache_size决定
  
  (2)日志缓冲区
  日志缓冲区用于存储数据库的修改操作信息,当日止缓冲区的日志数量达到一定的程度的时候,有日志写入进程LGWR将日志写入磁盘日志文件。 它的大小由log_buffer决定。 我的显示为 6340608
  
  (3)共享池
  用于保存最近执行的SQL语句,PL/SQL程序的数据字典信息,它是对SQL语句和PL/SQL语句进行语法分析,编译,和执行的内存区域,共享池主要包括以下三种缓存
       库缓冲区:用于保存SQL语句的分析代码和执行计划,在缓冲区中不通的数据库用户可以共享相同SQL语句。
    
    数据字典缓冲区:用于保存字典中得到的表,列定义和权限
    
    用户全局区:用于保存用户的会话信息。大小由share_pool_size 决定 可以使用 show parameter share_pool_size 查看大小
 
  2)程序全局区域
    程序全局区域是Oracle系统分配给一个进程的私有内存区域,包含单个用户或服务器数量可控制信息,它在用户连接到数据库并创建一个会话的时候,由Oracle自动分配。 全局区域大小由参数pga_aggregate_target决定,通过show parameter pga..可以查看它的信息  我的显示是0 (表示禁用)(PGA_AGGREGATE_TARGET参数用于控制PGA的总体期望目标)
 
  3)排序区
 这是Oracle系统为排序操作产生的临时数据提供的内存空间,实际上,在Oracle中,存放用户排序操作产生临时数据区域由内存区和磁盘临时段。 当进行排序操作时候,Oracle系统会优先使用内存排序进行排序,如果内存空间不够,才使用临时段进行排序。  排序的大小由sort_area_size决定。 (我的显示为65535)
 
  4)大型池
  这个是系统全局区域中可选的一个内存结构,用于提供一个大的缓冲区数据库的备份与恢复操作使用。大型池的大小由参数large_pool_size决定。
  
  5)Java池
  这个用于在数据库中支持Java的运行。例如,使用java编写一个存储过程,这是Oracle的Java虚拟机就会使用Java池来处理用户对话中的Java存储过程,大小由参数 java_pool_size决定。
发布了160 篇原创文章 · 获赞 5 · 访问量 11万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章