Oracle 表空间

Oracle磁盘空间管理中的最高逻辑层是表空间(TABLESPACE),它的下一层是段(SEGMENT),并且一个段只能驻留在一个表空间内。段的下一层就是盘区,一个或多个盘区(EXTENT)可以组成一个段,并且每个盘区只能驻留在一个数据文件中。如果一个段跨越多个数据文件,它就只能由多个驻留在不同数据文件中的盘区构成。盘区的下一层就是数据块,它也是磁盘空间管理中逻辑划分的最底层,一组连续的数据块可以组成一个盘区。

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

col tablespace_name for a10;
col file_name for a50;
col bytes for 999,999,999;
select tablespace_name,file_name,bytes from dba_data_files order by tablespace_name;

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

Oracle 11g的默认表空间

1. SYSTEM表空间

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

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

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

USERS表空间存放了SCOTT用户的表和索引,以及OE用户的大对象索引、索引等数据对象。

  1. SYSAUX表空间

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

下面通过DBA_SEGMENTS数据字典来查询SYSAUX表空间的相关信息。

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

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

  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 [AUTOALLOCATE | UNIFORM SIZE num[k/m]]]]

在上面的语法中出现了大量的关键字和参数

1.语法中的关键字

- SMALLFILE/BIGFILE:表示创建的是小文件表空间还是大文件表空间。

- AUTOEXEND [ON | OFF] NEXT:表示数据文件为自动扩展(ON)或非自动扩展(OFF),如果是自动扩展,则需要设置NEXT的值。

- MAXSIZE:表示当数据文件自动扩展时,允许数据文件扩展的最大长度字节数,如果指定UNLIMITED关键字,则不需要指定字节长度。

- MINIMUN EXTENT:指定最小的长度,由操作系统和数据库的块决定。

- ONLINE | OFFLINE:创建表空间时可以指定为在线或离线。

- PERMANENT|TEMPORARY:指定创建的表空间是永久表空间或临时表空间,默认为永久性表空间。

- LOGGING |NOLOGGING:指定该表空间内的表在加载数据时是否产生日志,默认为产生日志(LOGGING)。即使设置为NOLOGGING,但在进行INSERT,UPDATE和DELETE操作时,Oracle仍会将操作信息记录到RedoLog Buffer中。

- EXTENT MANAGEMENT DICTIONARY |LOCAL:指定表空间的扩展方式是使用数据字典管理还是本地化管理,默认为本地化管理。Oracle不推荐使用数据字典管理表空间。

- AUTOALLOCATE | UNIFORM SIZE:如果采用本地化管理表空间,在表空间扩展时,指定每次盘区扩展的大小是由系统自动指定还是按照等同大小进行。若是按照等同大小进行,则默认每次扩展的大小为1MB。

2.语法中的参数

- tablespace_name:该参数表示要创建的表空间的名称。

- /path/filename’:该参数表示数据文件的路径与名字;REUSE表示若该文件存在,则清除该文件在重新建立该文件,若该文件不存在,则创建该文件。

- DEFAULT STORAGE storage:指定以后要创建的表、索引及簇的存储参数值,这些参数将影响以后表等的存储参数值。

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

本地化表空间管理使用位图跟踪表空间所对应的数据文件的自由空间和块的使用状态,位图中的每个单元对应一个块或一组块。当分配或释放一个扩展时,Oracle会改变位图的值以指示该块的状态。这些位图值的改变不会产生回滚信息,因为它们不更新数据字典的任何表。所以,本地管理表空间具有以下优点。

使用本地化的扩展管理功能(包括自动大小和等同大小两种),可以避免发生重复的空间管理操作。

本地化管理的自动扩展(AUTOALLOCATE)能够跟踪临近的自由空间,这样可以消除结合自由空间的麻烦。本地化的扩展大小可以由系统自动确定(AUTOALLOCATE),也可以选择所有扩展有同样的大小(UNIFORM)。通常使用EXTENT MANAGEMENT LOCAL子句创建本地化的可变表空间。

