- 基本概念
a. 概述:
数据库系统是一个存储和管理数据记录的系统,通常由DB、DBMS及其开发工具、应用系统和用户组成。其中,DB实现数据存储功能,DBMS是数据库和其它部分的中间层,具有对数据库的管理和控制功能,开发工具、应用系统和用户通过DBMS可以实现对数据库的操作和数据存储。
b. Oracle系统的特点:
Oracle系统具有可扩充性、可靠性和可管理性。
a) 可扩充性
当Oracle系统承担不断增长的工作负载的同时,具有有效扩充其系统资源利用情况的能力。也就是说,给定的系统既可以有效地为5个用户提供服务,也可以有效地为5000个用户同时提供服务。
b) 可靠性
Oracle系统具有极强的抵御风险的能力,无论是操作系统崩溃,还是系统出现故障,都可以确保在执行事务处理时不出现异常或尽快地恢复到故障前的状态。
c) 可管理性
数据库管理员可以调整Oracle使用内存的方式、向磁盘写入数据的频率,数据库为连接到该数据库的用户分配系统进程的方式等等。
这些能力都是与Oracle的体系结构密切相关的。
c. oracle工作原理:
a) 在数据库服务器上启动Oracle实例;
b) 应用程序在客户端的用户进程中运行,启用Oracle网络服务驱动器与服务器建立连接;
c) 服务器运行Oracle网络服务驱动器,建立专用的服务器进程执行用户进程;
d) 客户端提交事务;
e) 服务器进程获取sql语句并检查共享池中是否有相似的sql语句,如果有,服务器进程再检查用户的访问权限;否则分配新的sql共享区分析并执行sql语句;
f) 服务器从实际的数据文件或SGA中取得所需数据;
g) 服务器进程在SGA中更新数据,进程DBWN在特定条件下将更新过的数据块写回磁盘,进程LGWR在重做日志文件中记录事务;
h) 如果事务成功,服务器进程发送消息到应用程序中。
- Oracle体系结构:
a. 三个重要概念:
Oracle服务器(Oracle Server)、Oracle实例(Oracle Instance)、Oracle数据库(Oracle Database)。
a) Oracle服务器:
是一个Oracle数据库管理系统。一个最大的
概念。包括oracle实例和oracle数据库。
b) Oracle实例:
Oracle实例是用来访问一个Oracle数据
库的。由内存和后台进程组成。Oracle
实例是易于消失的,断电则消失,服务
器启动则创建。
Instance和database是多对一的关系。
一个实例对应一个database,一个database可对应多个instance。集群下是多个instance对应一个database。
Connection和Session:
Connection:Oracle客户端和后台的服务器(后台
进程)建立的TCP连接。
Session:连接成功后就启动一个会话,断开连接
之后则会话销毁。
background Process(后台进程)和Server
Process(服务器进程):
background Process主要是专注于数据库核心的进程。
Server Process,也属于后台进程。主要是处理客户端和服务器之间连接的进程。
c) Oracle数据库:
i. Oracle数据库就是一堆文件,包含三种基本的文件类型:数据文件、控制文件和重做日志文件(恢复数据文件)。
还包含,其他文件:参数文件、密码文件及归档日志文件。
ii. 数据文件:存储数据,以.dbf做后缀。一句话:一个表空间对多个数据文件,一个数据文件只对一个表空间。
控制文件:存储实例、数据文件及日志文件等信息的二进制文件。alter system set control_files=‘路径’。
日志文件:即Redo Log Files和Archivelog Files。记录数据库修改信息。
参数文件:记录基本参数。
警告文件:show parameter background_dump_dest—使用共享服务器连接
跟踪文件:show parameter user_dump_dest—使用专用服务器连接(专用服务器适用于开发阶段,简单,连接少。反之,共享服务器适用于实际应用环境,多应用,高并发)。
iii. 重做日志文件和归档日志文件的关联:
重做日志文件写满之后会被覆盖,在覆盖之前写入到归档日志文件中。
- 物理结构:
4. 内存结构:
a. Oracle的内存结构包含两大块内存区域:
System Global Area(SGA,系统全局区):实例启动的时候启动一个SGA,SGA是Oracle实例一个最基本的组成部分。Oracle特别费内存,主要是SGA费内存(大概占到Oracle整个物理内存的80%)。
Program Global Area(PGA,程序全局区):一个Server process就启动一个PGA。
b. SGA:
a) SGA包含几个内存区域:Shared Pool(共享池)、Database Buffer Cache(数据库高速缓冲区)、Redo Log Buffer(重做日志缓冲区)及其他的内存区域。
此外还有两个额外的内存区域:Large Poo(大池)和Java Pool(Java池)。
b) 早起版本中SGA启动后就是固定不变的。Oracle9i之后就可以在线的时候动态的调整SGA的值。用户发出的请求负荷越大,SGA需要的内存越大,则SGA就会扩张。
c) SGA中的重要参数:SGA_MAX_SIZE:SGA内存的最大值。SGA分配内存的基本单位为granules。SGA小于128M,则granules是4M,超过则是16M. SGA是连续的分配内存空间。
d) 查询SGA的组成部分及每部分的大小:
Select component,granule_size from v$sga_dynamic_components;
e) 重要参数:(查询联机文档)
DB_CACHE_SIZE、LOG_BUFFER、SHARED_POOL_SIZE、LARGE_POOL_SIZE JAVA_POOL_SIZE等。
这些参数的配置是比较头疼的问题。所以从Oracle10g开始引入了自动内存分配功能。指定sga_max_size及sga_target的值来控制sga的最大内存,在该条件下,oracle具体每个部件分配具体的内存会随着oracle负荷的变化,oracle会自动调整。
f) SGA各个内存区域的介绍:
i. Shared Pool:
用来存储最近使用过的sql语句及最近使用过的数据。
它包含两部分和性能有关的内存结构:Library Cache(库缓存)和Data Dictionary Cache(数据字典高速缓存)。
该内存区域的大小可以由SHARED_POOL_SIZE参数控制。如:alter system set shared_pool_size=64M;
ii. Library Cache:
存放了最近执行的SQL语句、存储过程、函数、解析树以及执行计划等。
Library cache则是shared pool里最重要的部分,也是在shared pool中进进出出最活跃的部分。
采用least recently used(LRU)算法管理。
包含两部分:Shared SQL area和Shared PL/SQL area。
Shared Pool的大小决定了Library Cache的大小。
iii. Data Dictionary Cache:
存放了在执行SQL语句过程中,所参照的数据字典的信息,包括SQL语句所涉及的表名、表的列、权限信息等。
dictionary cache也叫做row cache,因为这里面的信息都是以数据行的形式存放的,而不是以数据块的形式存放的。
对于dictionary cache来说,oracle倾向于将它们一直缓存在shared pool里,不会将它们交换出内存,因此我们不用对它们进行过多的关注。
v$sga_dynamic_components是一个视图,数据都属于data Dictionary,存放在data dictionary Cache中。
几乎所有的操作都需要使用(如对表操作是否有权限)。
iv. Database Buffer Cache:
存储真正的数据文件。体积最大。
执行查询语句时,先到Database Buffer Cache中查找,找到称为 Cache hite。否则是Cache miss。优化sql语句实际上就是提高Cache hite的命中率。
v. Redo Log Buffer:
记录数据库的所有改变和事物回滚。主要目的是恢复。被改变的一条记录称为一个redo entry。
由LOG_BUFFER决定大小。
可选项:
vi. Large Pool:
SGA的一个可选模块,主要处理额外工作,如备份、并行处理及IO操作。
用于减轻Shared Pool的压力。没有采用LRU算法。由LARGE_POOL_SIZE决定大小,能够动态分配大小。
vii. Java Pool:
与Java有关。
用于解析Java命令,如果使用Java,则必须有Java Pool。大小由JAVA_POOL_SIZE决定。
c. PGA:每个后台进程一个PGA。
a) 为每个连接到Oracle数据库的用户进程保存操作。
b) 当一个进程创建出来的时候创建,当该进程终止则PGA终止。
c) 一个PGA值为一个进程服务。
5. Oracle进程结构:
Oracle实际上是运行在多种环境下:IBM大机、开放式环境unix小机、x86个人计算机、windows、unix、linux。
Windows、unix及linux本质区别:unix中进程是一个核心概念,windows虽然有进程,实际上是一个单进程多线程的程序。Oracle服务在unix和linux下表现形式都是一个个进程。在windows平台下表现形式是一个大的进程里面不同的线程。
a. Oracle中进程的分类:User process(用户进程)、Server process(服务进程)及Background processes(后台进程)。
Oracle进程其实只有后台进程,服务器进程是一种特殊的后台进程。
用户进程:为了连接Oracle的后台服务器,在客户端的程序运行起来的进程就叫用户进程。
b. User Process:
用户进程是一个要求和Oracle服务器进行交互的
程序。在交互之前必须先建立一个连接。用户进程并
不会直接和Oracle服务器进行交互。
任何程序想要连接到Oracle服务器,就是Oracle
的一个客户端。一般是编译Oracle客户端的库来进行连接。如Oracle的sqlplus。
c. Server Process:
直接和Oracle服务器进行交互的程
序,完成需求并且返回结果。可以是专
用的或共享的。
举例:
User Process:客户
Server Process:销售科
Background Process:生产线
采用IPC或TCP/IP协议进行交互。
大的矩形框相当于是电脑。黄色框表示
网卡,圈表示进程。如果计算机1是运行
oracle的服务器,另外一个windows是客
户端。
两个不同电脑上的进程通信用的是
TCP/IP协议。
同一个电脑上的进程通信有两种方式:
a) IPC:不通过网卡(通过共享池,消息放入到共享池中,另外一个去取出来)
b) 模拟的TCP/IP通讯。Linux和unix中有一个特殊的网卡交lo(Local Loopback本地环路).
d. Background Process:
Background Process:Oracle Instance的核心。用于负责进行物理和内存之间的交互。
必要的后台进程:DBWn、PMON、CKPT、LGWR及SMON。
可选的后台进程:ARCn、LMDn、QMNn、CJQ0、LMON、RECO、Dnnn、LMS、Snnn、LCKn、Pnnn。
注意:n表示数字
e. Database Writer(DBWn) n大概从0到20。
工作最繁重。把sga中data buffer cache中已经修改过的内容(duty buffer)通过dbwn写到datafiles中。
如果存在大量的io操作就可以配置多个dbwn。
f. Log Writer(LGWR)
将Redo Log Buffer 中的内容写到Redo Log files文件中。
g. System Monitor(SMON)
相当于清洁员。
h. Process Monitor(PMON)
相当于清除有问题的后台进程。
i. Checkpoint(CKPT)
工作是轻量级的。早起该工作是由LGWR来完成,随着管理数据的加大,用CKPT来完成。
相当于是秘书,打杂。
j. Archiver(ARCn):
可选项进程。但是基本上都用。
Oracle可运行与两种模式:归档和非归档。Redo log file中份内容覆盖之前用ARCn进程将内容归档到归档文件中。
- 逻辑结构:
包含:tablespaces、segments、extents和blocks。
一个服务器只有一个database,一个database可以有多个tablespace,一个tablsespace可以由多个segment组成,一个Segment可以有多个extent,一个extent是一组连续的blocks组成。
Block是oracle的最小基本单位,块对应操作系统的块(操作系统的文件系统也是由块组成),一块对应内存中的一页。Oracle的block是操作系统文件系统的整数倍。在oracle中一个重要参数db_block_size,决定了block的大小,一般一个block为8kb。
Tablespace和segment可以由多个datafile组成,extent只能有一个datafile组成。
Oracle数据库执行sql语句的过程:
1. 创建连接
2. 发出sql语句
3. 安全检查
4. Parsing即解析sql语句,把sql语句分解成它能够执行的原子操作。
5. bunding绑定变量
6. 执行sql语句
7. 返回结果
Connection 和Session的区别:
SGA和PGA的区别:
每个进程都有一个PGA。