分为三大部分
理解ORACLE实例
ORACLE数据库物理结构
ORACLE逻辑结构 Logical structure
理解ORACLE实例
-
实例与数据库的关系
-
ORACLE的内存结构
包括共享内存区 SGA(System Global Area)和非共享内存区PGA(Program Global Area)
-
共享池 shared cache
SGA中最重要的内存片段。
共享池中比较重要的两个部分
sql语句缓冲library cache: 存放解析过的sql语句,第二次运行此sql直接从这里取
数据字典缓冲Data Dictionary Cache: 数据字典存储了数据库运行的基础信息
-
块缓冲区高速缓存 Database Buffer Cache
数据库的任何修改都在该缓冲里完成,并有DBWR进程将修改后的数据写入磁盘
-
重做日志缓冲区 Redo log buffer
对数据库的任务修改都按顺序被记录在缓冲,然后由LGWR进程写入磁盘。缓冲区的存在是因为内存到内存的操作速度肯定快于内存到磁盘的速度,但是考虑到一致性和可恢复性,该区不回太大,数据驻留时间也不会太长。
数据库的四个重要后台进程,参见博文 《
oracle四个重要的后台进程》
-
Java程序缓冲区 Java pool
为Java程序保留的,如果不用Java程序没有必要改变该区的默认大小
-
大池 Large Pool
用来分配大块的内存,处理比共享池给大的内存
-
后台进程
Server Progress通过后台进程来和User Progress来进行联系沟通,交换数据。
-
数据写进程DBWR
工作条件:DBWR超时;系统中没有多的空缓冲区用来存放数据;CKPT进程触发DBWR
-
日志写进程LGWR
承担维护数据库完整性任务。包含所有数据的更改历史记录,以便数据恢复。
工作条件:用户提交;有1/3重做日志缓冲区未被写入磁盘;有大于1M重做日志缓冲区未被写入磁盘;超时;DBWR触发LGWR写入
-
系统监控SMON
-
进程监控PMON
-
检查点进程CKPT
-
归档进程ARCH
重做日志一般有两个组,组1写满了,就切换到写组2,这是就把组1拷贝到另一个固定的目录,叫做归档。
-
分布式恢复RECO
-
服务进程 Server Progress
-
用户进程User Progress
负责把用户的sql传送给服务进程,并把服务端的查询数据返回给用户进程
-
一个贯穿数据库全局的概念---系统改变号 SCN(System Change Number)
系统中维护数据的一致性和顺序恢复的重要标志。更逊才会改变scn,查询不回。一下例子说明了scn的作用:
用户 A 从 12:00 开始运行,到 12:05 结束在 12:01 用户 B 执行了一条 Update 语句,更新了 ID 是 2 的那条记录把 Beijing 该成了Tianjing.并提交,这时候用户 A 的那个查询是不会出现 Tianjing 的记录。12:00 查询时候的 SCN 是 N 然后用户 B 的更新使得系统的 SCN 变
成 N+1 当用户 A 查询到 ID=2 的记录的时候发现他的 SCN 已经大于查询开始时候的 SCN,他就会在回滚段数据缓冲中找到 SCN=N 的那条记录,并把它返回
ORACLE数据库
-
控制文件 control file
# sqlplus / as sysdba
> select name from v$controlfile
控制文件记录了数据库名字,检查点信息,所有的数据库文件,联机数据文件,归档日志文件等关键信息
-
数据文件 data file
# sqlplus / as sysdba
> select name from v$datafile
所有用户数据都记录这里呢
数据文件分成以下几类: 系统数据文件;回滚数据;临时数据;用户数据
-
重做数据文件 redo file
重做日志组至少要有两个,一个写满写另一个。满了的那个去归档。
切换的时候,如果数据库优化做的不好,可能造成临时的“挂起”,挂起一般有两个原因:
a. 需要归档的日志还没来得及归档,它又要被重新利用
b. 检查点事件还没有完成,满了的日志又要被重新利用。
关于oracle的检查点,参见博文 《
oracle之检查点》
解决上述挂起的常见做法 1. 增加日志组,2变3,3变4 2. 增大日志文件成员大小
#sqlplus / as sysdba
> select * from v$log;--查看日志组
> select * from v$logfile;--查看具体的成员文件
-
归档日志文件 archived files
oracle有归档与非归档的两种模式。非归档模式下,切换后满了的重做日志直接删除。
#sqlplus / as sysdba;
>select * from v$archived_log;
>select * from v$log_history;
-
初始化参数文件 parameter file
-
其它文件
oracle逻辑结构 Logical structure
-
表空间
表空间是一系列数据文件的集合,是数据库中的基本逻辑结构。一个表空间可以包括多个数据文件,但是一个数据文件只能属于一个表空间。
-
段 segment
段是对象在数据库中占用的空间,一个段只能属于一个表空间(但不一定在一个数据文件中),一个表空间可以有多个段。
段基本可以分为四种:数据段;索引段;回滚段;临时段;
-
区间 Extent
区间为数据一次性预留一定空间,满了之后在申请新的区间。类似c++中vector对内存的管理方式。
-
Oracle 数据块 Block
oracle最基本的存储单位,区间大小都是数据块大小的整数倍。一个块可能包含多个数据表的数据。
PCTFREE:表示保留该百分比的可用空间用于行更新,避免行迁移,行数据达到PCTFREE,该块从REDDLIST上撤销
PCTUSED:表示当行的空闲空间降低到该值,该块重新进入FREELIST,开始接受数据
什么是行迁移和行链接?
行迁移: 当一个行上的更新操作(原来的数据存在且没有减少)导致当前的数据不能在容纳在当前块,我们需要进行行迁移。一个行迁移意味着整行数据将会移动,仅仅保留的是一个转移地址。因此整行数据都被移动,原始的数据块上仅仅保留的是指向新块的一个地址信息。
产生:update
行链接: 当一行数据太大而不能在一个单数据块容纳时,行链接由此产生。举例来说,当你使用了4kb的Oracle 数据块大小,而你需要插入一行数据是8k,Oracle则需要使用3个数据块分成片来存储。因此,引起行链接的情形通常是,表上行记录的大小超出了数据库Oracle块的大小。
产生:insert 表上使用了LONG 或 LONG RAW数据类型的时候容易产生行链接。其次表上多于255列时Oracle会将这些过宽的表分片而产生行链接
-
基本表空间
-
系统表空间
系统数据文件,改表空间特点是大量的读少量的写
-
临时表空间
主要用于不能在内存上进行的排序操作,下次启动释放
临时表空间的总结见博文《
ORACLE临时表空间总结》
-
回滚段表空间
回滚段表空间用来临时存放修改前的数据(undo)。undo表空间见博文《
理解undo表空间》
-
用户表空间
两种常见类型的用户数据:数据和索引,条件许可放在不同的磁盘上