逻辑结构之表空间
表空间呢,肯定是相当重要,我不仅要会建表空间,理解里面的参数,而且还要能够管理监控表空间,使得表空间正常运转。
1.创建表空间
create tablespace tbs_test20140819
blocksize 16k
datafile 'e:/oracle/oradata/plmdemo/tbs_test0819.dbf' size 20m
autoextend on
next 5m maxsize 100m
extent management local
uniform seize 5m
segment space management auto;
这样呢,一个测试表空间建好了,那么如何监控表空间呢,下面来介绍。
2.表空间监控
select a.tablespace_name "tablespace",trunc(a.total) "allocated(M)",ceil((1-b.free/a.total)*100) "Usage %",
trunc(b.free) " free space(M)" from
(select tablespace_name, sum(nvl(bytes,0))/1024/1024 total from dba_data_files group by tablespace_name) a,
(select tablespace_name, sum(nvl(bytes,0))/1024/1024 free from dba_free_space group by tablespace_name) b
where a.tablespace_name=b.tablespace_name order by 3 desc;
这段代码咋一看很复杂,其实就是两个表dba_data_files和dba_free_space,一个是存储表空间总大小,一个是存储free空间,具体表的参数可以desc查看。
那么对于临时表空间,是在另外的表中查看:dba_temp_files和v$temp_space_header,具体代码如下:
SELECT D.TABLESPACE_NAME,d.file_name,SPACE "SUM_SPACE(M)",BLOCKS SUM_BLOCKS,
USED_SPACE "USED_SPACE(M)",ROUND(NVL(USED_SPACE,0)/SPACE*100,2) "USED_RATE(%)",
NVL(FREE_SPACE,0) "FREE_SPACE(M)"
FROM
(SELECT TABLESPACE_NAME,file_name,file_id,ROUND(SUM(BYTES)/(1024*1024),2) SPACE,SUM(BLOCKS) BLOCKS
FROM DBA_TEMP_FILES
GROUP BY TABLESPACE_NAME,file_name,file_id) D,
(SELECT TABLESPACE_NAME,file_id,ROUND(SUM(BYTES_USED)/(1024*1024),2) USED_SPACE,
ROUND(SUM(BYTES_FREE)/(1024*1024),2) FREE_SPACE
FROM V$TEMP_SPACE_HEADER
GROUP BY TABLESPACE_NAME,file_id) F
WHERE D.TABLESPACE_NAME = F.TABLESPACE_NAME(+) and d.file_id=f.file_id(+);
3.表空间设置
那么针对表空间不足的情况呢,就会出现讨厌的ora-01654错误,这时候就可以修改表空间属性自动扩展表空间或者增加数据文件。
设置成自动表空间:
alter database DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\SYSTEM01.DBF' autoextend on next 50m maxsize unlimited; ---普通表空间
alter database tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\TEMP01.DBF' autoextend on next 50m maxsize unlimited; --临时表空间
重新扩展,或者增加文件
扩展: alter DATABASE DATAFILE 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\SYSTEM01.DBF' RESIZE 9000m; --普通表空间
alter DATABASE tempFILE 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\TEMP01.DBF' RESIZE 200m; --临时表空间
增加文件: alter tablespace SYSTEM add datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\SYSTEM01.DBF' size 1g;------普通表空间
alter tablespace TEMP add tempfile 'E:\ORACLE\PRODUCT\10.2.0\ORADATA\PLMDEMO\TEMP02.DBF' size 10m;-------临时表空间
当然对于一些特定的表空间,一些有资深dba对我们有一些建议,表空间尽量避免自动扩展,尽可能大。对于回滚表空间尽量规划大,自动管理;对于临时表空间,最好使用临时表空间组;而业务表空间要根据业务分类进行配置,即时监控表空间使用情况。
4.删除表空间
drop tablespace tablespacename including contents and datafiles;
如果是linux类系统,那么使用这句代码直接就删除数据文件,但是win下面得手动删除。
5.切换回滚表空间
当新建回滚表空间后,需要切换,那么可以通过指令:
alter system set undo_tablespace=undo scope=both/memory/spfile;
6.切换临时表空间
alter user test temporary tablesapce temp1;
--改变数据库的临时表空间 alter database default temporary tablespace temp1;
随着oracle的发展,临时表空间组已经投入运用,可以做到为同一用户不同session设置不同的临时表空间。
7.1创建临时表空间组(粘贴代码太麻烦了,下面直接打吧)
其实很简单,就是在创建临时表空间后面添加一个tablesapce goup。
create temporary tablesapce temp01 tempfile 'xx/xx1.dbf' size 10m tablespace group temp_group1;
create temporary tablesapce temp02 tempfile 'xx/xx2.dbf' size 10m tablespace group temp_group1;
create temporary tablesapce temp03 tempfile 'xx/xx3.dbf' size 10m tablespace group temp_group1;
这样,临时表空间组(可以创建多个)就建好了,可以自行通过数据字典查看(dba_tablespace_groups),那么如何把已有临时表空间添加到临时表空间组呢?
这样就可以了,alter tablespace temp1 tablesapce group tmp_group1;
但是光是创建好了可不行,得让系统或者用户使用。
alter user test temporary tablespace temp_group1;(此后可以通过v$sort_usage查看临时表空间的使用情况)
好了,逻辑结构简单结束!