一. Oracle数据库的组件结构概述
本章节只是概述,各组件的含义和作用将在后文中详解
Oracle数据库主要分成两部分,即Instance和Database。
[oracle@localhost ~]$ cd/oracle/oradata/orcl
[oracle@localhost orcl]$ lltotal 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 oracleroot 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 sysdbaConnected to an idle instance.
SQL> startupORACLE 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 oracleroot 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
## 已经可以看到很多数据库的进程了
Server process和backgroundprocess不同,它主要用来处理用户和服务器的连接。一个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概述
========================切到数据库查看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
可以动态调整SGA的值,随着用户发送的请求增多,SGA需要不断的扩张。故需要动态的变化,SGA是一个连续内存的分配区域。
SGA_MAX_SIZE决定了Oracle需要的SGA上限。
Oracle中SGA内存增大或缩小的单位是granules,granules的默认值是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
SGA的组件也有自己的size,可以通过联机文档查看各组件参数的含义和大小:
为简化操作,目前ORACLE可以自动分配组件尺寸的参数,且随着实际的应用,这些参数也会动态的变化。
===================== Share Pool ========================
操作数据库的SQL语句会被解析成原子结构,然后进行操作,这些已经被解析了SQL语句就储存在Shared Pool(共享池)中。
上文中查看的v$sga_dynamic_components就存储在DD(数据字典)中
====================DatabaseBuffer Cache=========================
当数据库执行查询操作时,会首先在Database Buffer Cache中查找数据,如果找到了,就称为catch hit,没有找到称为catch miss,当catch miss时,Oracle只能到磁盘上去查找数据。因此要提高数据库的性能,就需要提高catch hit的几率。
===========================Redo LogBuffer===========================
============================LargePool===============================
=====================Java Pool========================
Large Pool和JavaPool是可选项。
B.PGA概述
当进程启动了,PGA就启动了,当进程结束,PGA就终止了。
Oracle的进程结构概述
User Process简而言之,就是客户端发起的进程;而Serverprocess和Background Process都属于后台进程。
A. User Process
Oracle在Linux服务器上表现为多个进程,而在Windows上则表现为一个大的进程,其中包含了多个线程。
==============演示Windows下不同工具连接数据库发起的进程==================
在命令行中用sqlplus连接数据库发起的进程
使用Toad连接数据库发起的进程:
上述两个进程都属于UserProcess。
B. Server Process
============在Windows中使用sqlplus连接数据库=============
============多了一个进程==============
该进程负责和windows下的sqlplus进行交互。
[oracle@localhost ~]$ ifconfigeth0 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
[oracle@localhost ~]$ ps -ef |grep oracleoracle 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
DBWn(其中n表示数字)用来将缓冲区中的数据写入到磁盘文件中。
2)LGWR
所有的操作都会被记录到Redo Log files中,以备今后备份恢复,在DBWn进行写操作前,LGWR一定会先进行写操作,以确保DBWn写入了错误的数据还能回滚。Redo Log Files是个循环文件,即当该文件被写满了后,会从头开始写,这样就会导致最初的数据被覆盖。
3)SMON
SMON类似于清洁工,用来清理一些不必要的数据,但它不监控process。
4)PMON
PMON和SMON的作用比较类似,也是进行清理工作,区别在于PMON清理的是进程而非数据。
5)CKPT
早期CKPT的工作是由LGWR来完成的,但随着管理数据规模的增大,LGWR不堪重负,于是Oracle引入了CKPT,主要用来更新一些检查点的信息。
6)ARCn
ARCn(n表示数字)是一个可选项,但在实际生产环境中数据库都会运行在归档模式下,由ARCn用来将Redo log files中的数据进行归档,以便备份和恢复。
四、Oracle的逻辑结构
Oracle的逻辑结果可以归纳为:
一个Oracle Server上只有一个OracleDatabase;一个Database可以有多个Tablespace;一个Tablespace可以有多个Segment;一个Segment可以由多个Extent组成,一个Extent是由一组连续的Blocks组成的,Oracle数据库中的Block是数据存储的最小单元。
操作系统中的数据存储单元也称为block,而Oracle数据库中的Block是操作系统中block的整数倍。Oracle中的DB_BLOCK_SIZE决定了block的大小,通常为8k。
Oracle中的Datafile实际上是个物理结构,一个Tablespace可以由多个Datafile组成,一个Segment可以横跨Datafile,但Extent不能横跨Datafile。
五、Oracle中执行SQL语句的过程
Oracle执行SQL语句的基本过程可以归纳为:1.连接数据库;2.. 进行安全检查;3. 将SQL语句解析为原子操作(parsing);4. 进行变量绑定操作; 5. 执行语句;6. 将执行结果返还给用户。