oracle数据库的存储原理
表空间,oracle逻缉存储结构,表空间下包含一个或者多个物理的文件存储。
所有用户对象存放在表空间中。
与系统有关的对象存放在系统表空间中。
数据库的作用就是实现对数据的管理和查询。任何一个数据库系统,必然存在对数据的大量读或者写或者两种操作都大量存在。I/O 问题也往往是导致数据库性能问题的重要原因。
- Oracle结构
(图 1)Oracle 结构
1.1. Orac le 实 例( Instance)
(图 1.1)Oracle 实例
一个 Orac le 实例:
1.是访问 Oracle database 的途径
2.只能打开一个数据库
3.由 SGA 内存区和一组后台进程组成
1.2. 数 据库 文件
(图 1.2)数据库文件
Orac le 数据库的物理结构是硬盘上的一组文件。主要有三类文件:即数据文件,日志文件和控制文件。
数据文件包含数据库的实际数据,数据存于用户定义的表中,此外数据字典数据、回滚数据、索引等
均存于数据文件中。
日志文件记录对数据库的所有修改,用于数据库的恢复。
控制文件记录日志文件和数据文件的信息,用于保证数据库文件的一致性和完整性。
归档日志文件是在线日志的拷贝,在归档模式下在线日志在重复使用之前必须归档。
- Oracle中IO的产生
I/O 包括了读、写两部分,先介绍 Oracle 中写操作的产生。
2.1. 写
介绍写操作之前,先简单的看下 Oracle 的物理结构:Oracle 的物理文件包括以下三种文件:控制文件(Control
Files)、重做日志文件(Redo Log Files)、数据文件(datafiles)。而数据文件中,根据功能的不同,还可以
分为:系统数据文件、用户数据文件、临时空间文件和回滚段文件。另外,如果数据库的 Archive Log 模
式被激活,还存在归档日志文件。Oracle 的 I/O 产生,就是对这些文件的数据读、写操作。下面再详细看
下几种主要写操作的产生及其过程。
2.1.1. 控制文件
控制文件中记录了整个数据库的物理结构信息。同时控制文件还记录系统和各个数据文件的 SCN(System
Change Number,关于 SCN 可以参见文章《Orac le SCN 机制详解》)信息,以用于数据恢复,因此数据文
件上的 SCN 变化后,Oracle 也会相应修改控制文件上的 SCN 信息。
2.1.2. Redo Log
在非直接写(Direct Write)的情况下,事务中的写操作都会产生 Redo Log,作为数据块异常关闭时的恢复
记录。同样,和写用户数据类似,Redo Log 也不会被直接写入 Redo Log 文件,而是先写入 Log Buffer 中。
Log Buffer 是一个可以循环重用的缓存区。LGWR 进程负责将 Log Buffer 中的记录写入 Redo Log File 中去。
一旦 Log Buffer 中的条目被写入了 Redo Log 文件中,就可以被重用了。
为了保证事务尽快获得 Log Buffer,LGWR 进程一般会尽快将 Log Buffer 中的数据写入 Redo Log 文件中去。
在以下几种情况下,LGWR 会将一个连续的 Log Buffer 写入 Redo Log 文件中去:
1.当一个事务提交(COMMIT)时。
2.每 3 秒钟写一次 Log Buffer。
3.当 Log Buffer 满 1/3 时。
4.当 DBWn 进程将“脏”数据写入磁盘时。
2.1.3. 用户数据文 件
由于内存的读写效率比磁盘的读写效率高万倍,因此,为了降低 I/O wait,Orac le 会将数据 cache 在内存
(Buffer Cache,对 Buffer Cache 的详细介绍可以参见《Oracle 内存全面分析》)中,对数据的读写尽量在
内存中完成。当 Buffer Cache 中的数据缓存块被修改过了,它就被标记为“脏”数据。根据 LRU Least Recently
Used)算法,如果一个数据块最近很少被使用,它就称为“冷”数据块。进程 DBWn(系统中可以存在多个
DBW 进程,n 为序号)负责将“冷”的 “脏”数据写入数据文件中去。DBWn 进程会在以下两种情况下将“脏”
数据写入磁盘中去:
1. 当服务进程扫描一定数量(阀值)的 Buffer Cache 后还没有找到干净、可重用的缓存块后,它会通知
DBWn 进程将“脏”数据写入文件中去,以释放出空闲缓存。
2. 当发生检查点(Checkpoint)时。 检查点的作用:
将数据缓存中所有改变的数据块写入数据文件(不管事物是否提交)
将数据文件的头部标为一致,并且在控制文件当中记录检查点序号。
该检查点号与日志文件中 SCN 号对应。
检查点操作的频繁程度可由数据库参数调节
2.1.4. 临时表空间
当 Oracle 在执行一些 SQL 时,会需要一些临时空间来存储执行时产生的中间数据。这些临时空间由 Orac le
从指定的临时表空间中分配给进程。主要有三种情况会占用临时空间:临时表/索引操作、排序和临时 LO B
对象操作。
1.临时表/索引:
在会话中,当第一次对临时表进行 INSERT(包括 CTAS)时 ,Orac le 会从临时表空间中为临时表
及其索引分配临时空间一存储数据。
2.排序:
任何会使用到排序的操作,包括 JOIN、创建(重建)INDEX、ORDER BY、聚合计算(GROUP
BY)以及统计数据收集,都可能使用到临时表空间。排序操作首先会选择在内存中的 Sort Area
进行(Sort In Memory),一旦 Sort Area 不足,则会使用临时空间进行排序操作(Sort In Disk)。
看下面的例子:
SQL> alter session set sort_area_size = 10000000;
Session altered.
SQL> select owner, object_name from t_test1 order by objec t_id;
47582 rows selected.
Exec ution Plan
Plan hash value : 1312425564
Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
| 0 | SELECT STATEMENT | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 1 | SORT ORDER BY | | 47582 | 1486K| 155 (4)| 00:00:02 |
| 2 | TABLE ACCESS FULL| T_TEST1 | 47582 | 1486K| 150 (1)| 00:00:02 |
Statistics
1 recursive calls
0 db block gets
658 c onsistent gets
0 physic al reads
0 redo size
1566184 bytes sent via SQL*Net to c lient
35277 bytes received via SQL*Net from client
3174 SQL*Net roundtrips to/from c lient
1 sorts (memory)
0 sorts (disk)
47582 rows processed
SQL> alter session set sort_area_size = 10000;
Session altered.
SQL> select owner, object_name from t_test1 order by objec t_id;
47582 rows selected.
Exec ution Plan
Plan hash value : 1312425564
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time|
| 0 | SELECT STATEMENT | | 47582 | 1486K| | 1251 (1)| 00:00:16 |
| 1 | SORT ORDER BY | | 47582 | 1486K| 4136K| 1251 (1)| 00:00:16 |
| 2 | TABLE ACCESS FULL| T_TEST1 | 47582 | 1486K| | 150 (1)| 00:00:02 |
Statistics
6 recursive calls
20 db bloc k gets
658 c onsistent gets
629 physical reads
0 redo size
1566184 bytes sent via SQL*Net to c lient
35277 bytes received via SQL*Net from client
3174 SQL*Net roundtrips to/from c lient
0 sorts (memory)
1 sorts (disk)
47582 rows processed
3.临时 LOB 对象:
LOB 对象包括 BLOB、CLO B、NCLOB、和 BFILE。在 PLSQL 程序块中,如果定义了 LOB 变量,
则这些 LOB 变量就是临时 LOB 对象。临时 LOB 对象被创建在临时表空间上,直到 LOB 数据被
释放,或者会话结束。
2.1.5. 回滚段
我们知道,一个事务在未被提交 前,其做的任何修改都 是可以被回滚(Rollbac k)的。这些回滚数据就被
放到回滚段(Rollback Segment)上。此外,一致性读(Read Consistency)、数据库恢复(Recover)都会用到回滚段。
任何数据块的修改都会被记录在回滚段中,甚至 Redo Log 也会产生回滚记录。当任何一个非只读(只有
查询)的事务开始时,oracle 会自动为其指定下一个可用的回滚段。事务中任何数据变化都被写入回滚段
中。如果事务回滚,Oracle 根据回滚段中的回滚记录将 buffer cache 中的“脏”数据恢复,释放回滚段空间。
当事务被提交,由于要保证一致性读,Oracle 并不会立即释放回滚段中的数据,而是会保留一段时间。
2.1.6. Archive Log
当 Oracle 的 Archive Log 模式被激活后,所有 Redo Log 数据都会被写入 Archive Log 文件中以便日后进行
恢复。当发生日志组切换时,ARCn(Arc hive 进程,可以存在多个)进程就会将 Redo Log 文件拷贝到指
定存储目录中去,成为 Archive Log 文件。
oracle数据库的存储原理的更多相关文章
- Oracle数据库基本知识-原理,实例,表空间,用户,表
1.数据库原理及sql 数据库:是人们存放数据,访问数据,操作数据的存储仓库. DB:数据库,按存储结构来组织,存储和管理的数据仓库 DBMS:数据库管理系统,管理数据库的软件 SQL:结构化查询语言 ...
- oracle数据库之存储函数和过程
一.引言 ORACLE 提供可以把 PL/SQL 程序存储在数据库中,并可以在任何地方来运行它.这样就叫存储过程或函数.过程和函数统称为 PL/SQL 子程序,他们是被命名的 PL/SQL 块 ...
- Oracle数据库多语言文字存储解决方案
一.关于字符集 字符集(也称字元集,Character Set)就是字符编码表(codepage),一个字符不论英文.中文.韩文等在计算机系统内存或硬盘中通过二进制的字节(Byte)保存,这个二进制的 ...
- ORACLE数据库存储结构简介(转)
首先,oracle数据库的存储结构可以分为逻辑存储结构和物理存储结构,对于这两种存储结构,oracle是分别进行管理的. 逻辑存储结构:oracle内部的组织和管理数据的方式. 物理存储结构:o ...
- Oracle数据库的特点与工作原理
Oracle数据库的特点 1.开放性: Oracle能在所有主流平台上运行(包括Windows),完全支持所有的工业标准,采用完全开放策略,可以使客户选择最适合的解决方案,对开发商全力支持. 2.可伸 ...
- Oracle 数据库逻辑结构
注:本文来源于 <腾科OCP培训课堂>.非准许商业活动. Oracle 数据库逻辑结构 一.存储关系 Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据 ...
- oracle数据库应用性能优化经验(培训讲义)
这是我给公司同事做的内部培训ppt的讲义,给大家分享一下.这是培训大纲,ppt在找地方上传,等找到了会把链接发在这里 . 暂时放在csdn上,赚点下载积分:https://download.csdn. ...
- Oracle数据库体系结构(7) 表空间管理1
表空间是Oracle数据库最大的逻辑存储结构,有一系列段构成.Oracle数据库对象存储结构的管理主要是通过表空间的管理实现的. 1.表空间的分类 表空间根据存储类型不同分为系统表空间和非系统表空间 ...
- Oracle数据库体系结构(1)整体概述
oracle数据库的存储结构: 逻辑存储结构:oracle内部的组织和管理数据的方式 物理存储结构:oracle外部(操作系统)组织和管理数据的方式 oracle对逻辑存储结构和物理存储结构的管理是分 ...
随机推荐
- Bash基础——命令替换
参考:Linux 下Shell 脚本几种基本命令替换区别 Command substitution 命令替换Command substitution https://www.jb51.net/arti ...
- CentOS7 安装记录
起因是想自建一个本地笔记云存储,按照网上的教程搭建,卡在了其中的一个步骤上(文章见https://www.laobuluo.com/1542.html),卡在了如下图的位置,google了一番解决的办 ...
- JIT优化的小问题
同事问了个问题,挺有意思的,代码: public class TestJIT{ private static boolean sss; public static void main(String[] ...
- 使用Ultra Librarian工具生成Altium封装和原理图符号的方法
最近在项目中用到了TI的单通道SPDT 模拟开关TS5A3160芯片,Altium官方的库中没有该元件的封装库,所以需要自己画.Ti在官网的产品介绍中提供了生成原理图符号和 PCB 布局封装的方法. ...
- MySQL进阶18- 存储过程- 创建语句-参数模式(in/out/inout-对应三个例子) -调用语法-delimiter 结束标记'$'- 删除/查看/修改-三个练习
/* MySQL-进阶18 存储过程 和 函数 存储过程和函数:类似于java中的方法 好处: 1.提高代码的重用性 2.简化操作 */ #存储过程 /* 含义: 一组已经预见编译好的SQL语句的集合 ...
- 优化你的HTTPS(上),你需要这么做
HTTP/2 HTTP 2.0即超文本传输协议 2.0,是下一代HTTP协议.是由互联网工程任务组(IETF)的Hypertext Transfer Protocol Bis (httpbis)工作小 ...
- jaxa技术2
XStream 1. 什么作用 * 可以把JavaBean转换为(序列化为)xml 2. XStream的jar包 * 核心JAR包:xstream-1.4.7.jar: * 必须依赖包:xpp ...
- list获取所有上级
/// <summary> /// 获取所有上级 /// </summary> /// <param name="list"></para ...
- PHP流程控制之嵌套if...else...elseif结构
还记得本章开篇我们讲了一个王思总同学的例子: 王同学是生活极度充满娱乐化和享受生活的人.他抵达北京或者大连的时候做的事,他抵达后做的事情,如下:直线电机参数 半夜到达,先去夜店参加假面舞会 早上抵达, ...
- React重置非受控组件state的方法
如果想通过props来重置state的值.有3种方法: 1. 最好的方法:key属性 修改key属性的值,可以使组件卸载后重新加载.所有的状态全部重置. 这种情况可以给key设一个每次渲染都会改变的值 ...