表空间的管理和创建

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qqww120102/article/details/77982570
一、表空间的管理方式
首先阐述一下,oracle通过表空间为数据库提供数据存储的使用空间。由于区段(extent)是oracle创建对象时的最小分配单位,所以表空间的管理实际上是针对区间的管理。
表空间的磁盘管理方式共分为两种。一种是数据字典管理方式(DMT),另一种是本地管理方式(LMT)。oracle 9i以后默认的管理方式是本地管理方式
管理方式 记录方式 优点 缺点
数据字典 1、将每一个数据字典管理的表空间的使用情况记录在system表空间的数据字典表中。需要使用两个字典来记录Extents的使用情况:SYS.FET$记录空闲的Extents,SYS.UET$记录使用的Extents。2、当为表空间分配和释放区段时,都要修改这两个字典。属于DML操作,存在竞争,每个动作都是一个事务,会产生UNDO记录。需要周期性进行合并操作。效率低下。 1、能通过调整数据字典内容调整区段的初始大小、最大区段数量等 使用数据字典管理存储空间的分配, 当表空间分配新的区, 或者回收已分配的区时, ORACLE会对数据字典对应的表进行查询、更新, 且使用单线程, 速度慢, 并且产生回退和重做信息。
本地管理 1、每个表空间的数据文件头部记录该表空间的空间分布、使用信息,典型的分布式管理。2、利用位图记录的管理方式,记录一个数据块或一组数据块的使用情况,表空间分配的最小单位为区段,一个区段包含一个或多个数据块。3、当表空间分配新的区段,或者回收已分配的区段时。oracle会对文件中的位图进行更新,不属于DML操作。不产生undo信息。4、并且可以自动跟踪连续表空间中的空闲块,不需要进行周期性合并操作,不会产生磁盘碎片。 1、提高存储管理的速度和并发性。2、不产生磁盘碎片。3、不产生递归管理。4、变更数据没有系统回滚。5、表空间区段的大小可以由oracle自动分配或者手动分配 本地管理的表空间创建后,不能随意变更默认的存储参数,如初始区段的大小、最大区段数等
相较于之前的数据字典管理方式,本地管理的优势明显大于劣势
二、表空间数据字典管理和本地管理之间的迁移
oracle 9i以后默认为本地管理方式,并且如果选择system表空间为数据字典管理情况下,才可以创建数据字典管理方式的表空间,并且可以进行两者之间的转换。
管理方式转换SQL语句
数据字典管理转换为本地管理
SQL> exec dbms_space_admin.Tablespace_Migrate_TO_Local('表空间名');
本地管理转换为数据字典管理
SQL> execdbms_space_admin.Tablespace_Migrate_FROM_Local('表空间名');
三、Oracle段空间的管理
oracle段管理方式共分为两种:手动管理和自动管理
手动段空间管理(Manual Segment Space Management)
手动设置FressLists(新的列表)、FreeList Groups(自由列表组)、PctUsed(数据块剩余百分比的阈值表)。Oracle使用自由列表(Free List)管理段中的块,自由列表列出允许进行插入操作的数据块。  
Oracle通过PCT_FREE(空余)和PCT_USED(已使用)两个参数来控制一个数据块是否允许插入数据。其它参数来控制如何分配、使用、重用段空间。 许多版本都支持MSSM
使用MSSM时, 这两个参数设置控制着块何时放入freelist中, 以及何时从freelist中取出。 如果使用默认值,PctFree为10, PctUsed为40, 那么在块到达90%之前(有10%以上的自由空间), 这个块会一直在freelist上。 一旦到达90%, 就会从freelist中取出, 而且直到块上的自由空间超过了块的60%, 才会重新回到freelist上, 在此之前, 这个块一直不在freelist上。
自动段空间管理(Automatic Segment Space Management)
只需要控制与空间使用相关的PctFree, 其它参数被忽略。 ASSM只有在9i版本后才被引入, 用于减少MSSM中的太多参数的管理。通过使用位图freelist取代传统单向的链接列表freelist,将freelist的管理自动化,并取消为独立的表格和索引指定PCTUSED、FREELISTS和FREELIST GROUPS存储参数的能力。它是一个二进制的数组,能够迅速有效地管理存储扩展和剩余区块(free block),因此能够改善分段存储本质,ASSM表空间上创建的段还有另外一个称呼叫Bitmap Managed Segments(BMB段)。
带有ASSM的本地管理tablespace会略掉任何为PCTUSED、NEXT和FREELISTS所指定的值。
当表或索引被分配到这个tablespace以后,用于独立对象的PCTUSED的值会被忽略,对于在LMT的tablespace内部创建的表和索引而言,由本地管理的tablespace会管理它们。但是,INITIAL_EXTENT(最初区段的大小)参数仍然是需要的,因为Oracle不可能提前知道初始表加载的大小。对于ASSM而言,INITIAL_EXTENT最小的值是三个块。
但是它不会控制一个块是否在freelist上, 因为ASSM根本不使用freelist。在ASSM中, PCTUSED参数将被忽略。
ASSM管理方式为每个段的前两个数据块用来管理freeblock(空闲块)其中第一个数据块记录first level bit map block(第一级位图块),第二个数据块记录second level bit map block(第二级位图块),第三块开始才是段的第一个可用数据块。 ASSM管理机制是用位图来跟踪或管理每个分配到对象的块,每个块有多少剩余空间根据位图的状态来确定,如>75%,50%-75%,25%-50%和<25%,也就是说位图其实采用了四个状态位来代替以前的pctused。一张表在进行inset、update的时候数据插入到哪个数据块中PctFree会限制,什么时候利用该数据块则由设定的pctfree来确定。同时也带来一个问题,该条数据的插入、变更是否会产生行迁移,也同样由oracle自己判断。如果发生行迁移,可以通过重建该数据块解决。
同样使用ASSM的一个巨大优势是,用位图来管理能够减轻缓冲区忙等待(buffer busy wait)的负担,这个问题在Oracle9i以前的版本里曾是一个严重的问题。
有了ASSM之后,Oracle宣称显著地提高了DML并发操作的性能,因为(同一个)位图的不同部分可以被同时使用,这样就消除了寻找剩余空间的串行化。根据Oracle的测试结果,使用位图freelist会消除所有分段头部(对资源)的争夺,还能获得超快的并发插入操作
尽管ASSM能够简化Oracle DBA的工作,但是位图分段管理还是有一些局限性的: 
1、一旦DBA被分配之后,它就无法控制tablespace内部的独立表和索引的存储行为。 
2、大型对象不能够使用ASSM,而且必须为包含有LOB(增长)数据类型的表格创建分离的tablespace。 
3、你不能够使用ASSM创建临时的tablespace。这是由排序时临时分段的短暂特性所决定的。
4.只有本地管理的tablespace才能够使用位图分段管理。
5.使用超高容量的DML(例如INSERT、UPDATE和DELETE等)的时候可能会出现性能上的问题。
什么是缓冲区忙等待?
在oracle 9i以前,在没有多个freelist(自由列表)的时候,每个区段的第一个数据块,用来管理对象所使用的剩余数据块,为insert、update数据行提供数据块。当数据缓冲内的数据块由于被另一个DML事务处理锁定而无法使用的时候,缓冲区忙等待就会发生。当你需要将多个行插入到同一个表里的时候,这些任务就被强制等待,而同时Oracle会在同时分派剩余的区块,一次一个。
四、创建表空间语法参数解释
CREATE [UNDO]  TABLESPACE tablespace_name          
[DATAFILE datefile_spec1 [,datefile_spec2] ......   
[{MININUM EXTENT integer [k|m]   
|BLOCKSIZE integer [k]   
|logging clause | FORCE LOGGING   
|DEFAULT {data_segment_compression} storage_clause   
|[online|offline]   
|[PERMANENT|TEMPORARY]   
|extent_manager_clause   
|segment_manager_clause}]
 1、undo   
说明将创建一个undo表空间。数据库管理员可以不必管理回滚段,只要建立了undo表空间,系统就会自动管理回滚段的分配,回收的工作。   
当然,也可以创建一般的表空间,在上面创建回滚段.不过对于用户来说,系统管理比自己管理要好很多.   
如果需要自己管理,请参见回滚段管理的命令详解.   
当没有为系统指定回滚表空间时,系统将使用system系统回滚段来进行事务管理。     
2、tablespace_name  
指出表空间的名称。    
3、datafile  datefile_spec1
datefile_spec是指创建表空间的参数:[ 'filename' ] 、[SIZE integer [ K | M ]]、 [REUSE] 、[autoextend_clause]  
[autoextend_clause]是指表空间的拓展方式:AUTOEXTEND { OFF | ON [ NEXT integer [ K | M ] ] [maxsize_clause] }  
filename:数据文件的路径名,可以是相对路径,也可以是绝对路径。   
size:文件的大小 
REUSE:表示文件是否被重用.   
AUTOEXTEND:表明是否自动扩展.   
OFF | ON  :表示自动扩展是否被关闭.   
NEXT :表示数据文件满了以后,扩展的大小.   
maxsize_clause:表示数据文件的最大大小,MAXSIZE { UNLIMITED | integer [ K | M ] }.   
UNLIMITED :表示无限的表空间.,直至表空间所在的磁盘全部占用   
integer:表示设定该数据文件的最大大小.     
4、MININUM EXTENT integer [k|m]   
指出在表空间中区段的最小值。这个参数可以减小空间碎片,保证在表空间的范围是这个数值的整数倍。
5、BLOCKSIZE integer [k]   
这个参数可以设定一个不标准的块的大小。如果要设置这个参数,必须设置db_block_size,db_nk_block_size这两个参数,并且这两个参数的值必须与blocksize的值相同。但是使用默认标准块时,参数db_nk_cache_size的值为0。
注意:在临时表空间不能设置这个参数。    
6、logging clause   
表空间中包括表,索引,分区,物化视图,物化视图上的索引,分区。是否需要日志保护 [ logging | nologging ](默认是logging)临时表空间为nologging,   
7、FORCE LOGGING   
使用这个子句指出表空间进入强制日志模式。此时,系统将记录表空间上对象的所有改变,除了临时段的改变。
这个参数高于对象的nologging选项。   
注意:设置这个参数数据库不能open并且处于读写模式。而且,在临时表空间和回滚表空间中不能使用这个选项。   
8、DEFAULT storage_clause   
该语句定义表空间的一些参数,如初始段的尺寸、最小区段尺寸,最大区段数量等。
9、online|offline   
改变表空间的状态。online使表空间创建后立即有效.这是缺省值.   
offline使表空间创建后无效。这个值,可以从dba_tablespace中得到。   
10、PERMANENT|TEMPORARY   
指出表空间的属性,是永久表空间还是临时表空间。   
永久表空间存放的是永久对象,临时表空间存放的是session生命期中存在的临时对象。   
这个参数生成的临时表空间创建后一直都是字典管理,不能使用extent management local选项。   
如果要创建本地管理表空间,必须使用create temporary tablespace   
注意,声明了这个参数后,不能声明block size   
11、extent_management_clause   
这是最重要的子句,说明了表空间如何管理范围。一旦你声明了这个子句,只能通过移植的方式改变这些参数。
如果希望表空间本地管理的话,声明local选项。本地管理表空间是通过位图管理的。   
autoallocate说明表空间自动分配范围,用户不能指定范围的大小。只有9i以上的版本具有这个功能。   
uniform说明表空间的区段的固定大小,缺省是1m。   
不能将本地管理的数据库的system表空间设置成字典管理。   
oracle公司推荐使用本地管理表空间。   
如果没有设置extent_management_clause,oracle会给他设置一个默认值。   
如果初始化参数compatible小于9.0.0,那么系统创建字典管理表空间。   
如果大于9.0.0,那么按照如下设置:   
如果没有指定 default  storage_clause,oracle创建一个自动分配的本地管理表空间。   
否则,   
如果指定了mininum extent,那么oracle判断mininum extent 、initial、next是否相等,以及pctincrease是否=0.   
如果满足以上的条件,oracle创建一个本地管理表空间,extent size是initial.   
如果不满足以上条件,那么oracle将创建一个自动分配的本地管理表空间。   
如果没有指定mininum extent。initial、那么oracle判断next是否相等,以及pctincrease是否=0。   
如果满足oracle创建一个本地管理表空间并指定uniform。否则oracle将创建一个自动分配的本地管理表空间。   
注意:本地管理表空间只能存储永久对象。   
如果你声明了local,将不能声明 default  storage_clause,mininum extent、temporary.   
EXTENT MANAGEMENT LOCAL   
12、segment_management_clause   
段空间管理的方式,自动或者手动:   
SEGMENT SPACE MANAGEMENT {AUTO|MANUAL}
13、retention guarantee
undo表空间参数,指定commit之后未达到undo_retention参数保留时间的数据块绝对不能被覆盖
五、创建表空间测试
1、创建数据字典管理方式表空间(表空间包含三个数据文件个100M,初始区段200K,每次区段增长200K,最大区段数500)
SQL> create tablespace yunnan_data
2 datafile '/u01/app/oracle/oradata/dg1/yunnan01.dbf' size 100m,
3 '/u01/app/oracle/oradata/dg1/yunnan02.dbf' size 100m,
4 '/u01/app/oracle/oradata/dg1/yunnan03.dbf' size 100m
5 minimum extent 200k
6 extent management dictionary
7 default storage(initial 200k next 200k maxextents 500 pctincrease 0);
ERROR at line 1:
ORA-12913: Cannot create dictionary managed tablespace(由于测试主机system为LOCAL本地管理方式,所以报错不允许创建字典管理表空间)
2、创建本地管理表空间(包含一个数据文件,大小固定为100M,区段管理方式为本地管理,区段大小统一为1M,默认生成logging)
SQL> create tablespace beijing_data
2 datafile '/u01/app/oracle/oradata/dg1/beijing01.dbf' size 100m
3 extent management local
4 uniform size 1m;
3、创建本地管理表空间(包含一个数据文件,大小为100m,自动拓展模式,空间不足时每次拓展10M,最大1024M,区段管理为本地管理)
SQL> create tablespace sichuan logging
2 datafile'/u01/app/oracle/oradata/dg1/sichuan01.dbf'
3 size 100m
4 autoextend on
5 next 10m maxsize 1024m
6 extent management local;
4、创建undo表空间,undo表空间创建时,只能使用datafile和extent management子句
SQL> create undo tablespace test_undo
2 datafile '/u01/app/oracle/oradata/dg1/test_undo.dbf'
3 size 100m;
查询创建情况
SQL> select tablespace_name,status,contents,extent_management
2 from dba_tablespaces;
SQL> select file_name,file_id,tablespace_name,status
2 from dba_data_files
3 where tablespace_name='TEST_UNDO';
5、创建临时表空间(本地管理,区段统一尺寸1M)
SQL> create temporary tablespace test_temp
2 tempfile '/u01/app/oracle/oradata/dg1/test_temp.dbf' size 50m
3 extent management local
4 uniform size 1m;
查询表空间状态
SQL> select tablespace_name,status,contents,logging
2 from dba_tablespaces;
SQL> select file#,status,enabled,bytes,block_size,name
2 from v$tempfile;
临时表空间存储 临时数据文件的特点
1、永远处于NOLOGGING状态,因为临时数据不需要日志保护
2、不能设置为只读模式(read_only)
3、不能重命名
4、不能通过alter database 创建
5、临时文件用于只读数据库
6、介质恢复时不恢复临时文件
7、使用backup controlfile(备份控制文件) 不产生任何临时文件信息
8、使用create controlfile(创建控制文件)不能设置任何与临时文件有关的信息
9、不能把 使用中的默认 临时表空间删除、脱机,修改为PERMANENT(永久)表空间
初始化参数文件时,为了优化排序区。最好将uniform size参数设置为 sort_area_size(排序区大小)的整倍数
6、创建大文件表空间
一、原理概述: oracle由10g开始提供大文件表空间的功能, 大文件表空间是由一个大文件组成 ,不是传统有多个小文件组成。由于大文件表空间与大文件一 一对应,才使得oracle有能力去管理大文件,表空间成为磁盘空间管理、备份、恢复的操作对象。
使用限制: 11g中只有 本地管理且段空间为自动管理的表空间 才可以使用大文件表空间(big file tablespace),简称BFT ,对于本地管理的undo表空间和临时表空间,不要求段空间管理类型,可以使用BFT。oracle 11g concept 文档建议,大文件表空间与自动存储管理和逻辑卷管理工具结合使用,这些工具能够支持动态扩展逻辑卷,也支持条带化或支持RIAD。
使用大文件表空间在数据库开启时对于DBWR进程的性能有显著提高,但该表空间的大文件会增加该表空间和整个数据库的备份、恢复时间。
二、大文件表空间的优势: 只需要创建一个数据文件,大大减少了数据文件的数量,简化了数据文件的管理难度。数据文件的减少相应控制文件不需要记录大量数据文件的位置信息,控制文件的容量相应减少。
大文件表空间的容量比普通表空间大得多,所以存储能力也有显著提高。 一个普通表空间最多可以管理1024个数据文件,而一个大文件表空间包含一个数据文件,但该文件的容量上限是普通数据文件的1024倍,所以大文件表空间和普通表空间的容量是一样的。 但由于每个数据库最多可以使用64K个表空间,所以使用大文件表空间的数据库总容量比使用普通表空间的数据库要大得多。根据块的大小,大文件表空间的容量可以为138,如果使用最大数据块 32K块,数据库最大容量为8EB。
三、大文件创建测试: 创建大文件表空间有3种方法,依次测试
1、:创建数据库时,定义大文件表空间为默认创建表空间类型。 一旦定义,以后创建表空间默认为大文件表空间,需要创建普通表空间需要手动修改。
以下语句为创建数据库时创建名为test_big大文件表空间的语句,以后大文件表空间会作为默认创建类型
SQL> create database
2 set default bigfile tablespace test_big
3 datafile '/u01/app/oracle/oradata/dg1/test_big.dbf' size 1G;
2、数据库创建后,使用 create bigfile tablespace创建大文件表空间
SQL> create bigfile tablespace test_big
2 datafile '/u01/app/oracle/oradata/dg1/test_big.dbf' size 1G;
验证创建是否成功
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G
2 from dba_data_files;
查询段空间的管理方式和区段的管理方式
SQL> select tablespace_name,initial_extent,contents,extent_management,segment_space_management
2 from dba_tablespaces
3 where tablespace_name like 'TEST_BIG';
TABLESPACE_NAME INITIAL_EXTENT CONTENTS EXTENT_MAN SEGMEN
---------------------------- ------------------- ----------------- ------------------ -----------
TEST_BIG 65536 PERMANENT LOCAL AUTO
(INITIAL_EXTENT)初始段大小 64K
(CONTENTS)表空间类型 永久表空间(PERMANENT)
(EXTENT_MAN)区段管理方式 本地管理(LOCAL)
(SEGMENT_SPACE_MANAGEMENT)段空间管理方式 自动(AUTO)
3、通过改变默认表空间类型为大文件表空间类型 ,使得之后创建的表空间都为大文件表空间类型
alter tablespace set default bigfile tablespace
四、参数修改
一、修改已经创建的大文件表空间容量的大小,有两种方法可以修改。
第一种、在alter tablespace 指令中使用resize(重建)子句
alter tablespace test_big resize 2G;
查询修改情况
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G,autoextensible
2 from dba_data_files
3 where tablespace_name like 'TEST_BIG';
TABLESPACE_NAME FILE_NAME G AUTOEXTENSIBLE
-------------------------------------- ---------------------------------------------- ---------- -------------------------------------
TEST_BIG /u01/app/oracle/oradata/dg1/test_big.dbf 2 NO
此种修改方式,发现AUTOEXTENSIBLE(自动拓展)为NO,证明该表空间不能自动拓展
第二种、在alter tablespace 指令中使用AUTOEXTEND ON子句,将表空间修改为自动拓展
SQL> alter tablespace test_big autoextend on next 1G;
修改结果为空间不足时自动拓展1G,直至整个磁盘空间被占满。
查询修改情况
SQL> select tablespace_name,file_name,bytes/(1024*1024*1024) G,autoextensible
2 from dba_data_files
3 where tablespace_name like 'TEST_BIG';

TABLESPACE_NAME FILE_NAME G AUTOEXTENSIBLE
-------------------------------------- ---------------------------------------------- ---------- -------------------------------------
TEST_BIG /u01/app/oracle/oradata/dg1/test_big.dbf 4 YES
此时自动拓展已修改为自动模式
六、表空间的管理
表空间的管理分为联机管理、脱机管理和只读管理。表空间处于脱机状态时,用户或应用程序无法访问表空间,此时可以完成如脱机备份等工作。处于只读状态时,用户或应用程序可以访问该表空间,但不能更改表空间中的数据,使该表空间中的数据处于静止状态。
一、数据文件、表空间脱机状态管理
数据文件脱机的目的:正常情况数据文件都是在联机状态下,当需要对数据文件冷备份、恢复、空间迁移或出现数据文件所在磁盘损坏等情况时需要将数据文件进行脱机。
1、数据文件OFFLINE
数据文件添加到表空间之后不能够被删除的,没有语法支持这么做,如果想不使用该数据文件,唯一办法是将数据文件设置为OFFLINE状态。
数据文件脱机后,数据文件相关的数据字典信息、原数据信息都依然存在,当表空间被删除后,相关数据文件的信息才会被清除。DROP TABLESPACE只是清空Oracle数据字典信息,即使数据文件不存在都可以正常的DROP表空间。对于数据文件的脱机,在设置该数据文件ONLINE的时候都对该数据文件执行介质恢复。
执行以下步骤将数据文件设置为OFFLINE状态:
1)           如果是归档模式可以执行如下 SQL 设置数据文件的状态为 OFFLINE
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE;
2)           如果是非归档模式执行以下 SQL 将数据文件状态设置为 OFFLINE
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE DROP;
1、归档模式下,脱机的数据文件内数据的变更可以通过LGWR进程记录在log file日志文件中,再次联机后通过日志记录内容进行数据变更的更新。
2、如果在非归档模式下使用OFFLINE DROP使数据文件脱机,这就意味着该数据文件可能无法再恢复到ONLINE状态,原因就在于在非归档模式可能没有足够的日志执行ONLINE的介质恢复。如果日志未发生切换,还依然存在的话,依然可以执行介质恢复后使数据文件ONLINE,但如果执行alter system switch logfile强制切换日志文件组或日志文件组正常切换覆盖那么此时由于没有日志文件记录数据文件信息该数据文件将永远处于recover状态,永远不能再次联机。
执行以下步骤将数据文件设置为ONLINE状态:
1)           如果是归档模式可以执行如下 SQL 设置数据文件的状态为 ONLINE

