1.Oracle RDBMS 架构图

2. Oracle 体系结构

由此区分database和instance的区别

No.
1.oracle serverdatabase + instance
2.databasedata file、control file、redo log file
3.instancean instance accesses a database
4.oracle memorySGA + PGA(oracle的内存结构)
5.instanceSGA + background process
6.SGA组成一个instance只有一个SGA,SGA为所有session共享,随着instance 启动而分配,instance down ,SGA被释放.

RDBMS架构图所示,Oracle架构主要包括:
User Process、Server Process等的Client端+Instance实例+Databases+一些参数文件+密码文件+归档日志文件.

在Oracle数据库中,用户并不能直接访问到数据库文件,而是需要先创建一个数据库实例.数据库实例指的就是操作系统中一系列的进程以及为这些进程所分配的内存块,就是访问Oracle数据库文件的通道.

一个数据库实例包括Shared Pool(共享池),Data Buffer Cache(数据库缓冲区缓存),Redo Log Buffer(重做日志缓冲区)等部分,其中Shared Pool(共享池)又包括Library Cache(库缓存),Data Dictionary Cache(数据字典缓存).

当用户访问数据库文件时,需要先启动一个数据库实例,然后将数据库文件加载到Data Buffer Cache,将数据字典加载到Data Dictionary Cache,之后Server Process会首先访问Data Dictionary Cache,获取到有关数据库表的字段,关键字等元数据信息,然后再访问Data Buffer Cache,读取相关数据.从上述过程中,可以看到在Oracle数据库中,数据字典不仅是管理和查询元数据的工具,还是用户访问数据库文件的基础.

3. SGA (系统全局区)

3.1 SGA的6个基本组件

3.1.1 shared pool

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

共享池=库缓存(library cache)+数据字典缓存(data dictionary cache)+结果缓存(result cache)等组成.

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

关于shared pool中的几个概述

3.1.1.1 library cache

sql和plsql的解析场所,存放所有编译后的sql语句代码,以备所有用户共享. (软解析\硬解析)

3.1.1.2 data dictionary cache

存放重要的数据字典信息,以备数据库使用

3.1.1.3 server result cache

存放服务器端的SQL结果集及PL/SQL函数返回值User Global Area (UGA) 与共享服务器模式有关

3.1.2 database buffer cache

3.1.2.1db buffercache 概述

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

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

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

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

NOTE:server process对数据文件执行读操作,而DBWR对数据文件执行写操作

3.1.2.2 Buffer cache参数

Buffer pool= (default pool) + (nodefault pool)
其中:

参数
default pool(db_cache_size):是标准块存放的内存空间大小,SGA自动管理时此参数无需设置.使用LRU算法清理空间 nodefault pool
db_nk_cache_size:指定非标准块大小内存空间,比如2k、4k、8k、16k、32k.
db_keep_cache_size:keep存放经常访问的小表或索引等. 不会按照LRU清理.
db_recycle_cache_size:与keep相反,存放偶尔做全表扫描的大表的数据.

高速缓存中的缓冲区由一个复杂算法管理,该算法组合使用最近最少使用(LRU) 列表和停靠计数.LRU 有助于确保最近使用的块往往都留在内存中,从而最大限度地减少磁盘访问.

3.1.2.3 default 、keep、recycle相互独立

db_keep_cache_sizedb_recycle_cache_size是可选的.

Buffer cache的大小就是以上cache参数size的总和,即没有分配到db_keep_cache_size和db_recycle_cache_size的任何数据对象都将分配给default cache.也就是 default 、keep、recycle相互独立的,对于某一个对象(表)来说,它只属于他们其中一种.

3.1.2.3.1 查看与更改default pool