通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为等同的256k,代码及运行结果如下。

SQL> create tablespace tbs_test_1 datafile ‘D:\OracleFiles\OracleData\datafile1.dbf‘
  2  size 10m
  3  extent management local uniform size 256K;

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

SQL> create tablespace tbs_test_2 datafile ‘D:\OracleFiles\OracleData\datafile2.dbf‘
  2  size 10m
  3  extent management local autoallocate;

当创建扩展大小等同的表空间时,使用uniform关键字,并指定每次扩展时的大小;当创建扩展大小为自动管理时,使用autoallocate关键字,并且不需要指定扩展时的大小。

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

段空间管理方式是建立在本地化空间管理方式基础之上的,即只有本地化管理方式的表空间,才能在其基础上进一步建立段空间管理方式,它使用“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)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为手工
create tablespace tbs_test_3 datafile ‘E:\OracleFiles\OracleData\datafile3.dbf‘
size 10m
extent management local autoallocate;
segment space management manual;

2.自动段空间管理方式

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

由于自动段空间管理方式比手工段空间管理方式具有更好的性能,所以它是创建表空间时的首选方式,下面来看一个实例。

----通过本地化管理方式(LOCAL)创建一个表空间,其扩展大小为自动管理,其段空间管理方式为自动
  create tablespace tbs_test_4 datafile ‘D:\OracleFiles\OracleData\datafile4.dbf‘
 size 20m
  extent management local autoallocate
 segment space management auto;
  • 自动段空间管理方式不能用于创建临时表空间和系统表空间。
  • Oracle本身推荐使用自动段空间管理方式管理永久表空间,但其默认情况下却是MANUAL(手工)管理方式,所以在创建表空间时需要明确指定为AUTO。

创建非标准块表空间

在Oracle数据库中,通常的块大小为8192字节,即8KB,但Oracle 11g允许创建块大小与基本块不同的表空间,块大小可由创建表空间时的blocksize参数指定,这样有利于存储不同大小的对象,但用户需要注意以下三点:

- 表空间的非标准块的大小为基本块的倍数。比如,大小为16KB,64KB,128KB。

- Oracle 11g通常使用SGA自动共享内存管理,因此需要设置初始化参数db_16k_cache_size=16K。