ALTER DATABASE DATAFILE 'datafile_name' ONLINE;
2)           如果是非归档模式执行以下 SQL 将数据文件状态设置为 ONLINE
RECOVER DATAFILE 'datafile_name' ;
ALTER DATABASE DATAFILE 'datafile_name' OFFLINE;
在实际的生产环境中,防止数据的丢失。尽量在归档模式下做脱机数据文件操作


2、表空间OFFLINE
表空间脱机的目的: 表空间通常处于联机状态,以便数据库用户访问其中的数据。但是DBA需要对表空间进行维护, 备份 或恢复操作时,则需要将表空间脱机。
对数据库的脱机包括数据文件的脱机和对表空间的脱机,表空间脱机实际就是表空间对应的所有数据文件脱机。
表空间脱机的限制: 数据库open状态下,不是所有表空间都可以变更状态为脱机状态,不能变更为脱机状态的表空间包括system表空间(需要使用其中的数据字典)、有活跃undo段的UNDO表空间和当前数据库默认的临时表空间。需要将这几种表空间进行脱机时,需要将数据库置于NOMOUNT状态
Oracle表空间脱机应对机制
当一个表空间脱机后,Oracle不允许任何 SQL 语句继续引用此表空间内的对象(schema object)。如果一个活动事务(active transaction)中的 SQL 语句正好在使用被置为脱机状态的表空间内的对象,其事务性也不会被破坏。Oracle使用 SYSTEM 表空间内的延迟回滚段(deferred rollback segment)为此事务中已完成的 SQL 语句保存回滚信息(rollback data)。当脱机表空间被重新置位联机(online)状态后,Oracle会在需要时应用这些回滚信息。
表空间联机或脱机时,SYSTEM 表空间内的数据字典(data dictionary)会进行记录。如果用户关闭一个数据库时某个表空间处于脱机状态,那么这个表空间在数据库下次被装载、打开后依旧保持脱机状态。
用户只能将一个表空间联机到创建她的数据库中,因为只有这个数据库的 SYSTEM 表空间中才保存着与此表空间相关的必要的数据字典(data dictionary)信息。一个脱机的表空间不能被Oracle之外的工具打开或编辑。因此脱机表空间不能被移动到其他数据库中。
当某些错误发生时,Oracle会自动地将相关的联机表空间切换到脱机状态。例如,当数据库写入进程(database writerprocess,DBWn)多次尝试向表空间的数据文件(datafile)写入失败后,Oracle就会将此表空间切换到脱机状态。此时尝试访问脱机表空间内数据表的用户将会得到错误信息。如果是介质故障(media failure)导致此次磁盘 I/O 失败,用户必须在处理故障后恢复(recover)受影响的表空间。
脱机表空间对数据库的影响
用户可以将不同类型的数据分开存储在不同的表空间中。当用户因为某些任务而令某个表空间脱机后,其余表空间仍保持联机状态,其中的数据对用户依然可用。但是表空间脱机后也会导致特殊情况发生。例如,有两个表空间分别用于存储表及此表对应的索引,脱机后将出现以下问题:
1、如果包含索引的表空间脱机,那么查询依旧可以访问表数据,因为对表数据的访问并不一定需要索引数据。
2、如果包含表的表空间脱机,那么查询将无法访问表数据,因为脱机表空间内的对象无法被引用。
Oracle对于表空间中数据获取的方法
如果Oracle能够从联机表空间中获得执行一个SQL语句完整的信息,那么语句就将被执行。如果相关信息必须从脱机的表空间中获得,那么语句将失败。

