首页 > 数据库 > 其他综合 >

Oracle表空间

2016-04-26

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

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用户的大对象索引、索引等数据对象。

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)等操作。

创建表空间
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段实现的,比如,闪回表,闪回事务查询,闪回版本查询等等。

相关文章
最新文章
热点推荐