您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > Oracle表空间管理逻辑
表空间(Tablespace)——为数据库提供使用空间的逻辑结构,其对应物理结构是数据文件,一个表空间可以包含多个数据文件。本地管理表空间(LocallyManagedTablespace简称LMT)——8i以后出现的一种新的表空间的管理模式,通过本地位图来管理表空间的空间使用。字典管理表空间(Dictionary-ManagedTablespace简称DMT)——8i以前包括以后都还可以使用的一种表空间管理模式,通过数据字典管理表空间的空间。本地化管理:就是指Oracle不再利用数据字典表来记录Oracle表空间里面的区的使用状况,而是在每个表空间的数据文件的头部加入了一个位图区,在其中记录每个区的使用状况。每当一个区被使用,或者被释放以供重新使用时,Oracle都会更新数据文件头部的这个记录,反映这个变化。本地化管理的表空间的创建过程:语法:CREATETABLESPACE表空间名字DATAFILE’数据文件详细信息’[EXTENTMANAGEMENT{LOCAL{AUTOALLOCATE|UNIFORM[SIZEINTETER[K|M]]}}]关键字EXTENTMANAGEMENTLOCAL指定这是一个本地化管理的表空间。对于系统表空间,只能在创建数据库的时候指定EXTENTMANGEMENTLOCAL,因为它是数据库创建时建立的第一个表空间。在8i中,字典管理还是默认的管理方式,当选择了LOCAL关键字,即表明这是一个本地管理的表空间。当然还可以继续选择更细的管理方式:是AUTOALLOCATE还是UNIFORM.。若为AUTOALLOCATE,则表明让Oracle来决定区块的使用办法;若选择了UNIFORM,则还可以详细指定每个区块的大小,若不加指定,则为每个区使用1M大小。本地管理表空间的优点:1)减少了递归空间管理本地管理表空间是自己管理分配,而不是象字典管理表空间需要系统来管理空间分配,本地表空间是通过在表空间的每个数据文件中维持一个位图来跟踪在此文件中块的剩余空间及使用情况。并及时做更新。这种更新只对表空间的额度情况做修改而不对其他数据字典表做任何update操作,所以不会产生任何回退信息,从而大大减少了空间管理,提高了管理效率。同时由于本地管理表空间可以采用统一大小分配方式(UNIFORM),因此也大大减小了空间管理,提高了数据库性能。2)系统自动管理extents大小或采用统一extents大小本地管理表空间有自动分配(AUTOALLOCATE)和统一大小分配(UNIFORM)两种空间分配方式,自动分配方式(AUTOALLOCATE)是由系统来自动决定extents大小,而统一大小分配(UNIFORM)则是由用户指定extents大小。这两种分配方式都提高了空间管理效率。3)减少了数据字典之间的竞争因为本地管理表空间通过维持每个数据文件的一个位图来跟踪在此文件中块的空间情况并做更新,这种更新只修改表空间的额度情况,而不涉及到其他数据字典表,从而大大减少了数据字典表之间的竞争,提高了数据库性能。4)不产生回退信息因为本地管理表空间的空间管理除对表空间的额度情况做更新之外不修改其它任何数据字典表,因此不产生回退信息,从而大大提高了数据库的运行速度。5)不需合并相邻的剩余空间因为本地管理表空间的extents空间管理会自动跟踪相邻的剩余空间并由系统自动管理,因而不需要去合并相邻的剩余空间。同时,本地管理表空间的所有extents还可以具有相同的大小,从而也减少了空间碎片。6)减少了空间碎片7)对临时表空间提供了更好的管理表空间管理方式转换:字典管理表空间每当表或其他对象需要扩大的时候都检查其数据字典以确保有可用的空间分配给对象,然后给对象分配一个新区段并更新其可用空间信息。本地管理表空间保存数据文件本身的空间管理信息,而且表空间自动跟踪每个数据文件块的可用或已用状态。在事务比较多的数据库中显然字典管理每次插入数据时都会检查数据字典,这就使得数据库性能有所损耗。1)命令方式转移。首先你要新建一个oracle表空间,在oracle10g以后默认都是采用本地管理表空间的。对于表空间的转移使用命令:ALTERTABLEtempMOVETABLESPACEnew_temp;对于索引你需要重建:ALTERTABLEindexREBUILDTABLESPACEnew_index;显然上面的方法并不适用于对system表进行转换,因为你不能建立2个同名的system表。2)采用oracle提供的PL/SQL数据包中的DBMS_SPACE_ADMIN.在转换system表前,你必须把所有的其他表空间转换为本地管理。EXECUTEdbms_space_admin.tablespace_migrate_to_local(tablespace);——转行表空间然后同样的方法将system表空间也进行转换。EXECUTEdbms_space_admin.tablespace_migrate_to_local(system);使用这种方法很好,但是它建立的表空间没有automaticsegmentspacemanagerment选项,所有字典管理表空间都是用默认手动段空间管理,而且在转换为本地管理的表空间是不能进行修改。还有一个缺点,就是表空间如果存在空间碎片的话,此方法也不能解决碎片问题。管理表空间的几个基本准则1.使用多个表空间使用多个表空间是有好处的,从硬件上说:我们可以将不同应用的数据存放在不同的表空间内,并且放在不同的分区上,这样可以防止多个应用抢占磁盘的I/O资源,另外当磁盘有损坏时不会同时影响到多个应用。从数据库上说:使用多个表空间可以将不同的用户数据从数据字典中分离,以减少一个数据文件的数据字典对象和模式对象之间的竞争。同样的临时表空间也是需要创建多个,用来匹配表空间,保证在执行操作过程中,得到更优化的响应。2.指定表空间的存储参数这个主要是针对不同的特殊应用来做(比如只做查询的表空间),暂时没研究。一般的应用就让oracle自己管理吧。3.为表空间指定限额合理的限额对表空间的利用率是有很大帮助的,如果一个只会用到20M的空间,而你却给它分配几百M,是不是就成为一个很严重的资源浪费。另外要提的是当表空间不够用的时候,需要做的是增加表空间所在文件的数据文件的大小,或者新建几个比较大的数据文件,而不是创建很多个比较小的数据文件,这么做理由应该是很好理解的。值得注意的表空间存储参数:MINIMUM:CREATETABLESPACE的一个参数,它能影响表空间段的分配,换句话说是能影响到表空间中空闲空间碎片的一个参数,当为它指定大小后,它能确保所有空闲的或者已分配的盘区的大小一定是它的倍数,以K或者M计算,系统的默认值似乎是64K。ALTERTABLESPACE语句的限制:ALTERTABLESPACE语句可以用来修改一个表空间的存储参数,但是它不能用来修改INITIAL和MINEXTENTS,一个表空间的默认参数的新值只能影响到将来该表空间为段分配的盘区,而已有分配的还是照创建时的设定值。因此一旦设定了默认参数,最好不要随意修改。合并表空间中的空闲空间:先来看看空闲空间是如何存储的:一个表空间的空闲空间是一些相邻的空闲块构成的,这些空闲块的大小不用说当然是由MINIMUM设定的,当需要创建一个新的表空间存储段的时候,系统会在这些连续的空闲块中寻找大小大于新存储段大小的区间进行创建,而当一个表空间存储段被取消时它的空间将直接被标记成空闲块,这样就会造成表空间中,连续的空闲块大小越来越小,越来越不连续,那么在之后需要创建新的表空间段时,就无法保证新的表空间段的空间是连续的块,当然oracle会自动去做合并这个事,那我们可以通过管理来减轻系统的负担。手动合并空闲的空间:ALTERTABLESPACE...COALESCE这个语句用来合所有的空闲空间,起到的作用类似于WINDOWS的磁盘整理,对操作者的权限要求是有ALTERTABLESPACE权限(似乎是句废话,但是如果发现无法执行的时候,不妨GRANT...ALTERTABLESPACE),不过这条语句不能用来合并一个表空间中不同盘区的所有空闲空间,如果要做到所有盘区的空闲空间的整理,除非导出空间数据再重新创建表空间再导入数据,而且最好只有一个盘区。那么如何才能了解表空间中空闲空间的分布呢(就是如何监控空闲空间)?有几个视图帮我们记录了这些数据:DBA_FREE_SPACE、DBA_FREE_SPACE_COALESCE。我们要做的就是在上面做查询,得到某个表空间中空闲空间的分布:SELECTBLOCK_ID,BYTES,BLOCKS,FROMDBA_FREE_SPACEWHERETABLESPACE_NAME='**'ORDERBYBLOCK_ID;结果显而易见。另外表空间的管理还有设置表空间是否联机。表空间可以有两种状态:脱机和联机,什么意思?脱机就是证明这表空间虽然存在但是它不能被使用,联机则相反。修改语句就是:ALTERTABLESPACE……[ONLINE/OFFLINE]。使用只读表空间只读表空间:从字面意思理解就是一个只能执行查询等不影响表空间内存储的数据的事务的一个表空间。那现在来看看它的定义:只读表空间的主要目的是消除执行数据库大量的静态部分的备份和恢复的需要。因此只读表空间应该有如下特性:任何用户都不可以在表空间创建或修改数据没有回滚段可以随意拷贝,甚至刻录到光盘中那么如何使一个表空间变成只读状态呢?我们知道任何一个表空间在创建后默认都是可读写状态,我们就需要改变这种状态:ALTERTABLESPACE……READONLY;这条命令需要用户拥有ALTER/MANAGETABLE权限。要设定一个表空间成为只读表空间需要注意几点:表空间必须是联机的表空间没有包括任何的活动回滚段表空间不能是SYSTEM(正是因为SYSTEM总是有活动的回滚段)该表空间没有涉及的联机备份,因为在备份的最后会要求更新表空间中所有的头文件新特性:在使用ALTERTABLE……READONLY;之前不需要等待表空间完成所有的事务,系统会自动转入过渡的只读模式,该模式将阻止一切新的事务进行,但是允许现有事务进行提交和回滚。注意:过渡状态只在初始化参数COMPATIBLE(和数据库版本有关的参数)的值为8.1.0以上才会出现,如果是小于8.1.0的值,当READONLY语句会在有活动的事务的情况下失败。小窍门:在执行ALTERTABLE……READONLY;语句之前可以先对每个表先执行SELECT*FROM……之类的查询语句,这样可以保证在表空间的数据块可以在随后被最有效的访问,同时也清除了oracle需要检查最近修改块的事务状态的必要,因为最后执行的是查询事务。两个有用的视图:V$SESSION:我们可以通过利用它的SQL_TEXT字段来查询一个语句的事务的会话地址V$TRANSACTION:它记载着当前活动事务的启动SCN,我们可以根据通过上面那张视图查询到的事务会话地址来查询该事务的状态。延迟只读表空间的打开当一个非常大的数据库的实质性部分存储在位于低速访问设备(如光盘)的只读表空间中或分级存储时,要考虑将初始化参数READ_ONLY_OPEN_DELAYED设置为TRUE,这将加速某些操作,主要是打开数据库,其原因是在需要读取存储它的数据时,使只读表空间的数据文件只在第一次被访问。但是,这么做有缺点:表空间中只读文件不会被再访问到,除非是RECOVERTABLESPACE和ALTERTALESPACEOPENRESETLOGS因为它们忽视初始化参数可以继续访问只读文件。既然表空间可以改为只读状态,那么一定也有办法把只读状态的表空间转为可读写状态:ALTERTABLESPACE……READANDWRITE;需要的权限和改只读的一样,条件就是该只读表空间必须是联机的。取消表空间(删除表空间)如果不需要一个表空间及其内容,我们就需要在数据库中取消这个表空间,语句:D
本文标题:Oracle表空间管理逻辑
链接地址:https://www.777doc.com/doc-13081 .html