博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oracle数据库对象的逻辑、物理、内存结构
阅读量:6638 次
发布时间:2019-06-25

本文共 11728 字,大约阅读时间需要 39 分钟。

hot3.png

一、先谈谈数据库和实例:

实例是个动态概念,它由一系列进程和内存区域组成;而数据库是个静态概念,主要指的是构成数据库的一系列文件。一般情况下实例与数据库是一对一的,但是在多实例数据库环境下,一个数据库可以对应多个实例。

实例 instance =进程 + 进程所使用的内存(SGA)
数据库 database=物理操作系统文件或磁盘(disk)的集合(redo文件+control文件+data文件+临时文件)
数据库实例也称作服务器, 是用来访问数据库文件集的存储结构及后台进程的集合.
1、一个数据库可以被多个实例访问(称为真正的应用群集选项).
2、一个实例在其生存期内只能装载(alter database mount)和打开(alter database open)一个数据库
3、Oracle的实例在启动以后,只能load一次数据库,如果想把数据库与Instance断开,然后再重新挂在一个数据库Instance,那么就需要你首先把数据库Instance进程结束,然后重新建立这个instance的一个进程,再load另外一个数据库。否则肯定要抛除ORA-16169错误,说数据库已经被打开。因为一个数据库Instance在其生存期中最多只能load和打开一个instance。.
4、另外实例可以在没有数据文件的情况下单独启动 startup nomount , 通常没什么意义。

二、数据库的逻辑和物理结构

数据库(实例)——X表空间——X段——X扩展(区)——X数据块--(OS Block)

对应的数据字典:
v$database--dba_tablespaces(user_tablespaces)-- dba_segments(user_segments)--dba_extents(user_Extents)--extent(或segment)表中的一个字段BLOCKS
数据库、表空间、段、扩展、数据块为逻辑结构
数据文件(dba_data_files)、操作系统块为物理结构

数据文件有以下类型:

1.数据文件(Data File)    数据文件用来存储数据库中的全部数据,例如数据库表中的数据和索引数据.通常以为*.dbf格式,例如:userCIMS.dbf 。2.日志文件(Redo Log File)    日志文件用于记录数据库所做的全部变更(如增加、删除、修改)、以便在系统发生故障时,用它对数据库进行恢复。名字通常为Log*.dbf格式,如:Log1CIMS.dbf,Log2CIMS.dbf 。  3.控制文件(Control File)     每个Oracle数据库都有相应的控制文件,它们是较小的二进制文件,用于记录数据库的物理结构,如:数据库名、数据库的数据文件和日志文件的名字和位置等信息。用于打开、存取数据库。名字通常为Ctrl*ctl 格式,如Ctrl1CIMS.ctl。  4.配置文件    配置文件记录Oracle数据库运行时的一些重要参数,如:数据块的大小,内存结构的配置等。名字通常为init*.ora 格式,如:tnsname.ora 。  

段(segment)是一种在数据库中消耗物理存储空间的任何实体,在12c中段的类型由:表(table),索引(Index), 回滚(Rollback),分区等12种组成,下面的sql可查看所有段的类型。

SQL> select distinct segment_type from dba_segments;SEGMENT_TYPE------------------------------------------------------LOBINDEXINDEX PARTITIONTABLE SUBPARTITIONROLLBACKTABLE PARTITIONNESTED TABLELOB PARTITIONLOBSEGMENTINDEXTABLETYPE2 UNDOSEGMENT_TYPE------------------------------------------------------CLUSTER已选择12行。

表和段的关系:表是段的一种(一个表可对应一个或多个段),但段不一定是表。表是逻辑对象;段是物理存储对象

通过下面的sql语句可以查看某个表空间的段、区、块的分布情况。

SQL> set pagesize 100; SQL> col SEGMENT_NAME format a20SQL> select SEGMENT_NAME, extent_id,block_id,blocks,bytes  from dba_extents where  tablespace_name='USERS';SEGMENT_NAME	      EXTENT_ID   BLOCK_ID     BLOCKS	   BYTES-------------------- ---------- ---------- ---------- ----------OJDS$PERM_INDEX 	      0        168	    8	   65536OJDS$NODE_INDEX 	      0        136	    8	   65536SYS_C005161		      0        152	    8	   65536OJDS$PERMISSIONS$	      0        160	    8	   65536OJDS$INODE$		      0        128	    8	   65536OJDS$BINDINGS$		      0        144	    8	   65536PK_EMP			      0        200	    8	   65536PK_DEPT 		      0        184	    8	   65536SALGRADE		      0        216	    8	   65536BONUS			      0        208	    8	   65536EMP			      0        192	    8	   65536DEPT			      0        176	    8	   65536已选择12行。

