1. 表空间和数据文件的关系

在Oracle数据库中,表空间和数据文件之间的关系非常密切,这二者之间相互依存,也就是说,创建表空间时必须创建数据文件,增加数据文件时也必须指定表空间。

Oracle磁盘空间管理中的最高逻辑层是表空间,它的下一层是段,并且一个段只能驻留在一个表空间内。段的下一层就是盘区,一个或多个盘区可以组成一个段,并且每个盘区只能驻留在一个数据文件中。

如果一个段跨越多个数据文件,它就只能由多个驻留在不同数据文件中的盘区构成。盘区的下一层就是数据块,它也是磁盘空间管理中逻辑划分的最底层,一组连续的数据块可以组成一个盘区。

如果要查询表空间与对应的数据文件的相关信息,可以从dba_data_files数据字典获得。

在system模式下,从dba_data_files数据字典中查询表空间以及包含的数据文件:SQL> col tablespace_name for a10
SQL> col file_name for a50
SQL> col bytes for 999,999,999
SQL> select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

从查询所列的结果来看,一个数据库包括多个表空间,如SYSTEM表空间,USERS表空间,tbsp_1表空间等。而每一个表空间又包含一个或多个数据文件,如USERS表包括一个数据文件USERS01.DBF,而TBSP_1表空间包括TBSP_1.DBF和TBSP_2.DBF两个数据文件。表空间可以看成是Oracle数据库的逻辑结构,而数据文件可以看成是Oracle数据库的物理结构。

2. Oracle 11g 的默认表空间

默认表空间是指在创建Oracle数据时,系统自动创建的表空间。这些表空间通常用于存放Oracle系统内部数据和提供样例所需要的逻辑空间,Oracle 11g默认的表空间及其说明:

表空间          说明
EXAMPLE         如果安装时选择"实例方案",则此表空间存放各样例的数据。
SYSAUX          SYSTEM表空间的辅助空间。一些选件的对象都存放在此表空间内,这样可以减少SYSTEM表空间的负荷。
SYSTEM          存放数据字典,包括表,视图,存储过程的定义等。
TEMP            存放SQL语句处理的表和索引的信息,如果数据排序就占用此空间。
UNDOTBS1        存放撤销数据的表空间。
USERS           通常用于存放"应用系统"所使用的数据对象。

2.1 SYSTEM表空间

Oracle数据库的每个版本都使用SYSTEM表空间存放内部数据和数据字典,SYSTEM表空间主要存放sys用户的每个对象和其他用户的少量对象。用户可以从dba_segments数据字典中查询到某个空间所存放的数据对象及其类型(如索引,表,簇等)和拥有者。

查询USERS表空间内存放的数据对象及其类型和拥有者,代码如下:

SQL> col owner for a10;
SQL> col segment_name for a30;
SQL> col segment_type for a20;
SQL> select segment_type,segment_name,owner from dba_segments where tablespace_name='USERS';

2.2 SYSAUX表空间

SYSTEM表空间主要用于存放Oracle系统内部的数据字典,而SYSAUX表空间则充当SYSTEM的辅助表空间,主要用于存储除数据字典以外的其他数据对象,它在一定程度上降低了SYSTEM表空间的负荷。

查询SYSAUX表空间所存放的用户及其所拥有的对象数量,代码如下:

SQL> select owner as 用户,count(segment_name) as 对象数量 from dba_segments where tablespace_name='SYSAUX' group by owner;

注意:用户可以对SYSAUX表空间进行增加数据文件和监视等操作,但不能对其执行删除,重命名或设置只读(READ ONLY)等操作。

3. 创建表空间

为了简化表空间的管理并提高系统性能,Oracle建议将不同类型的数据类型存放到不同的表空间中,因此,在创建数据库后,数据库管理员还应该根据具体应用情况,建立不同类型的表空间。

例如,建立专门用于存放表数据的表空间,建立专门用于存放索引或簇数据的表空间等,因此创建表空间的工作就显得十分重要,那么在创建表空间时必须要考虑以下几点:

(1)是创建小文件表空间,还是大文件表空间(默认是小文件表空间)。
(2)是使用局部盘区管理方式,还是使用传统的目录盘区管理方式(默认为局部盘区管理)。
(3)是手工管理段空间,还是自动管理段空间(默认为自动)。
(4)是否是用于临时段或撤销段的特殊表空间。

3.1 创建表空间语法

创建表空间的语法如下:CREATE [SMALLFILE/BIGFILE] TABLESPACE tablespace_name
DATAFILE '/path/filename' SIZE num[k/m] REUSE
[,'/path/filename' SIZE num[k/m] REUSE]
[,...]
[AUTOEXTEND [ON|OFF] NEXT num[k/m]
[MAXSIZE [UNLIMITED | [num[k/m]]]]
[MININUM EXTENT num[k/m]]
[DEFAULT STORAGE storage]
[ONLINE | OFFLINE]
[LOGGING | NOLOGGING]
[PERMANENT | TEMPORARY]
[EXTENT MANAGEMENT DICTIONARY | LOCAL [LOCAL [AUTOALLOCATE|UNIFORM SIZE num[k/m]]]]]

