一、存储关系
Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的;而在逻辑上表空间又是由一个或多个段组成的。在Oracle 数据库中,通过为每种不同的数据对象分配不同的段,来保存数据。例如EMP 表的所有数据会存放在EMP段中。在Oracle 数据库中,段是由一个或多个区组成的,而区又是由连续存储的数据块所组成的。块则是数据库的I/O 最小的单位。数据库可划分为被称为表空间的逻辑存储单元。每一个表空间可以包含很多的Oracle逻辑数据块。DB_BLOCK_SIZE 参数指定了逻辑块的大小。逻辑块的大小范围为2 KB 至
32 KB,默认大小为8 KB。特定数目的相邻逻辑块构成了一个区。为特定逻辑结构分配的一组区构成了一个段。Oracle 数据块是逻辑I/O 的最小单位。(二)、如何存储表数据
创建表时,就会创建段来保存表数据。表空间包含一组段。从逻辑上讲,表包含由列值组成的行。行最终将以行片段的形式存储在数据库块中。之所以称为行片段,是因为某些情
况下,不可以在一个位置存储一整行。当插入行由于太长而不适合单个块时,或者由于更新而导致现有行大小超出了行的当前空间时,就会发生这种情况。二、表空间和数据文件
Oracle 数据库(tablespace)是由若干个表空间构成的。任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。(一)、常用表空间
在Oracle 10g 中有以下几种比较特殊的表空间:(1)系统表空间系统表空间(system tablespace)是每个Oracle 数据库都必须具备的。其功能是在系统表空间中存放诸如表空间名称、表空间所含数据文件等数据库管理所需的信息。系统表空间的名称是不可更改的。系统表空间必须在任何时候都可以用,也是数据库运行的必要条件。因此,系统表空间是不能脱机的。系统表空间包括数据字典、存储过程、触发器和系统回滚段。为避免系统表空间产生存储碎片以及争用系统资源的问题,应创建一个独立的表空间用来单独存储用户数据。(2)SYSAUX 表空间SYSAUX 表空间是随着数据库的创建而创建的,它充当SYSTEM 的辅助表空间,主要存储除数据字典以外的其他对象。SYSAUX 也是许多Oracle 数据库的默认表空间,它减少了由数据库和DBA 管理的表空间数量,降低了SYSTEM 表空间的负荷。(3)临时表空间相对于其他表空间而言,临时表空间(temp tablespace)主要用于存储Oracle 数据库运行期间所产生的临时数据。数据库可以建立多个临时表空间。当数据库关闭后,临时表空间中所有数据将全部被清除。除临时表空间外,其他表空间都属于永久性表空间。(4)撤销表空间
用于保存Oracle 数据库撤销信息,即保存用户回滚段的表空间称之为回滚表空间(或简称为撤销表空间(undo tablespace))。在Oracle8i 中是rollback tablespace,从Oracle9i开始改为undo tablespace。在Oracle 10g 中初始创建的只有6个表空间sysaux、system、temp、undotbs1、example 和users。其中temp 是临时表空间,undotbs1是undo 撤销表空间。使用多个表空间有以下好处:
• 不同类型的数据存入到不同的表空间中,可以更灵活地管理数据库。• 将还原段、临时段、应用程序数据段和应用程序索引段分开存储到不同表空间中。• 根据备份要求将数据分开存储。• 将动态数据和静态数据分别存储在不同的表空间中,以利于备份和恢复。• 通过分配给用户表空间上的配额,避免分某个用户占用表空间太多的存储空间。数据库至少包含以下几个表空间:SYSTEM 表空间,临时表空间(TEMPORARY)用于存放临时数据,UNDO 表空间用于存入数据修改后的旧值。
【实例8-1】查询数据库包含的表空间信息
1)以管理员身份登录SQL> CONN /AS SYSDBA已连接。2)查询表空间SQL> SELECT name FROM V$TABLESPACE;NAME------------------------------CWMLITEDRSYSEXAMPLEINDXODMSYSTEMTOOLSUNDOTBS1USERSXDBTEMP已选择11 行。其中SYSTEM 是系统表空间、UNDOTBS1 是UNDO 表空间、TEMP 是临时表空间。
(二)、表空间和数据文件的关系
数据库、表空间和数据文件是紧密相关的,但它们之间又有着重要
区别,关系如图8-1 所示:• Oracle 数据库由一个或多个称为表空间的逻辑存储单元组成,表空间作为一个整体存储数据库中的所有数据,并且一个表空间只能属于一个数据库。数据库的大小是该数据库中所表空间
大小总和。
• 从物理讲,Oracle 数据库内的每个表空间由一个或多数据文件组成,并且一个数据文件只能属于一个表空间。表空间大是所有数据文件大小的总
和。这些数据文件与Oracle 运行所在的操作系统的文件有一样的物理结构。• 数据库的所有数据都存储在数据文件中,数据库的每个表空间都由这些数据文件组
成。例如,最简单的Oracle 数据库只有一个表空间和一个数据文件。
【实例8-2】查询表空间及数据文件的信息
1)以管理员身份登录SQL> CONN /AS SYSDBA已连接。2)查询数据文件SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES;FILE_NAME TABLESPACE_NAME---------------------------------------------------------D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF SYSTEMD:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF UNDOTBS1D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF CWMLITED:\ORACLE\ORADATA\DB01\DRSYS01.DBF DRSYSD:\ORACLE\ORADATA\DB01\EXAMPLE01.DBF EXAMPLED:\ORACLE\ORADATA\DB01\INDX01.DBF INDXD:\ORACLE\ORADATA\DB01\ODM01.DBF ODMD:\ORACLE\ORADATA\DB01\TOOLS01.DBF TOOLSD:\ORACLE\ORADATA\DB01\USERS01.DBF USERSD:\ORACLE\ORADATA\DB01\XDB01.DBF XDB已选择10 行。在查询结果中,FILE_NAME 列为数据文件的位置和名称,TABLESPACE_NAME 列为对应的表空间名称。(三)、数据字典管理和本地管理方式
在表空间中区是最小的空间分配单位,对表空间的管理是以区为单位进行的。根据管理方式的不同,表空间分为本地管理表空间和字典管理表空间:• 本地管理方式的表空间:在表空间内通过位图管理区。在本地管理的表空间中,每个数据文件内都维护一个位图,以了解该数据文件内块的空闲或使用状态。位图中的每个位对应于一个块或一组块。其特点是分配了的某个区或释放的某个区可被重新使用时,Oracle 服务器更改位图值以显示块的新状态。因为表空间的存储管理信息保存在表空间的数据文件的头部,而不是保存在表空间外部的数据字典中,所以被称为“本地管理方式”。从Oracle9i 开始,在本地管理已成为缺省设置。• 字典管理的表空间:由数据字典管理区。数据字典的信息存储在system 表空间中,Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句, 但是需要手动合并空闲区。这比本地管理的表空间更灵活,但效率要低得多。由于本地管理表空间是采用位图对区进行管理的,相对于字典管理有如下优点:
• 本地管理可以避免循环空间管理操作。在字典管理表空间上分配和释放区会导致访问回滚段和数据字典基表,而在本地管理表空间上的分配和释放区只需要修改其数据文件对应的位图值。• 由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对数据字典的争用。• 区的本地管理可自动跟踪并合并邻近的空闲空间,因而无须合并空闲区,而字典管理表空间则可能需要手工合并空间碎片。• 本地管理的区大小可由系统自动确定。• 对区的位图进行更改不会生成UNDO 信息,因为它们不更新数据字典中的表(表空间限额信息等特殊情况除外)。
(四)、创建表空间
1. 创建表空间要考虑的因素在创建数据库完毕后,通常可以立即创建所需的非SYSTEM 表空间,在创建表空间时,除考虑到空间数量、对应的数据文件的大小等基本因素外,还要考虑表空间存储管理方式、默认存储参数设置、块大小等问题。Oracle 本身并不能限制表空间的数目,但是受到数据库所能拥有的数据文件数目的限制,只能创建有限数时的表空间。即所有表空间的数据文件的总和不能超过创建数据库时指定的MAXDATAFILES 参数的限制。创建的表空间在默认情况具有标准的块大小,但是也可以创建具有非标准块大小的表空间。CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name
DATAFILE datafile spec | TEMPFILE tempfile spec[MINIMUM EXTENT minimum extent size][BLOCKSIZE blocksize][[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)][LOGGING|NOLOGGING][FORCE LOGGING][ONLINE|OFFLINE][EXTENT MANAGEMENT DICTIONARY |LOCAL [AUTOALLOCATE|UNIFORM SIZE size]][SEGMENT SPACE MANAGEMENT MANUAL|AUTO][FLASHBACK ON|OFF]参数说明如下:
• DATAFILE:用于指定表空间所对应的数据文件。• SIZE:用于指定数据文件的尺寸。• EXTENT MANAGEMENT DICTIONARY:表空间中区的管理方式为字典管理方式。• DEFAULT STORAGE:用于指定默认存储参数设置。当不设置默认存储参数时,系统会自动使用SYSTEM 表空间的存储参数设置。• INITIAL:用于指定为数据库对象所分配的第一个区的大小。• NEXT:用于指定为数据库对象所分配的第二个区的大小。
• MINEXTENTS:用于指定为数据库对象所分配的最少区个数。• MAXEXTENTS:用于指定为数据库对象所分配的最多区个数。• PCTINCREASE:用于指定从第三个区开始,每个区比前一个区所增长的百分比,并且区尺寸的计算公式如下:• Size=NEXT *(1+PCIINCREASE/100)(n-2)• 其中,n 表示第n 个区,除了第一个区和第二个区以外,其他区尺寸会自动转变为DB_BLOCK_SIZE 的整数倍。2. 本地管理的表空间中的段空间管理
用户使用CREATE TABLESPACE 语句创建一个本地管理的表空间(locally managedtablespace)时,可以使用SEGMENT SPACE MANAGEMENT 子句来设定段(segment)内
的可用/已用空间如何管理。可选的方式有:1.AUTO
在这种设置下,Oracle 使用位图(bitmap)管理段内的可用空间。[注意此处的位图与本地管理的表空间使用的位图不一样]此处的位图用于描述段内每个数据块(data block)是否有足够的可用空间来插入(insert)新数据。随着一个数据块中可用空间的变化,她的状态也被及时地反映到位图中。Oracle 使用位图可以更自动化地管理段内的可用空间。这种空间管理形式被称为自动段空间管理(automatic segment-space management)。一个本地管理的(locally managed),且使用自动段空间管理的表空间,既可以被创建为小文件表空间(传统的)(smallfile tablespace),也可以被创建为大文件表空间(bigfile tablespaces)。在创建本地管理的表空间时,自动段空间管理是默认值。2.MANUAL
在这种设置下,Oracle 使用可用块列表(free list)来管理段内的可用空间。可用块列表记录了所有可以被用于插入新数据的数据块。(五)、其他表空间操作
1. 调整表空间大小如果登录到Oracle 数据库,并给某表插人数据时,发现在插人数据时总是显示错误信息,但是可以查询该表数据,可以考虑查看表空间大小,如果数据已占满了表空间,表空间
不能分配新的区时用户不能插入数据记录。理想情况下,在建立表空间时就应该规划好其尺寸,以避免出现以上问题。但是如果表空间不足以存放更多数据,那么DBA 可以改变表空间的尺寸。但是如果DBA 等表空间不足时才去扩展表空间的容量,会影响Oracle 的性能,因此,DBA 需要知道现在的对象多大,对象的增长速度有多快,有规律的检查数据块对象的大小,把注意力集中在快速增长的表上,经常查看表空间中的自由空间,然后主动增加表空间的容量,提高系统的性能。表空间物理上表现为一个或多个数据文件,表空间的尺寸即表空间所有数据文件尺寸的总和。因此表空间的大小由数据文件的个数和数据文件的大小来决定,可通过以下方法进行
调整:• 重置数据文件的大小:ALTER DATABASE DATAFILE '...' | FileNo RESIZE XX• 更改数据文件的大小:可以使用数据文件AUTOEXTEND(自动扩展)属性自动调整数据文件的大小,也可以使用ALTER TABLESPACE 手动调整。• 使用ALTER TABLESPACE 命令给表空间添加新的数据文件1.数据文件的自动扩展属性(AUTOEXTEND)
当激活了数据文件的自动扩展选项之后,如果数据占满了数据文件所有空间,并且该数据文件不能容纳新数据时, 系统会自动扩展该数据文件。可以指定数据文件的
AUTOEXTEND 子句启用或禁用数据文件的自动扩展。文件将按指定的增量增加直到达到指定的最大值。使用AUTOEXTEND 子句的优点如下:• 当表空间的空间用尽时无需过多的直接干预。• 确保应用程序不会由于未能分配区而暂停。创建数据文件后,可使用下列SQL 命令启用数据文件的自动扩展:• CREATE TABLESPACE• ALTER TABLESPACE
【实例8-9】创建表空间mytbs8 并设置数据文件为自动扩展。
1)以管理员身份登录SQL> CONNECT / AS SYSDBA2)创建表空间SQL> CREATE TABLESPACE mytbs8DATAFILE 'd:\oracle\oradata\db01\mytbs08.dbf' SIZE 5MAUTOEXTEND ON NEXT 1M MAXSIZE 50M;表空间已创建。3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTENDSQL> SELECT FILE_NAME,AUTOEXTENSIBLEFROM DBA_DATA_FILESWHERE TABLESPACE_NAME='MYTBS8';FILE_NAME AUT---------------------------------------------D:\ORACLE\ORADATA\DB01\MYTBS08.DBF YES说明:可以在创建数据库时指定数据文件的自动扩展属性,命令格式如下:
CREATE TABLESPACE tablespaceDATAFILE filespec [autoextend_clause]autoextend_clause:== [AUTOEXTEND {OFF|ON[NEXT integer[K|M]][MAXSIZE UNLIMITED | integer[K|M]] } ]其中:AUTOEXTEND OFF:禁用数据文件的自动扩展AUTOEXTEND ON:启用数据文件的自动扩展NEXT:自动扩展时每次分配给数据文件的磁盘空间MAXSIZE:指定允许分配给该数据文件的最大磁盘空间UNLIMITED:将分配给数据文件的磁盘空间设为不受限可以为现有数据文件指定AUTOEXTEND,格式如下
ALTER DATABASE [database]DATAFILE 'filename'[, 'filename']... autoextend_clause【实例8-10】修改表空间mytbs7 的数据文件为自动扩展。
1)以管理员身份登录SQL>CONNECT / AS SYSDBA2)修改表空间
SQL> ALTER DATABASEDATAFILE 'd:\oracle\oradata\db01\mytbs7.ora' AUTOEXTEND ONNEXT 1M MAXSIZE UNLIMITED;数据库已更改。3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND。SQL> SELECT FILE_NAME,AUTOEXTENSIBLEFROM DBA_DATA_FILESWHERE TABLESPACE_NAME='MYTBS7';结果略如果想禁用文件的自动扩展属性,只要将on 改变off 就可以了。默认情况下,表空间
不不允许自动扩展的。如:SQL> ALTER DATABASEDATAFILE 'd:\oracle\oradata\db01\mytbs7.ora' AUTOEXTEND OFF;2.为表空间增加数据文件
可以通过ALTER TABLESPACE ADD DATAFILE 命令,向表空间添加数据文件以增加分配给表空间的磁盘空间总量。命令格式如下:ALTER TABLESPACE tablespaceADD DATAFILE filespec [autoextend_clause]