一、ORACLE逻辑结构
1、oracle的逻辑结构
- 表空间(tablespace)
- 段(segment)
- 区(extent)
- 数据块(data block)
oracle由表空间组成,表空间由段组成,段由区组成,区由数据块组成。
- 1)表空间是数据库中最大的逻辑单位,由表空间组成了数据库。
- 2)表空间由一个或多个数据文件在物理上构成,一个数据文件只能属于一个表空间,这里通过数据文件位置的不同形成表空间在多个磁盘的分布。
- 3)根据组成的段类型,表空间分成:数据段表空间、索引段表空间、临时段表空间、回退段表空间。
- 4)可以通过修改数据文件大小或者添加删除数据文件来管理表空间大小。
- 5)表空间可以在线(ONLINE)或者离线(OFFLINE),也可以将www.2cto.com空间中的部分表在线或离线。也有只读(read only)或者读写(read write)的属性。--system等某些特殊表空间不得设置成离线或者只读
- 6)可以通过QUOTA参数限制用户在表空间上的使用大小。
- 7)特殊的临时表空间,主要存储在使用ORDER BY语句进行排序或者汇总时所需的临时空间。不建议用system等特殊空间当临时表空间使用。基表不能在临时表空间上建立。系统指定默认临时表空间后不得使用其他表空间作为临时表空间。
2、必不可少的几个表空间:
- SYSTEM --->字典表空间,不能被损坏
- UNDO --->dml,dql把数据快照到此,数据提交即消失(用于恢复)
- SYSAUX --->10g 高并发系统繁忙时,会造成system争用,将工具放到SYSAUX,减轻system的压力,SYSAUX不影响系统(影响性能)
- TEMP --->临时数据相关的内容
- USERS --->10g 用户数据从system拨离出来
二、建立表空间语句详解
- 有create tablespace的权限,DBA角色具有该权限,sysdba,sysoper
- 创建的是bigfiel ,还是smallifle 超过T 级别应考虑bigfile
- 新建的表空间的I/O,是否会导致磁盘I/O不够用
- datafile后跟的路径应该具备写的权限
CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace_name DATAFILE datafile spec | TEMPFILE tempfile spec [MINIMUM EXTENT minimum extent size] [BLOCKSIZE blocksize] [[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)] [LOGGING|NOLOGGING] [FORCE LOGGING] [ONLINE|OFFLINE] [EXTENT MANAGEMENT DICTIONARY | LOCAL [AUTOALLOCATE|UNIFORM SIZE size]] [SEGMENT SPACE MANAGEMENT MANUAL|AUTO] [FLASHBACK ON|OFF]
1、BIGFILE|SMALLFILE|TEMPORARY
指定表空间类型
2、tablespace_name
指出表空间的名称。
3、datafile datefile_spec1
指出表空间包含。datefile_spec1 是形如 ['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是数据文件的最大大小.
DATAFILE 'D:"oracle"oradata"IMAGEDATA01.dbf' SIZE 2000M,
'D:"oracle"oradata"IMAGEDATA02.dbf' SIZE 2000M
4、MININUM EXTENT integer [k|m]
指出在表空间中范围的最小值。这个参数可以减小空间碎片,保证在表空间的范围是这个数值的整数倍。
5、BLOCKSIZE integer [k]
这个参数可以设定一个不标准的块的大小。如果要设置这个参数,必须设置db_block_size,至少一个db_nk_block_size,并且声明的integer的值必须等于db_nk_block_size.
注意:在临时表空间不能设置这个参数。
6、logging clause
这个子句声明这个表空间上所有的用户对象的日志属性(缺省是logging),包括表,索引,分区,物化视图,物化视图上的索引,分区。
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说明表空间自动分配范围,用户不能指定范围的大小。只有9.0以上的版本具有这个功能。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
三、表空间操作相关语句
1、创建表空间
1)、建立一般表空间
CREATE TABLESPACE testdata
DATAFILE '/opt/oracle/oradata/ocpserver/data01.dbf' SIZE 10M;
2)、建立undo表空间
CREATE UNDO TABLESPACE UNDOTBS02
DATAFILE '/oracle/oradata/db/UNDOTBS02.dbf' SIZE 50M
#注意:在OPEN状态下某些时刻只能用一个UNDO表空间,如果要用新建的表空间,必须切换到该表空间:
ALTER SYSTEM SET undo_tablespace=UNDOTBS02;
3)、创建临时表空间
CREATE TEMPORARY TABLESPACE test_temp
TEMPFILE ' /opt/oracle/oradata/ocpserver/test_temp01.dbf '
SIZE 20M
AUTOEXTEND ON
NEXT 20M MAXSIZE 100M
EXTENT MANAGEMENT LOCAL;
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE T2;
4)创建临时表空间组:
4.1、创建临时表空间的时候
CREATE TEMPORARY TABLESPACE tablespace_name TEMPFILE '...' SIZE n
TABLESPACE GROUP group_name;
ALTER TABLESPACE tablespace_name TABLESPACE GROUP group_name;
ALTER TABLESPACE T3 TABLESPACE GROUP TEMP_GRP;
4.2查看临时表空间组的信息:
dba_tablespace_groups
SELECT * FROM DBA_TABLESPACE_GROUPS;
4.3将临时表空间组成员移除:
ALTER TABLESPACE tablespace_name TABLESPACE GROUP '';
可将系统默认的临时表空间设为临时表空间组:
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tablespace_name;
4.4删除临时表空间:
--将所有成员全移出去,便自动删除
2、修改表空间
1)脱机
ALTER TABLESPACE game OFFLINE;
如果是意外删除了数据文件,则必须带有RECOVER选项
ALTER TABLESPACE game OFFLINE FOR RECOVER;
2)联机
ALTER TABLESPACE GAME ONLINE;
3)数据文件脱机
ALTER DATABASE DATAFILE 3 OFFLINE;
4)数据文件联机
ALTER DATABASE DATAFILE 3 ONLINE;
(这里的1,2,3,是数据文件的编号;
5)表空间只读
ALTER TABLESPACE game READ ONLY;
6)表空间可读写
ALTER TABLESPACE game READ WRITE
7)表空间改名
ALTER TABLESPACE XXX RENAME TO YYY
3、删除表空间
1)先脱机
2)再删除
DROP TABLESPACE data01 INCLUDING CONTENTS AND DATAFILES;
4、扩展表空间
1)查看表空间
SQL>COL FILE_NAME FOR A70
SQL>COL TABLESPACE_NAME FOR A30
SQL> SELECT TABLESPACE_NAME,FILE_ID,FILE_NAME,ROUND(BYTES/(1024*1024),0) ALL_SPACE FROM DBA_DATA_FILES ORDER BY FILE_ID;
TABLESPACE_NAME FILE_ID FILE_NAME ALL_SPACE
------------------------------ ---------- ---------------------------------------------------------------------- ----------
SYSTEM 1 /opt/oracle/oradata/ocpserver/system01.dbf 480
UNDOTBS1 2 /opt/oracle/oradata/ocpserver/undotbs01.dbf 30
SYSAUX 3 /opt/oracle/oradata/ocpserver/sysaux01.dbf 240
USERS 4 /opt/oracle/oradata/ocpserver/users01.dbf 5
EXAMPLE 5 /opt/oracle/oradata/ocpserver/example01.dbf 100
SQL>
2)增加数据文件
ALTER TABLESPACE testdata
ADD DATAFILE '/opt/oracle/oradata/ocpserver/test_01.dbf' SIZE 10M,
DATAFILE '/opt/oracle/oradata/ocpserver/test_02.dbf' SIZE 10M,;
3)手动增加数据文件尺寸
ALTER DATABASE DATAFILE '/opt/oracle/oradata/ocpserver/test_02.dbf'
RESIZE 20M;
4)设定数据文件自动扩展
ALTER DATABASE DATAFILE '/opt/oracle/oradata/ocpserver/test_02.dbf'
AUTOEXTEND ON NEXT 10M
MAXSIZE 100M;
5)设定后查看表空间信息
SELECT A.TABLESPACE_NAME,A.BYTES TOTAL,B.BYTES USED, C.BYTES FREE,
(B.BYTES*100)/A.BYTES "% USED",(C.BYTES*100)/A.BYTES "% FREE"
FROM SYS.SM$TS_AVAIL A,SYS.SM$TS_USED B,SYS.SM$TS_FREE C
WHERE A.TABLESPACE_NAME=B.TABLESPACE_NAME AND A.TABLESPACE_NAME=C.TABLESPACE_NAME;
四、表空间管理
字典管理:oracle 8i(不包括i),只存在一种表空间的管理模式,即字典管理表空间(DMT)
DMT是指oracle的空间分配或回收是通过数据库中的数据字典表来记录和管理的用于管理的两个数据字典表分别是:UET$(used extents)和FET$(freeextents)
其工作方式是:当建立一个新的段或者段在表空间时,oracle通过一系列的SQL语句来完成这个工作且和前面的两个字典表有关,在繁忙的系统中会造成竞争和等待(另一个DMT会带来的问题是空间碎片)
本地管理(LMT): 在i的R2版本后成了默认的选项LMT在表空间的数据文件头部加入了一个位图区域,在其中记录每个extent的使用状况。当extent被使用或者被释放,oracle会更新头部的记录来反映这个变化,不产生回滚信息因为仅仅操作数据文件头部的几个数据块,不用操作数据字典,LMT比DMT要快,尤其是在繁忙的时候更明显
1、查看表空间管理方式(默认为本地)
select TABLESPACE_NAME,EXTENT_MANAGEMENT,BLOCK_SIZE,STATUS,CONTENTS,FORCE_LOGGING,BIGFILE
from dba_tablespaces;
2、本地管理和字典管理互换
--将字典管理的表空间转换为本地管理
exec dbms_space_admin.tablespace_migrate_to_local('表空间名') --表空间名用大写
--将本地管理的表空间转换为字典管理
exec dbms_space_admin.tablespace_migrate_from_local('表空间名')
3、表空间状态
- online
- offline
- read only
- read write
1)脱机
ALTER TABLESPACE tablespace_name OFFLINE;
表空间脱机的时候,将产生检查点事件,该表空间上的数据是不能访问的
2)联机
ALTER TABLESPACE tablespace_name ONLINE;
--在脱机后,有可能无法再联机,这时要做数据的介质恢复
ALTER DATABASE RECOVER TABLESPACE tablespace_name
3)read only:
不能执行DML语句,可以使用的为DDL,DQL语句 */
ALTER TABLESPACE tablespace_name READ ONLY;
4)read write
alter tablespace users read write;
五、常用查询
1、查看scott用户的默认表空间及数据文件
SQL> COL EXTERNAL_NAME FOR A20
SQL> SELECT USERNAME,ACCOUNT_STATUS,EXPIRY_DATE,DEFAULT_TABLESPACE,PROFILE,EXTERNAL_NAME FROM DBA_USERS WHERE USERNAME LIKE 'SCOTT';
USERNAME ACCOUNT_STATUS EXPIRY_DA DEFAULT_TABLESPACE PROFILE EXTERNAL_NAME
------------------------------ -------------------------------- --------- ------------------------------ ------------------------------ --------------------
SCOTT EXPIRED & LOCKED 03-JUL-13 USERS DEFAULT
SQL>
2、查看表空间及数据文件
SQL> COL PATH FOR A80
SQL> SELECT A.NAME TBS_NAME,B.NAME PATH FROM V$TABLESPACE A,V$DATAFILE B WHERE A.TS#=B.TS#;
TBS_NAME PATH
------------------------------ --------------------------------------------------------------------------------
SYSTEM /opt/oracle/oradata/ocpserver/system01.dbf
UNDOTBS1 /opt/oracle/oradata/ocpserver/undotbs01.dbf
SYSAUX /opt/oracle/oradata/ocpserver/sysaux01.dbf
USERS /opt/oracle/oradata/ocpserver/users01.dbf
EXAMPLE /opt/oracle/oradata/ocpserver/example01.dbf
SQL>
3、查看缺省是BIGFILE 还是SMALLFILE,当缺省为SMALLFILE,创建表空间不指定表空间类型则为SMALLFILE
SQL> COL PROPERTY_VALUE FOR A20
SQL> SELECT PROPERTY_NAME,PROPERTY_VALUE FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME LIKE '%TBS%';
PROPERTY_NAME PROPERTY_VALUE
------------------------------ --------------------
DEFAULT_TBS_TYPE SMALLFILE
SQL>
修改默认表空间
//修改创建表空间为大或小表空间的默认值
alter database set default bigfile tablespace;
4、表空间相关表
SQL> SELECT * FROM DICTIONARY WHERE TABLE_NAME LIKE '%TABLESPACE%'; TABLE_NAME COMMENTS ------------------------------ ------------------------------------------------------------------------------------------ DBA_FILE_GROUP_TABLESPACES Details about the transportable tablespaces in the file group repository DBA_HIST_TABLESPACE_STAT Tablespace Historical Statistics Information DBA_TABLESPACES Description of all tablespaces DBA_TABLESPACE_GROUPS Description of all tablespace groups DBA_TABLESPACE_THRESHOLDS Space Utilization Threshold settings for all tablespaces DBA_TABLESPACE_USAGE_METRICS Description of all tablespace space usage metrics USER_FILE_GROUP_TABLESPACES Details about the transportable tablespaces in the file group repository USER_TABLESPACES Description of accessible tablespaces ALL_FILE_GROUP_TABLESPACES Details about the transportable tablespaces in the file group repository V$ENCRYPTED_TABLESPACES Synonym for V_$ENCRYPTED_TABLESPACES V$TABLESPACE Synonym for V_$TABLESPACE GV$ENCRYPTED_TABLESPACES Synonym for GV_$ENCRYPTED_TABLESPACES GV$TABLESPACE Synonym for GV_$TABLESPACE 13 rows selected. SQL>
5、查看表空间状态
SET LINE 300 PAGES 50000 COL NAME FOR A15 SELECT d.tablespace_name "NAME", NVL (u.bytes, 0) "SPACE_bytes", NVL (u.maxbytes, 0) "MAX_bytes", NVL (u.bytes, 0) - NVL (f.bytes, 0) "USED_bytes", NVL (f.bytes, 0) "UNUSED_bytes", TO_CHAR (100* (NVL (f.bytes, 0) / NVL (u.bytes, 0)),'999.99')|| '%' "FREE_bytes", d.status "STATUS" FROM dba_tablespaces d, (SELECT tablespace_name, SUM (bytes) bytes, SUM (maxbytes) maxbytes FROM dba_data_files GROUP BY tablespace_name) u, (SELECT tablespace_name, SUM (bytes) bytes FROM dba_free_space GROUP BY tablespace_name) f WHERE d.tablespace_name = u.tablespace_name(+) AND d.tablespace_name = f.tablespace_name(+) AND u.bytes != 0;
或者
SELECT d.tablespace_name "NAME", NVL (u.bytes, 0) "SPACE", NVL (u.maxbytes, 0) "MAX", NVL (u.bytes, 0) - NVL (f.bytes, 0) "USED", NVL (f.bytes, 0) "UNUSED", TO_CHAR (100* (NVL (f.bytes, 0) / NVL (u.bytes, 0)),'999.99')|| '%' "FREE", d.status "STATUS" FROM dba_tablespaces d, (SELECT tablespace_name, SUM (bytes) bytes, SUM (maxbytes) maxbytes FROM dba_data_files GROUP BY tablespace_name) u, (SELECT tablespace_name, SUM (bytes) bytes FROM dba_free_space GROUP BY tablespace_name) f WHERE d.tablespace_name = u.tablespace_name(+) AND d.tablespace_name = f.tablespace_name(+) AND u.bytes != 0;
6、数据文件相关视图/表
DBA_DATA_FILE
DBA_TEMP_FILE
DBA_EXTENTS
USER_EXTENTS
DBA_FREE_SPACE
USER_FREE_SPACE
V$DATAFILE
V$DATAFILE_HEADER
六、参考
1、robinson:http://blog.csdn.net/robinson_0612/article/details/5611738
七、小结
1、表空间内容还算比较多,但真正掌握还需要更多的实践和时间。
2、表空间是ORACLE最大的逻辑单位,一般不会出现问题。在数据库维护管理方面,做迁移,演练等方面经常使用,需要熟练掌握表空间的各种操作、查询等。