(1)语法中的关键字

 a. SMALLFILE/BIGFILE: 表示创建的是小文件表空间还是大文件表空间。b. AUTOEXEND [ON|OFF] NEX: 表示数据文件为自动扩展(ON)或非自动扩展(OFF),如果是自动扩展,则需要设置NEXT的值。c. MAXSIZE: 表示当数据文件自动扩展时,允许数据文件扩展的最大字节数,如果指定UNLIMITED关键字,则不需要指定字节长度。d. MINIMUN EXTENT: 指定最小的长度,由操作系统和数据库的块决定的。e. ONLINE|OFFLINE: 创建表空间时可以指定为在线或离线。f. PERMANENT|TEMPORARY: 指定创建的表空间是永久表空间或临时表空间,默认为永久性表空间。g. LOGGING|NOLOGGING: 指定该表空间内的表在加载数据时是否产生日志,默认为产生日志(LOGGING)。即使设置NOLOGGING,但在进行INSERT,UPDATE和DELETE操作时,Oracle仍会将操作信息记录到Redo Log Buffer中。h. EXTENT MANAGEMENT DICTIONARY | LOCAL: 指定表空间的扩展方式是使用数据字典管理还是本地化管理,默认为本地化管理。Oracle不推荐使用数据字典管理表空间。j. AUTOALLOCATE | UNIFORM SIZE: 如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定还是按照等同大小进行。若是按照等同大小进行,则默认每次扩展的大小为1MB.

(2)语法中的参数

 a. tablespace_name: 该参数表示要创建的表空间的名称。b. '/path/filename': 该参数表示数据文件的路径与名称。REUSE表示若该文件存在,则清除该文件再重新建立该文件,若该文件不存在,则创建该文件。c. DEFAULT STORAGE storage: 指定以后要创建的表,索引及簇的存储参数值,这些参数将影响以后表等对象的存储参数值。

3.2 通过本地化管理方式创建表空间

本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态,位图中的每个单元对应一个块或一组块。
当分配和释放一个扩展时,Oracle会改变位图的值以指示该块的状态。这些位图值的改变不会产生回滚信息,因为它们不更新数据字典的任何表。所以本地管理表空间具有以下优点:
(1)使用本地化的扩展管理功能(包括自动大小和等同大小两种),可以避免发生重复的空间管理操作。
(2)本地化管理的自动扩展(AUTOALLOCATE)能够跟踪邻近的自由空间,这样可以消除结合自由空间的麻烦。本地化的扩展大小可以由系统自动确定(AUTOALLOCATE), 也可以选择所有的扩展有同样的大小(UNIFORM)。通常使用EXTENT MANAGEMENT LOCAL子句创建本地化的可变表空间。

下面来看两个创建表空间的例子,一个是指定等同的扩展大小,另一个是由系统自动指定扩展大小。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为等同的256kb,代码如下:

SQL> create tablespace tbs_test_1 datafile 'D:\OracleFiles\OracleData\datafile1.dbf'
size 10m
extent management local uniform size 256K;表空间已创建。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,代码:


SQL> create tablespace tbs_test_2 datafile 'D:\OracleFiles\OracleData\datafile2.dbf'
size 10m
extent management local autoallocate;表空间已创建。

在上面的两个例子中,由于创建的都是本地化管理方式的表空间,因此都是用EXTENT MANAGEMENT LOCAL子句。当创建扩展大小等同的表空间时,使用UNIFORM关键字,并指定每次扩展时的大小;当创建扩展大小为自动管理的表空间时,使用AUTOALLOCATE关键字,并且不需要指定扩展时的大小。

3.3 通过段空间管理方式创建表空间

段空间管理方式是建立在本地化空间管理方式基础之上的,即只有本地化管理方式的表空间,才能在其基础上进一步建立段空间管理方式。它使用SEGMENT SPACE MANAGEMENT MANUAL/LOCAL语句,段空间管理又可分为手工段和自动段两种空间管理方式。

(1)手工段空间管理方式

手工段空间管理方式是为了向后兼容保留的,它使用自由块列表和PCT_FREE与PCT_USED参数来标识可供插入操作使用的数据块。
在每个INSERT或UPDATE操作后,数据库都会比较该数据块中的剩余自由空间与该段的PCT_FREE设置。如果数据块的剩余自由空间少于PCT_FREE自由空间(也就是说剩余空间已经进入系统的下限设置),则数据库就会从自由块列表上将其取下,不再对其进行插入操作。剩余的空余空间保留给可能会增大该数据块行大小的UPDATE操作。
而在每个UPDATE操作或DELETE操作后,数据库会比较该数据块中的已用空间与PCT_USED设置,如果已用空间少于PCT_USED已用空间(也就是已用空间未达到系统的上限设置),则该数据块会被加入到自由列表中,供INSERT操作使用。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为手工,代码及运行结果如下:

SQL> create tablespace tbs_test_3 datafile 'D:\OracleFiles\OracleData\datafile3.dbf'
size 20m
extent management local autoallocate
segment space management manual;表空间已创建。

(2)自动段空间管理方式

如果采用自动段管理方式,那么数据库会使用位图而不是自由列表来标识哪些数据块可以用于插入操作,哪些数据块需要从自由块列表上将其取下。此时,表空间段的PCT_FREE和PCT_USED参数会被自动忽略。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为自动,代码:

SQL> create tablespace tbs_test_4 datafile 'D:\OracleFiles\OracleData\datafile4.dbf'
size 20m
extent management local autoallocate
segment space management auto;表空间已创建。

