Oracle-管理表空间和数据文件
在SYSTEM模式下,从dba_data_files数据字典中查询表空间以及其包含的数据文件
默认表空间
SYSTEM表空间
存放内部数据和数据字典
使用dba_segments数据字典可以查询到某个表空间所存放的数据对象及其类型(索引,表簇)和拥有者
如:查询USERS表空间内存放的数据对象以及类型和拥有者
SYSAUX表空间
充当SYSTEM的辅助表空间,主要用于存储数据字典以外的其他数据对象,它在一定程度上降低了SYSTEM表空间的负荷
如:查询SYSAUX表空间所存放的用户及其所拥有的对象数量
select owner 用户 ,count(segment_name) 对象数量 from dba_segments where tablespace_name='SYSAUX' group by owner;
注意:用户可以对SYSAUX表空间进行增加数据文件和监视等操作,但不能对其执行删除、重命名或设置只读(READONLY)等操作
创建表空间
在创建表空间时,必须要考虑以下几点:
(1)是创建小文件表空间,还是大文件表空间(默认小)
(2)是使用局部盘区管理方式,还是使用传统的目录盘区管理方式(默认为局部盘区管理)
(3)是手动管理段空间,还是自动管理段空间(默认自动)
(4)是否用于临时段或撤销段的特殊表空间
创建表空间
重要的关键字:
smallfile | bigfile:创建是小文件表空间还是大文件表空间
reuse:若该文件存在,则清除在重新建立该文件,若不存在,则创建该文件
autoextend [on| off] next:表示数据文件是否为自动扩展,为on时,可以指定next的值
maxsize:可以扩展的最大长度字节数,可以为unlimited
minimun extent:指定最小的长度,由操作系统和数据库决定
online|offline :创建表空间时可以指定为在线或离线
permanent|temporary:指定创建的表空间是永久表空间或临时表空间
logging|nologging:默认为logging,即使选择了nologging,在insert,update,delete操作中,Oracle仍会将操作信息记录到Redo Log Buffer
extent management dictionary|local :指定表空间的扩展方式是使用数据字典管理,还是使用本地化管理,默认为本地化管理。不推荐使用DD
autoallocate|uniform size:如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小由系统自动指定还是按照等同大小(默认+1M)进行。
default storage:指定以后,要创建的表、索引以及簇的存储参数值,这些参数将影响以后表等的存储参数
通过本地化管理方式:
本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态。具有以下有点:
A.使用本地化的扩展管理功能(自动大小,等同大小)可以避免发生重复的空间管理操作
B.可以有autoallocate,或uniform
段空间管理
建立在本地化表空间管理方式基础之上的--关键字“segment space management manual/auto”
A--手动段空间管理方式
为了往后兼容,使用自由列表和PCT_FREE和PCT_USED参数标识可供插入使用的数据块
insert | update:DB会比较剩余空间与PCT_FREE,如果数据块的剩余自由空间少于PCT_FREE,则数据库就会从自由块列表上将其去下,不再对其进行插入操作。剩余的空余空间保留给可能会增大该数据块行大小的update操作
update|delete:DB会比较该数据块中的已用空间与PCT_USED,如果已用空间少于PCT_USED,则该数据块会被加入到自由列表中,供insert操作使用
当选择auto时要注意:
1.不能用于创建临时表空间或系统表空间
2.Oracle本身推荐使用自动段空间管理方式管理永久表空间,但其默认情况下却是MANUAL,所以一般需要显示指定为auto
创建非标准块表空间
通常块大小8192字节,但是用户可以创建块大小与基本块不同的表空间 ,由blocksize指定,这样有利于存储不同大小的对象,但用户需要注意一下3点:
1.表空间的非标准块的大小为基本块的倍数
2.Oracle 11g通常使用SGA自动共享内存管理,因此需要设置初始化参数db_16k_cache_size=16K
3.这种块较大的表空间通常用来存放大对象(LOB)类型
创建非标准块表空间
如:创建一个非标准块的表空间,块的大小为标准块的2倍:
step 1: alter system set db_16k_cache_size=16m scope=both;
注意:必须设置初始化参数,否则Oracle会报错
create tablespace tbs_test_5 datafile 'd:\orats\datafile5.dbf' size 64m reuse
autoextend on next 4m maxsize unlimited
blocksize 16k
extent management local autoallocate
segment space management auto
/
建立大文件表空间
32T---128T
如:创建一个大文件表空间,指定一个数据文件,并且数据文件大小为2G:
create bigfile tablespace tbs_test_big datafile 'd:\orats\datafilebig.dbf'
size 2g;
注意:在建大文件表空间时,由于指定的数据文件都比较大,所以通常创建过程都比较慢,用户需要耐心等待
大文件表空间主要用在存储区域网路上(SAN),磁盘阵列、自动存储管理(ASM)和类似的提供禁止数据访问多设备的存储解决方案上
当需要修改大文件表空间的大小时
alter tablespace tbs_test_big resize 1g;
而传统的表空间修改时,则需要指定完整的路径名
alter database datafile 'd:\orats\datafile3.dbf' resize 100m;
维护表空间与数据文件
设置默认表空间
更改默认临时表空间:
alter database default temporart tablespace temp_1
更改默认的永久表空间
alter database default tablespace tbs_example
更改表空间的状态
只读状态:保证表空间数据的完整性,通常进行数据库的备份、恢复及历史数据的完整性保护,可以指定该状态。但必须满足以下几个条件
1.该表空间必须为ONLINE状态
2.该表空间不能包含任何回滚段
3.该表空间不能在归档模式下
(默认为读写状态)
如:修改tbs_test_3表空间为只读状态
alter tablespace tbs_test_3 read only;
修改tbs_test_3 表空间为可读状态
alter tablespace tbs_test_3 read write;
重命名表空间
在Oracle11g以前的版本中,表空间是无法重命名的。
但需要注意的是:DBA只能对普通的表空间进行重命名,不能对SYSTEM,SYSAUX表空间进行重命名,也不能对已经处于OFFLINE状态的表空间进行重命名
如:把tbs_test_3重名为tbs_test_3_new
alter tablespace tbs_test_3 rename to tba_test_3_new
说明:在修改完表空间名称之后,原表空间中所存放的数据库对象(表,索引,簇等等)会被保存在新表空间下
删除表空间
需要用户具有drop tablesapce
若是采用Oracle Managed Files方式管理文件,这样删除表空间时会自动删除该表空间包含的物理文件
若没有采用Oracle Managed Files方式,则删除表空间实际上仅仅是从数据字典和控制文件中将该表空间的有关信息清楚掉,因此还需要手动释放物理磁盘文件。
删除表空间命令:
including contents:表示同时删除表空间的数据,如果没有指定,但是表空间又存在数据,则Oracle会提示错误
cascade constraints:同时删除相关的完整性约束。如果存在,而没有指定,则会报错
如:删除表空间tbs_test_2以及所包含的所有内容
drop tablespace tbs_test_2
including contents
cascade constraints;
维护表空间中的数据文件
1.向表空间添加数据文件
如:想users表空间中添加一个新的数据文件users02.dbf,该文件支持自动扩展,扩展能力为每次扩展5m,并且该文件的最大空间不受限制:
alter tablespace users add datafile 'f:\app\administrator\oradata\orcl\users02.dbf'
size 10m autoextend on next 5m maxsize unlimitied;
2.从表空间中删除数据文件
11g R2以前的版本是不允许的。
如:删除users表空间中的user02.dbf 数据文件:
alter tablespace users drop datafile 'e:\app\administrator\oradata\orcl\user02.dbf';
3.对数据文件自动扩展设置
autoextend on
用户可以通过以下4种方式设置数据文件的自动扩展功能:
create database (因为数据库已经创建,所以DBA,基本上不用此操作)
create tablespace
alter database
alter tablespace
其一:alter database
如:首先查询tbs_test_4 表空间中的数据文件是否为自动扩展,若不是自动扩展,则修改为自动扩展,扩展量为10m,并且不受限制
查询数据文件是否自动扩展:
select file_name,autoextensible from dba_data_files where tablespace_name='TBS_TEST_4';
如果是NO
则继续
alter database datafile 'd:\orats\datafile4.dbf'
autoextend on next 10m maxsize unlimited;
管理撤销表空间
当执行DML(insert,update,delete)时,Oracle会将这些操作的旧数据(即撤销信息)写入UNDO段,而UNDO段驻留在UNDO表空间中。
撤销表空间的作用
1.使读写一致
2.可以回滚事务
3.事务恢复
4.闪回操作
撤销表空间的初始化参数
undo_tablespace :用于指定例程所要使用的undo表空间
undo_management:用于指定undo数据的管理模式(auto,manual)
注意:如果使用auto,在没有指定undo_tablespace,Oracle会自动选择第一个可用的undo表空间存放undo数据;如果没有可用的undo表空间,Oracle会使用SYSTEM回滚段存放undo记录,并在alert文件中记载警告
undo_retention:最大保留时间,默认为900秒(9i)
撤销表空间的基本操作
1.创建UNDO表空间
如:创建一个撤销表空间,并指定数据文件大小为100m
create undo tablespace undo_tbs_1
datafile 'd:\orats\undotbs1.dbf'
size 100m;
注意:UNDO表空间所对应的数据文件大小通常由DML操作可能产生的最大数据量来确定,通常该数据文件的大小至少为1G
由于UNDO表空间只用于存储撤销数据,所以不要在UNDO表空间内建立任何数据对象(表)
2.修改UNDO表空间
如:向表空间undo_tbs_2添加一个新的数据文件,指定该文件大小为2G:
alter tablespace undo_tbs_2
add datafile 'd:\orats\undotbs_add.dbf'
size 2g;
3.切换UNDO表空间
alter system set undo_tablespace=undo_tbs_2;
默认UNOD表空间是UNDOTBS1
4.删除UNDO表空间
当前正在使用的UNDO表空间,是不能删除的
drop tablespace undo_tbs_2;
5.查询UNDO表空间的信息
A--当期例程正在使用的UNDO表空间
show parameter undo_tablespace;
B--查询当前实例拥有的所有UNDO表空间
select tablespace_name from dba_tablespaces where contents='UNDO';
contents:表空间的类型,比如TEMPORARY
C--undo表空间的统计信息
如:统计UNDO表空间中“回退块”的生成信息
D--显示UNDO段统计信息
使用自动UNDO管理模式时,Oracle会在UNDO表空间生自动建立10个UNDO段。
若要显示所有联机UNDO段的名称,则可以通过查询动态性能视图v$rollname;若要显示UNDO段统计信息,则可以通过v$rollstat
如:通过动态性能视图监视特定UNDO段的信息,包括段名称、活动事务个数和段中扩展个数等信息
select rn.name,rs.xacts,rs.writes,rs.extents
from v$rollname rn,v$rollstat rs
where rn.usn=rs.usn
/
xacts:活动事务个数
E--显示活动事务信息
会话详细信息:v$session
事务详细信息:v$transaction
联机UNDO名称:v$rollname
F--显示UNDO区信息
数据字典dba_undo_extents
如:查询指定段的信息,包括段编号、段的大小和段的状态
select segment_name,extent_id,bytes,status from dba_undo_extents
where segment_name='_SYSSMU3_991555123$';
status:用于标识区状态(ACTIVE:处于活动状态;UNEXPIRED:未到期,活动;EXPIRED:标识该区未用)
管理临时表空间
临时表空间是一个磁盘空间,主要用于内存排序区不够而必须将数据写到磁盘的额那个逻辑区域,由于该空间在排序操作完成后由Oracle系统自动释放,所以称作临时表空间
一般以下操作会经常用到临时表空间:
select distinct 不重复检索
union联合查询
minus计算
analyze分析
连接两个没有索引的表
创建临时表空间
create temporary tablespace temp_01 tempfile 'd:\orats\temp_01.tpf' size 300m;
临时表空间用临时文件创建而不是数据文件。另外,临时表空间不需要备份,临时表空间的数据的修改也不会被记录到重做日志中
把新建的临时表空间temp_01设置为系统默认的临时表空间
alter database default temporary tablespace temp_01;
查询临时表空间的信息
dd--dba_temp_files(file_name,tablespace_name)
关于临时表空间组
使用临时表空间组来管理临时数据具有以下作用:
A--避免因大量的排序而导致单一临时表空间不足
B--当一个用户同时有多个会话,可以使用组中的不同临时表空间
C--使并行的服务器在单节点上能够使用多个临时表空间
1.创建临时表空间组
如:创建一个临时表空间组,并向其添加两个临时表空间
create temporary tablespace tp1 tempfile 'd:\orats\tp1.tpf' size 10m tablespace group group1;
create temporary tablespace tp2 tempfile 'd:\orats\tp2.tpf' size 10m tablespace group group1;
2.转移临时表空间到另外一个组
创建临时表空间组group3,将组group1中的临时表空间tp1 转移到group3中:
create temporary tablespace tp3 tempfile 'd:\orats\tp3.tpf' size 10m tablespace group group3;
alter tablespace tp1 tablespace group group3;
可以通过dd--dba_tablespace_groups 查看临时空间组成员
select * from dba_tablespace_groups where group_name='GROUP3';
把临时表空间组分配给指定的用户使用
alter user xcn temporary tablespace group3;--这里又不加group
设置默认的临时表空间
如:修改数据库的默认表空间组group3
alter database orcl default temporary tablespace group3;
删除临时表空间组
删除临时表空间组主要通过删除组成临时表空间的所有临时表空间来实现
drop tablespace tp1 including contents and datafiles;