[oracle@oracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 30 10:06:22 2023Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.3.0.0.0SQL> alter session set container=PDB1;Session altered.SQL> show con_name;CON_NAME------------------------------PDB1SQL>SQL> set pagesize 200 linesize 200SQL> SQL> drop table scott.emp1;Table dropped.SQL> create table scott.emp1 as select * from scott.emp;Table created.SQL>SQL> col segment_name format a20SQL> col buffer_pool format a20SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';SEGMENT_NAME         BUFFER_POOL-------------------- --------------------EMP1                 DEFAULTSQL> -- 将表存放到keep缓存区.SQL> SQL> alter table scott.emp1 storage(buffer_pool keep);Table altered.SQL> select segment_name,buffer_pool from dba_segments where segment_name='EMP1';SEGMENT_NAME         BUFFER_POOL-------------------- --------------------EMP1                 KEEPSQL> 

3.1.2.3.2 建立非标准块的 TBS

default pool对应的参数是db_cache_size与标准块default block是配套的
如果default block8k, db_cache_size将代替db_8k_cache_size.
如果要建立非标准块的 TBS ,先要设定db buffer中的与之对应的db_nk_cache_size参数.

[oracle@oracle-db-19c ~]$ sqlplus / as sysdbaSQL*Plus: Release 19.0.0.0.0 - Production on Thu Mar 30 10:19:13 2023Version 19.3.0.0.0Copyright (c) 1982, 2019, Oracle.  All rights reserved.Connected to:Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - ProductionVersion 19.3.0.0.0SQL> set pagesize 200 linesize 200SQL> SQL> show user;USER is "SYS"SQL> -- 更改db buffer参数为16k SQL> alter system set db_16k_cache_size=8m;System altered.SQL> -- 建立 TBSSQL> create tablespace tbs_16k datafile '/u02/oradata/CDB1/pdb1/tbs16k01.dbf' size 10m blocksize 16k;Tablespace created.SQL> -- 查看 TBSSQL> select TABLESPACE_NAME, block_size from dba_tablespaces;TABLESPACE_NAME                                                                            BLOCK_SIZE------------------------------------------------------------------------------------------ ----------SYSTEM                                                                                           8192SYSAUX                                                                                           8192UNDOTBS1                                                                                         8192TEMP                                                                                             8192USERS                                                                                            8192TEMP02                                                                                           8192TBS_16K                                                                                         163847 rows selected.SQL> 

3.1.2.4 查看buffer cache命中率

SQL> SQL> show user;USER is "SYS"SQL> select  2  (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"   3  from v$sysstat; Hit Ratio----------93.9413876SQL> -- 100条命令,93.9413876%的数据块能在内存buffer cache里找到

Oracle DB用户进程第一次请求特定数据片段时,将在数据库缓冲区高速缓存中搜索数据.如果该进程在高速缓存中找到数据(称为高速缓存命中),则直接从内存中读取数据.如果进程在高速缓存中找不到数据(称为高速缓存未命中),则在访问数据之前,必须将磁盘上的数据文件中的数据块复制到高速缓存中的缓冲区中.高速缓存命中时访问数据的速度要比高速缓存未命中时快.

3.1.3 redo log buffer

3.1.3.1 概述与作用

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

3.1.3.2 大小和单位

SQL> SQL> show parameter log_buffer;NAME                                 TYPE                              VALUE------------------------------------ --------------------------------- ------------------------------log_buffer                           big integer                       15000KSQL> 

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

-- 如果想让它是一个最小值,这样可以做:SQL> alter system set log_buffer =1 scope=spfile;-- 修改动态参数文件,下次启动有效.SQL> startup force;-- 非正常重启,生产环境不能这么启动SQL> show parameter log_buffer;NAMETYPEVALUE------------------------------log_bufferinteger2927616-- 这就是最小值了

3.1.4 large pool(可选)

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

对于表查询很慢,Oracle有4招::索引、分区、物化视图(读写分离)、并行查询 并行查询

比如一个select语句分成四个部分查询,需要4个CPU(一个CPU并行查询没有意义),每个CPU有各自的进程,查询后拼接起来,该技术叫并行查询.

3.1.5 java pool(可选)

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

3.1.6 stream pool流池(可选)

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

3.2 SGA的granules(颗粒)

3.2.1 SGA的管理

9i是PGA先自动管理,10G是PGA和SGA分别管理,11G是两个整合管理
a) SGA_MAX_SIZE : SGA最大物理空间

b) SGA_TARGET : SGA实际可达最大空间,SGA_target0时就能SGA自动管理

以上是a)和b)是10G的管理,11G默认SGA_target设定成0,将参数 AMM的memory的target设置非0后自动管理PGA和SGA

3.2.2 Granules(颗粒)

组成oracle内存的最小单位

SGA_MAX_SIZEGranule Size
<=1 GB4 MB
1GB — 8GB16 MB
8GB –16GB32 MB
16GB–32GB64 MB
32GB–64GB128 MB
64GB–128GB256 MB
>128GB512 MB

3.2.3 查看SGA分配情况