对于使用自动段空间管理方式,用户需要注意以下两种情况:
(1)自动段空间管理方式不能用于创建临时表空间和系统空间。
(2)Oracle本身推荐使用自动段空间管理方式管理永久表空间,但其默认情况下却是MANUAL(手工)管理方式,所以在创建表空间时需要将段空间管理方式明确指定为AUTO。

3.4 创建非标准块表空间

在Oracle数据库中,通常的块大小为8192B,即8KB,但Oracle 11g 允许创建块大小与基本块不同的表空间。块大小可由创建表空间时的BLOCKSIZE参数指定,这样有利于存储不同大小的对象,但用户需要注意以下3点:
(1)表空间的非标准块的大小为基本块的倍数。如大小为16KB, 64KB, 128KB.
(2)Oracle 11g 通常使用SGA自动共享内存管理,因此需要设置初始化参数DB_16K_CACHE_SIZE=16K。
(3)这种块较大的表空间通常用来存放大对象(LOB)类型。

创建一个非标准块的表空间,块的大小为标准块的2倍,代码:

SQL> alter system set db_16k_cache_size=16M scope=both;
系统已更改。SQL> create tablespace tbs_test_5 datafile 'D:\OracleFiles\OracleData\datafile5.dbf'
size 64m reuse
autoextend on text 4m maxsize unlimited
blocksize 16k
extent management local autoallocate
segment space management auto;表空间已创建。

注意:若不设置初始化参数DB_16K_CACHE_SIZE,则Oracle会显示"ORA-29339:表空间块大小16384与配置块大小不匹配"这样的提示信息。

3.5 建立大文件表空间

从Oracle 11g版本开始,引进了一个新的表空间类型--大文件(BIGFILE)。与之前版本的最多可由1022个文件组成的表空间不同,大文件表空间存放在一个单一的数据文件中,并且它需要更大的磁盘容量来存放数据。大文件表空间可以根据选择的块的大小而变化,从32TB增至128TB。

大文件表空间是为超大型数据库而设计的。当一个超大型数据库具有上千个读/写数据文件时,必须更新数据文件头部(如检查点)的操作可能会花费相当长的时间。如果降低数据文件的数量,那么这些操作完成起来就可能会快很多。创建一个大文件表空间,只需要在CREATE语句中使用BIGFILE关键字即可。

创建一个大文件表空间,指定一个数据文件,并且数据文件的大小为2GB,代码运行结果如下:

SQL> create bigfile tablespace tbs_test_big datafile 'D:\OracleFiles\OracleData\datafilebig.dbf'
size 2g;表空间已创建。

注意:在创建大文件表空间时,由于指定的数据文件都比较大,因此通常这个创建过程都比较慢一些,用户要耐心等待,不要急于结束操作。

说明:大文件表空间主要被使用在存储区域网络(SAN)上,磁盘阵列上,自动存储管理(ASM)上和类似的提供禁止数据访问多设备的存储解决方案上。

由于大文件表空间只有一个数据文件,因此当需要重新设置其大小时不需要标识数据文件的具体路径和名称,只需要使用ALTER TABLESPACE命令指定大文件表空间的名称,即可很方便地修改其大小。另外,需要注意的是:在创建表空间地语法中使用SIZE来标识数据文件的大小,而在修改表空间时,要使用RESIZE关键字来重置数据文件的大小。

修改大文件表空间tbs_test_big,将其空间大小由2GB改变为1GB,代码:

SQL> alter tablespace tbs_test_big resize 1g;表空间已更改。

与大文件表空间不同的是,传统表空间可能包含多个数据文件,如果要改变其大小,则需要在ALTER DATABASE语句后面指定完整的操作系统路径名称或内部文件号辨别每个数据文件,然后再重新设置它们的大小。

把数据文件datafile3.dbf(其所属的表空间是tbs_test_3)的大小由原来的20MB修改为100MB,代码:

SQL> alter database datafile 'D:\OracleFiles\OracleData\datafile3.dbf'resize 100m;数据库已更改。

4. 维护表空间与数据文件

在创建完成各种表空间后,还需要数据库管理员经常对它们进行维护,常见的操作有改变表空间的可用性与读写性,重命名表空间,删除表空间,向表空间中添加新数据文件等。

4.1 设置默认表空间

在Oracle数据库中创建用户(使用CREATE USER语句)时,如果不指定表空间,则默认的临时表空间是TEMP,默认的永久表空间是SYSTEM,这样就导致应用系统与Oracle系统竞争使用SYSTEM表空间,会极大的影响Oracle系统的执行效率。为此,Oracle建议将非SYSTEM表空间设置为应用系统的默认永久表空间,并且将非TEMP临时表空间设置为应用系统的临时表空间。这样有利于数据库管理员根据应用系统的运行情况适时调整默认表空间和临时表空间。

更改默认临时表空间需要使用ALTER DATABASE DEFAULT TEMPRORY TABLESPACE语句,更改默认永久表空间需要使用ALTER DATABASE DEFAULT TABLESPACE语句。

将临时表空间temp_1设置为默认的临时表空间,代码如下:

SQL> alter database default temporary tablespace temp_1;

将表空间tbs_example设置为默认的永久表空间,代码如下:

SQL> alter database default tablespace tbs_example;

4.2 更改表空间的状态

表空间有只读和可读写两种状态,若设置某个表空间为只读状态,则用户不能够对该表空间中的数据进行DML操作(INSERT, UPDATE, DELETE等),但对某些对象的删除操作还是可以进行的,例如,索引和目录就可以被删除掉;若设置某个表空间为可读写状态,则用户就可以对表空间中的数据进行任何正常的操作,这也是表空间的默认状态。

