一、表空间的管理
数据库表空间的管理主要分为两种:
1.数据字典的表空间管理——当空闲的extents释放了,数据字典中的表会做相应的调整,它相当于*控制,对全局进行管理
2.本地表空间的管理——tablespace自身来管理空闲的extents;Bitmap位图用来记录extents空闲与否,每一个extent对应位图上的一位,其中1表示extent被占用,0表示没有被占用。
如果SYSTEM是本地管理的,那么该数据库将不支持表空间的数据字典管理方式。
使用数据字典进行*管理,需要定期对数据文件进行整理。
二、将Dictionary-Managed方式转换为Locally-Managed方式
出于一些历史原因或其他的原因,需要将Dictionary 的管理方式转换为本地管理的方式,只需要运行Oracle提供的一个包即可:
DBMS_SPACE_ADMIN.TABLESPACE_MICGRATE_TO_LOCAL(‘SYSTEM’);
通过以下具体可以完成转换:
1. 对数据库进行完整的备份;
2. 准备一个非SYSTEM的临时表空间,使用命令 CREATE TEMPORARYTABLESPACE可以创建临时表空间
3. 从Dictionary-managed的表空间中消除undo的是segments。
4. 至少确保有一个online undo的segment是本地管理的。
5. 将所有表空间(除undo 表空间和默认的临时表空间外)都设为只读模式;
6. 以restricted模式启动数据库,以防止其他用户登录;
7. 对system的表空间使用DBMS_SPACE_ADMIN.TABLESPACE_MICGRATE_TO_LOCAL(‘SYSTEM’)语句完成转换。
需要用到这种转换工作的可能性并不大,仅作了解即可。
三、 UNDO TABLESPACE
UNDO 表空间主要用来存储UNDO segment,UNDO主要保存的是一条记录修改之前的信息,当需要执行rollback操作时,会将UNDO segment里的信息拷贝到原来的位置。
UNDO Tablespace只能放UNOD的相关信息,它的extent只能是locally managed的。
它的创建方式和其他表空间的创建方式类似,执行CREATEUNDO TABLESPACE即可。
四、Temporary Tablespace
临时表空间类似于一个中转站,某些操作如sorting之类的,需要将一些数据存放在这里。它不可以存放一些需要长久保存的数据,可以由多个用户共享,推荐使用locallymanaged的方式。创建方式和其他的tablespace类似: CREATE TEMPORARY TABLESPACE。
9i及以前的数据库中,如果没有指定缺省的temporary tablespace,那么数据库会将SYSTEM tablespace作为默认的temporary tablespace,这是一个比较危险的操作,因此从10g和11g以后在创建数据库时会要求强制指定一个默认的temporary tablespace,且采用locally managed。
创建默认的temporarytablespace有两种方式,一种是在创建数据库时指定,另一种是创建了数据库之后,使用alterdatabase来指定。
在创建数据库时指定temporarytablespace,只需要加入DEFAULT TEMPORARYTABLESPACE语句就可以了。
如果创建数据库时没有指定,可以先创建一个temporarytablespace,然后使用ALTER DATABASEDEFAULT TEMPORARY TABLESPACE来指定:
=======查看temporary tablespace的信息========
SQL> conn / as sysdba
Connected.
SQL> desc database_properties;
Name Null? Type ------------------------------------------------- ------------------ PROPERTY_NAME NOT NULL VARCHAR2(30) PROPERTY_VALUE VARCHAR2(4000) DESCRIPTION VARCHAR2(4000)
SQL> col property_name format a20
SQL> col property_value format a20
SQL> col description format a30
SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION ---------------------------------------------------------------------- DICT.BASE 2 dictionary base tables version # DEFAULT_TEMP_TABLESPACE TEMP Name of default temporary tablespace -- 缺省的temporary tablespace DEFAULT_PERMANENT USERS Name of default permanenttablespace _TABLESPACE DEFAULT_EDITION ORA$BASE Name of the database defaultedition … WORKLOAD_REPLAY_MODE PREPARE implies external replay clients can connect;REPLAY implies workload replay is in progress
查询v$tablespace这个动态性能可以获取所有的表空间名字
SQL> select * from v$tablespace;
TS# NAME INC BIG FLA ENC ---------- ------------------------------ --- --- --- --- 0 SYSTEM YES NO YES 1 SYSAUX YES NO YES 2 UNDOTBS1 YES NO YES 4 USERS YES NO YES 3 TEMP NO NO YES -- temporarytablespace 6 EXAMPLE YES NO YES 6 rows selected.
dba_tablespaces表也有表空间的相关信息:
SQL> desc dba_tablespaces;
Name Null? Type ------------------------------------------------- ------------------- TABLESPACE_NAME NOT NULL VARCHAR2(30) BLOCK_SIZE NOT NULL NUMBER INITIAL_EXTENT NUMBER … EXTENT_MANAGEMENT VARCHAR2(10) CONTENTS VARCHAR2(9)
SQL> select tablespace_name, contents,extent_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN ------------------------------ ---------------------------------------- SYSTEM PERMANENT LOCAL SYSAUX PERMANENT LOCAL UNDOTBS1 UNDO LOCAL TEMP TEMPORARY LOCAL USERS PERMANENT LOCAL EXAMPLE PERMANENT LOCAL 6 rows selected.
=========创建临时表空间============
SQL> create temporary tablespace mytemp
2 tempfile‘/oracle/oradata/orcl/mytemp01.dbf‘ size 100M
3 extent management local;
Tablespace created.
[oracle@localhost ~]$ cd /oracle/oradata/orcl
[oracle@localhost orcl]$ ll
total 1807580 -rw-r-----. 1 oracle oinstall 9748480 Aug 30 11:45 control01.ctl -rw-r-----. 1 oracle oinstall 9748480 Aug 27 09:21 control02.ctl -rw-r-----. 1 oracle oinstall 9748480 Aug 27 09:21 control03.ctl -rw-r-----. 1 oracle oinstall 104865792 Aug 30 07:05example01.dbf -rw-r-----. 1 oracle oinstall 104865792 Aug 30 11:45mytemp01.dbf # 新创建的temporary tablespace,大小为100M … -rw-r-----. 1 oracle oinstall 20979712 Aug 30 10:30 temp01.dbf -rw-r-----. 1 oracle oinstall 57679872 Aug 30 11:45 undotbs01.dbf
这个临时表空间的创建速度非常快,因为操作系统并不是实实在在的划分了100M用作临时表空间,而只是建立了一个框架,通过df命令查询磁盘的剩余空间,可以看到在创建temporarytablespace之前和之后剩余空间并没有发生变化。
SQL> select tablespace_name, contents,extent_management from dba_tablespaces;
TABLESPACE_NAME CONTENTS EXTENT_MAN ------------------------------ --------- ---------- SYSTEM PERMANENT LOCAL SYSAUX PERMANENT LOCAL UNDOTBS1 UNDO LOCAL TEMP TEMPORARY LOCAL USERS PERMANENT LOCAL EXAMPLE PERMANENT LOCAL MYTEMP TEMPORARY LOCAL --新创建的临时表空间 7 rows selected.
=========修改临时表空间的缺省值为新建的临时表空间============
SQL> alter database default temporarytablespace mytemp;
Database altered.
SQL> select * from database_properties;
PROPERTY_NAME PROPERTY_VALUE DESCRIPTION --------------------------------------------------------------------- DICT.BASE 2 dictionary base tablesversion # DEFAULT_TEMP_TABLESP MYTEMP Name of default temp -- 缺省的表空间已经变成MYTEMP了 ACE orary tablespace DEFAULT_PERMANENT_TA USERS Name of default perm BLESPACE
五、临时表空间的局限性
缺省的全局临时表空间不能drop,如果要drop一个全局的临时表空间,需要先将其设定为offline,然后将全局的临时表空间alter到另一个表空间(一个数据库可以有多个临时表空间,但只能有一个全局的默认临时表空间;undo 表空间也是同理),再将其drop掉。
本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1560199