oracle小布课堂笔记

oracle体系架构主体(很重要)

oracle主要分成两块(instance)和(Database)

B. Oracle 体系架构

1)Oracle Sever : database + instance 

 补充connection&Session

官方解释:

1 connection:

A connection is a physical path from a client to an Oracle instance. A connection is established either over a network or over an IPC mechanism. A connection is typically between a client process and either a dedicated server or a dispatcher. However,using Oracle’s Connection Manager (CMAN), a connection may be between a client and CMAN, and CMAN and the database.

session

A session is a logical entity that exists in the instance. It is your session state, or a collection of data structures in memory that represents your unique session. It is what would come first to most people’s minds when thinking of a “database connection.” It is your session in the server, where you execute SQL, commit transactions, and run stored procedures.

个人理解:

Connection(连接)是一个物理概念,是指一个通过网络建立的客户端和专有服务器或调度器之间的一个网络连接

Session(会话)是一个逻辑概念,他存在于实例中,一个Connection可以拥有多个Session,也可以没有Session,同一个Connection上的多个Session之间不会相互影响

connection相当于修路,而session相当于通过这条道路的一次运输。

2) Database : data file,control file, redolog file(用于恢复数据文件)

3) instance(实例): an instance access a database

4) Oracle memory : SGA + PGA

SGA(System Global Area):由所有服务进程和后台进程共享;
PGA(Program Global Area):由每个服务进程、后台进程专有;每个进程都有一个PGA

SGA

查看granule

select component,granule_size from v$sga_dynamic_components;


包含实例的数据和控制信息,包含如下内存结构:
1)Database buffer cache:缓存了从磁盘上检索的数据块。
2)Redo log buffer:缓存了写到磁盘之前的重做信息。
3)Shared pool:缓存了各用户间可共享的各种结构。
4)Large pool:一个可选的区域,用来缓存大的I/O请求,以支持并行查询、共享服务器模式以及某些备份操作。
5)Java pool:保存java虚拟机中特定会话的数据与java代码。
6)Streams pool:由Oracle streams使用。
7)Keep buffer cache:保存buffer cache中存储的数据,使其尽时间可能长。
8)Recycle buffer cache:保存buffer cache中即将过期的数据。

9)nK block size buffer:为与数据库默认数据块大小不同的数据块提供缓存。用来支持表空间传输

select name,bytes/1024/1024 as "Size(M)"  from v$sgainfo;
 Fixed SGA Size                   2.25660858
Redo Buffers                     42.5429688
Buffer Cache Size                     14208
Shared Pool Size                       3392
Large Pool Size                         512
Java Pool Size                           64
Streams Pool Size                       128
Shared IO Pool Size                       0
Granule Size                             64
Maximum SGA Size                 18349.7031
Startup overhead in Shared Pool  556.230263 -- 给session、process分配的
Free SGA Memory Available                 0 -- 没有可剩余的空间,代表不够用
 
SQL>  SELECT a.sga_size,-- sga期望大小
  2            a.sga_size_factor, -- 期望sga大小与实际sga大小的百分比
  3            a.estd_db_time, -- sga设置为期望的大小后,其dbtime消耗期望的变化
  4            a.estd_db_time_factor,-- 修改sga为期望大小后,dbtime消耗的变化与修改前的变化百分比
  5            a.estd_physical_reads -- 修改前后物理读的差值
  6       FROM v$sga_target_advice a;
 
  SGA_SIZE SGA_SIZE_FACTOR ESTD_DB_TIME ESTD_DB_TIME_FACTOR ESTD_PHYSICAL_READS
---------- --------------- ------------ ------------------- -------------------
      6912            .375      6626336              1.3401          3489939352
      9216              .5      6042867              1.2221          3270250481
     11520            .625      5808490              1.1747          3206534942
     13824             .75      5524666              1.1173          3107646120
     16128            .875      5251721              1.0621          3012505270
     18432               1      4944658                   1          2883056053
     20736           1.125      4595565               .9294          2785032147
     23040            1.25      4478871               .9058          2652699874
     25344           1.375      4470465               .9041          2652699874

PGA(每一个进程都有一个PGA)
每个服务进程私有的内存区域,包含如下结构:
1)Private SQL area:包含绑定信息、运行时的内存结构。每个发出sql语句的会话,都有一个private SQL area(私有SQL区)
2)Session memory:为保存会话中的变量以及其他与会话相关的信息,而分配的内存区

关于pga和sga的分配,有个经验值:
在OLTP系统中,典型PGA内存设置应该是总内存的较小部分(例如20%),剩下80%分配给SGA。 
OLTP:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 20% 

