关系型数据库Oracle之架构详解
写在前面
作为开发人员,掌握数据库是必不可少的一件事情,当你已经对数据库系统的基本理论知识和基本的SQL语句有所掌握时,理所应当去深入学习一种数据库系统,以便在开发中能加以运用。就目前而言,市场上常见的数据库有以下这些。
你大可不必为应当学习以上哪种数据库系统而烦恼,当你的数据库理论及基本的SQL语法掌握后,学习哪种数据库系统对你而言应当不再是难事。
今天,我们就市场占据市场份额较多的关系型数据库–Oracle为例作为讲解,本章主要从架构上面分析,希望可以起到高屋建瓴的效果。
企业级常用数据库—Oracle
下面我们先来看下面这幅常见的架构图
由图可看出来,Oracle数据库实例(Instance)是由一系列内存结构及后台结构组成。内存结构主要是SGA(System Global Area,系统区全局区)和PGA(Program Global Area,程序全局区)组成,后台进程则主要是一系列进程监控进程(PMON)、系统监控进程(SMON)、数据库写入进程(DBWR)、日志写入进程(LGWR)、检查点进程(CKPT),以及一些其他进程组成。本文主要讲述内存结构的组成及原理。
SGA
SGA是什么呢,总的来说是Oracle分配的一种共享内存结构,用户对数据库的各种操作主要在SGA中进行。下面我们来看下如何查看系统的SGA。
- 首先,在sqlplus中以免密的方式登录数据库
C:\Users\Administrator>sqlplus / as sysdba
- 然后执行下面命令,便可以看到系统SGA的基本情况
SQL> show parameter sga
NAME TYPE VALUE
------------------------------------ ----------- -----
lock_sga boolean FALSE
pre_page_sga boolean FALSE
sga_max_size big integer 1G
sga_target big integer 0
- 当然你也可以选择修改里面的参数,例如
SQL>alter system set sga_target=436M;
- 或者,
SQL> alter system set sga_max_size=436M scope=spfile;
- 你只需要重启数据库即可使上面的命令生效
SQL>shutdown immediate
SQL>startup
但是,我并不建议你这样做,SGA通常在数据库系统建立之初就分配好。好了,下面我再来讲述SGA的主要组成部分
1.Database Buffer Cache(数据高速缓冲区)
在现代数据库中,设立数据高速缓冲区基本是必不可少的,为了避免数据库等待磁盘I/O,Oracle设计了数据库高速缓冲区,暂时存放用户执行查询语句时从数据文件(磁盘)读取出来的数据,避免了直接对磁盘I/O,并被当前实例的其他用户共享。下面我们来看下其原理图
当发生SQL查询时,在共享池的服务器结果缓冲区里找不到结果,那么就会到数据库高速缓冲区里查找,如果有,则产生缓冲命中(Cache Hit),读取保持池,否则产生缓冲失误(Cache Miss),可能会读取默认池或者回收池,还有一种情况,如果在数据库高速缓冲区里找了很久,直到临界点,那么就会通知DBWR进程,将回收池里的脏缓冲器写入磁盘,再将默认池里的空闲缓冲器转移到回收池,变为脏缓冲器。
在数据库优化一块便有对数据高速缓冲区的优化,在这我不做过多讲解,下面我们来了解一下其常用的视图即可
- v$db_cache_advice视图,Oracle自动收集的相关统计数据,并预测出DB_CACHE_SIZE在不同大小情况下的性能数据
SQL> desc v$db_cache_advice
名称 是否为空? 类型
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
ADVICE_STATUS VARCHAR2(3)
SIZE_FOR_ESTIMATE NUMBER
SIZE_FACTOR NUMBER
BUFFERS_FOR_ESTIMATE NUMBER
ESTD_PHYSICAL_READ_FACTOR NUMBER
ESTD_PHYSICAL_READS NUMBER
ESTD_PHYSICAL_READ_TIME NUMBER
ESTD_PCT_OF_DB_TIME_FOR_READS NUMBER
ESTD_CLUSTER_READS NUMBER
ESTD_CLUSTER_READ_TIME NUMBER
- v$bh视图,查询消耗数据库高速缓存区的对象
SQL> desc v$bh
名称 是否为空? 类型
----------------------------------------- -------- ------------
FILE# NUMBER
BLOCK# NUMBER
CLASS# NUMBER
STATUS VARCHAR2(10)
XNC NUMBER
FORCED_READS NUMBER
FORCED_WRITES NUMBER
LOCK_ELEMENT_ADDR RAW(4)
LOCK_ELEMENT_NAME NUMBER
LOCK_ELEMENT_CLASS NUMBER
DIRTY VARCHAR2(1)
TEMP VARCHAR2(1)
PING VARCHAR2(1)
STALE VARCHAR2(1)
DIRECT VARCHAR2(1)
NEW CHAR(1)
OBJD NUMBER
TS# NUMBER
LOBID NUMBER
CACHEHINT NUMBER
- v$buffer_pool视图,主要是里面不同分区的详细情况
SQL> desc v$buffer_pool
名称 是否为空? 类型
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
RESIZE_STATE VARCHAR2(10)
CURRENT_SIZE NUMBER
BUFFERS NUMBER
TARGET_SIZE NUMBER
TARGET_BUFFERS NUMBER
PREV_SIZE NUMBER
PREV_BUFFERS NUMBER
LO_BNUM NUMBER
HI_BNUM NUMBER
LO_SETID NUMBER
HI_SETID NUMBER
SET_COUNT NUMBER
- v$buffer_pool_statistics视图,主要是查看高速缓冲区和分区的命中率情况
SQL> desc v$buffer_pool_statistics
名称 是否为空? 类型
----------------------------------------- -------- ------------
ID NUMBER
NAME VARCHAR2(20)
BLOCK_SIZE NUMBER
SET_MSIZE NUMBER
CNUM_REPL NUMBER
CNUM_WRITE NUMBER
CNUM_SET NUMBER
BUF_GOT NUMBER
SUM_WRITE NUMBER
SUM_SCAN NUMBER
FREE_BUFFER_WAIT NUMBER
WRITE_COMPLETE_WAIT NUMBER
BUFFER_BUSY_WAIT NUMBER
FREE_BUFFER_INSPECTED NUMBER
DIRTY_BUFFERS_INSPECTED NUMBER
DB_BLOCK_CHANGE NUMBER
DB_BLOCK_GETS NUMBER
CONSISTENT_GETS NUMBER
PHYSICAL_READS NUMBER
写在后面
本来整体简单介绍其系统架构,不料在涉及其组成部分过于复杂,为避免蝙蝠过长,今天先写到这,在今后的时间我还会对更多的架构组成及其应用做讲解。