设置表空间为只读状态,可以保证表空间数据的完整性。通常在进行数据库的备份,恢复及历史数据的完整性保护时,可将指定的表空间设置成只读状态。但设置表空间为只读并不是可以随意进行的,必须要满足下列条件。
(1)该表空间必须为ONLINE状态。
(2)该表空间不能包含任何回滚段。
(3)该表空间不能在归档模式下。

更改表空间的读写状态需要使用ALTER TABLESPACE...READ|READ WRITE语句,下面通过两个例子来查看如何更改表空间的读写状态。

修改tbs_test_3表空间为只读状态,代码及运行结果如下:

SQL> alter tablespace tbs_test_3 read only;表空间已更改。

修改tbs_test_3表空间为可读写状态,代码如下:

SQL> alter tablespace tbs_test_3 read write;表空间已更改。

4.3 重命名表空间

在Oracle 11g以前的版本中,表空间无法重命名,但Oracle 11g提供了对表空间进行重命名的新功能,这对于一般的管理和移植来说是非常方便的。

但要注意的是:数据库管理员只能对普通的表空间进行重命名,不能够对SYSTEM和SYSAUX表空间进行重命名,也不能对已经处于OFFLINE状态的表空间进行重命名。

重命名表空间需要使用ALTER TABLESPACE...RENAME TO语句。

把tbs_test_3表空间重命名为tbs_test_3_new,代码如下:

SQL> alter tablespace tbs_test_3 rename to tbs_test_3_new;表空间已更改。

注意:在修改完表空间名称之后,原表空间中存放的数据库对象(表,索引,簇等)会被存放到新表空间名下。

4.4 删除表空间

当不再需要某个表空间中的数据时,或者新创建的表空间不符合要求时,可以考虑删除这个表空间。若要删除表空间,则需要用户具有DROP TABLESPACE权限。

在默认情况下,Oracle系统不采用Oracle Managed Files方式管理文件,这样删除表空间实际上仅是从数据字典和控制文件中将该表空间的有关信息清除掉,并没有真正删除该表空间包含的所有物理文件。

因此,要想彻底删除表空间来释放磁盘空间,在执行删除表空间的命令后,还需要手工删除该表空间包含的所有物理文件。

当Oracle系统采用Oracle Managed Files方式管理文件时,删除某个表空间后,Oracle系统将自动删除该表空间包含的所有的物理文件。删除表空间需要使用DROP TABLESPACE命令,其语法格式如下:

DROP TABLESPACE tbs_name[INCLUDING CONTENTS][CASCADE CONSTRAINTS](1)tbs_name:表示要删除的表空间名称。
(2)INCLUDING CONTENTS:表示删除表空间的同时删除表空间中的数据。如果不指定INCLUDING CONTENTS参数,而该表空间又存有数据时,则Oracle会提示错误。
(3)CASCADE CONSTRAINTS: 表示当删除当前表空间时也删除相关的完整性限制。完整性限制包括主键及唯一索引等。如果完整性存在,而没有CASCADE CONSTRAINTS参数,则删除时Oracle会提示错误,并且不会删除该表空间。

删除表空间tbs_test_1及其包含的所有内容,代码如下:

SQL> drop tablespace tbs_test_1
including contents
cascade constraints;表空间已删除。

*** 不但删除了表空间tbs_test_1,而且也删除了表空间中的数据和完整性约束。

4.5 维护表空间中的数据文件

维护表空间中的数据文件主要包括向表空间中添加数据文件,从表空间中删除数据文件和对表空间中的数据文件进行自动扩展设置。

** 向表空间中添加数据文件
当某个非自动扩展表空间的扩展能力不能满足新的扩展需求时,数据库管理员就需要向表空间中添加新的数据文件(如添加一个能够自动扩展的表空间),以满足数据对象的扩展需要。

向USERS表空间中添加一个新的数据文件users02.dbf,该文件支持自动扩展,扩展能力每次扩展5MB,并且该文件的最大空间不受限制,代码及运行结果如下:

SQL> alter tablespace users add datafile 'e:\app\Administrator\oradata\orcl\users02.dbf'size 10m autoextend on next 5m maxsize unlimited;表空间已更改。

** 从表空间中删除数据文件
在Oracle 11g R2以前的版本中,Oracle系统一直只允许增加数据文件到表空间,而不允许从表空间中删除数据文件。从Oracle 11gR2开始,允许从表空间删除无数据的数据文件。要实现从表空间中删除数据文件,需要使用ALTER TABLESPACE...DROP DATAFILE语句。

删除USERS表空间中的users02.dbf数据文件,代码及运行结果:

SQL> alter tablespace users drop datafile 'e:\app\Administrator\oradata\orcl\user02.dbf';表空间已更改。

** 对数据文件的自动扩展设置

Oracle 数据库的数据文件可以设置成具有自动扩展的功能,当数据文件剩余的自由空间不足时,它会按照设定的扩展量自动扩展到指定的值。这样可以避免由于剩余表空间不足而导致数据对象需求空间扩展失败的问题。

可以通过AUTOEXTEND ON命令将数据文件设置为在使用中能根据需求自动扩展。用户可以通过以下4种方式设置数据文件的自动扩展功能。

