一. Oracle 数据库的组件结构概述

本章节只是概述,各组件的含义和作用将在后文中详解

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _02

Oracle数据库主要分成两部分,即InstanceDatabase


1_Oracle_Admin_Oracle的体系结构概述_ PGA_03

1_Oracle_Admin_Oracle的体系结构概述_SGA_04

1_Oracle_Admin_Oracle的体系结构概述_ PGA_05

1_Oracle_Admin_Oracle的体系结构概述_SGA_06



[oracle@localhost ~]$ cd/oracle/oradata/orcl

[oracle@localhost orcl]$ ll

total 1591284
-rw-r-----. 1 oracle oinstall   9748480 Sep 8 21:50 control01.ctl  
# 控制文件(ctl)
-rw-r-----. 1 oracle oinstall 104865792 Sep  8 19:57 example01.dbf  
#数据文件(dbf)
-rw-r-----. 1 oracle oinstall  52429312 Sep 8 12:30 redo01.log
-rw-r-----. 1 oracle oinstall  52429312 Sep 8 19:00 redo02.log
-rw-r-----. 1 oracle oinstall  52429312 Sep 8 21:50 redo03.log  
#日志文件(log)
-rw-r-----. 1 oracle oinstall 576724992 Sep  8 21:49 sysaux01.dbf
-rw-r-----. 1 oracle oinstall 713039872 Sep  8 21:48 system01.dbf
-rw-r-----. 1 oracle oinstall  20979712 Sep 8 18:34 temp01.dbf
-rw-r-----. 1 oracle oinstall  57679872 Sep 8 21:49 undotbs01.dbf
-rw-r-----. 1 oracle oinstall   5251072 Sep 8 19:06 users01.dbf

 

==============切换到shell查看进程==================

[oracle@localhost ~]$ ps -ef |grep oracle

root      6522  1372  017:18 ?        00:00:00 sshd: oracle[priv]
oracle    6526  6522  017:18 ?        00:00:01 sshd:oracle@pts/2
oracle    6527  6526  017:18 pts/2    00:00:00 -bash
root      6554  1372  017:18 ?        00:00:00 sshd: oracle[priv]
oracle    6558  6554  017:18 ?        00:00:03 sshd:oracle@pts/3
oracle    6559  6558  017:18 pts/3    00:00:00 -bash
oracle    6590  6527  017:19 pts/2    00:00:00 sqlplus      
root      8470  1372  020:57 ?        00:00:00 sshd: oracle[priv]
oracle    8475  8470  020:57 ?        00:00:00 sshd:oracle@pts/0
oracle    8476  8475  020:57 pts/0    00:00:00 -bash
root      8505  1372  020:57 ?        00:00:00 sshd: oracle[priv]
oracle    8509  8505  020:57 ?        00:00:00 sshd:oracle@pts/1
oracle    8510  8509  020:57 pts/1    00:00:00 -bash
oracle    9038  8476  021:55 pts/0    00:00:00 sqlplus      
oracle    9149  9038  021:56 ?        00:00:01 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    9175  9038  021:57 pts/0    00:00:00 /bin/bash
oracle    9205  9175  022:00 pts/0    00:00:00 sqlplus      
oracle    9315  9205  022:00 ?        00:00:00 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    9429  8510  022:09 pts/1    00:00:00 ps -ef
oracle    9430  8510  022:09 pts/1    00:00:00 grep oracle...
 
-- 没有oracle 数据库的进程


 

 

=================启动数据库=====================

[oracle@localhost ~]$ sqlplus/nolog

 

SQL*Plus: Release 11.2.0.1.0 Production on Mon Sep 821:55:48 2014
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.

 

SQL> conn / as sysdba

Connected to an idle instance.

 

SQL> startup

ORACLE instance started.
 
Total System Global Area 422670336 bytes
Fixed Size                 1336960 bytes
Variable Size            318769536 bytes
Database Buffers          96468992 bytes
Redo Buffers               6094848 bytes
Database mounted.
Database opened.

SQL>

-- 出现SQL> 说明启动完成了

 

 

==============切换到shell查看进程==================

 

[oracle@localhost ~]$ ps -ef |grep oracle

