一、Oracle体系结构概述
体系结构是对一个系统的框架描述,是设计一个系统的宏观工作。数据库系统结构设计了整个数据库的组成和各部分组件的功能,这些组件相互协调完成数据的管理和数据维护工作。
二、Oracle数据库洗体系结构
Oracle体系结构包括:
- 实例(instance)
- 数据库文件
- 用户进程(User process)
- 服务器进程(Server process)
- 以及其他文件:参数文件(paramater file)、密码文件(password file)和归档日志文件(archived log file)等
如下图:
(1)Oracle服务器和实例
Oracle服务器和实例是两个非常重要的概念:
- Oracle实例(instance):是有一些内存区和后台进程组成;
内存包括:数据库高速缓存、redolog缓存、共享池、流池
后台进程包括 :smon、pmon、dbwr、lgwr、ckpt
数据库启动过程可以在告警日志(alertSID.ora)中看到详细过程;
从 Oracle 11g 开始,Oracle 以 XML与传统的文本两种格式提供 Alert日志。
新的日志位置由 Automatic Diagnostic Repository (ADR)决定。
可以通过新的初始化参数 DIAGNOSTIC_DEST控制 ADR BASE的位置。
如果没有设定这个初始化参数的位置,而设置 ORACLE_BASE环境变量的话,那么,如果没有设定ORACLE_BASE ,则 ORACLE_HOME/log即为 DIAGNOSTIC_DEST。
Alert Log 文件父目录的位置在:ADR_BASE/diag/product_type{eg:rdbms}}/product_id{eg:11g}/instance_id
这个目录下有 alert/trace/bdump之类的子目录。就是 Log的具体位置了。alert下是 XML文件:
可在v$diag_info视图中用如下命令查到:
select * from v$diag_info where name ='Diag Alert'; select * from v$diag_info where name ='Diag Trace'; select * from v$diag_info;
- Oracle服务器:有数据库实例和数据库文件组成
数据库服务器出了维护实例和数据库文件外,还在用户建立与服务器的连接时启动服务器进程并分配PGA。
(2)Oracle数据库物理结构(文件组成)
数据文件(Data files)、控制文件(control files)、重做日志文件(redo files)
》数据文件(Data files):数据文件包含数据库中的实际数据、为数据库操作中数据库最终存储位置
》控制文件(control files):包含维护数据库和验证数据库完整性的信息,它是二进制文件
》重做日志(redo files):重做日志包含数据库发生变化的记录,在发生故障时用户数据恢复。
(3)参数文件、密码文件和归档日志文件
这三个文件是oracle不可或缺的三个文件。
》参数文件(parameter file):定义了数据库市里的特性,在三处文件中包含SGA中内存解构分配空间参数;
》密码文件(password file):在刚安装数据库是,oracle的默认用户和密码就存储在密码文件中,oracle可以借此判断用户的操作权限。
》归档日志文件(archive log files):归档日志文件是日志文件的脱机备份,在发生故障进行数据回复时可能使用该文件。
三、数据库连接与回话
(1)数据库连接(connection)
连接只用户进程和数据库服务器之间的通信途径,一个连接诶可以有多个对话。Oracle提供了3中数据库连结方式:基于主机的方式(Host-Based)、基于客户机-服务器的方式(Client-Server)、客户-应用服务器-数据库服务器方式(Client-Application Server);
》基于主机的方式(Host-Based):服务器和客户端运行在同一台计算机上,用户可以直接连接数据库服务器;
》基于客户机-服务器的方式(Client-Server):客户端和数据库服务器运行在不同的主机上,通过网络连接数据库服务器。
》客户-应用服务器-数据库服务器方式(Client-Application-Server):这种方式称为三层访问模式,用户访问应用服务器,然后由应用服务器连接连接数据库服务器,应用服务器就如一个中介,完成客户和数据库的交互。
(2)会话(session)
会话指一个明确的数据库连接。在(1)中提到的3种方式,一旦用户采用了一种连接方式,就把这样的连接称为会话。
四、Oracle数据库内存结构
Oracle内存结构有两部分组成,一个SGA,一个是PGA。
》PGA:程序全局区,不是数据库实例的一部分,当服务器进程启动时,才分配PGA。
》SGA:系统全局区,数据库实例的一部分,数据库实例启动时,首先分配系统全局区,在系统全局起中包含几个重要的内存区:数据库高速缓存(Database buffer cache)、重做日志缓存(redo log buffer cache)、共享池(shared pool)、large pool、java pool。
(1)共享池(chared pool)
Oracle引入共享池目的是共享SQL或则PL/SQL代码。包含:Library cache、data dict cache;
》Library cache:存储了最近使用过的SQL和PL/SQL语句。LRU算法进行缓存管理;不能直接设置这个区域的大小,只能通过设置共享池(chared_pool_size)大小,间接设置Library cache大小。
alter system set shared_pool_size = 50M; show parameter shared_pool_size;
》data dict cache:缓存区存储了数据文件、表、索引、列、用户、权限信息和其他一些数据对象的定义。不能直接设置这个区域的大小,只能通过设置共享池(chared_pool_size)大小,间接色设置data dict cache大小。
(2)数据库告诉缓冲区(database buffer cache)
》缓存最近从数据文件中读取到的数据以及用护轨更改后需要会写到数据库的数据信息;
》LRU算法管理该区域;
》管理参数:DB_BLOCK_SIZE * DB_BLOCK_BUFFERS;修改这两个参数需要重启数据生效;
9i以上的版本db_cache_size = DB_BLOCK_SIZE * DB_BLOCK_BUFFERS 修改db_cache_size不需要重启数据库服务;
SQL> show parameter db_block NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_block_buffers integer 0 db_block_checking string FALSE db_block_checksum string TYPICAL db_block_size integer 8192 SQL> show parameter db_cache NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_advice string ON db_cache_size big integer 0 SQL>
11g sga自动管理,所以db_cache_size 和db_block_bufers都为0;
可以试用show sga查看数据库告诉缓冲去的分配的内存大小;
SQL> show sga Total System Global Area 1185853440 bytes Fixed Size 2212776 bytes Variable Size 738200664 bytes Database Buffers 436207616 bytes Redo Buffers 9232384 bytes SQL>
上述,database buffer为数据库缓存区的大小;
oracle中引入了。buffer cache advisory parameter,起目的是让oracle对于数据库缓存去的内存分配提供一些建议;
db_cache_advice OFF | ON | READY
SQL> show parameter db_cache_advice; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_cache_advice string ON SQL> select id, name, block_size,size_for_estimate,buffers_for_estimate from v$db_cache_advice; ID NAME BLOCK_SIZE SIZE_FOR_ESTIMATE BUFFERS_FOR_ESTIMATE ---------- -------------------- ---------- ----------------- -------------------- 3 DEFAULT 8192 32 3940 3 DEFAULT 8192 64 7880 3 DEFAULT 8192 96 11820 3 DEFAULT 8192 128 15760 3 DEFAULT 8192 160 19700 3 DEFAULT 8192 192 23640 3 DEFAULT 8192 224 27580 3 DEFAULT 8192 256 31520 3 DEFAULT 8192 288 35460 3 DEFAULT 8192 320 39400 3 DEFAULT 8192 352 43340 3 DEFAULT 8192 384 47280 3 DEFAULT 8192 416 51220 3 DEFAULT 8192 448 55160 3 DEFAULT 8192 480 59100 3 DEFAULT 8192 512 63040 3 DEFAULT 8192 544 66980 3 DEFAULT 8192 576 70920 3 DEFAULT 8192 608 74860 3 DEFAULT 8192 640 78800 20 rows selected. Elapsed: 00:00:00.02 SQL>
(3)重做日志高速缓存区(redo buffer cache)
log_buffer,该参数不能动态修改;
SQL> show parameter log_buffer NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_buffer integer 8847360 SQL> alter system set log_buffer = 10M 2 ; alter system set log_buffer = 10M * ERROR at line 1: ORA-02095: specified initialization parameter cannot be modified Elapsed: 00:00:00.04 SQL>
(4)Large pool和java pool
Large pool是sga的一段可选内存区,只在共享服务器环境中配置。
通过 large_pool_size修改改区域大小,可以动态修改,不需要重启服务;
SQL> show parameter large_pool_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ large_pool_size big integer 0 SQL> show parameter java_pool_size NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ java_pool_size big integer 0 SQL>
11g中这两个参数都是sga自动管理,所以值都是0;
(5)streaming pool
通过stream_pool_size设置
(6)PGA(进程全局区)和UGA(用户全局区)
》PGA,是服务器进程专用的一块聂村,它是操作系统进程专用的内存,系统中的其他进程是无法访问这块内存的。PGA独立于SGA,PGA不会在SGA中出现,他是有操作系统在本地分配的。
PGA中存储了服务器进程或者单独的后台进程的数据信息和控制信息。它随着服务器进程创建而被分配内存,随着进程的终止而释放内存。
PGA是不是一个共享区域,而是服务器进程专有的区域。在专有服务器(与共享服务器相对的概念)配置中包括如下组件:
-排序区:对某些的SQL语句执行结果进行排序。
-会话信息:包含本次会话的用户权限喝性能统计信息。
-游标状态:表名当前会话执行的SQL语句的处理阶段。
-堆栈区:包含其他会话变量。
在共享服务器配置中,多个用户进程共享一个服务器进程,上述的这些内存区域可能出现在SGA中分配,如果创建了largepool,这些内存结果就存储在large pool中,否这它们存储在shared pool中。
》UGA(用户全局区),在共享服务器模式下,UGA存储在每个共享服务器都可以访问的SGA中,这样任何服务器都可以试用用户会话的数据和其他信息。而在专用服务器模式下,用户会话状态不需要共享,用户进程与服务器进程是一一对应的关系,所以UGA总是在PGA中进行分配。
》PGA内存管理,从9i开始oracle提供了两种办法管理PGA,手动和自动。
如果手动管理,必须指定sort_area_size参数告诉oracle使用多大内存进行排序;自动管理则不需要。
SQL> show parameter sort_area_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sort_area_size integer 65536 SQL>
(7)如何活得内存缓冲区的信息
SQL> show sga Total System Global Area 1185853440 bytes Fixed Size 2212776 bytes Variable Size 738200664 bytes Database Buffers 436207616 bytes Redo Buffers 9232384 bytes SQL> show parameter sga_max_size; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ sga_max_size big integer 1136M SQL>SGA是oracle所有进程共享的一段内存区其中共享了数据库信息(数据库高速缓冲区中的数据、共享次中的library cache中的sql语句等)。
Data base buffers、redo buffers前面已经介绍过了,接下来看看fixed size和variable size。
Fixed size:大小用户无法控制,存储SGA中其他组件的变量。
Variable Size:该部分包含shared pool、java pool、large pool,Variable size必须大于三者之和,因为total sga中出去db_cache_size部分也包括在variable size之中。
五、Oracle服务器进程和用户进程
服务器进程和用户进程,是用户试用数据库连接工具同数据库服务器建立连接时,涉及的两个概念。
(1)服务器进程:代表客户会话完成工作的进程。应用向数据库发送的SQL语句最后就要由这些进程接收并执行。dedicated server连接
会在服务器上得到针对这个连接的一个专用进程。数据库连接与服务器上的一个进程之间存在一对一的映射。shared server多个会话可以共享一个服务器进程池,其中的进程由Oracle实例生成和管理。你所连接的是一个数据库调度器(dispatcher),而不是特意为连接创建的一个专用服务器进程。
(2)用户进程:是一个需要与Oracle Server交互的程序运行于客户端当用户运行某个工具或应用程序(如SQL*Plus)时创建,当用户退出上述程序时结束用户进程向Oracle Server发出调用,但它并不与Oracle Server直接交互,而是通过Server Process与Oracle Server进行交互。
六、Oracle数据库后台进程
DBWR、LGWR、PMON、SMON、CKPT。
(1)系统监控进程(SMON):系统监控进程的主要作用就是数据库实例恢复。
当数据库遭遇异常时,比如,操作系统重启数据库异常停机,此时实例SGA中的所有没有写到磁盘的信息都将丢失。当数据库重新启动后,系统监控进程自动恢复实例:
包括3个步骤:
①、前滚所有没有写入数据文件而记录已经在redolog的数据。
②、打开数据库,此时系统监控进程的redo操作还没有完成,oracle这样的做的目的是方便用户及时登录,避免前滚周期过长,影响用户的行为,此时用户可以操作没有被前滚锁的数据。
③、回滚未提交事务。
(2)进程监控进程(PMON):负责服务器进程的管理和维护工作,在进程失败或者连接异常发生时该进程负责一些清理工作。
未完。。。