(1)在CREATE DATABASE语句中设置。
(2)在ALTER DATABASE语句中设置。
(3)在CREATE TABLESPACE语句中设置。
(4)在ALTER TABLESPACE语句中设置。

对于Oracle数据库管理员来说,主要是利用后3种命令修改数据文件为是否可以自动扩展,因为数据库实例已经创建完成,所以不再需要使用CREATE DATABASE 命令。下面通过一个使用ALTER DATABASE命令来设置数据文件具有自动扩展功能的例子。

首先查询 TBS_TEST_2 表空间中的数据文件是否为自动扩展,若不是自动扩展,将其修改为自动扩展,扩展量为10MB,并且最大的扩展空间不受限制,代码及运行结果如下:

SQL> col file_name for a50;
SQL> select file_name, autoextensible from dba_data_files where tablespace_name='TBS_TEST_2';SQL> alter database datafile 'D:\OracleFiles\OracleData\datafile2.dbf'autoextend on next 10m maxsize unlimited;数据库已更改。

5. 管理撤销表空间

撤销表空间(UNDO表空间)用于存放撤销信息,当执行DML操作(NSERT, UPDATE和DELETE等)时,Oracle会将这些操作的旧数据(即撤销信息)写入UNDO段中,而UNDO段驻留在UNDO表空间中。

5.1 撤销表空间的作用

撤销表空间,通常也称为UNDO表空间;UNDO表空间中的段也称为撤销段或UNDO段;撤销段中存放的数据就是"撤销信息",这些"撤销信息"也称为撤销数据或UNDO段,可见,撤销段是最直接管理"撤销信息"的逻辑层。

(1)使读写一致。在不同的进程或用户模式下检索数据时,Oracle只能给用户提供被提交的数据,这样可以确保数据的一致性。例如,在scott模式下,执行了"UPDATE emp SET sal=5500 WHERE empno=7788"语句,这样旧的数据记录会被存放到UNDO段中,而新数据则会存放到emp段,假定此时该数据尚未提交(如果没有执行COMMIT命令,也没有退出SQL*Plus环境)。然后用户在system模式下执行"SELECT sal FROM scott.emp WHERE empno=7788"语句,此时用户将取得"旧的工资数据",而不是新数据5500,而该数据正是从UNDO段中读取的。

(2)可以回退事务。当执行修改(UPDATE)数据操作时,旧的数据(即UNDO数据)被存放到UNDO段,而新的数据被存放到数据段中。如果在修改操作中事务提交出现错误,就需要回退事务,从而取消数据的更改。

(3)事务恢复。事物恢复是例程恢复的一部分,它是由Oracle服务器自动完成的。如果在数据库运行过程中出现例程失败(如断电,内存故障等),那么当重启Oracle服务器时,后台进程SMON会自动执行例程恢复。执行例程恢复时,Oracle会重新处理所有未提交的数据记录,回退未提交事务。

(4)闪回操作。Oracle 11g新增了强大的闪回功能,其中很多闪回技术都是基于UNDO段实现的,如闪回表,闪回事务查询,闪回版本查询等。

5.2 撤销表空间的初始化参数

Oracle 11g可以通过设置初始化参数来控制UNDO表空间管理撤销数据,与UNDO表空间有关的参数有以下几种。

** UNDO_TABLESPACE。该初始化参数用于指定例程所要使用的UNDO表空间,使用自动UNDO管理模式时,通过配置该参数可以指定例程所要使用的UNDO表空间。
** UNDO_MANAGEMENT。该初始化参数用于指定UNDO数据的管理模式,如果为AUTO,则为自动撤销管理模式,如果为MANUAL,则为回滚段管理模式。

需要注意的是:使用自动撤销管理模式时,如果配置初始化参数UNDO_TABLESPACE,Oracle会自动选择第一个可用的UNDO表空间存放UNDO数据;如果没有可用的UNDO表空间,Oracle会使用SYSTEM回滚段存放UNDO记录,并在ALTER文件中记载警告。

** UNDO_RETENTION。该初始化参数用于控制UNDO数据的最大保留时间,默认为900秒。
    从Oracle 9i 版本开始,通过配置该初始化参数,可以指定UNDO数据的保留时间,从而也决定了基于UNDO数据的闪回操作能够闪回的最早时间点。

用户想要查询当前实例所设置的UNDO表空间参数,可以通过SHOW PARAMETER命令来完成。

5.3 撤销表空间的基本操作

对撤销表空间的基本操作包括创建,修改,切换和删除等。

(1)创建UNDO表空间
创建UNDO空间需要使用CREATE UNDO TABLESPACE语句。
创建一个撤销表空间,并指定数据文件大小为100MB,代码如下:

SQL> create undo tablespace undo_tbs_1datafile 'D:\OracleFiles\OracleData\undotbs1.dbf'size 100MB;表空间已创建。

在创建UNDO表空间时,需要注意以下两个方面。
** UNDO表空间对应的数据文件大小通常由DML操作可能产生的最大数据量来确定,通常该数据文件的大小至少应在1GB以上。
** 由于UNDO表空间只用于存放撤销数据,所以不要在UNDO表空间内建立任何数据对象(如表,索引等)。