以下几种情况需要手动或自动将联机状态的表空间变更为脱机状态。
1、允许用户访问数据库的一部分数据,某些表空间不予许用户访问
2、执行脱机的表空间备份
3、在数据库open状态下,恢复表空间或表空间中的数据文件
4、在数据库open状态下,移动表空间中的数据文件
5、在下面这种情况oracle实例会自动将表空间变更为脱机状态,当DBWR写进程尝试向一个表空间中的数据文件进行写入操作,但该表空间中的数据文件由于移动、丢失、磁盘故障等情况无法完成写入操作,则实例会自动将该表空间进行脱机状态操作。
当表空间处于脱机状态时,不予许执行任何SQL语句,用户访问该表空间中的对象会报错。表空间的脱机状态会记录在数据字典和控制文件中。在数据库关闭时,如该表空间处于脱机状态,再次打开数据库该表空间依然会处于脱机状态。

表空间脱机的方法
分为正常脱机、临时脱机和立即脱机共三种方法
1)         OFFLINE NORMAL
这是默认的选项,正常情况表空间的脱机,当重新执行ONLINE时,Oracle会用相应的SCN来更新表空间数据文件头SCN即可正常的ONLINE表空间,不需要执行介质恢复。
ALTER TABLESPACE tablespace_name OFFLINE | NORMAL |;
2)         OFFLINE TEMPORARY
如果指定TEMPORARY,Oracle数据库为表空间中所有在线数据文件执行一个检查点,但是不能确保所有文件能被同步。当执行这个语句数据文件已经脱机,那么在使表空间重新ONLINE之前需要执行介质恢复。
ALTER TABLESPACE tablespace_name OFFLINE TEMPORARY;
3)         OFFLINE IMMEDIATE
执行这个操作表示立即使表空间脱机,在下次使表空间ONLINE的时候必须执行介质恢复,介质恢复成功才能使表空间ONLINE:
ALTER TABLESPACE tablespace_name OFFLINE IMMEDIATE;
对于数据文件的脱机来说,在下次ONLINE的时候一定要执行介质恢复过程,如果介质恢复成功,那么就可以成功ONLINE。对于正常的表空间脱机,下次使表空间ONLINE的时候不需要执行介质恢复。对于OFFLINE TEMPORARY的表空间,如果脱机前已经有数据文件是脱机的,那么在表空间上线前也需要执行部分数据文件的介质恢复。对于IMMEDIATE OFFLINE的表空间,在表空间上线前需要对表空间的所有数据文件执行介质恢复。脱机后的数据文件和表空间,在实例重启的时候都不会对数据文件的SCN号进行验证。

