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 数据库其实就是一个存储数据的硬盘,而表空间就是这个硬盘下存放对象的一个个文件夹,而数据文件则存储着你放入文件夹中的数据。

转oracle 学习 - 表空间的更多相关文章

  1. Oracle创建表空间、用户管理、角色管理

    内容:Oracle创建表空间.用户管理.角色管理 1.用系统用户登录Oracle 默认的系统用户: sys/system.sysman.scott sys:权限最大,超级用户,可以完成所有任务, 默认 ...

  2. oracle数据库表空间追加数据库文件方法

    oracle数据库表空间追加数据库文件方法   针对非大文件方式表空间,允许追加文件进行表空间的扩展,单个文件最大大小是32G  第一种方式:表空间增加数据文件    www.2cto.com   1 ...

  3. Oracle 设置表空间自增长

    Oracle修改表空间大小 使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误: 查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据 ...

  4. Oracle Temp表空间切换

    来源于:  http://www.2cto.com/database/201507/418564.html 一.TEMP表空间作用 临时表空间主要用途是在数据库进行排序运算.管理索引.访问视图等操作时 ...

  5. Oracle基础表空间建立,以及练习

    Oracle的表空间创建,可以采用网页的https://127.0.0.1:1158/em来进入oracle的页面进行创建表空间. 利用plsqldev.exe程序在表空间里添加数据: 首先要在use ...

  6. [转载]Oracle修改表空间大小

    Oracle修改表空间大小 使用Oracle10g建立数据库后,向数据库中导入了部分数据,第二天继续向数据库中导入数据表时发生错误: 查了很多资料发现原来是Oracle表空间限制,导致无法继续导入数据 ...

  7. Oracle建立表空间和用户

    Oracle建立表空间和用户 建立表空间和用户的步骤: 用户 建立:create user 用户名 identified by "密码"; 授权:grant create sess ...

  8. oracle 11g 表空间使用率

    Oracle数据库表空间使用量查询: select b.file_name 物理文件名,b.tablespace_name 表空间,b.bytes/1024/1024 大小M,(b.bytes-sum ...

  9. oracle暂时表空间 ORA-01652:无法通过16(在表空间XXX中)扩展 temp 字段

    今天在查数据的时候报错  ORA-01652:无法通过16(在表空间temp1中)扩展 temp 字段 查看表空间使用明细 SELECT b.tablespace,        b.segfile# ...

随机推荐

  1. Jersey 2.x JDK 上的客户端应用

    如应用是运行在 JDK 上的话,你只需要使用 JAX-RS 中的客户端部分就可以了,这个根据你使用的客户端有所调整. 这里有一系列的模块是可以供你使用的,例如 grizzly 或 apache 或 j ...

  2. js下载图片

    DownloadImgZP = imgPath => { const image = new Image(); // 解决跨域 Canvas 污染问题 image.setAttribute('c ...

  3. Python解析Wav文件并绘制波形的方法

    资源下载 #本文PDF版下载 Python解析Wav文件并绘制波形的方法 #本文代码下载 Wav波形绘图代码 #本文实例音频文件night.wav下载 音频文件下载 (石进-夜的钢琴曲) 前言 在现在 ...

  4. Eclipse重命名项目名后如何彻底修改工程名

    背景:在Eclipse中当我们修改了一个Web项目名称后,在再次运行该项目,发现使用新的名称无法正常的浏览,而用旧的名称去可以 解决方案: 1:修改该项目目录下:.project文件 <?xml ...

  5. 等待进程结束wait,waitpid

    当子进程先于父进程退出时,如果父进程没有调用wait和waitpid函数,子进程就会进入僵死状态. pid_t wait(int *status); pid_t waitpid(pid_t pid, ...

  6. 使用python,将excel数据批量导入数据库

    这是上一篇文章的优化版本,相较于一条一条的执行sql语句,本文中,将excel中所有的数据先写到list列表中 在通过函数 cursor.executemany(sql, list) 一次性写入到数据 ...

  7. Mybatis学习总结-----mybatis中refid是什么意思(十)

    1.首先定义一个sql标签,一定要定义唯一id<sql id="Base_Column_List" >name,age</sql>2.然后通过id引用< ...

  8. laravel自定义分页功能的实现:

    laravel版本:5.5.. 执行命令: php artisan vendor:publish --tag=laravel-pagination 在到 resources/views/vendor/ ...

  9. Oracle11g 查询长时间运行的SQL

    一.大量的查询 某些时候,因为SQL的问题,导致数据库的session大量积压,服务器的磁盘读增大,CPU使用率剧增.一般这种SQL,都是一些全表扫描.多表关联.报表或者排序类的SQL.这中情况很有可 ...

  10. start with...connect by子句的浅用

    start with的用法,其基本语法如下: select … from tablename start with 条件1connect by 条件2where 条件3; 但是我在pl/sql中写入以 ...