DBA_TABLESPACES记录的是表空间的逻辑信息,而DBA_DATA_FILES视图则记录的是物理数据文件的信息,这些信息包括数据文件的名称、大小、所属表空间等信息:

SQL> select file_id,relative_fno,file_name,tablespace_name,round(bytes/1024/1024,2) MB from dba_data_files;
SQL> select FILE_ID as fid,FILE_NAME ,BYTES from dba_data_files;       FID FILE_NAME						   BYTES---------- -------------------------------------------------- ----------	 4 /u01/app/oracle/oradata/XE/users.dbf 	       104857600	 2 /u01/app/oracle/oradata/XE/sysaux.dbf	       681574400	 3 /u01/app/oracle/oradata/XE/undotbs1.dbf		31457280	 1 /u01/app/oracle/oradata/XE/system.dbf	       377487360	 5 /u01/app/oracle/oradata/XE/mymotif_ts.dbf	       104857600

可以通过DBA_SEGMENTS查询数据库中段的信息,这些信息包括对象名称、类型、所属表空间、空间使用等信息。DBA_EXTENTS视图记录了Segment中区的分配情况,可以通过以下两个查询获得某个用户每个区的分配情况:

SQL> select distinct OWNER from dba_extents ;OWNER--------------------------------------------------------------------------------APEX_040200MDSYSMYMOTIFOUTLNCTXSYSSYSTEMAUDSYSDVSYSSCOTTGSMADMIN_INTERNALORDSYSDBSNMPOJVMSYSORDDATAXDBSYSLBACSYSWMSYS已选择18行。SQL> col SEGMENT_NAME format a20SQL> select segment_name,file_id,extent_id,block_id,blocks from dba_extents where OWNER='SCOTT';SEGMENT_NAME		FILE_ID  EXTENT_ID   BLOCK_ID	  BLOCKS-------------------- ---------- ---------- ---------- ----------SALGRADE		      6 	 0	  216	       8PK_EMP			      6 	 0	  200	       8PK_DEPT 		      6 	 0	  184	       8EMP			         6 	   0	  192	       8DEPT			      6 	 0	  176	       8BONUS			      6 	 0	  208	       8已选择6行。

数据库逻辑上最小的单元就是data block, block 可以设置为2K, 4K, 8K....

利用dba_tablespaces可以用来查看所有表空间的基本信息;而dba_data_files可以用来查看相关数据文件的信息(需要管理员权限)。

例:

1、查看当前数据库所有表空间:

SQL> select TABLESPACE_NAME from dba_tablespaces;TABLESPACE_NAME---------------SYSTEMSYSAUXUNDOTBS1TEMPUSERSMYMOTIF_TS已选择6行。

2、查询当前数据库中的所有表空间和对应的操作系统数据文件:

SQL> col FILE_NAME format a40SQL> select file_name,tablespace_name from dba_data_files;FILE_NAME				 TABLESPACE_NAME---------------------------------------- ---------------/u01/app/oracle/oradata/xe/system01.dbf  SYSTEM/u01/app/oracle/oradata/xe/sysaux01.dbf  SYSAUX/u01/app/oracle/oradata/mymotif_ts.dbf	 MYMOTIF_TS/u01/app/oracle/oradata/xe/users01.dbf	 USERS/u01/app/oracle/oradata/xe/undotbs01.dbf UNDOTBS1

3、当前用户(scott)下的数据段:

SQL>  desc user_segments 名称                                    是否为空? 类型 ----------------------------------------- -------- ---------------------------- SEGMENT_NAME					    VARCHAR2(128) PARTITION_NAME 				    VARCHAR2(128) SEGMENT_TYPE					    VARCHAR2(18) SEGMENT_SUBTYPE				    VARCHAR2(10) TABLESPACE_NAME				    VARCHAR2(30) BYTES						    NUMBER BLOCKS 					    NUMBER EXTENTS					    NUMBER INITIAL_EXTENT 				    NUMBER NEXT_EXTENT					    NUMBER MIN_EXTENTS					    NUMBER MAX_EXTENTS					    NUMBER MAX_SIZE					    NUMBER RETENTION					    VARCHAR2(7) MINRETENTION					    NUMBER PCT_INCREASE					    NUMBER FREELISTS					    NUMBER FREELIST_GROUPS				    NUMBER BUFFER_POOL					    VARCHAR2(7) FLASH_CACHE					    VARCHAR2(7) CELL_FLASH_CACHE				    VARCHAR2(7) INMEMORY					    VARCHAR2(8) INMEMORY_PRIORITY				    VARCHAR2(8) INMEMORY_DISTRIBUTE				    VARCHAR2(15) INMEMORY_DUPLICATE				    VARCHAR2(13) INMEMORY_COMPRESSION				    VARCHAR2(17)SQL> column  TABLESPACE_NAME format a20SQL> column  SEGMENT_NAME format a20SQL> select SEGMENT_NAME,TABLESPACE_NAME from user_segments;SEGMENT_NAME	     TABLESPACE_NAME-------------------- --------------------COURSE		     MYMOTIF_TSSC		     MYMOTIF_TSSTUDENT 	     MYMOTIF_TSSYS_C0010000	     MYMOTIF_TSSYS_C0010005	     MYMOTIF_TSSYS_C0010008	     MYMOTIF_TS已选择6行。(12c在sysdba下有3000多条记录)SQL>  select SEGMENT_NAME,EXTENT_ID from user_extents;SEGMENT_NAME	      EXTENT_ID-------------------- ----------STUDENT 		      0COURSE			      0SC			      0SYS_C0010000		      0SYS_C0010005		      0SYS_C0010008		      0已选择6行。(12c在sysdba下有4920条记录)

基本上每个对象对应一个段( Segment),只有分区对应多个段,这里的对象包括表、视图、序列、同意词、索引、触发器、存储.过程等等,段可以跨越多个数据文件。

查看表空间的使用情况

SQL> col TABLESPACE_NAME format a20SQL> SELECT a.tablespace_name,a.bytes total,b.bytes used,c.bytes free,(b.bytes * 100) / a.bytes "% USED ",(c.bytes * 100) / a.bytes "% FREE " FROM sys.sm$ts_avail a, sys.sm$ts_used b, sys.sm$ts_free c WHERE a.tablespace_name = b.tablespace_name AND a.tablespace_name = c.tablespace_name;TABLESPACE_NAME 	  TOTAL       USED	 FREE	 % USED     % FREE-------------------- ---------- ---------- ---------- ---------- ----------SYSAUX		      765460480  705232896   59899904 92.1318493 7.82534247UNDOTBS1	      104857600   67502080   36306944	  64.375     34.625USERS			5242880     786432    3407872	      15	 65SYSTEM		      838860800  829095936    8716288 98.8359375  1.0390625MYMOTIF_TS	      104857600   15663104   99483648	 14.9375     94.875

三、Oracle Server系统进程与内存结构  

  当在计算机服务器上启动Oracle数据库后,称服务器上启动了一个Oracle实例(Instance)。ORACLE 实例(Instance)是存取和控制数据库的软件机制,它包含系统全局区(SGA)和ORACLE进程两部分。SGA是系统为实例分配的一组共享内存缓冲区,用于存放数据库实例和控制信息,以实现对数据库中数据的治理和操作。  

  进程是操作系统中一个极为重要的概念。一个进程执行一组操作,完成一个特定的任务.对ORACLE数据库治理系统来说,进程由用户进程、服务器进程和后台进程所组成。  
  当用户运行一个应用程序时,系统就为它建立一个用户进程。服务器进程处理与之相连的用户进程的请求,它与用户进程相通讯,为相连的用户进程的ORACLE请求服务。  
  为了提高系统性能,更好地实现多用户功能,ORACLE还在系统后台启动一些后台进程,用于数据库数据操作。  

       系统进程的后台进程主要包括:

  SMON 系统监控进程:(system monitor)负责完成自动实例恢复和回收分类(sort)表空间。   PMON 进程监控进程:(PRocess monitor)实现用户进程故障恢复、清理内存区和释放该进程所需资源等。   DBWR 数据库写进程:数据库缓冲区的治理进程。在它的治理下,数据库缓冲区中总保持有一定数量的自由缓冲块,以确保用户进程总能找到供其使用的自由缓冲块。   LGWR 日志文件写进程:是日志缓冲区的治理进程,负责把日志缓冲区中的日志项写入磁盘中的日志文件上。每个实例只有一个LGWR进程。  ARCH 归档进程:(archiver process)把已经填满的在线日志文件拷贝到一个指定的存储设备上。仅当日志文件组开关(switch)出现时,才进行ARCH操作。ARCH不是必须的,而只有当自动归档可使用或者当手工归档请求时才发出。  RECO 恢复进程:是在具有分布式选项时使用的一个进程,主要用于解决引用分布式事务时所出现的故障。它只能在答应分布式事务的系统中出现。  LCKn 封锁进程:用于并行服务器系统,主要完成实例之间的封锁。 