对于表空间脱机的不同需求
NORMAL
如果表空间所有数据文件都没有错误,表空间可以正常脱机。写入错误导致表空间所有数据文件都不能脱机。当指定OFFLINE NORMAL时,Oracle对所有数据文件一边进行检查一边将他们脱机。
TEMPORARY
表空间能临时脱机,即使表空间的一个或多个数据文件有错误。当指定OFFLINE TEMPORARY选项时,Oracle将还没脱机的数据文件脱机,同时对他们进行检查。如果没有数据文件脱机,然后用临时选项脱机,当联机表空间时不需要介质恢复。但是,如果有表空间的文件因写入错误脱机,然后将表空间临时脱机,在将表空间联机之前需要介质恢复。
IMMEDIATE
表空间能立即脱机,不等Oracle对任何数据文件做检查。在指定OFFLINE IMMEDIATE的情况下,当联机表空间时需要介质恢复。如果数据库运行在NOARCHIVELOG模式下,表空间不能立即脱机。
FOR RECOVER(前三种的附加参数)
将在恢复集中的数据库表空间脱机,以便进行时间点恢复。
Oracle的建议
如果必须脱机表空间,尽量用NORMAL选项(默认)。这将保证表空间联机时不需要恢复。尽管部分恢复后用ALTER DATABASE OPEN RESETLOGS语句重置了重做日志序列,依然不需要恢复。只有当不能正常脱机表空间的时候才指定TEMPORARY选项。这种情况下,只有因错误被脱机的文件在表空间联机时才需要恢复。只有当指定NORMAL和TEMPORARY都不行的情况下才用IMMEDIATE选项。
脱机表空间前需要的考虑:
  • 验证表空间不含有活动的回滚段,存在活动回滚段的表空间不能脱机。
  • 脱机永久、临时表空间前,需要用户将等待脱机的表空间设置为不是默认的表空间,因为当脱机时,他们即不能访问该表空间(永久)中的任何对象,也不能使用该表空间(临时)进行排序。