(2)修改UNDO表空间
与修改普通的永久性表空间类似,修改UNDO表空间也使用ALTER TABLESPACE语句。当事务用尽了UNDO表空间后,可以使用ALTER TABLESPACE...ADD DATAFILE语句添加新的数据文件;当UNDO表空间所在的磁盘填满时,可以使用ALTER TABLESPACE...RENAEM DATAFILE语句将数据文件移动到其他磁盘上;当数据库处于ARCHIVELOG模式时,可以使用ALTER TABLESPACE...BEGIN BACKUP/END BACKUP语句备份UNDO表空间。

向表空间undo_tbs_1中添加一个新的数据文件,指定该文件大小为2GB,代码:

SQL> alter tablespace undo_tbs_1add datafile 'D:\OracleFiles\OracleData\undotbs_add.dbf'size 2g;表空间已更改。

(3)切换UNDO表空间
启动例程并打开数据库后,同一时刻指定例程只能使用一个UNDO表空间,切换UNDO表空间是指停止例程当前使用的UNDO表空间,启动其他UNDO表空间,下面以启动undo_tbs_1表空间为例,说明切换UNDO表空间的方法。

把当前系统的系统UNDO表空间切换到自定义撤销表空间undo_tbs_1,代码:

SQL> alter system set undo_tablespace=undo_tbs_1;系统已更改。说明:通常情况下,Oracle 11g默认的UNDO表空间是UNDOTBS1。

(4)删除UNDO表空间
如果某个自定义的UNDO表空间确定不再使用了,数据库管理员就可以将其删除。删除UNDO表空间与删除普通的永久表空间一样,都使用DROP TABLESPACE语句。

但需要注意的是:当前例程正在使用的UNDO表空间是不能删除的,如果确定要删除当前例程正在使用的UNDO表空间,管理员应首先切换UNDO表空间,然后再删除切换掉的UNDO表空间。

把当前例程的UNDO表空间从undo_tbs_1切换到undotbs1,然后删除undo_tbs_1表空间,代码:

SQL> alter system set undo_tablespace=undotbs1系统已更改。SQL> drop tablespace undo_tbs_1;表空间已删除。

(5)查询UNDO表空间的信息
通过查询UNDO表空间的相关信息,可以给管理员提供决策和管理支持,管理员经常需要查看的UNDO表空间信息主要有以下几种。

*** 当前例程正在使用的UNDO表空间。
这个通过查询初始化参数undo_tablespace就可以实现查询。

查询当前实例正在使用的UNDO表空间,代码:

SQL> show parameter undo_tablespace;

*** 实例的所有UNDO表空间。
查询当前实例拥有的所有UNDO表空间,代码:

SQL> select tablespace_name from dba_tablespaces where contents='UNDO';

*** UNDO表空间的统计信息
使用自动UNDO管理模式时,需要合理设置UNDO表空间的大小,为了合理规划UNDO表空间的大小,应在数据库运行的高峰期搜索UNDO表空间的统计信息,最终根据该统计信息来确定UNDO表空间大小。

管理员通过查询动态性能视图v$undostat可以搜索UNDO统计信息。

统计UNDO表空间"回退块"的生成信息,代码如下:

SQL> select to_char(begin_time,'hh24:mm:ss') as 开始时间,to_char(end_time,'hh24:mi:ss') as 结束时,undoblks as 回退块数from v$undostatorder by begin_time;

*** 显示UNDO段统计信息。
使用自动UNDO管理模式时,Oracle会在UNDO表空间上自动创建10个UNDO段。

若要显示所有联机UNDO段的名称,则可以通过查询动态视图v$rollname来实现;若要显示UNDO段的统计信息,则可以通过查询动态性能视图v$rolllistat来实现。如果在v$rolllname和v$rolllistat之间执行连接查询,则可以监视特定UNDO段的特定信息。

通过动态性能视图监视特定UNDO段的信息,包括段名称,活动事务个数和段中的扩展个数等信息,代码:

SQL> select rn.name, rs.xacts, rs.writes, rs.extentsfrom v$rollname rn, v$rollstat rswhere rn.usn=rs.usn;

NAME列用于标识UNDO段的名称;XACTS列用于标识UNDO段所包含的活动事务个数;WRITES列用于标识在UNDO段上写入的字节数;EXTENTS列用于标识UNDO段的区个数。

(5)显示活动事务信息。

执行DML操作时,Oracle会将这些操作的旧数据放到UNDO段中。如果要显示会话的详细信息,则可以使用动态性能视图v$session;

如果要显示事务的详细信息,则可以使用动态性能视图v$transaction;如果要显示联机undo段名称,则可以使用v$rollname动态性能视图。

*** 通过查询v$transaction动态性能视图来显示事务的名称和状态,示例代码如下:

SQL> select name, status from v$transaction;

(6) 显示UNDO区信息
在数据字典dba_undo_extents中,用户可以查询UNDO表空间中所有区的详细信息,包括UNDO区的大小和状态等信息。

*** 在dba_undo_extents数据字典中,查询指定段的信息,包括段编号,段的大小和段的状态等,代码如下:

SQL> select segment_name, extent_id, bytes, status from dba_undo_extentswhere segment_name='_SYSSMU3_991555123$';

在上面的运行结果中,SEGMENT_NAME列用于标识指定的段名称,EXTENT_ID列用于标识区编号,BYTES列用于标识区尺寸,STATUS列用于标识区状态(ACTIVE: 表示该区处于活动状态,EXPIRED: 标识该区未用)。

6. 管理临时表空间

6.1 临时表空间简介

临时表空间是一个磁盘空间,主要用于内存排序区不足而必须将数据写到磁盘的那个逻辑区域,由于该空间在排序操作完成后可以由Oracle系统自动释放,因此也称作临时表空间。

