表空间是个逻辑概念。
表空间是ORACLE的最大逻辑结构。表空间是组织数据和分配空间的逻辑结构。
特性:
一个表空间有多个数据文件组成,但一个数据文件只属于一个表空间
一个数据库可以有多个表空间,可以在数据库中创建,删除表空间。
一个表空间只属于一个数据库,
一个表空间的大小等于所有数据文件的大小之和。
表空间可以联机,脱机(系统表空间和带有回滚段的表空间不能OFFLINE)
数据库对象、表、索引的数据被存储在表空间的数据文件中。
一个用户默认使用一个表空间
作用:
控制数据库所占的磁盘空间。
表是SEGMENT的一种。
表空间分类:
表空间 |
作用 |
系统表空间(SYSTEM和SYSAUX) |
此表空间必须存在,一般用户存放数据字典表 |
临时表空间(TEMP) |
用户排序,分组,索引等 |
撤消表空间(UNDO) |
用户ROLLBACK,从逻辑中恢复(可以创建多个表空间,但只能激活一个表空间) |
表空间的区,段管理方式
表空间是按区和段空间进行管理。
表空间的管理方式
1. 字典管理方式:使用数据字典来管理存储空间的分配,当表空间分配新的区、或者回收已分配的区时,ORACLE会对数据字典对应的表进行查询、更新。且使用单线程,速度慢,并且回产生回退和重做信息。
(注意:在字典管理方式下,如果对某个表进行更新,这是回产生存储操作,而该操作又回产生回滚和重做操作,导致对回滚段和重做日志文件进行读写,从而又产生存储管理操作,因此形成递归现象)
2. 本地管理方式:ORACLE 9i默认方式,表空间中区分配和区回收的管理信息都被存储在表空间的数据文件中,而与数据字典无关。表空间为每个数据文件维护一个位图结构,用于记录表空间的区分配情况。当表空间分配新的区、或者回收已分配的区时,ORACLE会对文件中的位图进行更新,所以不会产生回滚和重做信息。
优点:
(1) 提高存储管理的速度和并发性。
(2) 产生磁盘碎片
(3) 不产生递归管理
(4) 没有系统回滚段
通过dba_tablespaces可以查看各个表空间的区、段管理方式;
select TABLESPACE_NAME,STATUS,EXTENT_MANAGEMENT,ALLOCATION_TYPE,SEGMENT_SPACE_MANAGEMENT from dba_tablespaces
表空间的状态:
1. 读写状态
只读(READ-ONLY):任何人无法写入数据,无法修改数据。
读写(READ-WRITE):任何有权限的用户都可以读写。
修改为只读:
ALTER TABLESPACE WORKDATA01 READ ONLY(此TABLESPACE过程在下次启动时候依然为只读)
如果此时插入数据则出现如下错误:
1. 脱机状态
正常模式(NORMAL):进入脱机时,必须保证该表空间的数据文件处于联机,ORACLE会执行一个CHECKPOINT,以便SGA区中的脏数据都能写入数据文件中。然后在关闭表空间的所有文件。下一次启动时候就不用进行数据库恢复了。
临时模式(TEMPORARY):不须保证该表空间的数据文件处于联机,如果某个数据文件不可用,则回忽略错误,进入TEMPORARY 模式,ORACLE会执行一个CHECKPOINT,下一次启动时候可能需要进行数据库恢复
立即模式(IMMEDIATE):ORACLE会执行一个CHECKPOINT,直接将该表空间的所有数据文件都设置为脱机状态,恢复为联机时必须进行数据库恢复
用于恢复模式(FOR RECOVER):如果要对表空间进行基于时间的恢复,可以使用这模式,
然后DBA就可以进行备份的数据文件来覆盖原有的数据文件,而后根据这些数据文件上,利用归档日志,就可以将表空间恢复为某个时间点的状态。
演示将表空间脱机:
ALTER TABLESPACE USERS OFFLINE NORMAL(默认)
从图可以看出IMMEDIATE无须表空间处于联机状态,就能实现脱机
OFFLINE之后无法在该表空间做任何操作。
表空间的管理准则
表空间的管理主要是:确定其大小、创建、删除,修改表空间、设置状态等。
确定表空间的大小:
1. 确定表的大小。
PCTFREE—空闲百分比
表的大小=最大行数*行数*(1+PCTFREE/100)*预留的百分比
2. 确定表空间的大小:
表空间的大小=表的大小*表的数量
对于撤消表空间:
受UNDO_RETENTION(表示在UNDO表空间保留多长时间的撤消信息,如果表空间不足,则未完成的或撤消事务有可能被新的事务覆盖)参数的限制。
UNDO表空间大小=
(UNDO_PETENTION*每秒的撤消块*DB_BLOCK_SIZE)+DB_BLOCK_SIZE。
显示UNDO_RETENTION参数
显示DB_BLOCK_SIZE参数
表空间的创建
使用autoallocate分配方式:自动给存放对象分配相应大小的区的方式,可能造成磁盘空间的浪费。
create tablespace workdata01
datafile 'd:\oracle\oradata\work\workdata01_01.dbf' size
'd:\oracle\oradata\work\workdata01_02.dbf' size
使用uniform方式:给所有对象分配相同的大小的区,最小1K。
create tablespace workdata02
datafile 'd:\oracle\oradata\work\workdata02_01.dbf' size
uniform size 128K;
查看表空间的数据文件:
select file_name,tablespace_name from dba_data_files where tablespace_name='WORKDATA01'
指定数据文件的的扩展方式
使用此方式时候,一般需要指定数据文件的最大SIZE,以免数据文件无限制扩展。
CREATE TABLESPACE WORKDATA01
DATAFILE ' D:\ORACLE\ORADATA\WORK\WORKDATA01_01.DBF' SIZE
AUTOEXTEND ON NEXT
创建临时表空间(区分配无法指定为AUTOALLOCATE)
如果数据库经常有大量排序操作,则为了提高性能就需要创建多个临时表空间。
CREATE TEMPORARY TABLESPACE TEMP_WORKDATA01
TEMPFILE ' D:\ORACLE\ORADATA\WORK\TEMP_WORKDATA01_01.DBF ' SIZE
UNIFORM SIZE 64K;
创建撤消表空间(只能使用本地管理方式而不是数据字典管理方式,无法指定统一区的大小的选项):
正在使用的UNDO表空间无法删除。当UNDO表空间没有未提交的事务时候才能删除。
通过select * from v$transaction来查询:
指定UNIFORM时出现的错误。
修改表空间
为表空间增加数据文件:
ALTER TABLESPACE WORKDATA01
ADD DATAFILE 'D:\ORACLE\ORADATA\WORK\WORKDATA01_02.DBF' SIZE
修改数据文件:
ALTER DATABASE
'D:\ORACLE\ORADATA\WORK\WORKDATA01_02.DBF'
RESIZE
删除表空间:
DROP TABLESPACE WORKDATA02 INCLUDING CONTENTS AND DATAFILES;
此语句删除非空的表空间以及对应的数据文件。
查询表空间信息:
数据字典 |
作用 |
V$TABLESPACE |
表空间的标号和信息 |
DBA_TABLESPACE |
表空间的标号和信息 |
USER_TABLESPACE |
表空间的标号和信息 |
DBA_TABLESPACE_GROUPS |
|
DBA_SEGMENT |
表空间段的信息 |
USER_SEGMENT |
表空间段的信息 |
DBA_EXTENTS |
表空间的数据盘区的信息 |
USER_EXTENTS |
表空间的数据盘区的信息 |
DBA_FREE_SPACE |
表空间的空闲信息 |
USER_FREE_SPACE |
表空间的空闲信息 |
V$DATAFILE |
数据文件以及所属表空间的信息 |
V$TEMPFILE |
临时文件以及临时表空间的信息 |
DBA_DATA_FILES |
数据文件以及所属表空间的信息 |
DBA_TEMP_FILES |
临时文件以及临时表空间的信息 |
V$TEMP_SPACE_HEADER |
临时文件的空闲信息 |
V$SORT_SEGMENT |
每个排序段的信息 |
V$SORT_USER |
用户使用的临时排序信息 |
查询表空间的空闲信息:
SELECT TABLESPACE_NAME ,SUM(BYTES/1024/1024) FREESPACE FROM DBA_FREE_SPACE WHERE TABLESPACE_NAME=’WORKDATA
GROUP BY TABLESPACE_NAME
实际中可能有如下错误:
ORA-01653:此错误表明表空间数据文件设置小了。
使用上面的为表空间增加数据文件的命令即可
http://www.cnblogs.com/woody-wu/archive/2009/08/05/1539896.html