脱机后联机表空间
只要数据库打开,Oracle数据库的表空间都能恢复联机。如果要联机的表空间不是“干净”脱机(即用NORMAL选项的ALTER TABLESPACE OFFLINE语句),在联机之前必须先对表空间进行介质恢复。否则,Oracle返回错误并保持表空间脱机。

二、只读状态的管理

只读表空间 
使用只读表空间(read-only tablespace)的主要目的是为了避免对静态、且容量大的数据库内容进行备份和恢复操作。Oracle不会更新只读表空间内的数据,因此这类表空间的数据文件(datafile)可以放置在 CD-ROM 或 WORM之类的只读介质(read-only media)上。
因为Oracle只能将一个表空间联机到创建它的数据库,只读状态的表空间,不能进行insert、update和使用delete、truncate删除表空间内的数据,数据处于相对静止状态。不被redo日志保护,减少日志的大小。
如果想更新一个只读表空间,首先要使表空间可读写。在更新后,还可以将表空间恢复到只读状态。
因为只读表空间不能被修改,只要没有将只读表空间置于可读写状态,就无需对其进行重复的备份操作。当用户需要恢复数据库时,也没必要恢复只读表空间,原因同前所述。

进行此操作必须具有ALTER TABLESPACE 或 MANAGE TABLESPACE 系统权限或具有系统权限的角色。
GRANT ALTER TABLESPACE TO user_name
GRANT MANAGE TABLESPACE TO user_name
变更表空间为只读状态
SQL> alter tablespace tablespace_name read only;
变更表空间为读写状态
SQL> alter tablespace tablespace_name read write;