临时表空间主要用于临时段,而临时段是由数据库根据需要创建,管理和删除的,这些临时段的生成通常与排序之类的操作有关,下面的几种操作经常会用到临时表空间。

** SELECT DISTINCT 不重复检索。
** UNION 联合查询。
** MINUS 计算。
** ANALYZE 分析。
** 连接两个没有索引的表。

6.2 创建临时表空间

通常使用 CREATE TEMPORARY TABLESPACE 语句来创建临时表空间。

** 创建一个临时表空间,空间大小为300MB,代码如下:

SQL> create temporary tablespace temp_01 tempfile 'D:\OracleFiles\tempfiles\temp_01.tpf' size 300m;表空间已创建。

在临时表空间创建完毕后,可以通过ALTER DATABASE 命令修改默认的临时表空间为新创建的临时表空间,这样Oracle系统就会使用新创建的临时表空间来存放临时数据。

** 把新创建的临时表空间temp_01设置为系统默认的临时表空间,代码:

SQL> alter database default temporary tablespace temp_01;数据库已更改。

临时表空间使用临时文件而不是数据文件来创建的。另外,临时表空间不需要备份。临时表空间中的数据的修改也不会被记录到重做日志中。

说明:关于临时表空间的其他操作,如重命名表空间,删除表空间,这些与永久性表空间的操作基本相同。

6.3 查询临时表空间的信息

Oracle 11g将临时表空间与相应的临时文件信息存放在dba_temp_files 数据字典中。在v$tempfiles视图中,可以查看临时表的使用情况。

*** 查询系统的临时表空间信息,包括临时文件,,空间大小和空间名称,代码如下:

SQL> col file_name for a40;
SQL> col tablespace_name for a10;
SQL> select file_name, bytes, tablespace_name from dba_temp_files;

6.4 关于临时表空间组

在Oracle 11g中,可以创建多个临时表空间,然后把它们组成一个临时表空间。这样,应用系统中的数据就可以使用组里的多个临时表空间。在一个临时表空间组里至少有一个临时表空间,其最大个数没有限制,但是组的名称不能和其他临时表空间的名称相同。用户使用临时表空间组来管理临时数据具有以下作用:

*** 避免因大量的排序数据而导致单一临时表空间容量不足。
*** 当一个用户同时有多个会话时,可以使得它们使用组中的不同临时表空间。
*** 使并行的服务器在单节点上能够使用多个临时表空间。

用户可以在创建临时表空间的同时创建临时表空间组,如果删除组中的全部临时表空间,那么该组也将消失。另外,用户也可以将一个临时表空间从一个组移到另一个组,或是向组里添加新的表空间。

(1)创建临时表空间
创建临时表空间组主要使用GROUP子句。

创建一个临时表空间组,并向其中添加两个临时表空间,代码:

SQL> create temporary tablespace tp1 tempfile 'D:\OracleFiles\tempfiles\tp1.tpf' size 10m tablespace group group1;表空间已创建。SQL> create temporary tablespace tp2 tempfile 'D:\OracleFiles\tempfiles\tp2.tpf' size 20m tablespace group group1;表空间已创建。

(2)转移临时表空间到另外一个组
转移临时表空间到另外一个组主要使用 ALTER TABLESPACE 语句。

*** 创建临时表空间组group3,将组group1中的临时表空间tp1转移到group3中,代码:

SQL> create temporary tablespace tp3 tempfile 'D:\OracleFiles\tempfiles\tp3.tpf' size 10m tablespace group group3;表空间已创建。SQL> alter tablespace tp1 tablespace group group3;表空间已更改。

在将组group1中的临时表空间tp1转移到组group3中之后,用户可以通过查询dba_tablespace_groups数据字典来查看组group3中的临时表空间。

*** 在数据字典dba_tablespace_groups中查询组group3中所包含的临时表空间,代码:

SQL> select * from dba_tablespace_groups where group_name='GROUP3';

原来在组group1中的表空间tp1, 现在被转移到组group3中。

(3)把临时表空间组分配给指定的用户使用。
把临时表空间组group3分配给hr用户使用,代码:

SQL> alter user hr temporary tablespace group3;用户已更改。

(4)设置默认的临时表空间组。
设置默认的表空间组主要使用ALTER DATABASE 语句来实现。

*** 修改数据库的默认表空间组为group3,代码:

alter database orcl default temporary tablespace group3;数据库已更改。

(5)删除临时表空间组。
删除临时表空间组主要通过删除组成临时表空间组的所有临时表空间来实现。

删除组group3中的tp1临时表空间,代码如下:

SQL> drop tablespace tp1 including contents and datafiles;表空间已删除。

在删除组 group3中的一个表空间 tp1 之后,再通过查询 dba_tablespace_groups 数据字典来查看 group3 中的表空间是否存在,实例如下。

*** 在dba_tablespace_groups 数据字典中查询组group3中的表空间信息,代码如下:

SQL> select * from dba_tablespace_groups where group_name='GROUP3';

临时表空间group3仍然存在,用户只有删除该组中的全部临时表空间(即必须将临时表空间tp3也删除掉),组group3才能被删除掉,实例如下:

*** 删除组group3中的tp3临时表空间,代码:

SQL> drop tablespace tp3 including contents and datafiles;表空间已删除。

