oracle知识整理.docx
- 文档编号:5729376
- 上传时间:2022-12-31
- 格式:DOCX
- 页数:13
- 大小:318.60KB
oracle知识整理.docx
《oracle知识整理.docx》由会员分享,可在线阅读,更多相关《oracle知识整理.docx(13页珍藏版)》请在冰豆网上搜索。
oracle知识整理
Oracle知识整理-1(简介)
前一段时间去听了一个Oracle10g课程,这个课程主要是面向DBA的管理课程。
由于本人的工作方向是面向开发的,数据库管理方面的知识基本是一点儿都没有,所以这个课听的比较郁闷。
现在准备趁着自己还没忘了的时候,先把学到的东西整理一下,和大家分享一下我的学习成果。
既然是讲Oracle10g咱们就从这"g"说起。
它代表的意义就是网格(Grid)。
Oracle的网格技术带来的好处:
低的成本,高质量的服务,方便的管理。
Oracle的网格计算技术包括:
•AutomaticStorageManagement(ASM)
•RealApplicationClusters(RAC)
•OracleStreams
•EnterpriseManagerGridControl
ASM全称为AutomatedStorageManagement,即自动存储管理,它是Oracle提供的一个卷管理器,用于替代操作系统所提供的LVM,它不仅支持单实例配置,也支持RAC这样的多实例配置。
将给Oracle数据库管理员带来极大的方便,ASM可以自动管理磁盘组,并提供数据冗余和优化。
特别是对于企业级的大型数据库管理员来说,可以使管理员可以从管理成百上千个数据文件这些琐碎的日常事务中解脱开来,以便处理其它更为重要的事务上去。
一个磁盘组是ASM管理的一个逻辑单元,由一组磁盘设备组成。
我们可以定义一个磁盘组作为数据库的默认磁盘组,Oracle会自动管理存储,包括创建、删除数据文件等。
Oracle会自动将这些文件与一个合适的数据库对象做关联,这样我们在管理这些对象时只需要提供对象的名称,而无需像以前那样提供详细的文件名。
ASM允许你在一组独立的磁盘上创建一个单独的磁盘组。
这样就实现了单个磁盘组的I/O均衡。
同时ASM还实现了条带化(Striping)和磁盘镜像(Mirroring)以提高I/O的性能和数据可靠性。
与RAID或LVM不同的是,ASM是在文件级实现的条带化和镜像,这样的实现方式给用户带了很大选择自由度,我们可以在同一个磁盘组中对不同的文件配置不同的存储属性,实现不同的存储方式。
RAC全称为RealApplicationCluster,即真正应用集群,它是Oracle数据库支持网格计算环境的核心技术。
它的出现解决了传统数据库应用中面临的一个重要问题:
高性能、高可伸缩性与低价格之间的矛盾。
RAC中所有服务器都可以直接访问数据库中的所有数据,其他的数据库在开放系统中都做不到这点,正是由于这个原因,您可以非常方便地根据需求随时增加服务器来扩充您的系统,无需重新分布数据和应用。
RealApplicationClusters象一个单一的系统一样工作,任何节点的故障都不会影响其他节点对数据的访问。
所以说增加服务器就增加了系统的可靠性。
另外一点,对用户来说RAC是一个数据库系统,对它的维护管理如同单机一样简单方便。
OracleStreams是一个信息共享的简单解决方案。
它提供如下功能:
复制,消息队列,数据仓库的装载和简单的ETL,数据库迁移,应用升级,事件管理和通告
EnterpriseManagerGridControl是一种集成管理解决方案,用于管理包括主机、数据库、接收器、应用程序服务器、HTTP服务器和Web应用程序作为一个结合单元的完整企业Oracle环境。
Oracle知识整理-2(Oracle数据库的结构)
OracleServer包括OracleInstance和OracleDatabase。
一般情况下,OracleInstance与Oracledatabase一一对应。
在一台机器上可以安装多个Oracleserver,每个Oracleserver必须有独立的instance与database。
每一个运行的Oracle数据库(Oracledatabase)都会被关联到一个Oracle实例(Oracleinstance)上。
当一个数据库服务器被启动的时候,Oracle会关联的一个共享的内存区域被称做SystemGlobalArea(SGA),并启动一些后台的进程。
这个被关联的SGA区域和那些后台进程就被称为Oracle实例(Oracleinstance)。
在一个实例被启动之后,Oracle会把这个实例和一个具体的数据进行关联,这个过程就叫做mount这个数据库,这个数据进入到准备被打开(open)的状态。
这时被授权的用户可以登陆了。
多个实例可以被运行在是一台计算机上,但每一个实例都会有一个自己的物理数据库
Oracle知识整理-3(Oracle内存结构)
一个Oracle实例包括的基本内存结构如下:
SystemGlobalArea(SGA):
是用于存储数据库信息的内存区,该信息为数据库进程所共享。
它包含Oracle服务器的数据和控制信息,它是在Oracle服务器所驻留的计算机的实际内存中得以分配,如果实际内存不够再往虚拟内存中写。
在实例启动的时候内存会自动分配,当实例shutdown的时候操作系统会将内存回收的。
每一个实例(instance)拥有自己的SGA。
ProgramGlobalArea(PGA):
包含单个服务器进程或单个后台进程的数据和控制信息,与几个进程共享的SGA正相反PGA是只被一个进程使用的区域,PGA在创建进程时分配在终止进程时回收。
SGA是一个共享的内存区域,包括数据和控制信息,包括以下的内容:
Databasebuffercache:
是SGA中的一部分,它存储的是从数据文件中读取的数据块的拷贝,所有的数据库连接都会共享访问这个区域。
Databasebuffercache和sql的共享区分在不同的逻辑segment集中(databasebuffercache和sharedpool是不同的两个内存区域),这样可以降低他们之间的争用情况。
Redologbuffer:
该buffer是循环的一块空间在SGA中,它存储了一些关于数据库的一些改变。
这些信息就存储在redoentries,包含在执行INSERT,UPDATE,DELETE,CREATE,ALTER,orDROP操作时的重构或重做的信息,在恢复的时候,redoentries也许是有必要的。
Sharedpool:
这一块区域里面三个主要的部分:
librarycache,dictionarycache,存储并行执行的信息的buffer,还有一些控制信息。
Largepool:
是一种类似共享池的SGA缓冲池,和共享池不同的是,只有少量类型的对象可以再LargePool中创建。
LargePool的空间不在共享池中分配,是在数据库启动的时候另外分配的。
Javapool:
所有的JavaVirtualMachine(JVM)中的Java程序和数据。
Streamspool:
流池(或者如果没有配置流池,则是共享池中至多10%的空间)会用于缓存流进程在数据库间移动/复制数据时使用的队列消息。
这里并不是使用持久的基于磁盘的队列(这些队列有一些附加的开销),流使用的是内存中的队列。
如果这些队列满了,最终还是会写出到磁盘。
如果使用内存队列的oracle实例由于某种原因失败了,比如说因为实例错误(软件瘫痪)、掉电或其他原因,就会从重做日志重建这些内存中的队列。
Keepbuffercache:
拥有的数据保存在缓存中尽可能长的时间
Recyclebuffercache:
数据生命周期短的缓存
nKblocksizebuffercaches:
缓存和数据默认块大小不同的数据块;
Oracle知识整理-4(BufferCache)
buffercache是SGA的一部分,所有的用户都能共享里面的信息。
当一个serverprocess访问数据的时候,首先是在buffercache中查找,如果数据在buffer中存在,我们还需要根据databuffer的状态,来判断是否进行DBBlockGets还是ConsistentGets,如果数据在buffer中不存在,则我们需要在buffercache中寻找足够的空间来加载我们所需要的数据,如果在buffercache中我们找不到足够的空间,那么我们就需要触发DBWn进程,去写出脏数据,用来释放我们的buffer空间。
Oracle通过几个list来对buffer进行管理。
其中最为突出的就是LRUList还有Checkpointqueue,这些list上面存放的就是具体指向buffer的指针。
LRUList主要就是用来维护内存中的buffer,当数据库初始化的时候,所有的buffer都放入LRUList上进行管理。
当我们从数据文件中读取数据的时候我们现在要在LRUList上面寻找free的buffer,然后将数据读取到我们所找到的这个freebuffer中。
只要数据被修改了,那么这个buffer的状态就变为了dirty,那么Oracle就会把这个buffer从LRUList移到CheckpointQueue中去。
在CheckpointQueue上的buffer都是一些候选的稍后会被DBWn写出到数据文件的buffer,那么这里还有一点需要注意的是:
一个buffer要么存在于LRUList上面,要么存在于CheckpointQueue上面,不可能同时存在于两个List上面。
我们可以通过编辑参数DB_CACHE_SIZE和对bufferCache进行配置。
DB_CACHE_SIZE初始化参数取代了DB_BLOCK_BUFFERS初始化参数,DB_BLOCK_BUFFERS使用于早期的版本中。
DB_CACHE_SIZE参数以字节单位指定标准块大小的缓冲区高速缓存的大小。
为了兼容早期版本的数据库,DB_BLOCK_BUFFERS参数仍然可以使用,但是它保留一个静态的参数,并且不能与其他动态大小调整的参数组合使用DB_nK_CACHE_SIZE初始化参数
非标准块的缓冲区块大小和数量由如下的初始化参数指定:
DB_2K_CACHE_SIZE
DB_4K_CACHE_SIZE
DB_8K_CACHE_SIZE
DB_16K_CACHE_SIZE
DB_32K_CACHE_SIZE
每个参数给相应的块大小指定缓冲区高速缓存的大小。
例如:
DB_BLOCK_SIZE=4096
DB_CACHE_SIZE=12M
DB_2K_CACHE_SIZE=8M
DB_8K_CACHE_SIZE=4M
在这个例子中,指定标准数据库块大小的参数值是4K。
标准块大小的缓冲区高速缓存的大小为12M。
另外,2K和8K的高速缓存大小分别配置为8M和4M。
注意:
不能使用DB_nK_CACHE_SIZE参数来调整标准块的大小。
例如,如果DB_BLOCK_SIZE设置为2K,设置DB_2K_CACHE_SIZE。
等于2K是无效的。
标准缓存的块大小总是由DB_CACHE_SIZE决定的。
在BufferCache中的buffer有四种状态:
Pinned:
Theblockiseithercurrentlybeingreadintothecacheorbeingwrittento。
Othersessionswaittoaccesstheblock。
(当前正在更新的内存数据块。
)
Clean:
Thebufferisnowunpinnedandisacandidateforimmediateagingoutifthecurrentcontents(datablock)arenotreferencedagain。
EitherthecontentsareinsyncwithdiskorthebuffercontainsaCRsnapshotofablock。
(buffer的内容与数据文件中的一致。
)
Free/unused:
Thebufferisemptybecausetheinstancejuststarted。
Thisstateisverysimilartothecleanstate,exceptthatthebufferhasnotbeenused。
(buffercache中的内存数据块为空。
)
Dirty:
Thebufferisnolongerpinnedbutthecontents(datablock)havechangedandmustbeflushedtodiskbyDBWnbeforeitcanbeagedout。
(buffercache中的内存数据块的内容被修改,从而导致与数据文件中的数据块的内容不一致。
)
名词解释:
1、DBBlockGets(当前请求的块数目)
当前模式块意思就是在操作中正好提取的块数目,而不是在一致性读的情况下而产生的块数。
正常的情况下,一个查询提取的块是在查询开始的那个时间点上存在的数据块,当前块是在这个时刻存在的数据块,而不是在这个时间点之前或者之后的数据块数目。
2、ConsistentGets(数据请求总数在回滚段Buffer中的数据一致性读所需要的数据块)
这里的概念是在处理你这个操作的时候需要在一致性读状态上处理多少个块,这些块产生的主要原因是因为由于在你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。
这样就产生了一致性读。
3、PhysicalReads(物理读)
就是从磁盘上读取数据块的数量,其产生的主要原因是:
1、在数据库高速缓存中不存在这些块
2、全表扫描
3、磁盘排序
它们三者之间的关系大致可概括为:
逻辑读指的是Oracle从内存读到的数据块数量。
一般来说是'consistentgets'+'dbblockgets'。
当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsicalreads'。
Oracle知识整理-5(MultipleBufferPools)
数据库的管理可以通过建立多种缓冲池(multiplebufferpools)来提高数据的效率。
你指定对象到那种缓冲池是根据如何去访问这个对象来决定了。
有三种缓冲池:
Keep:
这个池用来保存对象在内存中以便这个对象被重复使用。
保持这些对象在内存中可以减少I/O操作。
这个池的大小要比被缓存的数据的总大小要大,所以在这个池中的缓存不会被过期。
可以通过修改DB_KEEP_CACHE_SIZE参数来配置这个池。
Recycle:
这个池保存在块只有很小的机会会被保存在内存中。
这个池的大小要比被缓存的数据的总大小要小,所以被缓存的数据会经常的过期。
可以通过修改DB_RECYCLE_CACHE_SIZE参数来配置这个池。
Default:
这个池总是存在,它相当于一个buffercache的实例不包括Keep和Recycle,可以通过修改DB_CACHE_SIZE参数来配置这个池。
注意:
在内存中Keeppool和Recyclepool并不是Defaultpool的子集。
例:
CREATEINDEXcust_idx…
STORAGE(BUFFER_POOLKEEP…);
ALTERTABLEoe.customers
STORAGE(BUFFER_POOLRECYCLE);
ALTERINDEXoe.cust_lname_ix
STORAGE(BUFFER_POOLKEEP);
Oracle知识整理-6(SharedPool)
SharedPool的大小是通过参数SHARED_POOL_SIZE和决定的。
它可以分为库缓存(Librarycache),数据字典缓存(Datadictionarycache)和用户全局区域(UGA)所组队成的。
Librarycache存放了最近执行的SQL语句、存储过程、函数、解析树以及执行计划等。
Datadictionarycache存放了在执行SQL语句过程中,所参照的数据字典的信息,包括SQL语句所涉及的表名、表的列、权限信息等。
dictionarycache也叫做rowcache,因为这里面的信息都是以数据行的形式存放的,而不是以数据块的形式存放的。
TheUserGlobalArea(UGA)当sharedserver模式被使用并且Largepool没有被设定的时候这个区域包括用户的session信息。
oracle对SQL语句进行了概括和抽象,将SQL语句提炼为两部分,一部分是SQL语句的静态部分,也就是SQL语句本身的关键词、所涉及的表名称以及表的列等。
另一部分就是SQL语句的动态部分,也就是SQL语句中的值(即表里的数据)。
很明显的,整个数据库中所包含的对象数量是有限的,而其中所包含的数据则是无限的。
而正是这无限的数据导致了SQL语句的千变万化,也就是说在数据库运行的过程中,发生的所有SQL语句中,静态部分可以认为数量是有限的,而动态部分则是无限的。
而实际上,动态部分对解析的影响相比静态部分对解析的影响来说是微乎其微,也就是说通常情况下,对于相同的静态部分的SQL语句来说,不同的动态部分所产生的解析结果(执行计划)基本都是一样的。
这也就为oracle提高解析SQL语句的效率提供了方向。
oracle会将用户提交来的SQL语句都缓存在内存中。
每次处理新的一条SQL语句时,都会先在内存中查看是否有相同的SQL语句。
如果相同则可以减少最重要的解析工作(也就是生成执行计划),从而节省了大量的资源;反之,如果没有找到相同的SQL语句,则必须重新从头到尾进行完整的解析过程。
这部分存放SQL语句的内存就叫做共享池(sharedpool)。
当然,sharedpool里不仅仅是SQL语句,还包括管理sharedpool的内存结构以及执行计划、控制信息等等内存结构。
当oracle在sharedpool中查找相同的SQL语句的过程中,如果SQL语句使用了绑定变量(bindvariable),那么就是比较SQL语句的静态部分,前面我们已经知道,静态部分是有限的,很容易就能够缓存在内存里,从而找到相同的SQL语句的概率很高。
如果没有使用绑定变量,则就是比较SQL语句的静态部分和动态部分,而动态部分的变化是无限的,因此这样的SQL语句很难被缓存在sharedpool里。
毕竟内存是有限的,不可能把所有的动态部分都缓存在sharedpool里,即便能够缓存,管理这样一个无限大的sharedpool也是不可能完成的任务。
不使用绑定变量导致的直接结果就是,找到相同的SQL语句的概率很低,导致必须完整的解析SQL语句,也就导致消耗更多的资源。
从这里也可以看出,只有我们使用了绑定变量,才真正遵循了oracle引入sharedpool的哲学思想,才能够更有效的利用sharedpool
Oracle知识整理-7(LargePool)
LargePool的大小是通过参数LARGE_POOL_SIZE来决定的。
它所存储的信息有用户全局区域(UGA),备份和恢复选项(Backupandrestoreoperations)和并行查询信息(Parallelquerymessaging)Oracle共享进程和OracleXA接口。
它是一种类似共享池的SGA缓冲池,和共享池不同的是,只有少量类型的对象可以再LargePool中创建。
LargePool的空间不在共享池中分配,是在数据库启动的时候另外分配的。
Oracle数据库也可以不配置LargePool。
它用来存放临时性的,有生命周期的信息,信息用过之后被释放掉。
不用LRU是它和SHAREDPOOL一个显著的区别。
如果LargePool空间不足,会出现ORA-4031错误。
Oracle为什么引入LARGEPOOL这个概念呢?
当出现象RMANBACKUPANDRECOVERY等需要大块内存请求(频繁的申请内存块,释放内存块过程)时,将对SHAREDPOOL造成一定的性能影响,而LARGEPOOL是起着这种功能隔离作用的一块区域。
例如在SHAREDSERVER中增加LARGEPOOL可以降低SHAREDPOOL的活动性使其更有效(当然如果你的系统不涉及使用LARGEPOOL的除外)。
就是说,这个池会对文件操作产生的I/O有一定的影响。
Oracle知识整理-8(JavaPool)
JavaPool的大小是通过参数JAVA_POOL_SIZE来决定的。
它是用来存储内存中所有在JVM内的JAVA代码和数据。
Sharedpool被用来存储JVM中的classloader。
这个classloader在每个class被读取的时候会占用8KB的内存。
Sharedpool还会被用来存储数据库中的JAVA代码的编译和在数据中使用的JAVA资源对象。
JavaPool被用来存储OracleJVM分配的所有运行时执行的JAVA状态,包含JAVA方法和类的定义,JAVA对象的调用等。
Oracle知识整理-9(进程结构)
用户进程(Userprocess):
它开始于用户请进连接一个Oracle数据库的时候,它运行于客户端,它并不和OracleServer直接交互,而是通过ServerProcess和OracleServer进行交互。
服务进程(Serverprocess):
连接到一个Oracle实例,并且开始于一个用户session的开始。
它和OracleServer运行于同一台机器上,使用PGA执行UserProcess发出的调用,并向UserProcess返回结果状态和结果信息。
后台进程(Backgroundprocess)开始于一个Oracle实例的启动
Oracle知识整理-10(后台进程)
一个Oracledatabaseserver包括一个Oracledatabase和一个Oracleinstance。
一个Oracle实例包括了内存结构,SystemGlobalArea(SGA)和后台进程。
这些共公的后台进程包括:
SystemMonitor(SMON):
负责数据库崩溃之后的恢复工作,用于维护数据的一致性。
他主要完成以下工作:
1)实例恢复
2)重做已提交的事务
3)打开数据库中国.网管联盟
4)回滚未提交的事务
5)合并数据文件中相邻的自由空间
6)释放临时段的空间
ProcessMonitor(PMON):
当某个进程失效时,清除相关的资源。
他主要完成以下工作:
1)回滚用户的当前事务
2)释放
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- oracle 知识 整理