创建和管理表空间
--查询任何一个表空间的状态信息;
selectt.tablespace_name name, d.allocated, u.used, f.free,t.status,d.cnt,contents,
t.extent_managementextman, t.segment_space_management segman
from dba_tablespacest,
(select sum(bytes)allocated,count(file_id) cnt from dba_data_files
where tablespace_name = '&tablespace') d,
(select sum(bytes)free from dba_free_space where tablespace_name='&tablespace') f,
(select sum(bytes)used from dba_segments where tablespace_name='&tablespace') u
wheret.tablespace_name='&tablespace';
--创建一个表空间
create smallfiletablespace cedar
datafile'D:\app\fanminggy\oradata\orafan11\CEDAR01.DBF'
size 100M autoextendon next 10M naxsize 200M
logging --all operations on segments in the tablespacewill generate redo
extent managementlocal
segment spacemanagement auto
default nocompress;
更改表空间的操作包括:
1、重命名
alter tablespace tablespaceoldname rename to tablespacename;
2、上线和离线
3、读写和只读
4、重新规定大小
5、命名警告门槛
Oracle表空间重命名的步骤:
1、alter tablespace SJ rename to CEDAR;
此时可以查看一下数据文件的状态仍然为online
select name datafile,status from v$datafile where name like '%SJ%';
2、将表空间离线:alter tablespace CEDAR offline;
此时查看数据文件状态为offline
select namedatafile, status from v$datafile wherename like '%SJ%';
3、在操作系统上重命名数据文件
SQL>HOST RENAME D:\app\fanminggy\oradata\orafan11\SJ01.DBF D:\app\fanminggy\oradata\orafan11\CEDAR01.DBF
此时可以在查询一下表空间和数据文件的对应关系
select t.name tablespace_name, d.name datafile_name
from v$tablespace t join v$datafile d using( TS#)
where t.name='CEDAR';
4、更改数据字典中的对应关系:alter database rename file 'D:\app\fanminggy\oradata\orafan11\SJ01.DBF' to 'D:\app\fanminggy\oradata\orafan11\CEDAR01.DBF';
5、将重命名后的表空间上线:alter tablespace CEDAR online;
此时可以在查询一下表空间数据文件的信息
select t.name tablespace_name, d.name datafile_name, d.status
from v$tablespace t join v$datafile d using( TS#)
where t.name='CEDAR';
数据库上线和离线操作:
ALTERTABLESPACE tablespacename OFFLINE [ NORMAL | IMMEDIATE | TEMPORARY ]
NORMAL--默认值,表空间在offline时会触发检查点,将所有所有缓存中的数据写回数据文件,如果任何一个数据文件中有错,命令将不能执行成功;
IMMEDIATE--使用此选项不会触发检查点,当表空间重新online的时候会执行恢复过程,当数据库处于noarchive模式的时候,不能使用immediate选项;
TEMPORARY--对于正常的数据文件,会触发检查点,进行正常的offline,online的时候不需要恢复,对于错误的数据会执行immediate选项,不会触发检查点,online的时候需要进行恢复
将数据库的表空间改变只读状态:
ALTER TABLESPACE tablespacename[READ ONLY | READ WRITE]
如果表空间变成只读状态,它的segment中的内容是不能更改的,也不能新建segment,但是可以删除segment。当数据库需要备份和恢复的时候,可以将表空间置为只读状态;
改变表空间的容量:
有两种方式:增加一个新的数据文件,或变更现有数据文件的大小;
ALTERDATABASE DATAFILE filename RESIZE n[M | G | T]
ALTER TABLESPAACE tablespace name ADD DATAFILE filename SIZE nM;
ALTERDATABASE DATAFILE filename AUTOEXTEND ON NEXT nM MAXSIZE nG;
更改表空间的警告门槛:
使用实例中的MMON进程来监控表空间的使用情况;默认85%警告,97%严重警告
删除表空间:
DROPTABLESPACE tablespacename [INCLUDING CONTENTS [AND DATAFILES ] ];
如果不加后面的子句,如果表空间中有任何内容,都不能执行成功;即使加上子句,如果该表空间和其他表空间有引用的父子关系,也不能执行成功;
如果不加后面的AND DATAFILES子句,则不能删除服务器上的物理数据文件;注意,这种情况在windows环境下会有例外,因为windows环境有保护机制,必须先停掉oracle服务,才能在操作系统层面删除数据文件;
表空间中的块管理(Extent Management):
段管理有两种方式:dictionary management and localmanagement
字典管理的方式会使用数据库数据字典中的两张表:
SYS.UET$:行数据记录已经使用的extents
SYS.FET$:行数据记录还空闲的extents
由于每次空间分配都要操作这两张表,所以字典管理的方式效率会很低;
本地管理的方式使用bitmaps来存储每个数据文件,用每个bit来表明数据文件中的blocks
--查询表空间extent的管理方式
selecttablespace_name,extent_management from dba_tablespaces
--将字典管理的表空间转换为本地管理的表空间
executedbms_space_admin.tablespace_migrate_from_local('tablespacename');
转换的过程会很快,但是SYSTEM表空间除外
表空间中的段管理(Segment Space Management)
有两种segments的管理方式:manual or automatic
--查询表空间中的segment的管理方式
selecttablespace_name,segment_space_management from dba_tablespaces;
there arefive bitmaps for each segment, and each block will appear on exactly onebitmap;
the oldmanual space management method used a simple list, known as the free list;
目前还没有将manual方式转换为automatic方式的方法