在删除组group3中的最后一个临时表空间tp3之后,再通过查询dba_tablespace_groups数据字典来查看group3表空间组是否存在,示例如下:

*** 在dba_tablespace_groups数据字典中查询组grop3是否存在,代码及运行结果:SQL> select * from dba_tablespace_groups where group_name='GROUP3';未选定行。

Oracle 11g_管理表空间和数据文件(7)相关推荐

  1. Oracle管理表空间和数据文件详解

    管理表空间和数据文件 介绍 表空间是数据库的逻辑组成部分 从物理上将:数据库数据存放在数据文件中 从逻辑上将:数据库则是存放在表空间中 表空间由一个或是多个数据文件组成 数据库的逻辑结构 介绍: Or ...

  2. 管理表空间和数据文件——维护表空间——设置默认表空间和删除表空间和删除数据文件盒临时文件...

    1.设置数据库默认表空间 当建立数据库时,使用default tablespace 选项可以设置数据库的默认表空间.在建立了数据库之后,使用alter database default tablesp ...

  3. ORACLE开发:创建与管理表空间和数据文件1

    Oracle在逻辑上以表空间存储数据,而实际上是以数据文件存储数据. 表空间和数据文件 表空间:某一时刻只属于一个数据库:由一个或多个数据文件组成:可近一步划分逻辑存储单元 数据文件:只能属于一个表空 ...

  4. ORACLE数据库、表空间、数据文件之间的关系

    完整的Oracle数据库通常由两部分组成:Oracle数据库和数据库实例. 1) 数据库是一系列物理文件的集合(数据文件,控制文件,联机日志,参数文件等): 2) Oracle数据库实例则是一组Ora ...

  5. 管理表空间和数据文件——维护表空间——改变表空间的读写状态和改变表空间名称...

    默认情况下表空间是处于可读写状态,用户不仅可以查询表空间上的对象数据,而且可以在表空间上执行dml 和ddl 操作.如果表空间只用于存放静态数据,那么为了便于管理和备份恢复,应该将其转变为只读状态:另 ...

  6. 管理表空间和数据文件——使用OMF方式管理表空间

    当使用omf方式管理表空间,需要配置初始化参数db_create_dest.当建立omf表空间会自动建立数据文件,当删除omf表空间时会自动删除omf文件.当使用omf方式管理数据文件时,如果不指定数 ...

  7. 管理表空间和数据文件——建立表空间——建立字典管理表空间和建立加密表空间...

    字典管理表空间是为了与早期版本兼容而保留的空间管理特性.当使用字典管理方式时,区数据字典进行管理. 注意:如果建立字典管理表空间,那么要求system表空间必须采用字典管理方式,并且建立时,需要指定e ...

  8. 《Oracle从入门到精通》读书笔记第八章 管理表空间和数据文件之二

    8.5 管理undo表空间 8.5.1 undo表空间的作用 1.使读写一致 2.可以回滚事物 3.事物恢复 4.闪回操作 8.5.2 undo表空间的初始化参数 1.undo_tablespace: ...

  9. Oracle移除表空间的数据文件 ora-00604 ora-01426

     项目背景:在之前开发环境数据库管理比較乱,在表空间不足时仅仅是加入数据文件,測试完后数据己删除,但数据库表空间所占的空间不能回收,导致数据库的存储文件夹使用率达到97%以上实际使用仅仅有10%, ...

最新文章

  1. FLINK源代码调试方式
  2. ECCV2020 Spotlight | CPN:Anchor Free,Two-stage目标检测
  3. 数字翻滚效果 HTML,js数字翻动效果 数字翻成中文怎么翻
  4. 周五话分析 | 两个指标解读用户千百种离开的姿势(跳出率与退出率)
  5. [css] pseudo-class与pseudo-element有什么区别?
  6. 挑战程序设计竞赛 (秋叶拓哉 / 岩田阳一 / 北川宜稔 著)
  7. Ubuntu定制live cd
  8. 厦门one_厦门外代荣获ONE全球船舶操作中心颁发的Sapphire Award奖
  9. 【转】Linux的僵尸进程解决攻略
  10. vscode更换字体
  11. vue JsBarcode的使用
  12. 走进波分 -- 14.OSN902产品介绍
  13. Java内存管理:Java内存区域 JVM运行时数据区
  14. 为什么没有Realtek面板?
  15. 面渣逆袭:三万字,七十图,详解计算机网络六十二问(收藏版)
  16. 腾讯技术团队整理,万字长文轻松彻底入门 Flutter,秒变大前端
  17. 北京化工大学2022-2023-1 ACM集训队每周程序设计竞赛(8)题解
  18. 美国主流网站所使用的JavaScript框架
  19. Unity Live2D的接入和使用
  20. [腾讯会议]接入耳机麦克风无声响

热门文章

  1. 水体提取NDWI和MNDWI的比较分析
  2. 10.1 二重积分的概念与性质
  3. 横河变送器EJA110E
  4. spoolsv应用程序错误_什么是“后台处理程序子系统应用程序”(spoolsv.exe),为什么它在我的PC上运行?...
  5. 2520阶群、20160阶群、有限单群的阶
  6. 10年编程无师自通[转]
  7. 基于Springboot+Mybatis的学校教务管理系统
  8. 修练8年C++面向对象程序设计之体会(文章不错)
  9. 小牛电动车09Z和10Z的区别
  10. USB PD等多快充协议芯片:沁恒微 CH235