只读表(Oracle 11g新特性)
Oracle更细粒度的改变
变更表为只读状态
SQL> alter tablespace table_name read only;
变更表为读写状态
SQL> alter tablespace table_name read write;

七、表空间和数据文件的管理
表空间的管理涉及修改表空间的大小、删除表空间以及修改表空间的存储参数。数据文件逻辑存放在表空间中,管理数据文件涉及修改数据文件大小、删除表空间中的数据文件、迁移数据文件以及改变表空间的存储路径。
一、表空间的管理
1、修改表空间大小
修改表空间大小有四种方法:
第一种、创建表空间时,使用AUTOEXTEND ON子句,使表空间空间不足时自动按设定条件增长
第二种、在创建表空间后,使用ALTER DATABASE DATAFILE 数据文件名 AUTOEXTEND ON修改不能自动扩展的数据文件为自动扩展
第三种、在已经创建的表空间中,添加数据文件
第四种、修改表空间内数据文件大小、通过resize重建某个数据文件的大小
下面分别测试
第一种:创建一个表空间,其中包含一个支持自动拓展空间的数据文件
SQL> create tablespace test_2017_9_6
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf'
3 size 100m
4 autoextend on;

Tablespace created.
查看该表空间内的数据文件是否可用和是否支持自动拓展

