2015年(68)
分类: Oracle
2015-08-31 19:25:56
一、概述
表空间是oracle的逻辑存储单位,保存着一组相关的逻辑对像。oracle的数据逻辑上存储于表空间,物理上存储在数据文件。
如上图所示,从逻辑结构来看,oracle数据块由多个操作系统块组成,多个数据块组成extent,多个extent组成segment且位于表空间中。可以把表空间看作存放各种段(表段、索引段、临时段、回滚段等)的容器
从物理结构来看,数据文件由多个操作系统块组成,数据文件是确实存在的磁盘上的文件。这些文件是由oracle数据库操作系统的block 组成的。
结合两者,表空间作为oracle的逻辑存储单位,可以有一个或多个物理数据文件,而oracle数据库由一系列的表空间构成。
二、表空间类型
2.1 系统表空间
system表空间:最重要的表空间,随数据库创建,包含数据字典,永远不能OFFLINE
sysaux表空间:system表空间的辅助表空间,减轻system表空间的压力,不能删除、重命名、设为read only
2.2非system表空间
永久表空间:用于存储永久数据
临时表空间:用于存储临时数据,如排序操作,不能包含任何永久对象
还原表空间:用于存储还原段,不能包含任何其他对象
三、创建表空间
创建表空间需注意的地方
具有create tablespace的权限,DBA角色具有该权限,sysdba,sysoper
创建的是bigfile,还是smallfile,超过T级别应考虑bigfile
新建的表空间的I/O,是否会导致磁盘I/O不够用
datafile后跟的路径应该具备写的权限
为方便管理,考虑为不同用户创建独立的表空间
3.1语法:
CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACEtablespace
[DATAFILE|TEMPFILE clause]
[AUTOEXTEND[OFF|ON[NEXT integer[K|M]]
[MAXSIZE UMLIMITED|integer[K|M]]
[MINMUM EXTENT integer[K|M]]
[BLOCKSIZE integer[K]]
[LOGGING|NOLOGGING]
[DEFAULT storage_clause]
[ONLINE|OFFLINE]
[PERMANENT|TEMPORARY]
[EXTENTMANAGEMENT DICTIONARY |LOCAL [AUTOALLOCATE|UNIFORM SIZE size]]
[SEGMENTSPACE MANAGEMENTMANUAL|AUTO]
[FLASHBACKON|OFF]
[BIGFILE | SMALLFILE]
TEMPORARY:创建临时表空间,默认为永久表空间
Tablespace:为要创建的表空间的名称
DATAFILE:指定组成表空间的一个或多个数据文件
TEMPFILE:指定组成临时表空间的一个或多个数据文件
AUTOEXTEND:是否自动扩展数据文件
NEXT:在需要更多区时自动分配给数据文件的磁盘空间
MAXSIZE:数据文件可以自动扩展到的最大磁盘空间
MINIMUM EXTENT:指定extent的大小是指定大小的整数倍,即initial和next extent大小应为MINIMUM EXTENT的整数
BLOCKSIZE:指定表空间的非标准块大小,要指定该子句必须具有DB_CACHE_SIZE,并至少设置一个DB_Nk_CACHE_SIZE参数,在该子句中指定的整数必须与一个DB_Nk_CACHE_SIZE参数设置相对应,一般在库建完后是不能更改的,8i一般采用8192个位,也就是8k,而10g以后一般采用16k。
LOGGING:缺省模式,说明表空间内的所有表、index和分区等所有更改都将写入重做日志文件。NOLOGGING只影响某些DML和DDL命令,如直接加载;所有变更不写如重做日志文件。
DEFAULT STORAGE:指定表空间内创建的所有对象的缺省存储参数。
OFFLINE:指定表空间从创建后立即被置为脱机,即不能使用。
PERMPORARY:指定表空间可用于保留永久对象。
TEMPORARY:指定表空间仅用于保留临时对象,如:order by子句引起的隐式排序。
EXTENT MANAGEMENT:该子句指定如何管理表空间内的区,默认为本地管理。
AUTOALLOCATE|UNIFORM SIZE:区的分配分式,AUTOALLOCATE为自动分配置,每次分配的大小不等;UNIFORM SIZE每次分配的大小都是定义的固定大小
SEGMENT SPACE MANAGEMENT:段的管理方式,默认为AUTO自动管理。
FLASHBACK:是否启用闪回恢复
3.2示例:
1)创建永久表空间
//表空间名为dbs01,开启自动扩展,最大可扩展到200M,每次扩展的大小为10M;表空间的所有操作记录到redo logfile,自动分配extent,段的管理方式为自动管理
sys@DEMO>CREATE TABLESPACE dbs01DATAFILE
1 '/data/oradata/demo/dbs01_01.dbf' SIZE 100M
2 AUTOEXTEND ON NEXT 10M MAXSIZE 200M
3 LOGGING
4 ONLINE
5 EXTENT MANAGEMENT LOCAL AUTOALLOCATE
6 BLOCKSIZE 8K
7*SEGMENT SPACE MANAGEMENT AUTO
/
Tablespace created.
2) 创建还原表空间
创建时只能使用DATAFILE和EXTENT MANAGEMENT子句
示例:
sys@DEMO> CREATE UNDO TABLESPACE undo01
2 DATAFILE'/data/oradata/demo/undo01_01.dbf' SIZE 50M
3 AUTOEXTEND ON NEXT 10M MAXSIZE100M;
Tablespace created.
3)创建临时表空间
临时表空间有如下特点:
(1) tempfile只能为NOLOGGING模式
(2) 无法将Tempfile设置为只读
(3) 无法重命名tempfile
(4) 无法通过alterdatabase 命令创建tempfile
(5) Tempfile对于只读数据库是必需的
(6) 介质恢复不恢复tempfile
示例:
sys@DEMO>CREATE TEMPORARY TABLESPACE temp01
2 TEMPFILE '/data/oradata/demo/temp01_01.dbf'SIZE 50M;
Tablespace created.
注:若要优化临时表空间内的排序性能,可将UNIFORMSIZE设置为SORT_AREA_SIZE参
数的整数倍。
4)验证:
sys@DEMO> select tablespace_name,contents,block_size,extent_management,
2 segment_space_managementfrom dba_tablespaces
3where tablespace_name in ('DBS01','UNDO01','TEMP01');
sys@DEMO>selecttablespace_name,file_name,autoextensible,
1 bytes/1024/1024mb,maxbytes/1024/1024 max_mb
2 fromdba_data_files
3 wheretablespace_name in ('DBS01','UNDO01','TEMP01');
/
sys@DEMO> selectf.file#,t.ts#,f.name "File",t.name "tablespace"
2 from v$tempfile f,v$tablespace t
3 where f.ts#=t.ts#
4 and t.name='TEMP01';
FILE# TS# File tablespace
----- --- -------------------------------------------------- -----------------
3 12 /data/oradata/demo/temp01_01.dbf TEMP01
四、删除表空间
语法:
DROP TABLESPACE tablespace_name
INCLUDING CONTENTS [AND DATAFILES] [CASCADECONSTRAINTS]
Tablespace:指定要删除的表空间名称
INCLUDING CONTENTS:删除表空间内的所有段
AND DATAFILES:删除数据文件
CASCADE CONSTRAINTS:如果有其他表空间的表引用了该表空间内表的主键和唯一键,则删除这种引用完整性约束(referential integrity constraints)
示例:
1)删除表空间及所有的段
DROPTABLESPACE dbs01 INCLUDING CONTENTS;
2)删除表空间及关联的所有数据文件
DROP TABLESPACE dbs01 INCLUDING CONTENTSAND DATAFILES;
3)删除所有引用完整性约束
DROP TABLESPACE dbs01 CASCADE CONSTRAINTS;
注意:
不能删除system表空间及具有活动段的表空间;
不使用INCLUDING CONTENTS选项,将无法删除仍包含数据的表空间;
删除表空间之前建议将表空间脱机,避免有事务访问该表空间内的任何段;
删除表空间后,其数据将不再包含在数据库内。
五、维护表空间
5.1默认表空间
在创建用户时如果没有指定表空间,oracle将为用户分配系统默认的表空间
系统默认表空间:
sys@DEMO> select property_name,property_value
1from database_properties
2 whereproperty_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALUE
---------------------------------- -------------------------------
DEFAULT_TEMP_TABLESPACE TEMP
DEFAULT_PERMANENT_TABLESPACE USERS
DEFAULT_TBS_TYPE SMALLFILE
可以看到oracle默认临时表空间为TEMP,默认永久表空间为USERS,如果在创建用户时没有指定表空间,那么将会为这新建的用户分配默认临时表空间和永久表空间。
5.1.1更改默认表空间
//更改默认临时表空间
sys@DEMO > alter database default temporary tablespace temp01;
Database altered.
//更改默认永久表空间
sys@DEMO> alter database default tablespace dbs01;
Database altered.
sys@DEMO> select property_name,property_value
1from database_properties
2 whereproperty_name like 'DEFAULT%';
PROPERTY_NAME PROPERTY_VALUE
---------------------------------- -------------------------------
DEFAULT_TEMP_TABLESPACE TEMP01
DEFAULT_PERMANENT_TABLESPACE DBS01
DEFAULT_TBS_TYPE SMALLFILE
5.2 更改表空间状态
5.2.1只读表空间
将表空间更改为只读时会导致检查点操作,数据只能读不能写,但可从表空间删除对象
//将表空间更改为只读
sys@DEMO> alter tablespace dbs01 readonly;
Tablespace altered.
sys@DEMO> select tablespace_name,statusfrom dba_tablespaces;
TABLESPACE_NAME STATUS
-----------------------------------------------
SYSTEM ONLINE
SYSAUX ONLINE
TEMP ONLINE
USERS ONLINE
TMP ONLINE
DBS01 READ ONLY
//恢复表空间为读写
sys@DEMO> alter tablespace dbs01 read write;
5.2.2 脱机表空间
用途:
-在数据库处于打开状态下移动数据文件
-在数据库处于打开状态下恢复一个表空间或一个数据文件
-执行对表空间的脱机备份(虽然可以对表空间进行联机备份)
-使数据库的一部分不可以被访问,而其他部分可以正常访问。
注意:若在数据库关闭之前有部分表空间是关闭状态,则在数据库开启之后会依然处于脱机状态
不能设为脱机的表空间:
System表空间、具有活动的还原段的表空间、缺省临时表空间
语法:
ALTER TABLESPACE tablespace
{ONLINE|OFFLINE[NORMAL|TEMPORARY|FORRECOVER]}
NORMAL:将该表空间中所有数据文件中的所有块从SGA中清空,这个是缺省设置,在使该表空间重新联机之前,无须对其执行介质恢复,尽可能使用NORMAL子句。
TEMPORARY:对表空间内的所有联机数据文件执行检查点操作,即使某些文件无法写入,所有脱机文件可能都需要进行介质恢复。
IMMEDIATE:不保证空间文件可用,而且不执行检查点操作,在使表空间重新联机前,必须对其进行介质恢复操作。
FOR RECOVER:使表空间脱机以进行表空间时间点恢复。
5.3 调整表空间大小
5.3.1启用AUTOEXTEND自动调整
//在创建表空时启用,如:
sys@DEMO>CREATE TABLESPACE dbs01DATAFILE
2 '/data/oradata/demo/dbs01_01.dbf' SIZE 100M
3 AUTOEXTEND ON NEXT 10M MAXSIZE 200M;
//在创建表空后后启用
语法:
ALTER DATABASE DATAFILE filespec[autoextend_clause]
Autoextend_clause:==[AUTOEXTEND{OFF|ON[NEXT integer[K|M]]
[MAXSIZE UNLIMITED|integer[K|M]]}]
AUTOEXTEND OFF 禁用数据文件的自动扩展
AUTOEXTEND ON 启用数据文件的自动扩展
NEXT 指定在需要更多区分配给数据文件的磁盘空间
MAXSIZE 指定允许分配给该数据文件的最大磁盘空间
UNLIMITED 将分配给数据文件的磁盘空间设为不受限
示例:
sys@DEMO>ALTER DATABASE DATAFILE
2 '/data/oradata/demo/dbs01_01.dbf'
3 AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
验证:
查询DBA_DATA_FILES视图以确定是否启用了AUTOEXTEND
SQL> select tablespace_name,fautoextensible,bytes/(1024*1024)MB,
2 maxbytes/(1024*1024)MAX_MB
3 fromdba_data_files where tablespace_name='DBS01';
TABLESPACE_NAME AUTOEXTEN MB MAX_MB
----------------------------- ------------------- --------- ------------------
DBS01 YES 100 500
5.3.2使用RESIZE手动调整
语法:
ALTER DATABASE [database]
DATAFILE 'filename' …
RESIZE integer[K|M]
Integer 表示的结果数据文件的绝对大小
示例:
sys@DEMO > alter database datafile '/data/oradata/demo/dbs01_01.dbf'resize 150M;
Database altered.
5.3.3添加数据文件
语法:
ALTER TABLESPACE tablespace ADD DATAFILE filename
示例:
sys@DEMO> alter database datafile'/data/oradata/demo/dbs01_01.dbf' autoextend off;
sys@DEMO> alter tablespace dbs01 adddatafile '/data/oradata/demo/dbs01_02.dbf' size 100M;
Tablespace altered.
验证:
sys@DEMO> select file_name,tablespace_name,bytes/(1024*1024)MB
2 from dba_data_files wheretablespace_name='DBS01';
FILE_NAME TABLESPACE_NAME MB
----------------------------------------------- ---------------------- ------------------
/data/oradata/demo/dbs01_01.dbf DBS01 100
/data/oradata/demo/dbs01_02.dbf DBS01 100
5.4 移动数据文件
5.4.1采用offline方式
只适用于上面没有活动的还原数据或临时段的非系统表空间的数据文件
1)将表空间offline
sys@DEMO>> alter tablespace dbs01offline;
Tablespace altered.
2)移动或复制文件到新位置
SQL> host cp/mv /data/oradata/demo/dbs01_02.dbf/home/oracle/dbs01_02.dbf
3)执RENAME修改控制文件
SQL> alter tablespace dbs01 renamedatafile ' /data/oradata/demo/dbs01_02.dbf'
2 to '/home/oracle/dbs01_02.dbf';
Tablespace altered.
4)将表空间online
SQL> alter tablespace dbs01 online;
Tablespace altered.
验证:
sys@DEMO> selecttablespace_name,file_name from
2 dba_data_files wheretablespace_name='DBS01';
TABLESPACE_NAME FILE_NAME
--------------- ----------------------------------------------
DBS01 /data/oradata/demo/dbs01_01.dbf
DBS01 /home/oracle/dbs01_02.dbf
5.4.2 采用rename file方式
适用于系统表空间和不能置为脱机的表空间中的数据文件,该语句只修改控制文件中指向数据文件的指针。
1)关闭数据库
sys@DEMO> shutdown immediate
2):移动文件到新位置
sys@DEMO > host mv /home/oracle/dbs01_02.dbf/data/oradata/demo/dbs01_02.dbf
3)启动数据库到mount状态
sys@DEMO> startup mount
Database mounted.
4)执行RENAME FILE修改控制文件
sys@DEMO> alter database rename file'/home/oracle/dbs01_02.dbf'
2 to'/data/oradata/demo/dbs01_02.dbf';
Database altered. Database altered.
5)打开数据库
sys@DEMO> alter database open;
Database altered.
验证:
sys@DEMO> selecttablespace_name,file_name from
2 dba_data_files wheretablespace_name='DBS01';
TABLESPACE_NAME FILE_NAME
--------------- ----------------------------------------------
DBS01 /data/oradata/demo/dbs01_01.dbf
DBS01 /data/oradata/demo/dbs01_02.dbf
V$TABLESPACE:控制文件中保存的所有的表空间名称和数量。
V$DATAFILE:所有的数据文件信息
V$TEMPFILE:所有的临时文件信息
DBA_TABLESPACES/USER_TABLESPACES:所有(用户可访问的)表空间的描述信息
DBA_SEGMENTS:在所有表空间内的段信息
USER_SEGMENTS:在所有用户可访问的表空间的段信息
DBA_EXTENTS/USER_EXTENTS:在所有/(用户)的表空间内的数据范围的信息
DBA_FREE_SPACE/USER_FREE_SPACE:在所有/(用户)的表空间内的空闲范围的信息
DBA_DATA_FILES:显示属于表空间的数据文件信息
DBA_TEMP_FILES:显示属于临时表空间的临时数据文件信息
DBA_USERS:所有用户的缺省和临时表空间
DBA_TS_QUOTAS:所有的用户的表空间限额