在DSS系统中,由于会运行一些很大的查询,典型的PGA内存最多分配70%的内存。
DSS:PGA_AGGREGATE_TARGET = (total_mem * 80%) * 50% 

凡事没绝对,需要根据自己的服务器和应用情况做判断,
这里有几个视图可以作为参考:
针对SGA的:v$sgainfo,v$sga_target_advice
    其中第一个是sga目前的一些状态信息,第二个是oracle提供的优化的一个视图建议
针对PGA的:V$PGASTAT,v$pga_target_advice
    其中第一个是pga目前的一些状态信息,第二个是oracle提供的优化的一个视图建议

5) Instance : an instance access a database

6) Sga 组成:SGA在一个instance 只有一个SGA,SGA 为所有session 共享,随着Instance 启动而分配,instance down,SGA被释放。 

SELECT name ,value/1024/1024 "MB"  FROM V$PGASTAT; 
 
NAME                                                                     MB
---------------------------------------------------------------- ----------
aggregate PGA target parameter                                         9192  -- pga_aggregate_target
aggregate PGA auto target                                        6823.20938	 -- 剩余的能被工作区使用的内存
global memory bound                                              819.199219  -- 单个SQL最大能用到的内存
total PGA inuse                                                  644.192383  -- 正被耗用的pga(包括workare pl/sql等所有占用的pga)
total PGA allocated                                              896.580078  -- 当前实例已分配的PGA内存总量
maximum PGA allocated                                            8837.66406  -- pga曾经扩张到的最大值
total freeable PGA memory                                          179.4375  -- 可释放的pga
process count                                                    .000473976  -- 当前process 单位不对
max processes count                                              .000980377  -- 最大时候的process
PGA memory freed back to OS                                      1201833.44
total PGA used for auto workareas                                37.5908203  -- 当前auto模式下占用的workara size 大小
maximum PGA used for auto workareas                              6617.17871  -- auto模式下占用的workara size最大 大小
total PGA used for manual workareas                                       0
maximum PGA used for manual workareas                            1.03515625
over allocation count                                                     0  -- 使用量超过pga大小的次数
bytes processed                                                  3531168.47  -- pga使用的字节
extra bytes read/written                                         25581.0293  -- 向临时段写的字节
cache hit percentage                                             .000094681
recompute count (total)                                          1.28579521
 
 
 
SQL> SELECT round(PGA_TARGET_FOR_ESTIMATE/1024/1024) target_mb, 
  2     ESTD_PGA_CACHE_HIT_PERCENTAGE cache_hit_perc, 
  3     ESTD_OVERALLOC_COUNT -- 关注对象
  4     FROM v$pga_target_advice;
 
 TARGET_MB CACHE_HIT_PERC ESTD_OVERALLOC_COUNT
---------- -------------- --------------------
      2441             98                    0
      4882             99                    0
      9763             99                    0
     14645             99                    0

C.1 SGA的6个基本组件:

1) Shared pool

共享池是对SQL、PL/SQL程序进行语法分析、编译、执行的内存区域。

共享池由库缓存(library cache),和数据字典缓存(Data dictionary cache)以及结果缓存(Result cache)等组成。

共享池的大小直接影响数据库的性能。

library cache : sql 和plsql 的解析场所,存放着所有编译过的sql语句代码,以备所有用户共享。

data dictionary cache: 存放重要的数据字典信息,以备数据库使用。

server result cache : 存放服务器端SQL 结果集及PL/SQL函数返回值。

User Global Area(UGA): 与共享服务器模式有关。

2) Database buffer cache

用于存储从磁盘文件中读入的数据,为所有用户共享。

服务器进程(server process)将读入的数据保存在数据缓存区中,当后续的请求需要这些数据时可以在内存中找到,则不需要再从磁盘读取。

数据缓冲区中被修改的数据块(脏块)由后台进程DBWR将其写入磁盘。

数据缓冲区的大小对数据库的读取速度有直接的影响。

要搞清楚Database Buffer Cache 中的几个cache概念。

Buffer pool = (default pool) + (nodefault pool)

其中:

default pool(db_cache_size) //是标准块存放内存空间大小,SGA自动管理时此参数不用设置。使用LRU算法清理空间。

nodefault pool:

db_nk_cache_size //指定非标准块大小内存空间,比如2K,4K,16K,32K

db_keep_cache_size //与keep 相反,存放偶尔做全表扫描的大表的数据。

db_recycle_cache_size //与keep 相反,存放偶尔做全表扫描的大表的数据。

