Oracle 数据库的表空间和 Oracle 数据库数据文件
关于 Oracle 数据库的表空间。
很多 Oracle 初学者弄不明白表空间的概念和意义,他们只知道给数据库建表的时候需要到表空间这个东东。他们也不大明白执行 create tablespace 命令时用到的数据库数据文件的作用。作者总结了一些数据库表空间和数据库数据文件的概念性、意义性的资料,希望可以方便大家。
Oracle 的表空间是 Oracle 数据库的逻辑世界和操作系统的物理世界之间相互交互的地方。Oracle 数据库在表空间中存储对象(如表、索引等)。Oracle 数据库中的表空间提供一种机制来存储数据库引擎所管理的数据。当创建对象(如表对象和索引对象)时,需要指定在哪个表空间中创建对象(否则将给对象分配默认的表空间)。
典型的 Oracle 数据库包含各种类型的表空间,下面列出了最常见的表空间:
*
SYSTEM 存储系统对象
* SYSAUX 存储 Oracle 数据库辅助模式对象,如 RMAN 恢复目录
*
USERS 为所有用户分配典型的默认表空间
* RBS 用于手工回滚段
*
UNDO 用于自动撤销段
* DATA 用于存储数据
*
INDEX 用于存储索引
*
TOOLS 用于为数据库管理员所使用的相关工具存储模式对象
本来就可以对表空间进行读写操作,或者也可以使表空间处于只读模式。当表空间中的数据都是静态数据时,只读模式的表空间在数据仓库环境中就显得非常有用。在这种情况下,可以先使表空间处于只读模式,然后再对该表空间进行备份。对表空间的本分完成以后,就不需要对该表空间进行再次备份了。
在 Oracle8i 和 Oracle9i 数据库中,表空间通过可传输表空间功能可以在不同的数据库之间进行传输。不同的数据库版本对传输有不同的约束,版本越新,对传输的约束越少。在很多时候,使用可传输的表空间可以带来很大的方便。例如:当在 OLP(online transaction processing,联机事务处理)表空间和数据仓库之间传输数据时,使用可传输的表空间可以带来很多的方便。
Oracle 10g 数据库去掉了以前版本中可传输表空间的基本约束:没有这些基本约束后,可以在大部分操作系统之间移动表空间,这样就进一步增强了数据库的可用性。在某些情况下,可以直接将表空间的集合移动到其他的硬件平台:然后在另外的一些情况下,表空间可能需要使用 RMAN 来进行转换。可以参见特定操作系统的 Oracle 数据库帮助文档来确定特定平台的需求。
关于 Oracle 数据库数据文件。
分配给表空间的空间来自于数据库的数据文件,这些数据文件或者是在一开始执行 create tablespace 命令时分配给表空间的,或者是在随后通过 alter tablespace 命令添加到表空间中的。当创建表空间时,至少需要定义一个数据文件。可用存储空间的总大小就是与表空间相关联的所有数据文件大小的综合。分配给表空间的数据文件的最大数目受使用的操作系统和 Oracle 数据库限制。
当给数据文件分配了磁盘空间之后,数据库数据文件所占的空间逻辑上可以再分成多个数据库快。当创建对象的时候,将数据库中的空闲空间以一个或多个扩展区的形式分配给所创建的对象。在一个单独的数据文件中,每一个扩展区都包含一个连续数据块的集合,因此扩展区自身不能超过数据库数据文件的范围。当创建对象时,初始扩展区的大小由参数 initial 定义,而后继扩展区的分配则通过 next 参数来定义。
底层表空间中数据文件所使用的空间在初始需要预先分配,所以当定义好这些数据文件后,就可以使用设备上的物理空间了。像添加额外的数据文件或者重新设置已存在数据文件大小的操作一样,也可以很容易地向表空间中添加空间以获得更大的表空间。当然数据库中的可用空间可能会很快地用完,有时候速度可以快到数据库管理员来不及对这种情况进行处理。在大多数情况下,如果表空间已经用尽,对数据库的操作将会失败,并且将会给用户返回一个错误的信息。
通过在于表空间相关联的数据文件中使用 autoextend 选项可以避免出现空间耗尽的问题。 autoextend 选项可以使数据库动态地对各数据文件进行扩展,这在不希望出现故障和错误信息的情况下是非常重要的。如:
SQL> create tablespace wfcrmdb datafile ‘e:/tools/oracle/oradata/wfcrm/wfcrmdb.dat‘ size 100m autoextend on next 50m maxsize unlimited;
在上面的 sql 语句中,创建了一个名为 wfcrmdb 的表空间,初始大小 100m,自动扩展大小 50m,没有最大上限,数据文件 wfcrmdb.dat 将会在 e:/tools/oracle/oradata/wfcrm 文件夹下被创建。
如果不想使用 autoextend,还有另一种解决空间用尽的方法,即使用可恢复的空间管理的方法。这个方法是使已经用尽空间的会话暂停运行以等待一段预先定义的时间长度,在此期间允许数据库管理员动态地向表空间中添加空间。
可以通过重新设置数据文件的大小来减小数据文件,然而不能将数据文件大小的边界减小到超过最后一个对象块所分配的位置。因此,如果数据文件大小是 1GB,最后一个块在 500MB 的位置上填充数据文件(通常数据文件的填充是从第一个块开始依次填充到最后一个块),则只能将数据文件的大小减小到 500MB,而不能继续地减小。
总结:用一句很形象的话讲,Oracle 数据库其实就是一个存储数据的硬盘,而表空间就是这个硬盘下存放对象的一个个文件夹,而数据文件则存储着你放入文件夹中的数据。