您的位置:首页 > 数据库 > Oracle

ORACLE数据存储空间的管理

2010-11-05 09:21 489 查看
Oracle的存储结构
在ORACLE数据库中对于数据存储的管理可以从两方面来论述。从逻辑上来说,ORACLE是将数据存储在表空间中的表里面,从物理上来说,ORACLE是将数据存储在磁盘的数据文件里。具体的结构如下图所示:

 

 

 

    一个ORACLE数据库可以包含多个TABLESAPCE;一个表空间物理上可以包含多个DATAFILE,逻辑上可以包括多个SEGMENT(TABLE、INDEX等);一个SEGMENT可以包含多个EXTENT并且可以跨数据文件存储数据;一个EXTENT包含多个DATA –BLOCK,其不可以跨数据文件存储;一个DATA-BLOCK包含多个OS-BLOCK。

TABLESPACE的管理
         TABLESPACE的管理可以分为两种管理方式:DATA-DICTIONARY MANAGEMENT和LOCAL MANAGEMENT。首先必须说明的是:对于在表空间上的说的管理方式是针对表空间里EXTENT的管理,即如何分配和回收EXTENT。在这两种管理方式中前者基本上已经被淘汰了,DATA-DICTIONARY MANAGEMENT 就是用两个数据字典(DEBIT、CREDIT)来管理哪些EXTENT已经被分配了哪些EXTENT还没有被分配,这种管理方式的缺点就是每分配和回收EXTENT时都需要去查询和更新这个两数据字典,这样就消耗了大量的系统资源,对PERFORMANCE上有很大的影响。对于LOCAL MANAGEMENT这种管理方式,ORACLE是在第一个数据文件的头部存储了一个BITMAP(010100111011001100010001110),当一个EXTENT被分配给了某个SEGMENT时只需要将1改为0即可,这对PERFORMANCE有很大的提高。具体的指令如下:

CTEATE TABLESPACE  tab_sapce  DATAFILE  ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ SIZE   100M  EXTENT MANAGEMENT  LOCAL  UNIFORM  SIZE 128k

这里需要指出的是对于LOCAL MANAGEMENT的管理方式还可指定分配的EXTENT为统一的大小(UNIFORM  SIZE 128k)。

         前面讲了TABLESPACE的管理方式,现在现在再讲一下TABLESPACE的空间扩展方法。这里有三种方法:

1.  向TABLESPACE中再添加一个DATAFILE

ALTER  TABLESATPCE  tab_sapce  ADD DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce01.dbf’ SIZE   100M

2.  重置一个DATAFILE的大小

ALTER   DATABASE  DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’   RESIZE  100M

3.  改变DATAFILE的增涨方式为 AUTOEXTEND ON NEXT….MAXSIZE….

ALTER   DATABASE  DATAFILE ‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’  AUTOEXTEND   ON  NEXT 10M  MAXSIZE  100M

顺便提出一下查询表空间、数据文件的几个常用数据字典和动态性能视图:

DBA_TABLESPACES,USER_TABLESPACES,DBA_DATA_FILE,DBA_FREE_SPACE,DBA_SEGMENTS

USER_SEGMENTS,V$TABLESPACE,V$DATAFILE,V$TMPFILE

SEGMENT的管理
一个SEGMENT包含多个EXTENT,一个EXTENT包含多个BLOCK。对于SEGMENT的管理则是指对SEGMJENT中BLOCK的管理,其分为:MANUAL MANAGEMENT和AUTOMATIC SEGENT-SPACE MANAGEMENT。对于BLOCK的管理有几个参数需要了解:

 

                PCTFREE:这个参数用于指定一个BLOCK中需要为以后BLOCK中数据的更改欲留的空间(百分比),即当BLOCK中的剩余空间小于等于这个值时这个BLOCK就不能再插入数据了,将被标记为不可用状态。

PCTUSED:当一个BLOCK中的空间因为数据的更新或插入而减小到这个值时这个BLOCK将会被标记为可用状态。

ININTRANS:初始并发事务处理数量

MAXTRANX:最大并发事务处理数量

         手动管理:在SEGMENT中指定一个或多个FREELIST用来管理SEGMENT中的BLOCK

         自动管理:在SEGMENT中指定几个连续的BLOCK

         所谓MANUAL  MANAGEMENT就是在SEGMENT中构建一个FREELIST用于管理BLOCK的分配,这种方式现在已基本不使用。

         对于AUTOMATIC SEGENT-SPACE MANAGEMENT方式就是在每个SEGMENT中取几个连续的BLOCK(BITMAP  BLOCKS简称DMBS)来存放一个BITMAP,用于管理BLOCK。

         具体指定管理方式的指令如下:

‘C:/oracle/product/10.1.0/oradata/orcl/datafile/tab_sapce.dbf’ SIZE   100M  EXTENT MANAGEMENT  LOCAL  UNIFORM  SIZE 128k SEGMENT SPACE MANAGEMENT AUTO

         注:这是在创建表空间进指定的,并不是在创建SEGMENT时指定的,我在初学这个时经常搞错。对于INITTRANS,MAXTRANS,PCRFREE,PCRUSED,FREELIST这些参数是在创建表的时候指定。

         在ORACLE中的BOLCK的大小有标准和非标准这分,对于标准的BLOCK一般有参数DB_BLOCK_SIZE决定,一般为8K,在系统中SYSTEM和TEMPORARY表空间只能使用标准的数据BLOCK。此外非标准的BLOCK又分为:2K,4K,16K,32K。一般由参数DB_Nk_CACHE_SIZE决定,在创建表空间时可以指定BLOCK的大小。

         这里还介绍两个常见的TERMINOLOGY

         BLOCK  MIGTATION:指的是当一个BLOCK的空间因为数据的更新的出现不够的情况时,ORACLE就会把这个数据迁移到另一个BLOCK并在该块留下一个指针指向那个    新的BLOCK。

         BLOCK  CHAINNING:指的是当一条数据因为过大使一个BLOCK无法全部装下时,ORACLE就是把这条数据分成几个PIECE存储到不同的数据BLOCK中并在各个块中留下相应的指针。

         以上这两种情况在数据的操作时都要一次操作几个BLOCK,所以对性能影响很大。

