Oracle 数据库的组成(instance+database)

Oracle 数据库的组成(instance+database)Oracle 数据库的组成(instance+database)Oracle 数据库的组成(instance+database)Oracle 数据库的组成(instance+database)Oracle 数据库的组成(instance+database)

Oracle服务器是一种对象关系数据库管理系统,它为信息管理提供开放、综合、集成的方法。

Oracle服务器中有多种进进程、内存结构和文件;

Oracle服务器由一个Oracle实例和一个Oracle数据库组成。

Oracle服务器:Oracle实例+Oracle数据库

Oracle实例:后台进程+内存结构

(必须启动实例才能访问数据库中的数据,每次启动实例,都会分配系统全局去SGA并启动Oracle后台进程)

SGA是用于村粗数据库信息的内存区,该信息为数据库进程所共享。

后台进程代表调用进程执行功能。它们把为每个用户运行的多个oracle程序所处理的功能统一起来。

后台进程执行i/o并监控其他oracle进程以增加并行性,从而使性能和可靠性更加优越。

Oracle数据块:物理结构+逻辑结构

Oracle存储结构:物理结构+逻辑结构

物理结构:

主要文件

数据文件

重做日志文件

控制文件

其他文件

参数文件

归档日志文件

逻辑结构:

表空间

数据块

Oracle内存结构

系统全局区SGA(Oracle实例启动时分配系统全局区)

程序全局区PGA(服务器进程启动时分配程序全局区)

用户全局区UGA(用户全局区为用户进程存储回话状态)

Oracle 数据库的组成

  • 实例 instance

– 内存

• sga,pga,streams pool....

– 进程

• Oracle 后台进程(为oracle实例服务,PMON、SMON等)

• 服务器端进程

• 客户端进程

  • 数据库 database

– 文件

• 控制文件,重做日志文件,数据文件

  • 其它组成部分

– 参数文件,密码文件(放置sys用户的口令),Archived归档日志(redo文件的备份)

  • 数据库 database

数据库是一个静态的,被动的文件.

  • 实例=内存区+后台进程
    • 实例的内存区:SGA+PGA,内存是一块区域.
    • 后台进程:使用/操作实例的内存区.

SGA(系统全局区system global area)

  • 在SGA区中数据是共享的,所有人都可以看到的数据.
  • Oracle最重要的内存区域,是数据库*享资源的内存区域.

1、Database Buffer Cache(数据缓冲区)

  • 数据块
    • 表的数据记录是放在数据块里的.
    • oracle最小的单位是数据块.
    • 数据块被读到内存里(oracle查询是在内存里完成的.数据处理要内存来完成)
    • 某个用户从磁盘里读了一个数据块,放到内存里来,这个数据块被所有人所共有.

2、Shared pool

  • Library cache(库高速缓存)
    • SQL的一些信息.
      • 比如一条SQL被解析了,生成了执行计划,这条SQL生成的执行计划可以被其他用户使用.如果其他用户再查询这条SQL就不用解析了,就可以直接使用这个执行计划.
  • Data Dictionary Cache(数据字典高速缓存)
    • 数据字典信息
      • 如表的属性,列,存储 空间,权限等信息.

3、Redo log buffer(重做日志区)

Oracle 数据库的组成(instance+database)

SGA 区里发生了什么?

  • SQL语句在这里被解析,生成执行计划,执行计划被共享。
  • 数据在这里被访问,被共享。
  • 重做日志在这里被产生。

SGA内存配置(show parameter sga)

PGA

PGA自己的内存区:

  • Sort Area(排序区):当排序区不够就放到临时表空间中排序.
  • Hash Area
  • Bitmap Merge Area
  • Session Memory
  • Persistent Area
  • Runtime Area
    • 是某个会话独有的数据和其他的一些东西.
    • 每个会话都不一样,每个会话都有自己的PGA.
    • 属于每一个会话私有的内存区.

PGA 里发生了什么?

  • 私有SQL区

– 私有SQL区包含了:

1、绑定变量值的信息.

2、运行时期内存结构信息等数据。

-每一个运行SQL语句的会话都有一个块私有SQL区。

-所有提交了相同SQL语句的用户都有各自的私有SQL区,并且他们共享一个共享SQL区。因此,一个共享SQL区可能和多个私有共享区相关联。

  • 游标和SQL区

