Oracle 12c 读书笔记(二):Oracle数据库体系结构

Oracle 12c 读书笔记(二):Oracle数据库体系结构

以11g来分析

 数据库实例包括:SGA和一系列后台管理、监控简称

数据库包括三种文件:数据文件、控制文件、重做日志文件

数据库实例和数据库是Orale数据库体系的核心部分

Oracle服务器和实例

实例:由一些在内存区和后台进程组成

这些内存区包括 数据库高速缓存、重做日志缓存、共享池、流池及其他可选区域,如JAVA池,这些池称为数据库的内存结构

后台进程包括系统监控进程SMON,进程监控PMON,数据库写进程DBWR,日志写进程LGWR,检验点进程CKPT及其他进程(如归档进程,REco进程),这些数据库系统进程忠于职守、相互协作地完成数据库管理任务

Oracle 12c 读书笔记(二):Oracle数据库体系结构

要访问数据库,则必须先启动实例,启动实例,则先分配内存区,然后启动后台进程。

在数据库启动过程中,5个进程是必须启动的:SMON、PMON/DBWR、LGWR、CKPT,在告警日志中alterSID.ora可以看到数据库的启动过程

Oracle服务器

Oracle服务器是由实例和数据库文件组成。

Oracle 12c 读书笔记(二):Oracle数据库体系结构

Oracle除了维护实例和数据文件外,还在用户与服务器连接时启动服务器进程并分配PGA

Oracle数据库的物理结构(文件组成):

数据文件:数据文件宝内涵数据库中的实际数据,是数据库操作系统中数据的最终存储位置

控制文件:包含维护数据库和验证数据库完整性的信息,它是二进制文件

重做日志文件:重做日志文件包含数据库发生变化的记录,在发生故障时用于数据恢复

Oracle参数文件和密码文件

虽然不是Oracle的数据库文件,但是是不可缺少的两个文件

参数文件:定义了数据库实例特性,在参数文件中包含SGA内存结构分配空间的参数,如分配数据库高速缓冲区的大小等,参数文件是正文文件,可以使用编辑器查看。
密码文件:授予用户启动和关闭数据库实例,Oracle默认用户名和密码存储在文件中,可以根据这个判断用户的操作权限

数据库连接与会话

数据库连接

连接有3中方式 

1 基于主机方式:服务器和客户端运行在同一台计算机上,用户可以直接连接数据库服务器
2 基于客户机:数据库服务器和客户端运行在不同计算机上,客户通过网络连接数据库服务器。经常使用此种方式
3 用户-应用服务器-数据库服务器:此种方法称为三成访问模式。用户先访问应用服务器,应用在访问数据库服务器,应用服务器类似中介,完成客户和数据库的交互

 会话

一个明确的数据库连接,用户采用3种的任意一种方式连接,就称为一个会话

用户通过某种工具,在专用连接情况下访问数据,服务器就会自动创建一个与该用户进程对应的服务器进程,二者是一对一关系,用户退出或发生异常时,会话结束

专有连接,指用户和服务器进程之间是一对一关系,而共享服务器配置情况下,多个用户进程可以同时共享服务器进程,此时就不是专有服连接,而是多对一关系

一个用户可以并发发起多个会话

SQL> select serial#,username,status,process,program,logon_time from v$session where username='SYS';

   SERIAL# USERNAME              STATUS   PROCESS            PROGRAM                         LOGON_TIM
---------- ------------------------------ -------- ------------------------ ------------------------------------------------ ---------
     24691 SYS                  ACTIVE   27448            sqlplus@gzxbi01 (TNS V1-V3)              18-MAR-17
     28528 SYS                  INACTIVE 27443            sqlplus@gzxbi01 (TNS V1-V3)              18-MAR-17

可以看到,有两个会话,当前执行的指令的会话为ACTIVE,一个用户可以建立多个会话

Oracle 12c 读书笔记(二):Oracle数据库体系结构

一个连接,可以有多个会话(即服务器进程和数据库服务器见,可以建立多个会话)

SQL> select sid,serial#,paddr from v$session where username='SYS';

       SID    SERIAL# PADDR
---------- ---------- ----------------
       125    24691 00000000D1B5A9B8
       357    28528 00000000D1B4B448

SQL> set autotrace on statistics;
SQL> select sid,serial#,paddr,port from v$session where username='SYS';

       SID    SERIAL# PADDR             PORT
---------- ---------- ---------------- ----------
       125    24691 00000000D1B5A9B8        0
       132    14042 00000000D1B5A9B8        0
       357    28528 00000000D1B4B448        0


Statistics
----------------------------------------------------------
      0  recursive calls
      0  db block gets
      0  consistent gets
      0  physical reads
      0  redo size
    850  bytes sent via SQL*Net to client
    552  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      3  rows processed

从PADDR和PORT可以看到是一个连接,但是有两个会话通过SID和SERIAL#来确认。

查询会话是否存在,可以

SQL> select pname,username from V$PROCESS WHERE ADDR=HEXTORAW('00000000D1B5A9B8');

PNAME USERNAME
----- ---------------
      oracle


Statistics
----------------------------------------------------------
     36  recursive calls
      0  db block gets
     67  consistent gets
      0  physical reads
      0  redo size
    614  bytes sent via SQL*Net to client
    552  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      1  rows processed

SQL> select pname,username from V$PROCESS WHERE ADDR=HEXTORAW('00000000D1B4B448');

PNAME USERNAME
----- ---------------
      oracle


Statistics
----------------------------------------------------------
      1  recursive calls
      0  db block gets
      0  consistent gets
      0  physical reads
      0  redo size
    614  bytes sent via SQL*Net to client
    552  bytes received via SQL*Net from client
      2  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      1  rows processed

SQL> select pname,username from V$PROCESS WHERE ADDR=HEXTORAW('00000000D1B4B448');   -- 在另一个终端将这个会话退出后执行这条查询发现,连接不存在

no rows selected


Statistics
----------------------------------------------------------
      0  recursive calls
      0  db block gets
      0  consistent gets
      0  physical reads
      0  redo size
    411  bytes sent via SQL*Net to client
    541  bytes received via SQL*Net from client
      1  SQL*Net roundtrips to/from client
      0  sorts (memory)
      0  sorts (disk)
      0  rows processed

Oracle 数据库的内存结构

由SGA和PGA组成

PGA:程序全局区,程序全局区不是实例的一部分。当服务器启动时,才分配PGA

SGA:系统全局区,是数据库实例的一部分,当数据库实例启动时,首先分配系统全局区,在系统全局区包含几个重要的内存区(数据库高速缓存、重做日志缓存、共享池、大池、Java池等)

共享池Shard Pool

用用共享池的目的就是共享SQL和PL/SQL代码。即把解析到的SQL代码结果放到这里缓存,PL/SQL不仅在这里缓存,同时在这里共享。共享池由两部分组成

Oracle 12c 读书笔记(二):Oracle数据库体系结构

相关推荐