root      6522  1372  017:18 ?        00:00:00 sshd: oracle[priv]
oracle    6526  6522  017:18 ?        00:00:01 sshd:oracle@pts/2
oracle    6527  6526  017:18 pts/2    00:00:00 -bash
root      6554  1372  017:18 ?        00:00:00 sshd: oracle[priv]
oracle    6558  6554  017:18 ?        00:00:03 sshd:oracle@pts/3
oracle    6559  6558  017:18 pts/3    00:00:00 -bash
oracle    6590  6527  017:19 pts/2    00:00:00 sqlplus      
root      8470  1372  020:57 ?        00:00:00 sshd: oracle[priv]
oracle    8475  8470  020:57 ?        00:00:00 sshd:oracle@pts/0
oracle    8476  8475  020:57 pts/0    00:00:00 -bash
root      8505  1372  020:57 ?        00:00:00 sshd: oracle[priv]
oracle    8509  8505  020:57 ?        00:00:00 sshd:oracle@pts/1
oracle    8510  8509  020:57 pts/1    00:00:00 -bash
oracle    9038  8476  021:55 pts/0    00:00:00 sqlplus      
oracle    9149  9038  021:56 ?        00:00:01 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    9175  9038  021:57 pts/0    00:00:00 /bin/bash
oracle    9205  9175  022:00 pts/0    00:00:00 sqlplus    
 
#######-------------以下是Oracle 数据库的进程---------------######
oracle    9482     1  022:10 ?        00:00:00 ora_pmon_orcl
oracle    9484     1  122:10 ?        00:00:00 ora_vktm_orcl
oracle    9488     1  022:10 ?        00:00:00 ora_gen0_orcl
oracle    9490     1  022:10 ?        00:00:00 ora_diag_orcl
oracle    9492     1  022:10 ?        00:00:00 ora_dbrm_orcl
oracle    9494     1  022:10 ?        00:00:00 ora_psp0_orcl
oracle    9496     1  022:10 ?        00:00:00 ora_dia0_orcl
oracle    9498     1  022:10 ?        00:00:00 ora_mman_orcl
oracle    9500     1  022:10 ?        00:00:00 ora_dbw0_orcl
oracle    9502     1  022:10 ?        00:00:00 ora_lgwr_orcl
oracle    9504     1  022:10 ?        00:00:00 ora_ckpt_orcl
oracle    9506     1  022:10 ?        00:00:00 ora_smon_orcl
oracle    9508     1  022:10 ?        00:00:00 ora_reco_orcl
oracle    9510     1  222:10 ?        00:00:00 ora_mmon_orcl
oracle    9512     1  022:10 ?        00:00:00 ora_mmnl_orcl
oracle    9514     1  022:10 ?        00:00:00 ora_d000_orcl
oracle    9516     1  022:10 ?        00:00:00 ora_s000_orcl
oracle    9543  9205  622:10 ?        00:00:00 oracleorcl(DESCRIPTION=(LOCAL=YES)(ADDRESS=(PROTOCOL=beq)))
oracle    9545     1  022:10 ?        00:00:00 ora_qmnc_orcl
oracle    9559     1  022:10 ?        00:00:00 ora_cjq0_orcl
oracle    9561  8510  022:10 pts/1    00:00:00 ps -ef
oracle    9562  8510  022:10 pts/1    00:00:00 grep oracle
## 已经可以看到很多数据库的进程了


1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _07

1_Oracle_Admin_Oracle的体系结构概述_SGA_08

Server processbackgroundprocess不同,它主要用来处理用户和服务器的连接。一个Serverprocess就有一个PGA,但整个instance只有一个SGA

 

=============查看当前系统的ipcs资源=================

[oracle@localhost ~]$ ipcs 

------ Shared Memory Segments --------
key        shmid      owner     perms      bytes      nattch    status     
0x85abc748 229376    oracle     660         4096       0                      
 
------ Semaphore Arrays --------
key         semid      owner     perms      nsems    
0x974edfd4 589826     oracle      660       154      
 
------ Message Queues --------
key        msqid      owner     perms      used-bytes   messages

  

 

 

二. Oracle的内存结构概述

A. SGA概述

1_Oracle_Admin_Oracle的体系结构概述_SGA_09