– 一个Oracle预编译程序或OCI程序的应用开发人员能够很明确的打开一个游标,或者控制一块特定的私有SQL区,将他们作为程序运行的命名资源。

  • 会话内存

基于排序的操作(ORDER BY、GROUP BY、ROLLUP、窗口函数);

– Hash Join

– Bitmap merge

– Bitmap create

PGA是所有会话的总和

PGA会话内存总和(pga_alloc_mem)

后台进程

Oracle 数据库的组成(instance+database)

SQL> desc v$bgprocess;

SQL> select count(*) from v$bgprocess;

SQL> select name from v$bgprocess;

后台进程是一段代码,完成一些固定的功能.

后台进程定义:为了最大的性能和容纳更多的用户,oracle使用额外的进程被叫做后台进程处理。

一、后台进程主要包括:

    • Database Writer Process(DBWn)
    • Log Writer Process(LGWR)
    • CheckPoint Process(CKPT)
    • System Monitor Process(SMON)
    • Process Monitor Process(PMON)
    • Recoverer Process(RECO)
    • Job Queue Processes
    • Archiver Processes(ARCn)
    • Queue Monitor Processes (QMNn)
    • Other Background Processes
 

DBWn(Database Writer Process)

      • n是指ORACLE可以启动多个Database Writer Process
      • 内存中有很多脏数据,有很多数据在修改,一个Database Writer Process不够用,就会启多个Database Writer Process
      • DBWn是数据库后台写入进程,负责把buffer cache内的脏数据(当buffer cache被修改了,就会标成脏数据)写入数据库.DBWn的主要工作是把脏数据写入磁盘以保证buffer cache是干净的.
      • 用户进程会产生脏数据,空余的缓冲区会减少.如果空闲的缓冲区太少,用户进程从磁盘读取block进缓冲区的时候就找不到空余的位置了.DBWn管理buffer cache保证用户进程始终可以找到空闲的位置.

在什么触发DBWR进程的条件:

1.当脏缓冲区的数量超过了所设定的限额。

2.当所设定的时间间隔到了。

3.当有进程需要数据库高速缓冲区却找不到空闲的缓冲区时。当server process在buffer cache中无法找到可用的buffer时,调用该进程,保证用户进程始终可以在buffer cache中找到空闲的位置;

4.当校验点发生时。 接收到CKPT(检查点,checkpoint)进程的指令后,调用该进程,将数据写入到磁盘中。

5.当某个表被删除或被截断时。

6.当某个表空间被设置为只读状态时。

7.当使用类似于alter tablespace users begin backup的命令对某个表空间进行联机备份时。

8.当某个临时表空间被设置为只脱机状态或正常状态时。

查看DB_WRITER_PROCESSES参数

SQL> show parameter db_writer_processes

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     1

SQL>

修改DB_WRITER_PROCESSES参数

作为一个DBA,可以通过设置多个DBWn进程来加快脏数据写入磁盘的速度。在sqlplus中,连接上数据库后,使用命令如下命令即可查看并改写该进程个数:(需重启数据库生效)

可通过设置DB_WRITER_PROCESSES的参数来让多个DBWR来进行写操作

1.show parameter db_writer_processes

2.alter system set db_writer_processes=9 scope=spfile(网有说是最多10个dbwr同时进行写操作,但是官方的文档上说有20个,本人没有测试过)

3.shutdown immediate

4.startup

SQL> alter system set db_writer_processes=8 scope=spfile;

System altered.

SQL> show parameter db_writer_processes

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     1

SQL> startup force

ORACLE instance started.

Total System Global Area 1653518336 bytes

Fixed Size                  2253784 bytes

Variable Size            1207962664 bytes

Database Buffers          436207616 bytes

Redo Buffers                7094272 bytes

Database mounted.

Database opened.

SQL> show parameter db_writer_processes

NAME                                 TYPE        VALUE

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

db_writer_processes                  integer     8

SQL>

官方文档关于dbwn的说明

Database Writer Process (DBWn)

The database writer process (DBWn) writes the contents of buffers to datafiles. The DBWn processes are responsible for writing modified (dirty) buffers in the database buffer cache to disk. Although one database writer process (DBW0) is adequate for most systems, you can configure additional processes (DBW1 through DBW9 and DBWa through DBWj) to improve write performance if your system modifies data heavily. These additional DBWn processes are not useful on uniprocessor systems.