TABLE的管理
         TABLE的管理并没有多少值得说的,主要就是对表的存储结构的管理(对一些参数的设置),而对于其数据的完整性的管理这里不再阐述。ORACLE中对表的存储结构上主要涉及到以下几个参数:

INITTRANS,MAXTRANS,PCFFREE,PCTUSED,INITIAL,NEXT,PCTINCREASE,MINEXTENTS,MAXEXTENTS(这当中也有一些现在不使用了)

对于以上这些参数,在表一级设置会受到表空间一级的参数的影响。比如说在表空间一级设置了UNIFORM SIZE 128K(统一大小),当我们在表一级再设置INITIAL,NEXT,PCTINCREASE这几个参数就会失效。

         手动为表分配空间实现表跨数据文件

         ALTER  TABEL  table_name  ALLOCATE EXTENT  (SIZE 10M DATAFILE ‘***’);

         回收没有被使用的空间

         ALTER  TABLE  table_name  DEALLOCATE  UNUSED;

         更新表的STATISTICS

         EXEC  DBMS_STATS.GATHER_TABLE_STATS(‘username’,’tablename’)

         在表的管理中还涉及一些表名的更改,列名的更改等操作,这些这里都不再讲述。

INDEX的管理
         对于INDEX的管理,这里主要讲述一上对INDEX的监控管理即分析INDEX,监控INDEX的使用情况等。查询系统有那些INDE命令如下:

         SELECT * FROM DBA_OBJECTS/USER_OBJECTS

         首先是对INDEX的分析,在此主要是讲一下对INDEX的结构的分析(层级,节点数等)。命令语如下:

         ANALYZE  INDEX   index_name   VALIDATE        STRUCTURE

         DBMS_STATS.GATHER_INDEX_STATS(‘username’,’indexname’)

分析之后可以在V$INDEX_STATS中查询到分析的结果。

         其次是重构INDEX和溶合INDEX。在ORCLE的运行期间可能全对INDEX中的内容进行修改,当修改数据累积到一定的值时INDEX中就会出现大量的空间冗余(因为当我们删除索引值时,在INDEX中并没有真的删除相应的记录,只是将其标注为删除状态,如果这些记录以后不会被重用,这些空间将被浪费),因此重构或者溶合这些空间对提高INDEX的访问速度和系统的整体性能都有极大的帮助。具体命令如下:

         重构:ALTER  INDEX      indexname      REBUILD   TABLESPACE   tsname

注:在进行INDEX的重构时应该注意,因为对INDEX的重构时先复制一个一模一样的INDEX再将老的INDEX删掉,所以这里就要求要就足够的空间来容纳两个INDEX。另外,这种重构INDEX时会锁住INDEX对应的TABLE

在线重构:ALTER  INDEX      indexname      REBUILD   ONLINE

这种重构INDEX的方式也会锁住表,只是锁表的时间要短一些

溶合INDEX:ALTER        INDEX      indexname  COALESCE

所谓溶全INDEX就是将INDEX中一些相邻的小的的空间重新组织成一个大的空间(BLOCK)

         监控INDEXR的使用:这里我们可能监控一个INDEX在一定的时间内的使用情况

     ALTER       INDEX  indexname   MONITORING  USAGE

9e3d
     ALTER     INDEX  indexname   MONITORING  USAGE

监控后可以在v$object_usage中查看其使用情况

常用查询INDEX的数据字典:DBA_INDEXS        DBA_IND_COLUMNS

     另外,我们在创建INDEX也可以指定在创建表时可用的存储参数,手动分配空间实现跨数据文件和回收空间等。

UNDO的管理
UNDO TABLESPACE的管理也有两种管理方式:AUTOMATIC   UNDO       MANAGEMENT和MANUAL           UNDO          MANAGEMENT

         UNDO TABLESPACE 主要是用于TRANSACTION ROOLBACK、TRANSACTION RECOVERY、READ CONSISTENCY,当我对某条数据作了修改后,如果没有COMMIT,ORACLE会将修改这前的数据放到UNDO TABLESPACE中去,它是通过一种循环写的方式来管理其空间的,对于每条UNDO数据在UNDO TABLESAPCE中的存放时间可以通一个INIT PARAMETER来指定(UNDO_RETENTION),至于我们在读取数据时是如何读取一条记录它在UNOD TABLESPZCEJFD 里面对应的记录的,在ORACLE中有一个SCN(SYSTEM CHANGE NUMBER)来标识一个记录在修改前和修改后(NO COMMIT)的对应关系的

     在初始化参数中可以通过UNDO _MANAGEMENT和UNDO_TABLESPACE指定系统的UNDO管理方式和DEFAULT  UNDO  TABLESPACE

          待更新.......

     第一次写...多多指教...
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息