- 这种块较大的表空间通常用来存放大对象(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‘
  2  size 64m reuse
  3  autoextend on next 4m maxsize unlimited
  4  blocksize 16k
  5  extent management local autoallocate
  6  segment space management auto;

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

建立大文件表空间

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

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

创建一个大文件表空间,指定一个数据文件,并且数据文件的大小为2g

SQL> create bigfile tablespace tbs_test_big datafile ‘D:\OracleFiles\OracleData\datafilebig.dbf‘
  2  size 2g;

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

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

由于大文件(BIGFILE)表空间只有一个数据文件,所以,当需要重新设置其大小时不需要标识数据文件的具体路径和名称,只需要使用ALTER TABLESPACE命令指定大文件表空间的名称,即可很方便地修改其大小。另外,需要注意的是:在创建表空间的语法中使用size来标识数据文件的大小,而在修改表空间时,要使用resize关键字来重置数据文件的大小。修改大文件表空间tbs_test_big,将其空间大小由2g改变为1g

SQL> alter tablespace tbs_test_big resize 1g;
与大文件表空间不同的是,传统表空间可能包含多个数据文件,如果要改变其大小,则需要在ALTER DATABASE语句后面指定完整的操作系统路径名或内部文件号辨别每个数据文件,然后再重新设置他们的大小。 把数据文件datafile3.dbf(其所属的表空间是tbs_test_3)的大小由原来的20m修改为100m,代码及运行结果如下。

SQL> alter database datafile ‘D:\OracleFiles\OracleData\datafile3.dbf’

2 resize 100m;

维护表空间与数据文件

设置默认表空间

在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 temprory tablespace temp_1
      -----将表空间tbs_example设置为默认的永久表空间
SQL>alter database default tablespace tbs_example

更改表空间的状态

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

设置表空间为只读状态,可以保证表空间数据的完整性。通常在进行数据库的备份、恢复及历史数据的完整性保护时,可将指定的表空间设置成只读状态。但设置表空间为只读并不是可以随意进行的,必须要满足下列条件。

  • 该表空间必须为ONLINE状态。
  • 该表空间不能包含任何回滚段。
  • 该表空间不能在归档模式下。

    更改表空间的读写状态需要使用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;

重命名表空间

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;

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

删除表空间

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

在默认情况下,Oracle系统不采用Oracle Managed Files方式管理文件,这样删除表空间实际上仅是从数据字典和控制文件中将该表空间的有关信息清除掉,并没有真正删除该表空间包含的所有物理文件。因此,要想彻底删除表空间来释放磁盘空间,那么在执行删除表空间的命令之后,还需要手工删除该表空间包含的所有物理文件。

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

DROP TABLESPACE tbs_name[INCLUDING CONTENTS] [CASCADE CONSTRAINTS]

参数说明如下:

  • tbs_name:表示要删除的表空间名称。
  • INCLUDING DONTENTS:表示删除表空间的同时删除表空间中的数据。如果不指定INCLUDING

    CONTENTS参数,而该表空间又存在数据时,则Oracle会提示错误。

  • CASCADE CONSTRAINTS:表示当删除当前表空间时也删除相关的完整性限制。完整性限制包括主键及唯一索引等。如果完整性存在,而没有CASCADE CONSTRAINTS参数,则Oracle会提示错误,并且不会删除该表空间。

删除表空间tbs_test_2及其包含的所有内容。

SQL> drop tablespace tbs_test_1
  2  including contents
  3  cascade constraints;

在上面的代码中,不但删除了表空间tbs_test_1,而且也删除了表空间中的数据(including contents)和完整性约束(cascade constraints)。

维护表空间中的数据文件

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

1.向表空间中添加数据文件

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

向users表空间中添加一个新的数据文件users02.dbf,该文件支持自动扩展,扩展能力为每次扩展5m,并且该文件的最大空间不受限制

SQL> alter tablespace users add datafile ‘e:\app\Administrator\oradata\orcl\users02.dbf‘
  2  size 10m autoextend on next 5m maxsize unlimited;

2.从表空间中删除数据文件

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

删除users表空间中的users02.dbf数据文件

SQL> alter tablespace users drop datafile ‘e:\app\Administrator\oradata\orcl\users02.dbf‘;

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

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

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

  • 在CREATE DATABASE语句中设置。
  • 在ALTER DATABASE语句中设置。
  • 在CREATE TABLESPACE语句中设置。
  • 在ALTER TABLESPACE语句中设置。

    对于Oracle 数据库管理员来说,主要是用后三种命令修改数据文件是否为自动扩展,因为数据库实例已经创建完成,所以不再需要使用CREATE DATABASE命令。

    首先查询TBS_TEST_2表空间中的数据文件是否为自动扩展,若不是自动扩展,然后修改为自动扩展,扩展量为10m,并且最大扩展空间不受限制

    SQL> col file_name for a50;
SQL> select file_name ,autoextensible from dba_data_files where tablespace_name = ‘TBS_TEST_2‘;

FILE_NAME                                           AUT
------------------------------------------------------------------------------  ---
D:\ORACLEFILES\ORACLEDATA\DATAFILE2.DBF         NO

从上面的运行结果中可以看出,DATAFILE2.DBF数据文件不自动扩展(autoextensible属性值为NO),然后使用alter databas语句修改该数据文件为自动扩展。

SQL> alter database datafile ‘D:\OracleFiles\OracleData\datafile2.dbf‘
  2  autoextend on next 10m maxsize unlimited;

管理撤销表空间

撤销表空间,通常也称为UNDO表空间;UNDO表空间中的段也称为撤销段或UNDO段;撤销段中存放的数据就是“撤销信息”,这些“撤销信息”也称为撤销数据或UNDO数据,可见撤销段是最直接管理“撤销信息”的逻辑层,下面将对撤销段的几种作用进行讲解和分析。

使读写一致

在不同的进程或用户模式下检索数据时,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段中读取的。

可以回退事务

当执行修改(UPDATE)数据操作时,旧的数据(即UNDO数据)被存放到UNDO段,而新的数据则被存放到数据段中。如果在修改操作中事务提交出现错误,就需要回退事务,从而取消数据的更改。比如,当用户使用UPDATE语句修改员工的工资时,发现,原本打算修改某个人的工资,但由于误操作,而导致修改了全公司员工的工资(比如,没有使用where条件语句)。这样,用户就可以通过执行ROLLBACK语句来取消事务修改。当执行ROLLBACK语句时,Oracle会将UNDO段的UNDO数据(即旧的员工工资)全部写回到数据段中。

事务恢复

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

闪回操作

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

撤销表空间的初始化参数

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秒,从9i版本开始,通过配置该初始化参数,可以指定UNDO数据的保留时间,从而也决定了基于UNDO数据的闪回操作能够闪回的最早时间点。

撤销表空间的基本操作

对撤销表空间的基本操作包括创建、修改、删除和切换等,下面分别进行介绍。

1.创建UNDO表空间

创建UNDO表空间需要使用CREATE UNDO TABLESPACE 语句,来看下面的例子。

---创建一个撤销表空间,并指定数据文件大小为100m
SQL> create undo tablespace undo_tbs_1
  2  datafile ‘D:\OracleFiles\OracleData\undotbs1.dbf‘
  3  size 3g;

在创建表空间时,需要注意以下两个方面:

  • UNDO表空间对应的数据文件大小通常由DML操作可能产生的最大数据量来确定,通常该数据文件的大小至少应在1G以上;
  • 由于UNDO表空间只用于存放撤销数据,所以不要在UNDO表空间内建立任何数据对象(如,表、索引等)。

2.修改UNDO表空间

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

管理临时表空间

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

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

- SELECT DISTINCT不重复检索

- UNION联合查询

- MINUS计算

- ANALYZE分析

- 连接两个没有索引的表

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

--- 创建一个临时表空间,空间大小为300m
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;

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

说明:关于临时表空间的其它操作,比如,重命名表空间、删除表空间,这些与永久性表空间的操作基本相同,这里不再赘述。

查询临时表空间的信息

关于临时表空间组

在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中的临时表空间。

综合实例——在新建的表空间中创建数据表

(1)打开SQL*Plus,以system身份登录。登录成功后,在SQL*Plus中输入如下代码创建表空间

SQL> create tablespace test datafile ‘E:\database\test_data.dbf‘ size 20M autoextend on next 5M;

(2)在新建的表空间中创建教师表,代码及运行结果如下:

SQL> create table teacher(
  2  teaid number primary key,
  3  teaname varchar2(10),
  4  teaage number,
  5  teasubject varchar2(20),
  6  teasex varchar(5))
  7  tablespace test
  8  /
时间: 2024-11-06 03:54:13

Oracle 表空间的相关文章

Oracle表空间

Oracle表空间,布布扣,bubuko.com

【Oracle 常用查询】oracle表空间使用率统计查询

参考1 --查询表空间使用情况 SELECT Upper(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", D.TOT_GROOTTE_MB - F.TOTAL_BYTES "已使用空间(M)", To_char(Round(( D.TOT_GROOTTE_MB - F.TOTAL_BYTES ) / D.TOT_GROOTTE_MB * 100, 2), '990.99') || '

44.oracle表空间的使用

要给下属充分的发挥空间,要允许下属犯错,下属犯错自己能顶下来就顶着,不要盯得让下属觉得"这不是我的事,我只是个小打工的",团建要放在首位.不可在下属面前"装B",别人也不傻. Oracle数据库开创性地提出了表空间的设计理念,这为Oracle数据库的高性能做出了不可磨灭的贡献.可以这么说,Oracle中很多优化都是基于表空间的设计理念而实现的. ORACLE数据库被划分成称作为表空间[1]  的逻辑区域--形成ORACLE数据库的逻辑结构.一个ORACLE数据库能够

Oracle表空间,用户,用户授权

一:Oracle表空间 1,Oracle表空间与SQL Server文件组对比 SQL Server的文件组(文件组包括若干MDF,NDF数据文件)对我们来说并不陌生,前段时间我在博客"怎样玩转千万级别的数据"提到了过表分区的概念,其实表分区说到本质上就是按一定条件把不同数据放在不同的数据文件里,这些数据文件在物理上是相对独立的,在逻辑上又是一个整体.特别强调一下,在SQL Server中,建表时是默认把所有的表都保存在PRIMARY默认文件组 ,当数据库中表很多,并且数据量很大时,会

zabbix自动发现oracle表空间并监控其使用率

监控需求 Oracle表空间使用率实时监控,当表空间使用率达到95%时触发告警机制.Oracle表空间分为系统默认表空间和用户创建的表空间,而表空间又有自动扩展和非自动扩展两种类型,用户(DBA)在创建表空间时可以根据应用需求指定是否开启表空间自动扩展.那么在这里我们需要分析一个监控策略,就是当zabbix监控到某个表空间使用率达到95%,那么就让触发器触发警告(Warning)信息,并发送邮件给DBA或管理者.当检测到表空间没有开启自动扩展时,则触发Information信息.说明一下:ora

SQL创建Oracle表空间、用户以及给用户赋权的方法

//创建表空间 Create tablespace examination//创建表空间examination datafile 'c:\Oracle\zhangwei\examination.dbf'//与表空间关联的文件存放位置(要预先手动建好文件夹) size 100m//文件初始大小,千万不要写成mb(这里以下可略) autoextend on//文件大小可自动拓展 next 30m//每次拓展30m maxsize unlimited//不限制文件大小的上限 logging//生成对于

oracle 表空间tablespace_name 文件满了,扩充方法

当然:还是建议在简历表空间时就让其自动扩充的,代码如下:(注意倒数三行) create tablespace prmms_log   logging    datafile 'C:\app\Administrator\product\11.2.0\dbhome_1\database\prmms_log.dbf'   size 50m   autoextend on    next 50m maxsize 20480m   extent management local; 好吧,假如你和博主一样给

ORACLE表空间操作实例

本文主要介绍oracle表空间常见的操作实例,包括创建.查询.增加.删除.修改.表空间和数据文件常用的数据字典和动态性能视图包括v$dbfile.v$datafile.dba_segments.user_segments.dba_data_files.v$tablespace.dba_tablespaces.user_tablespaces. 创建表空间 1.创建数据表空间 CREATE TABLESPACE test DATAFILE '/opt/oracle/oradata/test.dbf

oracle 表空间不足解决办法

Oracle表空间不足,一般有两个原因: 1. 原表空间太小,没有自增长: 2. 表空间已自增长,而且表空间也已足够大 检查原因: 1. 查看表在那个表空间 select tablespace_name,table_name from user_talbes where table_name='test'; 2. 获取用户的默认表空间 select username, DEFAULT_TABLESPACE from dba_users where username='MXH'; 3. 查看表空间

修改Oracle 表空间名称 tablespace name

修改表空间名称步骤如下: 1. 使用oracle用户登录执行 $sqlplus / as sysdba 2. 执行修改表空间命令如下 SQL> alter tablespace  TEST rename to TEST1; 注:可连续对多个表空间进行重命名 4. 确认表空间名已经修改 SQL>select name from v$tablespace; SQL>exit 参考文章 如何修改Oracle 表空间名称tablespace name