SQL > alter table scott.emp1 storage(buffer_pool keep);

SQL> select segment_name,buffer_pool from dba_segments where segment_name = 'EMP1';

default pool 对应的参数是 db_cache_size 与标准块 default block 是配套的,如果 default block 是 8k, db_cache_size 这个参数将代替 db_8k_cache_size。

如果要建立非标准块的表空间,先前要设定 db buffer 中的与之对应的 db_nk_cache_size 参 数。

09:50:46 SQL> alter system set db_16k_cache_size=8m;  // 改 参 数 , 先 把 db buffer 里的 16k cache 建上。
 
09:50:49 SQL> create tablespace tbs_16k datafile '/u01/oradata/timran11g/tbs16k01.dbf' size 10m blocksize 16k;
 
09:51:29 SQL> select TABLESPACE_NAME,block_size from dba_tablespaces;
 
TABLESPACE_NAME                BLOCK_SIZE

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

SYSTEM                               8192

UNDOTBS1                             8192

SYSAUX                               8192

TEMP                                 8192

USERS                                8192

EXAMPLE                              8192

TBS_16K                             16384

查看buffer cache 命中率:

select (1 - (sum(decode(name, 'physical reads', value, 0)) /
       (sum(decode(name, 'db block gets', value, 0)) +
       sum(decode(name, 'consistent gets', value, 0))))) * 100 "Hit Ratio"
  from v$sysstat;

3) Redo log buffer

日志条目(redo entries)记录了数据库的所有修改信息(包括DML和DDL),为的是数据库恢复。日志条目首先产生于日志缓冲区。日志缓冲区。日志缓冲区较小,它是以字节为单位的,它极其重要。

> show parameter log_buffer;

日志缓存区的大小启动后就是固定不变的,如果调整只能通过修改参数文件重新启动生效,不能动态修改。不能由SGA自动管理。

如果想让它是一个最小值,这样可以做:

> ALTER SYSTEM SET LOG_BUFFER = 1 SCOPE=SPFILE; // 修改动态参数文件,下次启动有效。

> STARTUP FORCE

> SHOW PARAMETER LOG_BUFFER;

4) Large pool

为了进行大的后台进程操作而分配的内存空间,与shared pool 管理不同,主要用于共享服务器的session memory ,RMAN备份恢复以及并行查询等。

5) Java pool

为了JAVA 虚拟机及应用而分配的内存空间,包含所有session指定的JAVA代码和数据。

6)Stream pool

为了stream process 而分配的内存空间。stream 技术是为了在不同数据库之间共享数据。因此,它只对使用了stream 数据库特性的系统是重要的。

C.2 SGA 的granules(颗粒):组成oracle 内存的最小单位。

SGA_MAX_SIZE                                  Granule Size

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

<= 1 GB                                                    4 MB

1GB -- 8GB                                             16 MB

8GB -- 16GB                                            32 MB

16GB -- 32GB                                          64 MB

32GB -- 64GB                                          128MB

64GB -- 128GB                                        256MB

> 128GB                                                   512MB

> select name ,bytes/1024/1024 "Size(M)" from v$sgainfo; // 在oracle 里查看SGA分配情况。

D.Oracle 的进程:

IPC

三种process:

1)user process

2) server process

3) background process

user process: 属于客户端的process,一般分为三种形式,

1)sql*plus

2)应用程序,

3) web方式(OEM)

客户端请求,sqlplus 是客户端命令。

由user process 造成的会话终止,系统将自动回滚这个会话上的处于活动状态的事务。

如果是windows 作为客户端:可以通过查看任务管理器看到sqlplus 用户进程。

[oracle@]$ sqlplus / as sysdb

server process 这是服务器端的进程,user process 不能直接访问Oracle,必须通过相应的server process 访问实例,进而访问数据库。

[oracle@ ~]$ ps -ef|grep LOCAL

// 注意: 在Linux下看到的server process,(LOCAL=YES)是本地连接,(LOCAL=NO)是远程连接。

可以在oracle 查看V$process视图,它包括了当前所有的oracle 进程,即后台进程和服务器进程。

> select pid,program,background from v$process;

background 字段为1 是background process,其余都是 server process

六个基本的后台进程(background process)

smon :系统监控进程

在实例崩溃之后,Oracle 会自动恢复实例。另一个作用是释放不再使用的临时段。

pmon: 进程监控。

1、当 user process 失败时,清理出现故障的进程。 释放所有当前挂起的锁定。释放服 务器端使用的资源   

2、监控空闲会话是否到达阀值   

3、动态注册监听
   

