(二)、表空间和数据文件的关系
数据库、表空间和数据文件是紧密相关的,但它们之间又有着重要
区别,关系如图8-1 所示:

? Oracle 数据库由一个或多个称为表空间的逻辑存储单元组成, 表空间作为一个整体存储数据库中的所有数据,并且一个表空 间只能属于一个数据库。数据库的大小是该数 据库中所表空间 大小总和。
? 从物理讲,Oracle 数据库内的每个表空间由一个或多数据文件 组成,并且一个数据文件只能属于一个表空间。表空间大是所有数据文件大小的总 和。这些数据文件与Oracle 运行所在的操作系统的文件有一样的物理结构。
? 数据库的所有数据都存储在数据文件中,数据库的每个表空间都由这些数据文件组 成。例如,最简单的Oracle 数据库只有一个表空间和一个数据文件。
1 --【实例8-2】查询表空间及数据文件的信息 2 --1)以管理员身份登录 3 SQL> CONN /AS SYSDBA 4 --已连接。 5 --2)查询数据文件 6 SQL> SELECT FILE_NAME,TABLESPACE_NAME FROM DBA_DATA_FILES; 7 FILE_NAME TABLESPACE_NAME 8 --------------------------------------------------------- 9 D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF SYSTEM 10 D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF UNDOTBS1 11 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF CWMLITE 12 D:\ORACLE\ORADATA\DB01\DRSYS01.DBF DRSYS 13 D:\ORACLE\ORADATA\DB01\EXAMPLE01.DBF EXAMPLE 14 D:\ORACLE\ORADATA\DB01\INDX01.DBF INDX 15 D:\ORACLE\ORADATA\DB01\ODM01.DBF ODM 16 D:\ORACLE\ORADATA\DB01\TOOLS01.DBF TOOLS 17 D:\ORACLE\ORADATA\DB01\USERS01.DBF USERS 18 D:\ORACLE\ORADATA\DB01\XDB01.DBF XDB 19 --已选择10 行。 20 --在查询结果中,FILE_NAME 列为数据文件的位置和名称,TABLESPACE_NAME 列为对应的表空间名称。
(三)、数据字典管理和本地管理方式
在表空间中区是最小的空间分配单位,对表空间的管理是以区为单位进行的。根据管理 方式的不同,表空间分为本地管理表空间和字典管理表空间:
? 本地管理方式的表空间:在表空间内通过位图管理区。在本地管理的表空间中,每 个数据文件内都维护一个位图,以了解该数据文件内块的空闲或使用状态。位图中 的每个位对应于一个块或一组块。其特点是分配了的某个区或释放的某个区可被重 新使用时,Oracle 服务器更改位图值以显示块的新状态。因为表空间的存储管理 信息保存在表空间的数据文件的头部,而不是保存在表空间外部的数据字典中,所 以被称为“本地管理方式”。从Oracle9i 开始,在本地管理已成为缺省设置。
? 字典管理的表空间:由数据字典管理区。数据字典的信息存储在system 表空间中, Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间 内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句, 但是需要 手动合并空闲区。这比本地管理的表空间更灵活,但效率要低得多。
由于本地管理表空间是采用位图对区进行管理的,相对于字典管理有如下优点:
? 本地管理可以避免循环空间管理操作。在字典管理表空间上分配和释放区会导致访 问回滚段和数据字典基表,而在本地管理表空间上的分配和释放区只需要修改其数 据文件对应的位图值。
? 由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对数据字典的 争用。
? 区的本地管理可自动跟踪并合并邻近的空闲空间,因而无须合并空闲区,而字典管 理表空间则可能需要手工合并空间碎片。
? 本地管理的区大小可由系统自动确定。
? 对区的位图进行更改不会生成UNDO 信息,因为它们不更新数据字典中的表(表 空间限额信息等特殊情况除外)。
(四)、创建表空间
1. 创建表空间要考虑的因素
在创建数据库完毕后,通常可以立即创建所需的非SYSTEM 表空间,在创建表空间时,
除考虑到空间数量、对应的数据文件的大小等基本因素外,还要考虑表空间存储管理方式、
默认存储参数设置、块大小等问题。
Oracle 本身并不能限制表空间的数目,但是受到数据库所能拥有的数据文件数目的限
制,只能创建有限数时的表空间。即所有表空间的数据文件的总和不能超过创建数据库时指
定的MAXDATAFILES 参数的限制。创建的表空间在默认情况具有标准的块大小,但是也
可以创建具有非标准块大小的表空间。
1 CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace name 2 DATAFILE datafile spec | TEMPFILE tempfile spec 3 [MINIMUM EXTENT minimum extent size] 4 [BLOCKSIZE blocksize] 5 [[COMPRESS|NOCOMPRESS] DEFAULT STORAGE (default storage clause)] 6 [LOGGING|NOLOGGING] 7 [FORCE LOGGING] 8 [ONLINE|OFFLINE] 9 [EXTENT MANAGEMENT DICTIONARY | 10 LOCAL [AUTOALLOCATE|UNIFORM SIZE size]] 11 [SEGMENT SPACE MANAGEMENT MANUAL|AUTO] 12 [FLASHBACK ON|OFF] 13 --参数说明如下: 14 --? DATAFILE:用于指定表空间所对应的数据文件。 15 --? SIZE:用于指定数据文件的尺寸。 16 --? EXTENT MANAGEMENT DICTIONARY:表空间中区的管理方式为字典管理方式。 17 --? DEFAULT STORAGE:用于指定默认存储参数设置。当不设置默认存储参数时,系统会自动使用SYSTEM 表空间的存储参数设置。 18 --? INITIAL:用于指定为数据库对象所分配的第一个区的大小。 19 --? NEXT:用于指定为数据库对象所分配的第二个区的大小。 20 --? MINEXTENTS:用于指定为数据库对象所分配的最少区个数。 21 --? MAXEXTENTS:用于指定为数据库对象所分配的最多区个数。 22 --? PCTINCREASE:用于指定从第三个区开始,每个区比前一个区所增长的百分比,并且区尺寸的计算公式如下: 23 --? Size=NEXT *(1+PCIINCREASE/100)(n-2) 24 --? 其中,n 表示第n 个区,除了第一个区和第二个区以外,其他区尺寸会自动转变为DB_BLOCK_SIZE 的整数倍。
2. 本地管理的表空间中的段空间管理
用户使用CREATE TABLESPACE 语句创建一个本地管理的表空间(locally managed
tablespace)时,可以使用SEGMENT SPACE MANAGEMENT 子句来设定段(segment)内
的可用/已用空间如何管理。可选的方式有:
1.AUTO
在这种设置下,Oracle 使用位图(bitmap)管理段内的可用空间。[注意此处的位图
与本地管理的表空间使用的位图不一样]此处的位图用于描述段内每个数据块(data block)
是否有足够的可用空间来插入(insert)新数据。随着一个数据块中可用空间的变化,她的
状态也被及时地反映到位图中。Oracle 使用位图可以更自动化地管理段内的可用空间。这种
空间管理形式被称为自动段空间管理(automatic segment-space management)。
一个本地管理的(locally managed),且使用自动段空间管理的表空间,既可以被创
建为小文件表空间(传统的)(smallfile tablespace),也可以被创建为大文件表空间(bigfiletablespaces)。在创建本地管理的表空间时,自动段空间管理是默认值。
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
1 --【实例8-9】创建表空间mytbs8 并设置数据文件为自动扩展。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)创建表空间 5 SQL> CREATE TABLESPACE mytbs8 6 DATAFILE ‘d:\oracle\oradata\db01\mytbs08.dbf‘ SIZE 5M 7 AUTOEXTEND ON NEXT 1M MAXSIZE 50M; 8 --表空间已创建。 9 --3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND 10 SQL> SELECT FILE_NAME,AUTOEXTENSIBLE 11 FROM DBA_DATA_FILES 12 WHERE TABLESPACE_NAME=‘MYTBS8‘; 13 FILE_NAME AUT 14 --------------------------------------------- 15 D:\ORACLE\ORADATA\DB01\MYTBS08.DBF YES 16 --说明:可以在创建数据库时指定数据文件的自动扩展属性,命令格式如下: 17 CREATE TABLESPACE tablespace 18 DATAFILE filespec [autoextend_clause] 19 autoextend_clause:== [AUTOEXTEND {OFF|ON[NEXT integer[K|M]] 20 [MAXSIZE UNLIMITED | integer[K|M]] } ] 21 --其中: 22 --AUTOEXTEND OFF:禁用数据文件的自动扩展 23 --AUTOEXTEND ON:启用数据文件的自动扩展 24 --NEXT:自动扩展时每次分配给数据文件的磁盘空间 25 --MAXSIZE:指定允许分配给该数据文件的最大磁盘空间 26 --UNLIMITED:将分配给数据文件的磁盘空间设为不受限 27 --可以为现有数据文件指定AUTOEXTEND,格式如下 28 ALTER DATABASE [database] 29 DATAFILE ‘filename‘[, ‘filename‘]... autoextend_clause 30 --【实例8-10】修改表空间mytbs7 的数据文件为自动扩展。 31 --1)以管理员身份登录 32 SQL>CONNECT / AS SYSDBA 33 --专业专注超越Oracle 体系结构篇之对象空间管理 34 2)修改表空间 35 SQL> ALTER DATABASE 36 DATAFILE ‘d:\oracle\oradata\db01\mytbs7.ora‘ AUTOEXTEND ON 37 NEXT 1M MAXSIZE UNLIMITED; 38 --数据库已更改。 39 --3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND。 40 SQL> SELECT FILE_NAME,AUTOEXTENSIBLE 41 FROM DBA_DATA_FILES 42 WHERE TABLESPACE_NAME=‘MYTBS7‘; 43 --结果略 44 --如果想禁用文件的自动扩展属性,只要将on 改变off 就可以了。默认情况下,表空间不不允许自动扩展的。 45 --如: 46 SQL> ALTER DATABASE 47 DATAFILE ‘d:\oracle\oradata\db01\mytbs7.ora‘ AUTOEXTEND OFF;
2.为表空间增加数据文件
可以通过ALTER TABLESPACE ADD DATAFILE 命令,向表空间添加数据文件以增加
分配给表空间的磁盘空间总量。命令格式如下:
1 ALTER TABLESPACE tablespace ADD DATAFILE filespec [autoextend_clause]1 --【实例8-11】为mytbs3 表空间增加一个数据文件,大小为5MB. 2 --1)以管理员身份登录 3 SQL>CONNECT / AS SYSDBA 4 --2)增加数据文件 5 SQL>ALTER TABLESPACE mytbs3 ADD DATAFILE ‘d:\oracle\oradata\db01\mytbs3c.dbf‘ SIZE 5M; 6 --表空间已更改。 7 --3)查询DBA_DATA_FILES 确认是否增加了数据文件 8 SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=‘MYTBS3‘; 9 FILE_NAME 10 -------------------------------------- 11 D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF 12 D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF 13 D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 14 --专业专注超越Oracle 体系结构篇之对象空间管理 通过查询结果可以看到,数据文件由原来的2 个增加为3 个
3.手工修改数据文件大小
尽管指定自动扩展选项可以使得数据文件在数据写满的情况下自动扩展,但自动扩展导
致递归空间操作,从而降低系统性能。例如,当使用SQL*Loader 给表EMP 装载大批量数
据时,在数据写满数据文件之后需要先扩展数据文件,然后才能装载数据,因而会导致系统
性能的降低。因此,在执行批量数据装载操作之前,你应该首先确定数据文件是否能够容纳
足够数据。如果不足以容纳数据的话,应该首先扩展该数据文件,然后装载数据。DBA 可
以使用ALTER DATABASE 命令手动增加或减少数据文件的大小,而不必通过添加数据文
件或更改自动扩展属性更改表空间的大小。命令格式如下:
1 ALTER DATABASE [database] DATAFILE ‘filename’[, ‘filename’]... RESIZE integer[K|M]
其中:Integer:以字节为单位表示的结果数据文件的绝对大小 ; 如果更改数据文件的大小比实际存储的数据库对象要小,那么数据文件大小只能减少到 数据文件内最后一个对象的最后一个块为止,也就是缩减尺寸后表空间必须能容纳已存在的 数据对象,否则会提示出错信息。
1 --【实例8-12】将mytbs5 表空间中数据文件的大小改为10M. 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)创建表空间 5 SQL> ALTER DATABASE DATAFILE ‘d:\oracle\oradata\db01\mytbs05.dbf‘ RESIZE 10M; 6 --数据库已更改。 7 --3)查询以确认更改 8 SQL> SELECT BYTES FROM DBA_DATA_FILES WHERE TABLESPACE_NAME=‘MYTBS5‘; 9 BYTES 10 ---------- 11 10485760 12 --【练习8-3】重新更改mytbs5 表空间大小为5M。
2. 修改表空间读写属性
当表空间用于存放静态数据时,因为不会对这些数据进行修改操作,所以可以将这些数
据存放到只读设备上,例如存放到光盘上。为了将表空间放到只读设备上,必须将其转变为
只读状态。下面的命令将表空间改为只读模式:
1 ALTER TABLESPACE [tablespace] READ ONLY; 执行这条命令时,与该表空间相关的所有事务会自动回滚,过渡状态期间不允许再对该
表空间进行任何写入操作。当所有事务处理提交或者回退后,只读命令完成,该表空间置于
只读模式。1 --【实例8-13】在表空间mytbs3 中创建表test,将mytbs3 表空间更改为只读状态,验证能否插入数据,能否删除表。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)创建表 5 SQL> CREATE TABLE test (name varchar(20)) TABLESPACE mytbs3; 6 --表已创建。 7 --3)将表空改为只读状态 8 SQL> ALTER TABLESPACE mytbs3 READ ONLY; 9 --表空间已更改。 10 --4)向表中插入一条数据,能否成功,为什么? 11 SQL> INSERT INTO test VALUES (‘SHEN‘); 12 INSERT INTO test VALUES (‘SHEN‘) 13 * 14 --ERROR 位于第1 行: 15 --ORA-00372: 此时无法修改文件16 16 --ORA-01110: 数据文件16: ‘D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF‘ 17 --表空间只读后不能执行DML 操作. 18 --5)删除表,查看能否成功,为什么? 19 SQL> DROP TABLE test; 20 --表已丢弃。
由上例可以看出执行了上述命令之后,会将表空间mytbs3 转变为只读状态。此时,用 户将只能在该表空间的对象上执行查询操作(SELECT),而不能执行DML 或DDL 操作。但 专业专注超越Oracle 体系结构篇之对象空间管理 大家要注意,有一种DDL 操作例外,可以执行DROP TABLE 或DROP INDEX 删除该表空 间上的表或索引,因为这些命令只影响数据字典(数据字典位于SYSTEM 表空间)。之所以 可以这样操作,是因为DROP 命令只更新数据字典,而不更新只读表空间上的物理文件。
对于本地管理的表空间,删除的段将改为临时段以避免更新位图。将表空间设为只读状态之 前,将会引发对表空间的数据文件执行检查点操作。将表空间设为只读可防止对表空间中的 数据文件进行任何写操作,因此,数据文件可驻留在只读介质上,如CD-ROM 或一次性写入 (WORM) 驱动器。使用只读表空间的好处是可以免去对数据库大量的静态数据执行备份。 要在只读表空间上执行DML 操作,必须将表空间改为可写状态,可以使用
ALTER TABLESPACE [tablespace] READ WRITE命令,但是表空间内的所有数据文件都必须联机。
1 --【实例8-14】将mytbs3 表空间更改为可读写状态,验证是否能够创建表。 2 --1)以管理员身份登录 3 SQL>CONNECT / AS SYSDBA 4 --2)改为可读可写状态 5 SQL> ALTER TABLESPACE mytbs3 READ WRITE; 6 --表空间已更改。 7 --3)创建表test 验证表空间的状态 8 SQL> CREATE TABLE test (name varchar(20)) TABLESPACE mytbs3; 9 --表已创建。 10
在这里建表操作成功,也说明上一实例在只读状态下对表的删除是成功的。
Oracle 数据库逻辑结构
标签:信息 ack 之间 动态 mat default 开始 next 管理员