Oracle数据库的组成

Oracle数据库的组成部分:

  • 实例instance
    • 内存
      • SGA
      • PGA
      • 其他部分
  • 进程

    Oracle后台进程、服务器端进程、客户端进程。

    PMON、SMON、DBWR、LGWR、CKPT、其他。

  • 数据库database
    • 文件

      控制文件、重做日志文件、数据文件

  • 其他部分

    参数文件、密码文件、归档日志

数据库实例内存

sql在数据库实例的执行流程:

  1. 用户进程Client Process 向数据库发送一条SQL语句到监听器
  2. 监听器将请求转到数据库实例上
  3. 数据库实例开辟一个Server Process,和Client Process建立连接,组成一个Session。Server Process进行用户请求的处理
  4. 服务器端开辟一块内存PGA,存放用户的请求、SQL。之后到SGA区执行SQL语句
  5. 首先到SGA区的 Shared Pool中解析SQL语句(语法分析有没有语法错误、语义分析分析SQL语义),得到执行计划
  6. 按照执行计划到SGA区的 Database Buffer Cache访问数据
  7. 如果Database Buffer Cache内存中没有找到,Server Process就会去磁盘的数据文件中查找,读入到Database Buffer Cache中
  8. 读到数据之后,如果用户需要修改数据,就会在 Database Buffer Cache中修改数据块。修改之前会先将原来的数据放到undo表空间,然后才修改数据块
  9. 修改数据块之后,就要产生redo日志。就会在redo log buffer区域产生重做项
  10. 如果用户发出了commit,oracle的LGWR进程就会将 redo log buffer中的内容写入到磁盘中、将undo产生的数据写入磁盘。
  11. 如果用户发出了checkpoint检查点指令(alter system checkpoint),oracle的DBWn进程就会将数据块中的脏数据(数据块中修改了还没写入磁盘的数据称为脏数据)写入磁盘数据文件中

SGA

SGA(System Global Area):是Oracle中最重要的内存区域,所有用户共享。

组成:

  • shared pool

    SQL字典区。SQL语句的解析

  • db buffer

    数据缓冲区。数据库数据文件读到内存中的数据块

  • redo log buffer

    重做日志区。产生的重做日志

  • 其他区域

    Java Pool、Large Pool等

SGA中发生的事情:

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

重做日志会很快刷到磁盘上(cpu空闲时,几乎每3秒就会刷到磁盘上)。只要重做日志被刷到磁盘上,即使内存的数据块没有被写入数据文件中,最后也可以通过重做日志进行恢复。

查看SGA参数:

sga_target:设置的SGA大小,0表示自动调整。

memory_target:11g之后才有的参数,设置oracle的内存大小,由oracle自动管理sga、pga大小

  1. SQL> show parameter sga
  2. NAME TYPE VALUE
  3. ------------------------------------ ----------- ------------------------------
  4. lock_sga boolean FALSE
  5. pre_page_sga boolean FALSE
  6. sga_max_size big integer 1G
  7. sga_target big integer 0
  8. SQL> show parameter memory;
  9. NAME TYPE VALUE
  10. ------------------------------------ ----------- ------------------------------
  11. hi_shared_memory_address integer 0
  12. memory_max_target big integer 1232M
  13. memory_target big integer 1232M
  14. shared_memory_address integer 0

查看SGA当前大小:

Total System Global Area:SGA总大小

Fixed size:Oracle为了维护SGA区内存结构给的一个固定大小

Variable Size:Shared Pool大小

Database Buffers:数据块区域大小,有的数据库版本将该参数写作Cache Buffers

Redo Buffers:Redo大小

  1. SQL> show parameter sgaSQL> show sga;
  2. Total System Global Area 1071333376 bytes
  3. Fixed Size 1375792 bytes
  4. Variable Size 889192912 bytes
  5. Database Buffers 176160768 bytes
  6. Redo Buffers 4603904 bytes

PGA

单个会话私有的内存。

主要组成:

  • Sort Area

    Order by等排序区。

    当PGA的排序区不够用时,会使用临时表空间进行排序

  • Hash Area

    Hash区,用于Hash运算

  • Bitmap Merge Area

    位图合并区

PGA中发生的事情:

  • 私有SQL区

    私有SQL区包含了绑定变量值和运行时内存结构信息等数据。每一个运行SQL语句的会话都有一个块私有SQL区。所有提交了相同SQL语句的用户都有各自的私有SQL区,并且他们共享一个共享SQL区。因此,一个共享SQL区可能和多个私有共享区相关联。

  • 游标和SQL区

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

  • 会话内存

    基于排序的操作(Order By、Group By、RollUp、窗口函数);

    • Hash Join
    • Bitmap merge
    • Bitmap create

可以通过sql查询 v$process视图来查看每个进程分配的PGA、已经使用的PGA:

  1. -- PGA_USED_MEMPGA_ALLOC_MEM
  2. select * from v$process;

所以,要查看总的分配的PGA大小,可以直接对PGA_ALLOC_MEM求和:

  1. select sum(PGA_ALLOC_MEM) from v$process;

数据库实例进程

内存和文件中的通讯等都需要通过进程。

可以通过sql查询 v$bgprocess 视图查看Oracle的所有后台进程:

  1. select * from v$bgprocess;

SMON

SMON(System Monitor):系统监视器,后台进程。

作用:

  • 实例恢复
    • redo前滚
    • 打开数据库
    • 回滚
  • 回收空间
  • 释放临时表(临时段)

PMON

PMON(Process Monitor):进程监视器,后台进程。主要针对会话

作用:

  • 回滚事务
  • 释放锁及其他资源
  • 重启死掉的调度器(在共享服务器中使用)
  • 在监听器中注册服务器信息

    从Oracle 9i 开始,监听器改为动态注册,即使删掉 listener.ora文件,PMON进程也可以注册服务器信息

DBWn和LGWR

DBWn(Database Writer):oracle可以启动很多DB Writer(DBW1~DBW9、DBWA~DBWz),将数据块中的脏数据写入数据文件中

LGWR(Log Writer):将内存中redo日志修改的内容(脏数据)写到磁盘上

DBWn、LGWR都是后台进程。

既然有DBWn进程将数据块的脏数据写入了数据文件,为什么还需要LGWR进程去再写一个redo日志文件?

答:数据文件中的数据都是有固定的位置的,修改的数据需要更新到指定的位置中,属于分散写,非常耗时。redo日志是一种日志文件,数据是从前往后按顺序写的,速度很快。当数据库异常宕机时,如果数据文件写入出现问题,只要redo日志正常写入了磁盘,依然可以完整的恢复数据库数据。

CKPT

CKPT(checkpoint):检查点,后台进程。

作用:

  • 会启动DBWn来写脏数据(SIGNALLING DBWn at CKPT.)
  • 完后会更新datafile的header和控制文件的header,而header中有同步锁需要的信息,即checkpoint的信息
  • 在oracle中,正常情况下,所有文件必须同期性地同步,靠checkpoint完成。保证数据的一致性。

Server Process

Server Process:服务器进程,不是后台进程。

作用:

  • 接收客户端发出的SQL请求
  • 完成SQL的分析、执行计划和SQL的执行过程

专有模式下:一个客户端进程对应一个服务器进程。对客户端的响应快,但是如果客户端较多就要开很多服务器端,造成服务器很大压力。

共享模式下:实际是一个中间件,开了一个缓冲池,通过分发器把用户请求发给共享服务器,共享服务器进程可以响应很多用户,不是一对一的。可以用更少的进程服务更多的用户。生产环境中很少使用共享模式,实际中会通过weblogic等中间件构造连接池