Oracle体系结构
文章平均质量分 76
chengonghao
这个作者很懒,什么都没留下…
展开
-
第一讲--概述
Oracle由两大块组成:1. oracle数据库软件2. oracle数据库 在生产环境中:oracle数据库软件通常放在服务器本地硬盘上;oracle数据库则放在存储上; 在学习环境中:Oracle数据库软件和oracle数据库都放在同一台电脑上。查看oracle数据库软件:[oracle@redhat4 db_1]$ cd $O原创 2016-03-21 18:57:37 · 889 阅读 · 0 评论 -
第二十讲--系统改变号(SCN)详解
SCN:system change numberSCN是一串数字,这串数字是由时间经过一个函数算出来的。同理,可以经过这个函数把SCN转成时间。SCN其实就是一个时间。如果以字符串的形式比较时间,消耗的资源多;如果以数字来比较时间,消耗的资源少。在shared pool里面比较SQL语句是否一样也是把SQL经过hash运算以后得到一个数字,然后比较数字是否相等。比较时间的意义:比较原创 2016-03-22 12:12:18 · 1537 阅读 · 0 评论 -
第二十一讲--事务概述
从开发者的角度来讲,oracle的事务很简单,就是commit和rollback。事务关系到数据的一致性。事务的基本概念:一组DML语句:insert、update、deleteCommit;Rollback;Savepoint;Rollback to[savepoint] ; 数据库正常运行期间一个会话登录上来,这个会话有自己的SID,会话开始了一个事务,事务原创 2016-03-22 12:12:59 · 434 阅读 · 0 评论 -
第二十一讲--事务概述
从开发者的角度来讲,oracle的事务很简单,就是commit和rollback。事务关系到数据的一致性。事务的基本概念:一组DML语句:insert、update、deleteCommit;Rollback;Savepoint;Rollback to[savepoint] ; 数据库正常运行期间一个会话登录上来,这个会话有自己的SID,会话开始了一个事务,事务原创 2016-03-22 12:13:22 · 373 阅读 · 0 评论 -
第二十二讲--事务ACID及隔离级别
事务的含义(ACID):1. 原子性(automicity):事务中包含的所有操作要么都做要么都不做,保证数据库是一致的;2. 一致性(consistency):数据库在事务操作前和事务处理后,其中的数据必须都满足业务规则约束;3. 隔离性(Isolation):数据库允许多个并发事务同时对数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉原创 2016-03-22 12:14:20 · 502 阅读 · 0 评论 -
第二十三讲--Undo表空间概述
数据库建好以后自动有undo表空间,undo表空间里自动有undo段(这一点与普通表空间不同)。Undo段里的区是自动分配的(这一点和普通表空间一样),块也是自动使用的。Undo表空间与普通表空间的不同:1. undo段是自动生成的,自动维护的;2. oracle自动使用undo段,普通表空间的段是手工创建的也是手工使用的; 查看undo表空间:SQL>原创 2016-03-22 12:17:25 · 575 阅读 · 0 评论 -
第十九讲--实例崩溃恢复原理剖析
核心内容是检查点队列的作用。Oracle运行期间可能出现以下情况:Buffer cache里有很多脏buffer还没来得及写回磁盘,服务器突然掉电,buffer cache里的数据全部丢失。丢失的脏buffer分为两种:1.未提交的事务所修改的数据块可以丢失;2.已提交事务的数据块不能丢失。Oracle提交的时候只是日志写过来了(见22,日志核心意义-快速提交)。故oracle崩溃以后原创 2016-03-22 12:07:15 · 1257 阅读 · 0 评论 -
第二十四讲--Undo段及区的状态和使用
Undo的作用:oracle开始一个事务的时候使用undo表空间。假如执行一个delete语句,oracle会把删除前的数据放到undo表空间的undo段里面。一个事务修改的block越多则占用的undo段越多。Undo的两大作用:1.Oracle的事务有时需要回滚,回滚的作用就是把事务修改前的数据拷贝回来,所以需要修改前的数据,修改前的数据就放在undo表空间里面;2.B会话要读原创 2016-03-22 12:26:47 · 1205 阅读 · 0 评论 -
第二十五讲--图解深入剖析一个事务的操作流程
事务ID:当一个事务开始以后,oracle会给事务分配一个XID。 事务表:undo表空间的undo段的第一个数据块里面放了一个事务表,介于块大小的限制,最多可以放47个事务。 段头块:Undo表空间里的undo段里的第一个块叫做undo段的段头块,这段头块里面有一个事务表,事务表最多有47行,每行放一个事务,也就是说一个undo段最多有47个活动事务原创 2016-03-22 12:28:31 · 1490 阅读 · 0 评论 -
第二十七讲--Oracle IMU及Redo Private Strands技术
Oracle传统的undo机制:在传统里面oracle对undo表空间和普通表空间是一视同仁的。都是在buffer cache里面分配内存区,都是用DBWR进程定时写到磁盘上。一个事务开始时,在一个相对空闲的undo段段头里面获得一个槽位,写上事务信息。1.段头可能不在内存里面,就需要通过IO把段头放在内存里去;2.接下来获得一个undo回滚块,可能undo回滚块不在内存里面,这是会发生I原创 2016-03-22 12:37:01 · 1462 阅读 · 0 评论 -
第二十八讲--读一致性(ORA-01555错误机制分析)及Undo表空间大小设置
一个会话读到了另未提交一个事务所修改的数据叫脏读。 假设会话一在08:50读一张有一万行数据的A表,在08:55时会话二删除了A表的第一万行数据,在09:00时会话一读出了A表的全部数据,此时全部数据是9999行还是10000行呢?答案是10000行,虽然会话二删除了第10000行的数据并提交了事务,但是oracle为了满足读一致性要求,会话一依然可以读出10000行数据。原创 2016-03-22 12:40:15 · 782 阅读 · 0 评论 -
第二十九讲--锁基础原理
Oracle实例里面的sharedpool、buffer cache、log buffer在内存的SGA(shared global area)里面,也就是说所有的前台进程(PGA)和后台进程(DBWR、LGWR)都可以访问。后台进程数量有限(十几个),而且后台进程的工作负载并不重,对oracle数据库来讲最多的进程是server process,一个session对应一个链接,一个链接对应一个s原创 2016-03-22 12:41:14 · 550 阅读 · 0 评论 -
第三十讲--锁相关视图及相关操作
select xidusn, xidslot,xidsqn,statusfrom v$transactionxidusn是事务使用的回滚段的编号,xidslot事务使用的槽位数,xidsqn是槽位被覆盖的次数,xidusn、xidslot、xidsqn这三个参数唯一的标识了一个事务。Status是事务当前的状态。原创 2016-03-22 12:42:48 · 431 阅读 · 0 评论 -
第三十一讲--网络原理及配置
Oracle的网络没有负载。 Oracle的监听要独立启动,监听跟数据库的没有太多关系。可以先起监听再起数据库,也可以先起数据库再起监听。数据库崩溃了监听可以存在,监听完蛋了数据库可以存在。虽然监听和数据库没有太多联系,但是它们之间也要互相知道对方在哪。监听知道数据库在什么地方,但是监听和数据库之间没有长连接。 用户通过sqlplus发起的连接连的是监听。L原创 2016-03-22 13:01:34 · 786 阅读 · 0 评论 -
第三十三讲--参数文件及数据库的启动和关闭详解
Oracle数据库分为数据库和实例,实例是一堆进程和内存。Oracle启动时如何分配内存,SGA分多大,SGA里面的每个池子改分多大,这些信息全部存在参数文件里面。对oracle进行配置和修改,绝大多数都是对参数文件的操作。 在Linux系统中,参数文件存放在$ORACLE_HOME/dbs目录下。在Windows系统中,参数文件存放在database目录下。[oracle原创 2016-03-22 13:10:53 · 1050 阅读 · 0 评论 -
第三十二讲--数据库的关闭和启动
关闭时先关闭sqlplus和EM,然后关闭监听,最后是关闭DB。启动时先启动监听,再启动DB、EM、SQLPLUS/*--------------------关闭oracle--------------------*/1.关闭sqlplus [oracle@redhat4 ~]$ isqlplusctl stop iSQL*Plus 10.2.0.1.0原创 2016-03-22 13:16:36 · 411 阅读 · 0 评论 -
第七讲--buffer cache内存组织结构剖析
内存组织结构的核心就是链(链式存储结构,而且是双向链表,可向前向后走),链上挂着内存块。找内存块的时候小确定内存块在哪个链上,然后遍历链。根据内存大小不同,oracle自动分配链的大小。Buffer cache里面有多种链:1. CBC:cache bufferchain: Buffer cache提前建了一些“空”链。Oracle接收到一条select语句,oracle经过原创 2016-03-21 19:34:17 · 1161 阅读 · 0 评论 -
第十八讲--检查点队列(checkpoint queue)
Buffer cache的左边是buffer右边是链,用来记录buffer。链的类型有LRU、LRUW。LRU是将干净可用的块串起来,将来从buffer cache找可用块的时候就从LRU链中找。LRUW是将脏块链起来,将来DBWR将脏块写入磁盘时就访问LRUW链。把块链起来的目的就是为了组织和管理buffer块。Buffer cache中还有一种叫做检查点队列链(checkpoint原创 2016-03-22 12:03:01 · 2517 阅读 · 1 评论 -
第二讲--SQL语句执行过程
客户端连接到oracle实例就会在oracle实例端产生一个server process进程,此为前台进程,oracle为该进程分配独自的PGA。SQL语句执行过程:1. 客户端输入SQL语句,SQL语句通过网络到达oracle实例,server process接收SQL语句;2. Oracle无法直接执行SQL,需要将SQL解析成执行计划才能执行;3.原创 2016-03-21 19:02:48 · 849 阅读 · 0 评论 -
第三讲--SQL语句硬解析和软解析
本节讲解shared pool的内存结构 SQL语句的执行分为三个阶段:1. SQL的解析(parse);2. SQL的执行(exec);3. SQL结果的获取(fetch)。Shared pool是一块内存池,最主要的作用是缓存SQL语句以及SQL语句的执行计划。Sharedpool主要在parse阶段起作用。 Shared pool原创 2016-03-21 19:12:19 · 2104 阅读 · 0 评论 -
第四讲--shared pool内存块组成结构及4031错误产生原因分析
我们只能设置shared pool的大小,不能设置里面librarycache和row cache的大小。 Free的内存结构:Free空间由一个个小的内存块(chunk,图中圆圈)组成,然后用链(chain)把内存块挂到链上。图中所示的三个链由上到下所挂的内存块的大小越来越大。硬解析时根据SQL执行计划的大小,从free区中分配合适的内存块给执行计划,并把内存块移到l原创 2016-03-21 19:22:00 · 787 阅读 · 0 评论 -
第五讲--共享SQL减少硬解析
SQL要共享就是让SQL完全相同,空格,数值,回车,大小写等等,统统认为是SQL语句不一样。不能共享就会发生硬解析。SQL共享的方法:1. 统一书写风格;2. 使用绑定变量;SQL语句可以分为动态部分和静态部分,where不同的输入是动态部分。 查看library cache的解析命中率:SQL> select sum(pinhits)/sum(p原创 2016-03-21 19:25:37 · 1330 阅读 · 0 评论 -
第六讲--buffer cache作用概述
Oracle数据库有三大文件:*.ctl、*.dbf、*.log。 块的概念:Oracle把dbf文件分成一个个大小相等的块(block),块大小通常为8k。块是oracle进行IO的最小单位。块里面放的数据行,一个块里放多个数据行,一般而言,一个数据行不会被放在多个数据块里面。当一个select语句要查询一行数据时,oracle通过计算定位到数据块。这个数据块里有20行数据,但是原创 2016-03-21 19:30:29 · 2195 阅读 · 0 评论 -
第八讲--buffer cache大小的设置及依据
查看oracle相关进程:[oracle@redhat4 ~]$ ps -ef|grep oraroot 8450 7935 0 10:40 pts/1 00:00:00 su - oracleoracle 8451 8450 0 10:40 pts/1 00:00:00 -bashoracle 8480 1 0 10:41 ?原创 2016-03-21 19:39:38 · 5299 阅读 · 0 评论 -
第九讲--buffer状态深入剖析
在物理磁盘上叫block,在内存里叫buffer。有个叫做x$bh(bufferheader)的表,其中每一行数据都对应着一个buffer。查看x$bh表结构:SQL> descx$bh; Name Null? Type --------------------------------------------原创 2016-03-21 19:41:23 · 703 阅读 · 0 评论 -
第十讲--Oracle日志原理剖析
日志关系到数据一致性,日志和性能没有多大关系。Oracle的日志是严格按照buffer cache里面buffer的改变时间去记录的。Oracle怎么记录buffer的改变呢?1. 记录buffer的地址;2. 记录改变发生的时间;3. 对数据块做了什么改变,改变就两种,增加和删除,修改数据的本质是删一行数据在添加一行数据,看来修改时增删改中消耗最原创 2016-03-21 19:44:23 · 1663 阅读 · 0 评论 -
第十一讲--Oracle日志核心意义:快速提交、写缓存
一条SQL通过会话进入oracle,修改一个buffer,修改的日志首先放在会话的PGA中,一定程度之后把PGA里的日志再写到redolog buffer里,LGWR按顺序周期性的把日志写到redo log中,因为是顺序写,不用大量寻道,所以写的速度会很快。会话用commit提交修改,提交时并不把脏buffer写回block上,而是把redo log buffer中那一点点(因为LGWR周期性的工原创 2016-03-21 19:49:56 · 1071 阅读 · 0 评论 -
第十二讲--logbuffer相关设置
LGWR的出发条件:1. 用户提交,commit;2. 有1/3重做日志缓冲区未被写入磁盘;3. 有大于1M的重做日志缓冲区未被写入磁盘;4. 每隔3秒钟;5. DBWR需要写入的数据的SCN大于LGWR记录的SCN,DBWR出发LGWR写入; 对第5点的解释:对于一个脏buffer,oracle保证,在脏buffe原创 2016-03-21 19:55:33 · 1687 阅读 · 0 评论 -
第十三讲--PGA内存作用和构成
每一个进程,包括后台进程都有PGA空间。只不过后台进程占用的PGA空间比较小,平时不怎么关心。而server process占用的PGA空间比较大。 PGA的构成:1. private SQL area;2. session memory;3. SQL work areas(SQL工作区);其中SQL work area是最重要的工作区,存放会原创 2016-03-21 21:46:39 · 698 阅读 · 0 评论 -
第十四讲--PGA管理和调整
Oracle有两种工作方式:1. dedicated server;一个连接对应一个server process。连接的请求得到最及时的相应。2. shared server;多个连接由调度进程随机分配,连接被放入SQL队列,6个server process不断轮询从SQL队列中取出SQL执行。Despatcher只是调度的作用,起负载很小,主要的负原创 2016-03-21 21:52:04 · 537 阅读 · 0 评论 -
第十五讲--Oracle存储结构:文件
控制文件主要放的数据库的名字,数据库的物理结构信息等。数据文件放的实实在在的数据,数据文件分为两类:普通数据文件和临时数据文件。临时数据文件在排序查询时用作swap空间。对oracle来讲,控制文件、数据文件、联机重做日志文件非常重要,一般不放在服务器上,而是放在存储上。oracle针对这三类文件提供了很多的安保措施。 查询控制文件:SQL> select name, valu原创 2016-03-21 21:57:39 · 477 阅读 · 0 评论 -
第十六讲--Oracle存储结构:表空间
控制文件,数据文件,重做日志一定要放在存储上。 存储有三种组织形式:1. 文件系统(很少);2. ASM;3. 裸设备; Oracle有很多表同时也有很多dbf文件,oracle并没有直接将表放到某个dbf文件上。而是在表与dbf文件之间加一层表空间。一个表空间由一个或者多个dbf文件组成,表空间就是多个dbf集合起来起的名原创 2016-03-21 22:04:20 · 622 阅读 · 0 评论 -
第十七讲--Oracle存储结构:段区块
建立一个表空间:1. 登录EM,打开管理页2. 选择表空间3. 选择创建创建好表空间和数据文件之后接下来开始存储设置 Oracle高水位线:建立段之后就会给段分配区,区里面有很多块,区里面的块自然被段使用。段使用区的最后一个块的位置叫高水位线。高水位线是orac原创 2016-03-21 22:13:41 · 2623 阅读 · 0 评论 -
第二十六讲--深入剖析事务槽及Oracle多种提交方式
每一个oracle块的头部都有事务槽,oracle块里有一个PCT_free的概念,即oracle会预留块大小的10%作为缓冲,当修改oracle的事务增加时,事务槽向下增长,当更新oracle块的数据时,数据向上增长,PCT_free的空间被压缩。当PCT_free被用完时,oracle就彻底填满了,如果还有事务要修改Oracle块,就需要在事务队列中等待这叫做事务槽的争用。假如一张表占有8原创 2016-03-22 12:34:52 · 2730 阅读 · 0 评论