内存结构(SGA)

  SGA是Oracle为一个实例分配的一组共享内存缓冲区,它包含该实例的数据和控制信息。SGA在实例启动时被自动分配,当实例关闭时被收回。数据库的所有数据操作都要通过SGA来进行。

SQL> show parameter sga_max_size;NAME                                 TYPE                              VALUE------------------------------------ --------------------------------- ------------------------------sga_max_size                         big integer                       3232MSQL> show parameter pga_aggregate_target;NAME                                 TYPE                              VALUE------------------------------------ --------------------------------- ------------------------------pga_aggregate_target                 big integer
SQL> select * from v$sga;NAME								  VALUE------------------------------------------------------------ ----------Fixed Size							2228848Variable Size						      251661712Database Buffers					      343932928Redo Buffers							3448832

  

SGA中内存根据存放信息的不同,可以分为如下几个区域:
1、Buffer Cache:存放数据库中数据库块的拷贝。
    它是由一组缓冲块所组成,这些缓冲块为所有与该实例相链接的用户进程所共享。缓冲块的数目由初始化参数DB_BLOCK_BUFFERS确定,缓冲块的大小由初始化参数DB_BLOCK_SIZE确定。大的数据块可提高查询速度。它由DBWR操作。

2、日志缓冲区Redo Log Buffer:存放数据操作的更改信息。

    它们以日志项(redo entry)的形式存放在日志缓冲区中。当需要进行数据库恢复时,日志项用于重构或回滚对数据库所做的变更。日志缓冲区的大小由初始化参数LOG_BUFFER确定。大的日志缓冲区可减少日志文件I/O的次数。后台进程LGWR将日志缓冲区中的信息写入磁盘的日志文件中,可启动ARCH后台进程进行日志信息归档。
3、共享池Shared Pool:包含用来处理的SQL语句信息。
    它包含共享SQL区和数据字典存储区。共享SQL区包含执行特定的SQL语句所用的信息。数据字典区用于存放数据字典,它为所有用户进程所共享。
4、Cursors:一些内存指针,执行待处理的SQL语句 
5、其他信息区:除了上述几个信息区外,还包括一些进程之间的通讯信息(如封锁信息);在多线索服务器配置下,还有一些程序全局区的信息,请求队列和响应队列等。

--------------------------------------------------------------------------

后台进程详解

 

oracle中的进程共分为三类:用户进程、服务进程、后台进程。其中后台进程伴随实例的启动而启动,他们主要是维护数据库的稳定,相当于一个企业中的管理者及内部服务人员。他们并不会直接给用户提供服务。

1:database write(DBWn(n代表数字1..n,表示可能有几个DBW在运行) )--数据写入
   作用:把SGA中被修改的数据同步到磁盘文件中。保证Buffer Cache中有足够的空闲数据块数量。
   触发条件: 1)、检查点 2)、一个服务进程在设定的时间内没有找到空闲块3)、每三秒自动唤醒一次。
   设置:DB_WRITER_PROCESS用来定义DBWn进程数量。(commit命令只是把记录修改写入日志文件,不是把修改后的数据写入数据文件)

