一、Oracle体系概论
在正式开始学习Oracle体系结构之前,我们先通过下面的图片对Oracle体系结构有个初步把握。
1、Oracle服务体系(Oracle Service)由实例(Instance)和数据库(Database)两部分内容组成。
其中数据库是我们计算机上实实在在存在的一系列磁盘文件,而实例则是由一组管理数据库的内存结构和进程结构两部分内容组成;
2、实例:负责与数据库进行交互,在oracle数据库客户端/服务器模式中,任何用户都无法绕过实例,直接与数据库进行交互;非RAC模式下,一个实例通常只对应一个数据库;我们可以通过HASH(ORACLE_SID,ORACLE_HOME)确定实例的哈希地址,即确定实例唯一性;
二、Oracle体系组成图,中英文对照版
说明:下面的体系组成部分,我们会在后面一点点详细讲解,图片所示内容初步了解即可:
三、“桥梁”――监听
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,如下图:
3、数据库分类文件样式图:
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、 从用户进程发起的sql或pl/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_name、salary这两个字段;
数据字典缓冲区是数据库对应磁盘文件的副本,如果数据解析时,数据缓冲区没有内容,则会到数据库磁盘文件中进行检索并复制一份副本给数据字典缓存区;
③用户全局区域(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算法?
LRU是Least 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参数实现动态智能化管理SGA和PGA;
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记录数据修改时的记录,主要用于数据库异常情况下的数据回滚;
UNDO记录数据修改前的状态,主要用于ROLLBACK时的操作处理;
5、Oracle10g内存管理(了解)
在 Oracle 10g中,与内存相关的参数可以归为两类: |
l 自动调优的SGA参数:目前这些参数包括DB_CACHE_SIZE、 SHARED_POOL_SIZE、LARGE_POOL_SIZE和JAVA_POOL_SIZE。 |
l 手动SGA参数:这些参数包括LOG_BUFFER、STREAMS_POOL、 DB_NK_CACHE_SIZE、DB_KEEP_CACHE_SIZE和DB_RECYCLE_CACHE_SIZE。 |
在Oracle 10g中,任何时候你都能查询V$SGAINFO,来查看SGA的哪些组件的大小可以调整。 |
注意要使用自动SGA内存管理,参数STATISTICS_LEVEL必须设置为TYPICAL或ALL。如果不支持统计集合,数据库就没有必要的历史信息来确定大小。 |
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的状态
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;