数据库的dbwn进程主要是把缓存的内容写到数据文件中。dbwn进程主要负责把数据库的高速缓存中的脏数据写到硬盘上。虽然一个dbwn进程能够满足大部分的系统,如果你的系统脏数据太多,你也可以配置(dbw1到dbw9或dbwa到dbwj)来改善写性能。在单进程的系统上增加dbwn进程没有用。

When a buffer in the database buffer cache is modified, it is marked  dirty. A cold buffer is a buffer that has not been recently used according to the least recently used (LRU) algorithm. The DBWn process writes cold, dirty buffers to disk so that user processes are able to find cold, clean buffers that can be used to read new blocks into the cache. As buffers are dirtied by user processes, the number of free buffers diminishes. If the number of free buffers drops too low, user processes that must read blocks from disk into the cache are not able to find free buffers. DBWn manages the buffer cache so that user processes can always find free buffers.

在数据库高速缓存中当有一个缓存被修改,它就变成了脏数据了。一个冷缓存就是最近没有被访问的缓存块。dbwn进程写冷块,脏缓存到硬盘,所以用户进程能够找到冷块,清除缓,能把新的块读进缓存中去。缓存被用户进程变脏,空闲缓存的数量就变少了。如果空闲的缓存下降的太少了,如果缓存不能找到空闲的块用户进程就必须从硬盘中读块。dbwn管理着高速缓存是为了让用户进程总能找到空闲的缓存。

SGA只会将修改了的数据(脏数据)写入磁盘

LGWR(Log Writer Process)

Oracle 数据库的组成(instance+database)

LGWR进程在启动实例时启动

LGWR是把log_buffer中的日志条目(ORACLE把客户提交的SQL语句转换成ORACLE能够识别、通过它可以重构数据的一种日志格式)写入到日志文件中.

LGWR保存日志条目,迅速释放log_buffer空间,只要该日志条目写入到日志文件,所占的内存空间就释放.所以log_buffer的功能就是临时的存放日志条目,循环的使用,如果log_buffer满了,就无法接受新的事务,就会发生实例挂起现象.

LGWR的作用:

将日志缓存区的数据从内存写到磁盘的redo文件里,完成数据库对象创建、更新等操作过程中的记录。

LGWR的一些理解:

LGWR,是Log Writer的缩写,也是一种后台进程。主要负责将日志缓冲内容写到磁盘的在线重做日志文件或组中。DBWn将dirty块写到磁盘之前,所有与buffer修改相关的redo log都需要由LGWR写入磁盘的在线重做日志文件(组),如果未写完,那么DBWn会等待LGWR,也会产生一些相应的等待事件(例如:log file prarllel write,后面单独作为话题再聊)。总之,这样做的目的就是为了当crash时,可以有恢复之前操作的可能,也是Oracle在保持交易完整性方面的一个机制。

相关知识点:

1、LGWR写日志是顺序写,这就解释了一个Orace Server只能有一个LGWR进程,不能像DBWR那样可以有多个,否则就无法保证顺序写的机制,而且可能会产生锁的问题。

2、用户进程每次修改内存数据块时,都会在日志缓冲区(redo buffer)中构造一个相应的重做条目(redo entry),它记录了被修改数据块修改之前和之后的值。

3、LGWR将redo entry写入联机日志文件的情况可以概括为两种:后台写和同步写,或者说异步写和同步写。

可以使用如下命令查看日志文件位置:

SQL> select group#,member from v$logfile;

GROUP#

----------

MEMBER

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

3

/u01/app/oracle/oradata/gaga01/redo03.log

2

/u01/app/oracle/oradata/gaga01/redo02.log

1

/u01/app/oracle/oradata/gaga01/redo01.log

LGWR进行写操作的情况:

1、用户进程提交一个commit

2.日志缓冲区达到1/3范围,或者包含了1MB的缓存重做日志数据

3.要求LGWR切换日志文件

4.出现超时(3秒钟内未活动,则进行一次写操作。)

5.DBWR需要写入的数据的SCN号大于LGWR 记录的SCN号,DBWR 触发LGWR写入

LGWR的工作机制:

1、提交的时候,LGWR先要把日志缓冲区中的日志条目先写入到​日志文件,然后再提示用户该事务已经提交,以防在提交的时候突然间断电,导致客户先收到提交提示,而事务却丢失,这是不允许发生的。就好像我们到银行取钱的时候,银行要我们先签字,再给钱一个道理,万一你丫的拿了钱跑了,不签字以后不认账。