SQL> SQL> show user;USER is "SYS"SQL> -- 在 oracle里查看SGA分配情况SQL> select name ,bytes/1024/1024 "Size(M)" from v$SGAinfo;NAME                                                                                                Size(M)------------------------------------------------------------------------------------------------ ----------Fixed SGA Size                                                                                   8.71464539Redo Buffers                                                                                     15.2851563Buffer Cache Size                                                                                       180In-Memory Area Size                                                                                       0Shared Pool Size                                                                                        376Large Pool Size                                                                                          20Java Pool Size                                                                                            0Streams Pool Size                                                                                         0Shared IO Pool Size                                                                                      24Data Transfer Cache Size                                                                                  0Granule Size                                                                                              4Maximum SGA Size                                                                                 599.999802Startup overhead in Shared Pool                                                                  190.286659Free SGA Memory Available                                                                                 014 rows selected.SQL> 

4. Oracle的三种进程

4.1 user process

4.1.1 分类

属于客户端的process,一般分为三种形式,1)sql*plus, 2)应用程序,3) web方式(OEM).

4.1.2 查看win进程

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

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

4.1.3 查看linux进程

linux作为客户端时可以使用ps看到sqlplus关键字:

[root@oracle-db-19c ~]# [root@oracle-db-19c ~]# ps -ef | grep sqlplusoracle     46213   45436  0 10:19 pts/0    00:00:00 rlwrap sqlplus / as sysdbaoracle     46214   46213  0 10:19 pts/1    00:00:00 sqlplus   as sysdbaroot       47281   47239  0 10:39 pts/2    00:00:00 grep --color=auto sqlplus[root@oracle-db-19c ~]# 

4.1.4 User process终止与事务

*NOTE: 由user process造成的会话终止,系统将自动回滚该会话上的处于活动状态的事务.

4.2 server process:

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

[root@oracle-db-19c ~]# [root@oracle-db-19c ~]# ps -ef |grep LOCALoracle     46215   46214  0 10:19 " />

在Shared Server环境中,一个调度器(dispatcher process)服务多个连接的请求,并将请求放到公共请求队列(common request connectpool)中,所有调度器共用一个请求队列,接着由共享服务进程(Shared Server processes)来处理这些请求,并将处理后的结果返回到响应队列(response queue).与请求队列不同,每个调度器都有自己的响应队列(response queue),然后由调度器把响应队列中的结果返回给客户端.其中请求队列和响应队列都是SGA中的一部分.

在一个共享服务环境中,一个客户端请求的步骤是这样的:

-- 客户端发送一个请求到调度器

-- 调度器(dispatcher)将请求放入到请求队列中(common request connect pool)

-- 共享服务进程(Shared Server processes)从请求队列中取出请求进行处理

-- 共享服务进程将处理后的结果放到调度器的响应队列中(response queue)

-- 调度器从响应队列中取出结果返回给客户端

上图实线表示发送信息,虚线表示返回信息.

6.3 驻留连接池模式

database resident connection pooling,简称DRCP

适用于必须维持数据库的永久连接.结合了专用服务器模式和共享服务器模式的特点,它提供了服务器连接池,但是放入连接池的是专用服务器.它使用连接代理(而不是专用服务器)连接客户机到数据库,优点是可以用很少的内存处理大量并发连接

(11g 新特性,特别适用于Apache的PHP应用环境).

6.4 NOTE

1).所有调度进程(dispatcher process)共享一个公共请求队列(common request connect),但每个调度进程都有自己响应的队列(response queue).
2).在共享服务器中会话是在SGA中的User Global Area(UGA)存储信息,而专用连接在PGA中存储信息,这时的PGA的存储结构为堆栈空间.
3).PGA itself is subdivided. The UGA (User Global Area) contains session state information, including stuff like package-level variables, cursor state, etc.
Note that, with shared server, the UGA is in the SGA. It has to be, because shared server means that the session state needs to be accessible to all server processes, as any one of them could be assigned a particular session. However, with dedicated server (which likely what you're using), the UGA is allocated in the PGA.
在Dedicated Server环境中,每一个连接都将启动一个专用服务进程,这个专用服务进程始终服务于这个连接直到连接断开.每一个专用服务进程都有一个属于自己的内存区域,叫做PGA(Program GlobalArea),里面存放了会话的信息,包括绑定变量、游标、排序等等. 而在Shared Server环境中,这些信息被存放到SGA中的UGA(User Global Area)区域中,这个区域一般都位于大型池中(Large pool)
4).The Location of a private SQL area depends on the type of connection established for a session. If a session is connected through a dedicated server, private SQL areas are located in the server process’ PGA. However, if a session is connected through a shared server, part of the private SQL area is kept in the SGA