========================切到数据库查看SGA===========================

 

SQL> show sga;

 

Total System Global Area 422670336 bytes
Fixed Size                 1336960 bytes
Variable Size            318769536 bytes
Database Buffers          96468992 bytes
Redo Buffers               6094848 bytes

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _10

可以动态调整SGA的值,随着用户发送的请求增多,SGA需要不断的扩张。故需要动态的变化,SGA是一个连续内存的分配区域。

 

SGA_MAX_SIZE决定了Oracle需要的SGA上限。

 

OracleSGA内存增大或缩小的单位是granulesgranules的默认值是4MB

 

 

=====================查看granules============================

 

SQL> select component,granule_size from v$sga_dynamic_components;

 

COMPONENT                                                       GRANULE_SIZE
--------------------------------------------------------------------
shared pool                                                       4194304
--可以看到granules是4MB
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 rows selected



1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _11

SGA的组件也有自己的size,可以通过联机文档查看各组件参数的含义和大小:

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _12

1_Oracle_Admin_Oracle的体系结构概述_SGA_13

1_Oracle_Admin_Oracle的体系结构概述_SGA_14

为简化操作,目前ORACLE可以自动分配组件尺寸的参数,且随着实际的应用,这些参数也会动态的变化。

 

===================== Share Pool ========================

1_Oracle_Admin_Oracle的体系结构概述_ PGA_15

操作数据库的SQL语句会被解析成原子结构,然后进行操作,这些已经被解析了SQL语句就储存在Shared Pool(共享池)中。

1_Oracle_Admin_Oracle的体系结构概述_SGA_16

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _17

上文中查看的v$sga_dynamic_components就存储在DD(数据字典)中 

 

 

====================DatabaseBuffer Cache=========================

1_Oracle_Admin_Oracle的体系结构概述_SGA_18当数据库执行查询操作时,会首先在Database Buffer Cache中查找数据,如果找到了,就称为catch hit,没有找到称为catch miss,当catch miss时,Oracle只能到磁盘上去查找数据。因此要提高数据库的性能,就需要提高catch hit的几率。

1_Oracle_Admin_Oracle的体系结构概述_SGA_19

===========================Redo LogBuffer===========================

1_Oracle_Admin_Oracle的体系结构概述_ PGA_20============================LargePool===============================

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _21

=====================Java Pool========================

1_Oracle_Admin_Oracle的体系结构概述_SGA_22

Large PoolJavaPool是可选项。

 

BPGA概述

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _23

当进程启动了,PGA就启动了,当进程结束,PGA就终止了。


1_Oracle_Admin_Oracle的体系结构概述_ PGA_24

 

 Oracle的进程结构概述

1_Oracle_Admin_Oracle的体系结构概述_ PGA_25

User Process简而言之,就是客户端发起的进程;而ServerprocessBackground Process都属于后台进程。

 

A. User Process

OracleLinux服务器上表现为多个进程,而在Windows上则表现为一个大的进程,其中包含了多个线程。

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _26

==============演示Windows下不同工具连接数据库发起的进程==================

在命令行中用sqlplus连接数据库发起的进程

1_Oracle_Admin_Oracle的体系结构概述_ PGA_27

使用Toad连接数据库发起的进程:

 1_Oracle_Admin_Oracle的体系结构概述_SGA_28

上述两个进程都属于UserProcess

 

B. Server Process

1_Oracle_Admin_Oracle的体系结构概述_SGA_29

============Windows中使用sqlplus连接数据库=============

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _30

============多了一个进程==============

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _31

该进程负责和windows下的sqlplus进行交互。

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _32

[oracle@localhost ~]$ ifconfig

eth0      Link encap:Ethernet  HWaddr 08:00:27:72:C3:4A 
          inetaddr:192.168.56.101 Bcast:192.168.56.255 Mask:255.255.255.0
          inet6 addr:fe80::a00:27ff:fe72:c34a/64 Scope:Link
          UP BROADCASTRUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:70142errors:0 dropped:0 overruns:0 frame:0
          TXpackets:13444 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0txqueuelen:1000
          RXbytes:6398802 (6.1 MiB)  TX bytes:1746250(1.6 MiB)
 
