首页 > 代码库 > 17_Oracle_Admin_表空间的管理方式以及UNDO和临时表空间

17_Oracle_Admin_表空间的管理方式以及UNDO和临时表空间

一、表空间的管理

 

wKioL1Qqv13B_6mdAAJJehDMyTs977.jpg

 

数据库表空间的管理主要分为两种:

1.数据字典的表空间管理——当空闲的extents释放了,数据字典中的表会做相应的调整,它相当于中央控制,对全局进行管理

2.本地表空间的管理——tablespace自身来管理空闲的extentsBitmap位图用来记录extents空闲与否,每一个extent对应位图上的一位,其中1表示extent被占用,0表示没有被占用。

 

wKiom1Qqv0SyORt2AADWaX4UGyU286.jpg

 

wKioL1Qqv4WiIzlKAAO-MuqI9No068.jpg

 

wKiom1Qqv3WjFENEAANWhkev3po972.jpg

 

如果SYSTEM是本地管理的,那么该数据库将不支持表空间的数据字典管理方式。

 

wKioL1Qqv76BJ3IFAAIZqWA2gSI956.jpg

 

使用数据字典进行中央管理,需要定期对数据文件进行整理。

 

wKiom1Qqv6WA272BAAHPByc8f0g651.jpg

 

 

二、将Dictionary-Managed方式转换为Locally-Managed方式

wKioL1Qqv_HRQG3TAAFZHg46DXE447.jpg

 

出于一些历史原因或其他的原因,需要将Dictionary 的管理方式转换为本地管理的方式,只需要运行Oracle提供的一个包即可:

 

            DBMS_SPACE_ADMIN.TABLESPACE_MICGRATE_TO_LOCAL(‘SYSTEM’);

  

wKiom1Qqv-CTy1SfAAJNZLFAIf8409.jpg

通过以下具体可以完成转换:

            1. 对数据库进行完整的备份;

            2. 准备一个非SYSTEM的临时表空间,使用命令 CREATE TEMPORARYTABLESPACE可以创建临时表空间

            3. Dictionary-managed的表空间中消除undo的是segments

            4. 至少确保有一个online undosegment是本地管理的。

            5. 将所有表空间(除undo 表空间和默认的临时表空间外)都设为只读模式;

            6. restricted模式启动数据库,以防止其他用户登录;

            7. system的表空间使用DBMS_SPACE_ADMIN.TABLESPACE_MICGRATE_TO_LOCAL(‘SYSTEM’)语句完成转换。

 

需要用到这种转换工作的可能性并不大,仅作了解即可。 

 

三、 UNDO TABLESPACE

 

wKioL1QqwDOTKVM2AAGfYV4XS2g214.jpg

UNDO 表空间主要用来存储UNDO segmentUNDO主要保存的是一条记录修改之前的信息,当需要执行rollback操作时,会将UNDO segment里的信息拷贝到原来的位置。

UNDO Tablespace只能放UNOD的相关信息,它的extent只能是locally managed的。

它的创建方式和其他表空间的创建方式类似,执行CREATEUNDO TABLESPACE即可。

 

四、Temporary Tablespace

 

wKiom1QqwBfzEa2pAAHdprv1c5Q511.jpg

 

临时表空间类似于一个中转站,某些操作如sorting之类的,需要将一些数据存放在这里。它不可以存放一些需要长久保存的数据,可以由多个用户共享,推荐使用locallymanaged的方式。创建方式和其他的tablespace类似: CREATE TEMPORARY TABLESPACE

 

wKiom1QqwCbiY--vAAHfP8W5PYk760.jpg

 

9i及以前的数据库中,如果没有指定缺省的temporary tablespace,那么数据库会将SYSTEM tablespace作为默认的temporary tablespace,这是一个比较危险的操作,因此从10g11g以后在创建数据库时会要求强制指定一个默认的temporary tablespace,且采用locally managed

 

wKioL1QqwGLgjfY6AAG29zR6Tv4332.jpg

 

 

创建默认的temporarytablespace有两种方式,一种是在创建数据库时指定,另一种是创建了数据库之后,使用alterdatabase来指定。

 

wKioL1QqwHfjlSTjAAJZL6S4vtc564.jpg

在创建数据库时指定temporarytablespace,只需要加入DEFAULT TEMPORARYTABLESPACE语句就可以了。

wKiom1QqwFyTevwGAAG4PhpSP84645.jpg

如果创建数据库时没有指定,可以先创建一个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

  

五、临时表空间的局限性

wKioL1QqwJvSHlmKAAEGyuXXMt0232.jpg

 

 缺省的全局临时表空间不能drop,如果要drop一个全局的临时表空间,需要先将其设定为offline,然后将全局的临时表空间alter到另一个表空间(一个数据库可以有多个临时表空间,但只能有一个全局的默认临时表空间;undo 表空间也是同理),再将其drop掉。


本文出自 “重剑无锋 大巧不工” 博客,请务必保留此出处http://wuyelan.blog.51cto.com/6118147/1560199

17_Oracle_Admin_表空间的管理方式以及UNDO和临时表空间