您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > Oracle原理学习笔记
Oracle学习笔记----Rill1ORACLE的工作机制体系结构实例Oracle运行的时候,在内存中会要开辟一个区间,这个区间主要是用于从磁盘(数据文件)中读出数据后的一个在内存的缓存和处理。而处理这些数据的操作,需要有一些系统的后台进程,这些进行在Oracle数据库启动的时候,就开始运行,一直在响应前台的操作。实际上,这一个区间(SGA)和这些后台进程合在一起,就称为实例。实例是包括SGA区和后台进程两个部分的。数据库启动执行若干动作,经历三个阶段,分别是未加载、加载和打开。1、未加载(nomount)可以把数据库启动的这一阶段看作是Oracle实例的启动。这种方式启动下可执行:重建控制文件、重建数据库。这一启动命令:•读取数据库参数文件。•启动所需的后台进程并按参数文件中的定义分配内存。•将进展情况写入告警日志文件中。2、加载(mount)在实例启动加载阶段,数据库参数文件中指定的控制文件被读取。记住控制文件将数据库各部分联系在一起。实例从控制文件中找到下列信息,然后将进展写入告警日志文件。这种方式启动下可执行:数据库日志归档、数据库恢复、重新命名一些数据库文件:•所有数据文件和重做日志文件的名称和位置。•数据库名。•最新系统更改号(SCN)。3、打开(open)包含在数据库中的每个联机数据文件在数据库打开前必须被同步。在数据库打开阶段:•所有联机数据文件的头与控制文件信息相比较。•所有文件同步后,数据库打开。当数据库关闭时,取决于它的关闭方式执行不同的任务:•正常(normal)在所有的用户离线后发生的正常关闭。•事务(transactional)事务关闭就是当所有的用户执行完当前的事务后,将用户从数据库上清除。•立即(immediate)立即关闭就是从数据库清除所有当前用户之后,回退所有未完成的操作。•异常(abort)异常关闭没有给数据库任何整理的机会。这种方式关闭后需要实行崩溃恢复。实例是数据管理的核心—它做所有的工作,而数据库存储所有的数据。其他启动方式:•startuprestrict约束方式启动这种方式能够启动数据库,但只允许具有一定特权的用户访问非特权用户访问时,会出现以下提示:ERROR:ORA-01035:ORACLE只允许具有RESTRICTEDSESSION权限的用户使用Oracle学习笔记----Rill2•startupforce强制启动方式当不能关闭数据库时,可以用startupforce来完成数据库的关闭先关闭数据库,再执行正常启动数据库命令•startuppfile=参数文件名带初始化参数文件的启动方式先读取参数文件,再按参数文件中的设置启动数据库•startupEXCLUSIVE***************一个Delete操作的流程:1、检查语法、语义(V$ROWCACHE:datadictionarycache),计算HASHVALUE,在session的UGA中进行匹配(session_cached_cursors),如果UGA中没有,在librarychache中匹配(librarychachelocklatch保护librarychachelock对地址堆的访问,而后librarychachepinlatch保护librarycachepin对librarycache中sql相关信息的访问)2、根据执行计划读取数据:cachebufferchainlatch保护能定位到bufferheader并pin住该块(如果没有bufferheader,就pin住某个空块(没有空块就产生freebufferwaits),并到数据文件中读取)。如果此时有某个进程想访问该块,将产生bufferbusywaits。3、在redologbuffer中记录delete操作的细节。(包括回滚段前后镜像、数据块前后镜像)。4、在相应回滚段段头的事务表中创建一个undo条目,把将要删除的记录创建前镜像,存放到UndoBlock中。5、在BufferCache中的相应数据块上删除记录,并且标记相应的数据块为Dirty。提交(COMMIT)1.Oracle产生一个SCN2.在回滚段事务表中标记该事务状态为commited3.LGWRFlushLogBuffer到日志文件3.如果此时数据块仍然在BufferCache中,那么SCN将被记录到BlockHeader上,这被称为快速提交(fastcommit)4.如果dirtyblock已经被写回到磁盘,那么下一个访问这个block的进程将会自回滚段中获取该事务的状态,确认该事务被提交。然后这个进程获得提交SCN并写回到BlockHeader上。这被称为延迟块清除(delayedblockcleanout)。内存SGA(系统全局区、共享全局区)、PGA(进程全局区、私有全局区)内存分配原则:10%冗余内存,OSSYS进程(约1.6G),OSBUFFER(约0.8G),数据库连接消耗内存(每个连接约5~8M),PGA(每个连接约2M,V$PGA_TARGET_ADVICE),SGAOracle学习笔记----Rill3SGAv$sgastat注意showparametersga_max_sizeOracle的内存:软件代码区系统全局区进程全局区:包含单个进程的数据和控制信息排序区SGA中的Thefixedarea包含了数千个原子变量,以及如指向SGA中其它区域的SystemGlobalAreaFixedSizeVariableSizeDatabaseBuffersRedobuffersLargepoolSharedPoolLibrarycacheDatadictionarycacheUserGlobalArea共享SQL区专用SQL区db_cache_sizedb_keep_cache_sizedb_recycle_cache_sizedb_nk_cache_size永久性内存结构JavapoolOracle学习笔记----Rill4pointers(指针)等小的数据结构.通过对fixedtable内表X$KSMFSV查询(如下)可以获得这些变量的名字,变量类型,大小和在内存中的地址.thevariablearea是由largepool和sharedpool组成Sharedpool中永久性的内存包含各种数据结构如:thebufferheaders,processes,sessions,transactionarrays,theenqueueresources,locks,theonlinerollbacksegmentarrays,variousarraysforrecordingstatistics.其中大部分的SIZE是依靠初始参数的设置来确定的.这些初始参数只能在实例被关闭的状态下才能够进行修改.所以这里说的永久性是针对实例打开状态下的生存期而言.Thevariablearea的在SGA中的SIZES就等于LARGE_POOL_SIZE,SHARED_POOL_SIZE和永久性的内存arrays的SIZE三者相加.永久性内存arrays的SIZE=thevariablearea-(LARGE_POOL_SIZE+SHARED_POOL_SIZE).数据缓冲区命中率v$sysstat这里命中率的计算应该是令x=physicalreadsdirect+physicalreadsdirect(lob)命中率=100-(physicalreads-x)/(consistentgets+dbblockgets-x)*100通常如果发现命中率低于90%,则应该调整应用可可以考虑是否增大数据缓冲区共享池的命中率SQLselectsum(pinhits-reloads)/sum(pins)*100hitradiofromv$librarycache;hitradio----------99.809291假如共享池的命中率低于95%,就要考虑调整应用(通常是没使用bindvar)或者增加内存关于排序部分SQLselectname,valuefromv$sysstatwherenamelike'%sort%';NAMEVALUE--------------------------------------------------------------------------sorts(memory)67935sorts(disk)1sorts(rows)7070假如我们发现sorts(disk)/(sorts(memory)+sorts(disk))的比例过高,则通常意味着sort_area_size部分内存较小,可考虑调整相应的参数。关于log_bufferSQLselectname,valuefromv$sysstat2wherenamein('redoentries','redobufferallocationretries');NAMEVALUE--------------------------------------------------------------------------redoentries2325719redobufferallocationretries10假如redobufferallocationretries/redoentries的比例超过1%我们就可以考虑增大log_bufferOracle学习笔记----Rill5如何在Linux上扩展SGA超过1.7G共享池(SHARED_POOL_SIZE)v$shared_pool_adviceALTERSYSTEMFLUSHSHARED_POOLHowtoKeepObjects--重点使用DBMS_SHARED_POOL.KEEP过程来keepobjects,UNKEEP过程从sharedpool中移走pinnedobjectsexecutedbms_shared_pool.keep('address,hash_value');--keep该匿名块共享池包括库高速缓存(librarycache)、数据字典高速缓存和服务器控制结构(例如数据库字符集)。Oracle服务器用库高速缓存来提高执行SQL语句的性能;库高速缓存包括共享和专用SQL区。共享SQL区包括SQL语句语法分析树和执行路径,而专用SQL区存储特定的会话信息,例如捆绑变量、环境和会话参数、运行堆栈和缓冲区等。Softparse使用的资源包括CPU和librarycachelatchgetsHardparse是指要解析的SQL没有在librarycache中,或者执行的时候发现解析过的SQL已经agedout,就是离开了librarycache,称为Librarycachemisses.使用的资源包括额外的CPU,librarycachelatchgets,以及sharedpoollatchgets.专用SQL区在每个事务初始化时创建,在与专用SQL区相关的游标关闭时被释放。一个用户会话能够一次打开的专用SQL区的数量由init.ora参数OPEN_CURSORS决定。使用这两个结构,Oracle服务器能够重用一条SQL语句的所有执行的共同信息。与此同时,可以从专用SQL区中查询执行的特定会话信息。注意游标使用过程中并不关闭游标的应用会继续为应用分配越来越多的内存,部分原因是为每个打开的游标分配了专用SQL区。库高速缓存中的专用SQL区可更进一步分为永久区和运行区。共享池的大小取决于init.ora文件参数SHARED_POOL_SIZE,它是以字节为单位的。你必须将这个值设得足够大,以确保有足够的可用空间来装载和存储PL/SQL块和SQL语句。共享区经过长期装卸和卸载数据对象会产生许多碎片,如果在共享池中没有足够的连续空间用来装载目标数据,会产生错误。解决这个问题的捷径是运行SQL命令ALTERSYSTEMFLUSHSHARED_POOL。但是如果在数据库操作时,经常遇到共享池错误,你必须增大共享池
本文标题:Oracle原理学习笔记
链接地址:https://www.777doc.com/doc-11334 .html