2:log write(LGWR)--日志文件写入

   作用:把log buffer中的日志内容写入联机的日志文件中,释放log用户buffer空间。
   触发条件:

           1)、用户发出commit命令。(在oracle中称为快速提交机制(fast commit)):把redo log buffer中的记录写入日志文件,写入一条提交的记录

            2)三秒定时唤醒。
            3)log buffer超过1/3,或日志数量超过1M。
            4)DBWR进程触发:DBWn视图将脏数据块写入磁盘先检测他的相关redo记录是否写入联机日志文件,如果没有就通知LGWR进程。在oracle中成为提前写机制(write ahead):redo记录先于数据记录被写入磁盘

3:checkpoint(CKPT)-检查点事件

   作用:维护数据库一致性状态。检测点时刻数据文件与SGA中的内容一致,这不是一个单独的进程,要和前两个进程一起工作呦。DBWR写入脏数据,同时触发LGWR进程。
      CKPT更新控制文件中的检查点记录。
   触发条件:日志切换(log switch)会触发检查点。

4:process monitor(PMON)--进程监控

   作用:1)发现用户进程异常终止,并进行清理。释放占用资源。(清理异常终止用户使用的锁)
           2)向监听程序动态的注册实例。
   触发条件:定时被唤醒,其他进程也会主动唤醒它。

5:system monitor:(SMON)--系统监控

   作用:1)负责实例恢复,前滚(Roll Forward)恢复到实例关闭的状态,使用最后一次检查点后的日志进程重做。这时包括提交和未提交的事务。打开数据库,进行回滚(Roll Back):回滚未提交的事务。(oracle承诺commit之后数据不会丢失,现在我们可以大致的了解是如何实现这个承诺,以及在数据的安全性和数据库性能之间的平衡选择。)
        2)负责清理临时段,以释放空间

触发条件:定期被唤醒或者被其他事务主动唤醒。

6:archive:(ARCn)--归档操作

   作用:发生日志切换时把写满的联机日志文件拷贝到归档目录中。
   触发条件:日志切换时被LGWR唤醒。
   设置:LOG_ARCHIVE_MAX_PROCESSES可以设置oracle启动的时候ARCn的个数。

7:manageability monitor:MMON--AWR主要的进程

   作用:1、收集AWR必须的统计数据,把统计数据写入磁盘。10g中保存在SYSAUX表空间中。
          2、生成server--generated报警
   每小时把shared pool中的统计信息写入磁盘,或者shared pool占用超过15%。

8:manageability monitor light:MMNL:轻量级的MMON

9:memory manager:MMAN:自动内容管理

   作用:每分钟都检查AWR性能信息,并根据这些信息来决定SGA组件最佳分布。
   设置:STATISTICS_LEVEL:统计级别
        SGA_TARGET:SGA总大小

10:job queue coordinator:CJQ0--数据库定时任务

11:recover writer:RVWR

   作用:为flashback database提供日志记录。把数据块的前镜像写入日志。

12:change tarcking writer:CTWR

   作用:跟踪数据块的变化,把数据块地址记录到 change_tracking file文件中。RMAN的增量备份将使用这个文件来确定那些数据块发生了变化,并进行备份。

以上是oracle中比较常见的后台进程,不是所有的进程。其中DBWn,ARCn可以设置数据库启动时的数量。这些进程在系统中可以不止一个。

 





 

转载于:https://my.oschina.net/u/2245781/blog/1585823

你可能感兴趣的文章
机器学习实战_人工神经网络
查看>>
Laravel核心解读 -- 扩展用户认证系统
查看>>
关于MySQL的知识点与面试常见问题都在这里
查看>>
CSS module 入门
查看>>
浅谈软件工程师的代码素养
查看>>
docker+jenkins+golang持续集成实践[转载自我的博客]
查看>>
Python 面向对象
查看>>
Vue路由使用总结
查看>>
Spring Boot入门(8)文件上传和数据预览
查看>>
js面试题
查看>>
Java多态
查看>>
js设计模式 --- 策略设计模式
查看>>
编写小而美函数的艺术
查看>>
art_template模板引擎渲染数据的小方法
查看>>
nodejs笔记-模块机制
查看>>
DuiC 性能测试报告 20180203
查看>>
“unspecified on project app resolves to an APK……”错误的解决方法
查看>>
聊聊ImageIO使用argb操作jpg的bug
查看>>
PHP 的 错误/异常 处理总结
查看>>
基于Node(bootstrap+ejs+express+formidable+fs-extra)制作的在线相册资源管理器
查看>>