1、将修改后的缓冲区(脏 buffer)数据写入数据文件中。写脏块。   

2、释放 data buffer 空间。

注意:以下几种情况发生时 dbwr 都会写
 
   1)ckpt 发生,2)脏块太多时,3)db_buffer 自由空间不够时,4)3 秒,5)表空间 read only/offline/backup 等1)服务器进程对数据文件执行读操作,而 DBWR 负责对数据文件执行写操作。 2)commit 时 dbwn 有何举动?答案是:它什么也不做!              lgwr:写日志条目,从 redo log buffer 到 redo logfile (必须在 dbwr 写脏块之前写入日 志)
 
   负责将日志缓冲区中的日志条目写入日志文件。 有多个日志文件,该进程以循环的方式 将数据写入文件。
 
   注意:以下 5 个状况发生时, lgwr 都会写
 
   1)commit, 2)三分之一满,3)先于 dbwr 写而写(先记后写,即 dbwn 正好要执行写入 前),4)3 秒(由先记后写引发)       ckpt:生成检查点, 通知或督促 dbwr 写脏块
 
   完全检查点:保证数据一致性。增量检查点:不断更新控制文件中的检查点位置,当发生 实例崩溃时,可以尽量缩短实例恢复的时间。
 
arcn:归档模式下,发生日志切换时,把当前日志组中的内容写入归档日志,作为备份历史 日志。
 
考点:lgwr 负责对联机日志文件写操作,arcn 负责读取联机日志文件。其他进程与日志文件 不接触。
 
11g 里又强调了其他几个后台进程,它们都和数据库性能有关,有关内容将在 053 课程介绍:
 
MMON: Oracle 自我监视和自我调整的支持进程(与 AWR 有关)
MMNL:MMON 的辅助进程(与 ASH 有关)
 
MMAN:内存自动管理,10g 时推出,11g 得到加强,在 11g 里这个进程负责 Oracle 内存结构 (SGA+PGA)的自动调整。

Database Writer:

作用时间database buffer cacha 写入到Data files

 Log Writer(LGWR)

作用:将Redo Log Buffer写入到Redo Log files

Logical Structure
 

一、oracle数据库的逻辑存储结构

oracle database为数据库里面的说有数据都分配了逻辑空间。oracle database的逻辑单元有数据块、序列(extent)、段、表空间。下面是逻辑存储和物理存储之间的关系。

逻辑存储和物理存储之间的关系

图1 逻辑存储和物理存储之间的关系

图2是一个表空间中,段、区、数据块之间的关系图。
段、区、数据块之间的关系

图2 段、区、数据块之间的关系

  • 数据块(data block)是oracle分配空间的最小单元。
  • 区(extent)。是一串连续的数据块data block,用来存放特定类型的数据
  • 段segment。由多个区组成,用来存储数据块对象(database object)。如表,表的索引。每个段有且仅属于一个表空间(tablespace)
  • 表空间(tablespace)是段的一个逻辑存储容器。一个oracle数据库必须拥有SYSTEM 和 SYSAUX 表空间。

注意。这里的表空间不是其他数据库如mysql数据库里面的table的概念。

图3是数据库中的表空间构成
数据库中的表空间构成

图3 数据库中的表空间构成

二、表空间

持久化表空间组(permanent tablespaces)。
SYSTEM 表空间。用来管理数据库的。这个表空间里面有以下信息。

  • 数据块字典。
  • 该数据库管理信息的表和视图。
  • 已经被编译了的存储对象。如触发器、过程、包(triggers, procedures, and packages)

表空间还有表空间模式一说。有下面两个模式。

  • read/write。用户拥有读写表空间的权限。
  • read。用户之后读表空间的权限,而没有修改表空间的权限。

online/offline,online的表空间可以被用户访问,而offline的表空间不行。一个数据库的SYSTEM表空间和temporay 表空间不能被修改为offline。


三、总结

一个数据库有很多表空间,一个表空间有多个段组成,一个段由多个区组成,一个区由连续的数据块组成。表空间不是表,段是用来存储数据库对象的(如表、所以、过程等),一个区用来存储特定类型的数据的(如字符、日期、数字、其他类型)。

总结

在这节课中,你应该学会如何:

解释数据库文件:数据文件,控制文件,在线重做日志文件

解释SGA内存结构:数据库缓冲缓存、共享池和重做日志缓冲区

解释主要的后台进程:DBWn, LGWR, CKPT, PMON, SMON

说明可选后台进程ARCn的使用

识别可选的和有条件的后台进程

解释逻辑层次结构

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值