2、当log_buffer三分之一满的时候,日志马上要写,三分之一满意味着日志将要用之过半,所以要抓紧写,​然后释放空间,以提供空间给新的事务。

3、当日志条目达到1MB的时候,LGWR也要开始写,如果不写,此时实例崩溃,就会丢失太多的事务,所以当积累了一定的事务量的时候,LGWR就要写了。

4、​每隔3秒就要写,这个目的也是为了减少事务丢失,因为只要把日志条目保存了,即使实例崩溃了,也能够根据redolog进行重做,不会丢失数据。

5、​在DBWn写之前LGWR就要写,因为我们要把事务造成的修改给保存起来了,所以我们先要把该事务先保存,要不然先保存修改的数据,此时实例崩溃了,事务没有记下来,那么数据缓冲区的脏块就白保存了,事后也无法判断该脏块是哪个事务修改的,无法回滚。

以上是LGWR写的触发因素,我们可以发现LGWR写的频率是最高的,下面我们来讨论一下跟性能相关的问题,我们在维护数据库时,一条最根本的原则是:保证log_buffer始终都有可用空间给Server进程写,否则就会出现事务等待,做到这一点,就必须保证有足够数量的日志组,以及足够大的日志组,只要日志组有可用的空间给LGWR写,就能够及时的释放log_buffer的空间,能够保证log_buffer被永久的循环的使用,有关与LGWR相关的调优问题,我们在后面的调优章节中详细的给大家介绍。

后台写的条件:

(1)、每3秒LGWR启动一次。

(2)、DBWR启动时如果发现dirty块对应的redo entry还没写入联机日志文件,则DBWR触发LGWR进程并等待LGWR完成后继续。

(3)、redo entry数量达到整个log buffer的1/3时,触发LGWR。

(4)、redo entry的数量达到1M。

同步写的条件:

COMMIT。即执行COMMIT时,必须等待log buffer进行flushing操作(可能产生log file sync等待事件),写入磁盘中的联机日志文件。但一般上述1/3满的条件触发LGWR,几乎强制LGWR实时写,因此当需要执行COMMIT,可能没有任何redo entry需要写入了。

4、3秒触发LGWR的规则,事实上,这个超时是DBWR的,但是因为LGWR总在DBWR调用之前执行,因此效果上也相当于LGWR的超时是3秒即调用。

LGWR负责释放脏的日志块从而提供可用日志块,LGWR在日志缓冲区中的脏日志块超过1M或者超过日志缓冲区的1/3时就会启动,而且在将重做记录写入联机日志文件时,都是按照顺序写入,不存在类似DBWR的随机写入,所以写入的速度是非常快的

触发LGWR进程将日志缓冲区中的日志信息写入联机日志文件条件包括以下几种:

1) 前台进程触发,包括两种情况。最显而易见的一种情况就是用户发出commit或rollback语句进行提交时,需要触发LGWR将内存里的日志信息写入联机日志文件,因为提交的数据必须被保护而不被丢失;另外一种情况就是在日志缓冲区中找不到足够的内存来放日志信息时,也会触发LGWR进程将一些日志信息写入联机日志文件以后,从而释放一些空间出来。

2) 每隔三秒钟,LGWR启动一次。

3) 在DBWR启动时,如果发现脏数据块所对应的重做条目还没有写入联机日志文件,则DBWR触发LGWR进程并等待LRWR写完以后才会继续。

4) 日志信息的数量达到整个日志缓冲区的1/3时,触发LGWR。

5) 日志信息的数量达到1MB时,触发LGWR。

6) 发生日志切换时触发LGWR。

oracle记录数据库变化(也就是记录日志信息)的最小单位是改动向量(change vector)。改动向量用来描述对数据库中任何单个数据块所做的一次改动。改动向量的内容包括:被改动的数据块的版本号、事务操作代码、被改动的数据块的地址等。这里的版本号非常重要,它能够帮助数据块始终能够体现当前最新的状态。oracle在建立改动向量时,会从数据块中拷贝其版本号。而当恢复期间,oracle读取改动向量并将改动应用于相应的数据块以后,被恢复的数据块的版本号加1。这里的数据块可以属于表、也可以数据索引、也可以属于回滚段。但是对于临时表空间里的临时段,不会生成改动向量。

对于update事务,

