漫谈Oracle体系结构(慢慢补充......)

一、Oracle体系概论

在正式开始学习Oracle体系结构之前,我们先通过下面的图片对Oracle体系结构有个初步把握。

wKiom1SGfyHDTY-EAADqKkAddQM749.jpg


1、Oracle服务体系(Oracle Service)由实例(Instance)和数据库(Database)两部分内容组成。

其中数据库是我们计算机上实实在在存在的一系列磁盘文件,而实例则是由一组管理数据库的内存结构和进程结构两部分内容组成;

2、实例:负责与数据库进行交互,在oracle数据库客户端/服务器模式中,任何用户都无法绕过实例,直接与数据库进行交互;非RAC模式下,一个实例通常只对应一个数据库;我们可以通过HASH(ORACLE_SID,ORACLE_HOME)确定实例的哈希地址,即确定实例唯一性;


二、Oracle体系组成图,中英文对照版

说明:下面的体系组成部分,我们会在后面一点点详细讲解,图片所示内容初步了解即可:

wKiom1SG7KnQi_lqAAOEQfdf9qw668.jpg

wKioL1SG7T_QUvBjAAKbxo1v8Hk871.jpg


三、“桥梁”――监听

1、监听(Listener):用于监视从客户端发起对数据库的连接请求,请求信息中包含登录用户名、登录密码、连接实例等信息内容,监听对于这部分请求信息进行合法性鉴别,如果信息合法,则抛给服务进程进行客户端请求服务;可以通俗理解成,监听是连接用户进程和服务进程的“桥梁”;

2、监听路径:E:\app\tom\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora

3、监听格式:

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))

      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))

    )

  )


四、Oracle 服务器两种最常见的处理请求方式:

1、分类:

        专用服务器(dedicated server)连接和共享服务器(shared server)连接。

2、含义:

        专用服务器模式下,1个服务器进程只服务于1个客户端连接请求;

        共享服务器模式下,采用”共享进程“池服务于客户端连接请求,即共享进程池中哪个服务进程有空闲就服务于客户端连接请求,如果所有的服务器进程都处于繁忙状态,则客户端连接请求处于等待状态;3、适用场景说明:

       当预期客户机连接总数较小,或客户机向数据库服务器发起请求持续时间比较长,请使用专有模式;

       当大量客户机同时要连接数据库并且有效地利用系统资源时,特点是高并发、事务量小,此种情景模式下请使用共享模式

4、注意:

        共享服务器模式必须使用net services,即必须配置tns信息――网络配置信息,

 我们可以通过在DOS命令行中执行 lsnrctl  service  命令来查看连接模式;                                      

5、lsnrctl service命令执行结果集

Microsoft Windows [版本 6.1.7600]

版权所有 (c) 2009 Microsoft Corporation。保留所有权利。


C:\Users\neusoft>lsnrctl service


LSNRCTL for 32-bit Windows: Version 11.2.0.1.0 - Production on 09-12月-2014 21:2

0:37


Copyright (c) 1991, 2010, Oracle.  All rights reserved.

正在连接到 (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521)))

服务摘要..

服务 "CLRExtProc" 包含 1 个实例。

  实例 "CLRExtProc", 状态 UNKNOWN, 包含此服务的 1 个处理程序...

    处理程序:

      "DEDICATED" 已建立:0 已被拒绝:0

         LOCAL SERVER

服务 "orcl" 包含 1 个实例。

  实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...

    处理程序:

      "DEDICATED" 已建立:144 已拒绝:0 状态:ready

         LOCAL SERVER

服务 "orclXDB" 包含 1 个实例。

  实例 "orcl", 状态 READY, 包含此服务的 1 个处理程序...

    处理程序:

      "D000" 已建立:0 已被拒绝:0 当前: 0 最大: 1022 状态: ready

         DISPATCHER <machine: NEUSOFT-PC, pid: 2112>

         (ADDRESS=(PROTOCOL=tcp)(HOST=neusoft-PC)(PORT=49160))

命令执行成功


6、查看共享模式参数:

我们可以通过在SQLPLUS界面输入show parameter shared查看共享模式参数

例如:SQL> show parameter shared


NAME                                   TYPE        VALUE

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

hi_shared_memory_address             integer          0

max_shared_servers                   integer

shared_memory_address     integer          0

shared_pool_reserved_size            big integer    13212057

shared_pool_size                     big integer      0

shared_server_sessions               integer

shared_servers                       integer          1


7、查看调节器参数:

可以通过在sqlplus中执行show parameter dispatchers查看共享服务器模式下调度器参数情况信息


8、备注说明:

共享模式现在在应用程序中已经很少使用,因为现在程序中都已经具备这种功能,不需要单独在oracle中进行设置;


五、数据库文件

1、组成分类:数据库文件由控制文件、数据文件、重做日志文件3大类文件组成;

2、文件分布路径:E:\app\tom\oradata\orcl,如下图:

wKioL1SJlPPQqBKjAAHNm11SLy4945.jpg

3、数据库分类文件样式图:

wKioL1SJlUGAlcpdAAG09lO7NiA624.jpg

4、类型分类:

其中控制文件和重做日志文件属于离线文件,数据文件属于在线文件。所谓离线是指不需要oracle服务启动也可以使用,反而,在线是需要Oracle正常启动后才能正常作业;

5、数据文件查询方法:

SELECT * FROM V$DATAFILE;

SELECT * FROM DBA_DATA_FILES;


六、SGA

1、含义:

(SYSTEM GLOBAL AREA)系统全局区域,还有一种通俗称呼是(SHARE GLOBAL AREA)共享全局区域,存储Oracle数据库实例(instance)的数据和控制文件信息,1个实例只有1个SGA,数据库实例启动时,SGA的内存被自动分配,当数据库实例关闭时,SGA内存被回收;

2、SGA组成体系:

共享池(shared pool
数据缓存区(database buffer cache
重做日志缓冲区(redo logbuffer
Java
池(Java pool
大型池(large pool)(可选的, Oracle9iRelease2版本中才开始出现)
数据流池(streams pool(Oracle 10g 新增)
数据字典缓存区(datadictionary cache
其他杂项信息(others

3、共享池

Ⅰ组成范围:

①库高速缓存区(Library Cache):

共享SQL区(与之对应的有“私有SQL区”,在PGA中存放)

SQL AREA:存放sql语句文本、分析树已编译的版本、执行计划执行时采取的步骤;

PL/SQL AREA,存放PL/SQL中编译代码、调试代码、解析树等信息;

说明:

1、             从用户进程发起的sqlpl/sql代码,oracle首先会在共享SQL区中寻找是否存在历史已缓存的数据结果集,如果有则不需要进行重新解析,直接复制一份返回给PGA私有SQL区进行执行,如果没有,则先进行代码分析,分析完毕后存放于共享SQL区,然后再复制一份给PGA私有SQL区进行执行

2、             Library Cache大小由共享池大小(share_pool_size)决定,不可以直接进行调整。

3、             存放共享SQL区的目的是为了以后减少解析时间,复用已有的解析成果。但是任何SQL或者PL/SQL代码最终都是在PGA中的私有SQL区进行执行、排序等操作;

4、             任何用户都可以通过V$sqlarea访问共享SQL;

②数据字典缓存区(data dictionary cache):

存放用户、权限、表对象、表中字段等所对应的数据字典的副本,如果不存在,则会报错。主要是负责语法、语义的解析;、

举例:比如我需要执行selecth.last_name,h.salary from hr.employees h;   

oracle会检查这个待执行的sql语句中是否存在拼写错误,检查是否存在employees这张表,检查是否存在hr这个用户,检查当前登录用户是否有权限对hr.employees表有操作权限,检查表中是否有last_namesalary这两个字段;

数据字典缓冲区是数据库对应磁盘文件的副本,如果数据解析时,数据缓冲区没有内容,则会到数据库磁盘文件中进行检索并复制一份副本给数据字典缓存区;          

③用户全局区域(User Global Area):

在共享连接模式下,如果大型池(large pool)启用,则UGA属于大型池,否则属于共享池;

Ⅱ共享池管理:

 1、刷新共享池:ALTERSYSTEMFLUSHSHARED_POOL

说明:

  刷新共享池会将SGA中的share_pool中的数据全部清除,这个操作不建议在并发量大的时间操作,

  另外操作完毕后,oracle解析sql或pl/sql的时间可能会增加,但是性能会很快重新提升,

  这个操作可以作为oracle性能调优的手段之一,减少共享内存中的碎片;

2、更改共享池大小:ALTERSYSTEMSET SHARED_POOL_SIZE=66M; 

3、  共享池size过大或过小,都会影响Oracle性能;

4、  共享池中多大量的小内存块组成,内存块大小一般为4KB,我们使用大量的小内存块来避免碎片的问题,共享池中使用LRU方法进行管理,下面补充LRU的相关知识;

什么是LRU算法?

 LRULeast Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的。LRU法则下,Oracle内存中最近使用的数据就会被依次放入头部,当内存空间满时,就会将最近很少使用的内存区域中的数据清除出共享内存区;

4、数据缓存区(data buffer cache

数据缓存区的大小是由内存块大小(DB_BLOCK_SIZE*内存块数量(DB_BLOCK_CACHE)决定,因为DB_BLOCK_SIZE是由数据库创建时决定,一般大小是4K,如需更改则需要重新创建数据库,所以我们一般不需要更改,那我们只能通过修改动态参数DB_BLOCK_CACHE进而控制数据缓存区的大小。在Oracle9i以后版本中出现了另外一个参数DB_CACHE_SIZE控制数据缓存区大小,即DB_CACHE_SIZE= DB_BLOCK_CACHE* DB_BLOCK_SIZE

Oracle通过LRUW链条对数据缓存区中的脏块(即数据缓存区中数据发生变化并且没有写入数据文件中的数据)进行管理;

我们可以通过:ALTER SYSTEM FLUSH BUFFER_CACHE;语句实现对数据缓存区的刷新;

oracle10g开始,可以通过SGA_TARGET参数实现动态智能化管理SGA;

oracle11g更加智能化,通过MEMORY_TARGET参数实现动态智能化管理SGAPGA;


Oracle9i需要手工分配max_sga_size

            ↓

Oracle10g自动管理SGA,设置sga_target,sga_target<=max_sga_size

            ↓

Oracle11g自动管理SGA和PGA,设置memory_target,我们称之为ASMM;

说明:

通过上面各Oracle版本对于内存的管理,不难看出Oracle在朝着越来越智能化的方向发展,但是作为优秀的DBA人员,至少应当是熟悉Oracle对于共享内存处理的原理,以方便问题的排查、解决;

5、  重做日志缓冲区(redo logbuffer)

  • 主要目的用来数据库恢复

  • 在块中动的记录我们称REDO 记录

  • REDO实体包括了重构数据的信息

  • 大小由LOG_BUFFER决定

REDO记录数据修改时的记录,主要用于数据库异常情况下的数据回滚;

UNDO记录数据修改前的状态,主要用于ROLLBACK时的操作处理;

5、Oracle10g内存管理(了解)


 Oracle 10g中,与内存相关的参数可以归为两类:

自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE SHARED_POOL_SIZELARGE_POOL_SIZEJAVA_POOL_SIZE

手动SGA参数:这些参数包括LOG_BUFFERSTREAMS_POOL DB_NK_CACHE_SIZEDB_KEEP_CACHE_SIZEDB_RECYCLE_CACHE_SIZE

Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。

注意要使用自动SGA内存管理,参数STATISTICS_LEVEL必须设置为TYPICALALL如果不支持统计集合,数据库就没有必要的历史信息来确定大小。

SQL> SELECT * FROM V$SGAINFO;

 

NAME                            BYTES       RESIZEABLE

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

Fixed SGA Size                  1374584         No

Redo Buffers                    5410816         No

Buffer Cache Size             452984832         Yes

Shared Pool Size              226492416         Yes

Large Pool Size                 8388608         Yes

Java Pool Size                  8388608         Yes

Streams Pool Size                     0         Yes

Shared IO Pool Size                   0         Yes

Granule Size                    8388608         No

Maximum SGA Size              711430144         No

Startup overhead in Shared Pool   67108864      No

Free SGA Memory Available        8388608 

 

12 rows selected


我们可以通过V$SGA的状态

wKiom1SJm32Se36xAAP0MboUlas381.jpg


SQL> SHOW SGA


Total System Global Area     711430144 bytes

Fixed Size                     1374584 bytes

Variable Size                251659912 bytes

Database Buffers             452984832 bytes

Redo Buffers                   5410816 bytes


alter system set sga_target=1000m scope=both;

指定区域为spfile时(包括修改SGA_MAX_SIZE本身),SGA_TARGET可以大于MAX_SGA_SIZE的大小,Oracle会在下次启动时自动变更max_sga_size的大小=总和;

PRE_PAGA_SGA默认值为false,这个参数设置作用是:是否将全部SGA置入物理内存中;


**********下面内容为课堂试验部分**********

SQL> --共享池过小或过大都会影响数据库性能,我们可以通过下面语句实现共享池的刷新

SQL> alter system flush shared_pool;


系统已更改。


SQL> --但是上面语句不建议在白天数据并发量很大的时候操作,此操作可以将共享池中缓

存数据清除;

SQL> --我们可以通过pre_page_sga参数实现oracle实例启动时将分配给sga的物理内存一次

性加载上

SQL> alter system set pre_page_sga=true scope=spfile;


系统已更改。


SQL> --我们可以通过lock_sga参数实现sga锁定在物理内存中;

SQL> alter system set lock_sga=true scope=spfile;


系统已更改。


--下面是更改共享池最大内存大小的过程

SQL> --查询共享池内存大小

SQL> show parameter sga_max_size


NAME                                 TYPE        VALUE                          

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

sga_max_size                         big integer 680M                           

SQL> --sga_max_size参数是sga最大内存,可以手工调整,调整完毕需要重启数据库实例

SQL> alter system set sga_max_size=660M;

alter system set sga_max_size=660M

                 *

第 1 行出现错误: 

ORA-02095: 无法修改指定的初始化参数 


SQL> --上面的错误可以通过后面加scope(范围)解决

SQL> show parameter spfile


NAME                                 TYPE        VALUE                          

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

spfile                               string      E:\APP\NEUSOFT\PRODUCT\11.2.0\ 

                                                 DBHOME_1\DATABASE\SPFILEORCL.O 

                                                 RA                             

SQL> alter system set sga_max_size=800M scope=spfile;


系统已更改。


SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。


Total System Global Area  836976640 bytes                                       

Fixed Size                  1377812 bytes                                       

Variable Size             658508268 bytes                                       

Database Buffers          171966464 bytes                                       

Redo Buffers                5124096 bytes                                       

数据库装载完毕。

数据库已经打开。

SQL> show parameter sga_max_size


NAME                                 TYPE        VALUE                          

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

sga_max_size                         big integer 800M                           


--通过v$sgainfo视图可以查看sga各组成部件的明细及大小

SQL> select * from v$sgainfo;


NAME                                  BYTES RES                                 

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

Fixed SGA Size                      1377812 No                                  

Redo Buffers                        5124096 No                                  

Buffer Cache Size                 171966464 Yes                                 

Shared Pool Size                  524288000 Yes                                 

Large Pool Size                     4194304 Yes                                 

Java Pool Size                      4194304 Yes                                 

Streams Pool Size                         0 Yes                                 

Shared IO Pool Size                       0 Yes                                 

Granule Size                        4194304 No                                  

Maximum SGA Size                  836976640 No                                  

Startup overhead in Shared Pool    58720256 No                                  


NAME                                  BYTES RES                                 

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

Free SGA Memory Available         125829120                                     


已选择12行。SQL> --查看sga组件信息

SQL> show sga


Total System Global Area  836976640 bytes                                       

Fixed Size                  1377812 bytes                                       

Variable Size             658508268 bytes                                       

Database Buffers          171966464 bytes                                       

Redo Buffers                5124096 bytes                                       

SQL> --查询共享池中空闲信息

SQL> select * from V$SGASTAT st where st.POOL='shared pool' and st.NAME='free memory';

 

POOL         NAME                            BYTES                              

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

shared pool  free memory                 415369404                              


SQL> --通过v$sga_dynamic_components视图查看sga各部件信息

SQL> select component as 数据对象,granule_size as 颗粒大小 from V$sga_Dynamic_Components;


数据对象                                                           颗粒大小     

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

shared pool                                                         4194304     

large pool                                                          4194304     

java pool                                                           4194304     

streams pool                                                        4194304     

DEFAULT buffer cache                                                4194304     

KEEP buffer cache                                                   4194304     

RECYCLE buffer cache                                                4194304     

DEFAULT 2K buffer cache                                             4194304     

DEFAULT 4K buffer cache                                             4194304     

DEFAULT 8K buffer cache                                             4194304     

DEFAULT 16K buffer cache                                            4194304     


数据对象                                                           颗粒大小     

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

DEFAULT 32K buffer cache                                            4194304     

Shared IO Pool                                                      4194304     

ASM Buffer Cache                                                    4194304     


已选择14行。


SQL> --这里的颗粒大小也是作为实际变更sga组件大小的依据

SQL> --sga中共享池中有共享sql区域,用于存放历史期间执行过的sql语句信息,我们可以通过v$sqlarea视图进行查看

SQL> select * from v$sqlarea where rownum=1;



你可能感兴趣的:(oracle,数据库,计算机,体系结构)