SQL> select file_name,tablespace_name,blocks,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME BLOCKS STATUS AUTOEXTENSIBLE
----------------------------------------------------------------------- ---------------------------- ------------- ------------- ---------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 12800 AVAILABLE YES

AVAILABLE 表示该数据文件可用
AUTOEXTENSIBLE 表示是否支持自动拓展
第二种:修改一个不能自动拓展的数据文件
首先将TEST_2017_9_6表空间变更为不自动拓展模式
SQL> alter database datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf' autoextend off;
或者重新创建一个不自动拓展的表空间
SQL> create tablespace test_2017_9_6_1
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906_1.dbf'
3 size 50m
4 uniform size 1m;

Tablespace created.
查询是否支持自动拓展
SQL> select tablespace_name,file_name,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6_1';

TABLESPACE_NAME FILE_NAME AUTOEXTENSIBLE
------------------------------ ----------------------------------------------------------------- ----------------------------------
TEST_2017_9_6_1 /u01/app/oracle/oradata/dg1/test_20170906_1.dbf NO
修改表空间为自动拓展模式(每次拓展10M)
SQL> alter database datafile
2 '/u01/app/oracle/oradata/dg1/test_20170906_1.dbf' autoextend on
3 next 10M;

Database altered.
第三种:向TEST_2017_9_6表空间中添加一个数据文件,使空间的容量得到增加
首先查询该表空间拓展状态和包含的数据文件数量、大小
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
可以看出共包含1个100MB的数据文件,并且不支持拓展

现在添加一个50MB的不可拓展数据文件
SQL> alter tablespace test_2017_9_6
2 add datafile '/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf'
3 size 50M;

再次查询可以看出包含两个数据文件分别为100MB和50MB
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 50 AVAILABLE NO

第四种:通过重建TEST_2017_9_6表空间中数据文件来增加表空间的容量
将test_20170906_add01.dbf数据文件重建为100MB
SQL> alter database
2 datafile '/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf' resize 100M;

Database altered.
查询该表空间中test_20170906_add01.dbf 数据文件已经重建为100MB,该表空间容量也提高到200MB
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
-------------------------------------------------------- ---------------------------------- ---------- -------------- -----------------------------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO

2、修改表空间存储参数(只针对数据字典管理模式)
修改表空间的存储参数只针对数据字典管理的表空间,在11g中默认创建的表空间为本地管理,所以只进行命令演示。
修改表空间tianjin的存储参数MINMUM EXTENT(最小区段),将EXTENT的尺寸由1MB修改为2MB,通过修改这一参数将表空间的整体容量提升一倍。
SQL> alter tablespace tianjin
2 minimum extent 2M;
修改表空间的默认存储语句
SQL> alter tablespace tianjin default storage (initial 2M next 2M maxextents 50);
修改结果为,初始段为2M,每次增长2M,最多包含有50个区段(即100MB)
在dba_tablespaces字典表内可以查询修改结果
3、删除表空间
当不需要一个表空间时,可以删除该表空间释放磁盘空间。
删除语法
DROP TABLTSPACE tablespace_name [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
参数含义
tablespace_name 表空间名
INCLUDING CONTENTS 删除表空间内的所有EXTENT(区段)
AND DATAFILES 删除表空间同时删除数据文件
CASCADE CONSTRAINTS 删除与该表空间关联的完整性约束(如主外键约束),如外部表会引用该表空间中表的唯一键等作为外部表的引用。

测试删除名为test_2017_9_6_1的表空间,并且删除所有extent,以及包括数据文件和与之关联的约束一并删除
SQL> drop tablespace test_2017_9_6_1 including contents and datafiles cascade constraints;

Tablespace dropped.

4、迁移数据文件
迁移数据文件是指把当前表空间内的数据文件迁移到其他磁盘空间。在生产环境中,当一个表空间所在的磁盘空间容量达到上限无法再继续拓展数据文件时,为了使数据库系统正常运行,就需要将其中的数据文件迁移到其他空闲磁盘空间中。
迁移主要分为两种,迁移系统表空间中的数据文件和迁移非系统表空间中的数据文件,下面分别测试
1、迁移系统表空间中的数据文件
首先查看系统表空间中数据文件信息
SQL> select tablespace_name,file_name,bytes/(1024*1024) M,status
2 from dba_data_files
3 where tablespace_name='SYSTEM';

TABLESPACE_NAME FILE_NAME M STATUS
--------------------------- -------------------------------------------------- ---------- -----------
SYSTEM /u01/app/oracle/oradata/dg1/system01.dbf 325 AVAILABLE
记录数据文件位置,关闭数据库。将数据文件复制到新的路径
SQL> shutdown immediate;
cp /u01/app/oracle/oradata/dg1/system01.dbf /u01/app/oracle/oradata/system01.dbf
将数据库启动至mount状态,此时只由参数文件将instance启动
startup mount;
通过ALTER DATABASE告诉数据库system表空间的数据文件位置已经变更(前面为原路径,to后面为新路径)
SQL> alter database
2 rename file '/u01/app/oracle/oradata/dg1/system01.dbf'
3 to '/u01/app/oracle/oradata/system01.dbf';

Database altered.
将数据库启动至open状态
SQL> alter database open;

Database altered.

此时再次查看系统表空间中数据文件信息,已经迁移成功。最后把原数据文件删除
TABLESPACE_NAME FILE_NAME M STATUS
-------------------------- ------------------------------------------------------ ---------- -----------
SYSTEM /u01/app/oracle/oradata/system01.dbf 325 AVAILABLE
2、迁移非系统表空间中的数据文件
限制:需要迁移数据文件的表空间内,不能包含活跃的undo段、临时段、排序段,这样才能进行数据文件的迁移。
首先查看需要迁移表空间中数据文件的信息
SQL> select file_name,tablespace_name,bytes/(1024*1024) M,status,autoextensible
2 from dba_data_files
3 where tablespace_name='TEST_2017_9_6';

FILE_NAME TABLESPACE_NAME M STATUS AUTOEXTENSIBLE
--------------------------------------------------------------- --------------------------- --------------- ---------------- ---------------
/u01/app/oracle/oradata/dg1/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO
共包含两个100MB的数据文件
把该表空间进行脱机状态变更
SQL> alter tablespace test_2017_9_6 offline;

Tablespace altered.
查看表空间状态是否已脱机
SQL> select tablespace_name,status from dba_tablespaces
2 where tablespace_name='TEST_2017_9_6';

TABLESPACE_NAME STATUS
---------------------------- -----------
TEST_2017_9_6 OFFLINE
复制数据文件到新路径
[oracle@dg1 dg1]$ cp test_20170906.dbf /u01/app/oracle/oradata/test_20170906.dbf
[oracle@dg1 dg1]$ cp test_20170906_add01.dbf /u01/app/oracle/oradata/test_20170906_add01.dbf
利用ALTER TABLESPACE语句将表空间路径进行更新
SQL> alter tablespace test_2017_9_6
2 rename datafile '/u01/app/oracle/oradata/dg1/test_20170906.dbf','/u01/app/oracle/oradata/dg1/test_20170906_add01.dbf'
3 to '/u01/app/oracle/oradata/test_20170906.dbf','/u01/app/oracle/oradata/test_20170906_add01.dbf';

Tablespace altered.
将表空间进行联机状态变更
SQL> alter tablespace test_2017_9_6 online;

Tablespace altered.
再次查询表空间数据文件路径,完成数据文件的迁移。最后将原数据文件删除
FILE_NAME T ABLESPACE_NAME M STATUS AUTOEXTENSIBLE
----------------------------------------------------------- ---------------------------- ----------- ------------------ -------------------
/u01/app/oracle/oradata/test_20170906.dbf TEST_2017_9_6 100 AVAILABLE NO
/u01/app/oracle/oradata/test_20170906_add01.dbf TEST_2017_9_6 100 AVAILABLE NO

猜你喜欢

转载自blog.csdn.net/qqww120102/article/details/77982570