1) 对回滚段事务表的改动,这发生在回滚段段头。事务表中包含被修改的数据块的地址、该事务的状态(commit或active)、 以及存有该事务所使用的回滚段的地址。如果事务表被修改,就会产生针对于它的改动向量。

2) 对回滚段数据块的改动。将修改前的旧值(abc)存放到回滚段的数据块里。这时回滚段发生改变,于是产生改动向量。

3) 对redo_test表的数据块所做的改动。将修改后的新值(cdf)存放到表的数据块里。这时数据块发生改变,于是产生改动向量。

重做记录中会有三个改动向量。当然可能有其他情况会产生新的重做记录,比如修改的列如果有索引,则必须修改索引。这时就会产生第二个重做记录,用来描述对索引数据块的修改。这时候的重做记录还是和第一个重做记录一样,包含多个改动向量。此外,在事务完成之后运行commit或rollback语句时,就会产生第三个重做记录。该重做记录只有一个改动向量,用来记录对回滚段事务表的更改,因为commit或rollback时,需要更新事务表里记录的该事务的状态

SMON(System Monitor Process)

SMON是Oracle数据库至关重要的一个后台进程,SMON 是System Monitor 的缩写,意即:系统监控。

作用:

      • 实例恢复
        • 前滚Rolls forward changes in redo logs
        • Opens database for user access
        • 回滚Rolls back uncommitted transactions
      • 回收空间Coalesces free space
      • 释放临时表Deallocates temporary segments

在数据库启动过程中,SMON排在CKPT进程之后,在Oracle9i中排在第六号的位置:

PMON started with pid=2

DBW0 started with pid=3

LGWR started with pid=4

CKPT started with pid=5

SMON started with pid=6

RECO started with pid=7

SMON负责系统监视已经一些系统清理及恢复工作,这些工作主要包括:

1.清理临时空间以及临时段

SMON负责在数据库启动时清理临时表空间中的临时段,或者一些异常操作过程遗留下来的临时段.

例如,当创建索引过程中,创建期间分配给索引的Segment被标志为TEMPORARY,如果Create Index (或rebuild Index等)会话因某些原因异常中断,SMON负责清理这些临时段。

2.接合空闲空间

在DMT(字典管理表空间)中,SMON负责把那些在表空间中空闲的并且互相是邻近的Extent接合成一个较大的空闲扩展区,这需要表空间的pctincrease设置为非零值。

3.执行实例恢复(Instance recovery)

在实例恢复过程中,SMON的工作包括三个环节:

    1. 应用Redo执行前滚、
    2. 打开数据库提供访问、
    3. 回滚未提交数据

    4.离线(Offline)回滚段

    在自动回滚段管理(AUM)中负责Offline不再需要的回滚段,日志中会记录类似如下信息:

    Fri May 2 15:43:21 2008

    SMON offlining US=11

    5.执行并行恢复

    以下信息来自9i日志:

    Fri May 11 21:30:45 2007

    SMON: Parallel transaction recovery tried

    Also Record some English Note About SMON:

    The SMON background process performs all system monitoring functions on the Oracle database. The SMON process performs a "warm start" each time that Oracle is re-started, ensuring that any in-flight transaction at the time of the last shutdown are recovered. For example, if Oracle crashed hard with a power failure, the SMON process is attached at startup time, and detects any uncompleted work, using the rollback segments to recover the transactions. In addition, SMON performs periodic cleanup of temporary segments that are no longer needed, and also perform tablespace operations, coalescing contiguous free extents into larger extents.

        • Process Monitor Process(PMON)
          • 回滚事务
          • 释放锁及其它资源
          • 重启死掉的调度器.(在共享服务器中用).
          • 在监听器中注册服务信息
        • CheckPoint Process(CKPT)

    检查点,把内存中的数据写到磁盘上

        • 会启动DBWn来写脏数据(SIGNALLING DBWn at CKPT.)
        • 完后会更新DATAFILE的HEADER和控制文件的HEADER.而HEADER中有同步所需要的信息,即CHECKPOINT的信息.
        • 在ORACLE中,正常情况下,所有文件必须同期性地同步;靠CHECKPOINT来完成.
        • 服务器进程 --server process
          • 接受客户端发出的SQL请求。
          • 完成SQL的分析,执行计划和SQL的执行过程。

    Oracle 数据库的组成(instance+database)

    Oracle 数据库的组成(instance+database)

    上一篇:PAT 1009 说反话 (20)(代码)


    下一篇:python中的第三方日志模块logging