lo        Linkencap:Local Loopback 
# 本地回环的通讯设备,它的IP Address永远都是127.0.0.1
          inetaddr:127.0.0.1  Mask:255.0.0.0
          inet6 addr:::1/128 Scope:Host
          UP LOOPBACKRUNNING  MTU:16436  Metric:1
          RXpackets:1875 errors:0 dropped:0 overruns:0 frame:0
          TXpackets:1875 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0txqueuelen:0
          RXbytes:131872 (128.7 KiB)  TX bytes:131872(128.7 KiB)

 

本机连接数据库,可能用的是IPC协议,不同机器远程连接数据库则需要使用TCP/IP协议。

 

C. Background Process

1_Oracle_Admin_Oracle的体系结构概述_ PGA_33

[oracle@localhost ~]$ ps -ef |grep oracle

oracle    9482     1  022:10 ?        00:00:01 ora_pmon_orcl
oracle    9484     1  122:10 ?        00:01:05 ora_vktm_orcl
oracle    9488     1  022:10 ?        00:00:00 ora_gen0_orcl
oracle    9490     1  022:10 ?        00:00:00 ora_diag_orcl
oracle    9492     1  022:10 ?        00:00:00 ora_dbrm_orcl
# 这里 ora 指的是数据库名,orcl指的是Oracle的sid;中间的pmon等指的就是background process。


 

有些进程是必须的,有些是可选的,只有当某些服务被启动时才产生。

 

====================一些重要的进程========================

1)DBWn

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _34

DBWn(其中n表示数字)用来将缓冲区中的数据写入到磁盘文件中。

 

2 LGWR

1_Oracle_Admin_Oracle的体系结构概述_ PGA_35

所有的操作都会被记录到Redo Log files中,以备今后备份恢复,在DBWn进行写操作前,LGWR一定会先进行写操作,以确保DBWn写入了错误的数据还能回滚。Redo Log Files是个循环文件,即当该文件被写满了后,会从头开始写,这样就会导致最初的数据被覆盖。

 

3)SMON

1_Oracle_Admin_Oracle的体系结构概述_SGA_36

SMON类似于清洁工,用来清理一些不必要的数据,但它不监控process

 

4)PMON

1_Oracle_Admin_Oracle的体系结构概述_SGA_37

PMONSMON的作用比较类似,也是进行清理工作,区别在于PMON清理的是进程而非数据。

 

5)CKPT

1_Oracle_Admin_Oracle的体系结构概述_Oracle Admin _38

早期CKPT的工作是由LGWR来完成的,但随着管理数据规模的增大,LGWR不堪重负,于是Oracle引入了CKPT,主要用来更新一些检查点的信息。

 

6)ARCn

1_Oracle_Admin_Oracle的体系结构概述_ PGA_39

ARCnn表示数字)是一个可选项,但在实际生产环境中数据库都会运行在归档模式下,由ARCn用来将Redo log files中的数据进行归档,以便备份和恢复。

 

四、Oracle的逻辑结构

1_Oracle_Admin_Oracle的体系结构概述_SGA_40

Oracle的逻辑结果可以归纳为:

 

一个Oracle Server上只有一个OracleDatabase;一个Database可以有多个Tablespace;一个Tablespace可以有多个Segment;一个Segment可以由多个Extent组成,一个Extent是由一组连续的Blocks组成的,Oracle数据库中的Block是数据存储的最小单元。

1_Oracle_Admin_Oracle的体系结构概述_SGA_41

 操作系统中的数据存储单元也称为block,而Oracle数据库中的Block是操作系统中block的整数倍。Oracle中的DB_BLOCK_SIZE决定了block的大小,通常为8k

Oracle中的Datafile实际上是个物理结构,一个Tablespace可以由多个Datafile组成,一个Segment可以横跨Datafile,但Extent不能横跨Datafile

 

五、Oracle中执行SQL语句的过程

1_Oracle_Admin_Oracle的体系结构概述_SGA_42

Oracle执行SQL语句的基本过程可以归纳为:1.连接数据库;2.. 进行安全检查;3. SQL语句解析为原子操作(parsing);4. 进行变量绑定操作; 5. 执行语句;6. 将执行结果返还给用户。