注:本文来源于 <腾科OCP培训课堂>。非准许商业活动。
Oracle 数据库逻辑结构
一、存储关系
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 是临时表空间,ndotbs1是undo 撤销表 空间。
使用多个表空间有以下好处:
• 不同类型的数据存入到不同的表空间中,可以更灵活地管理数据库。
• 将还原段、临时段、应用程序数据段和应用程序索引段分开存储到不同表空间中。
• 根据备份要求将数据分开存储。
• 将动态数据和静态数据分别存储在不同的表空间中,以利于备份和恢复。
• 通过分配给用户表空间上的配额,避免分某个用户占用表空间太多的存储空间。
数据库至少包含以下几个表空间:SYSTEM 表空间,临时表空间(TEMPORARY)用 于存放临时数据,UNDO 表空间用于存入数据修改后的旧值。
1 --【实例8-1】查询数据库包含的表空间信息 2 --1)以管理员身份登录 3 SQL> CONN /AS SYSDBA 4 --2)查询表空间 5 SQL> SELECT name FROM V$TABLESPACE; 6 NAME 7 ------------------------------ 8 CWMLITE 9 DRSYS 10 EXAMPLE 11 INDX 12 ODM 13 SYSTEM 14 TOOLS 15 UNDOTBS1 16 USERS 17 XDB 18 TEMP 19 --已选择11 行。 20 --其中SYSTEM 是系统表空间、UNDOTBS1 是UNDO 表空间、TEMP 是临时表空间。
(二)、表空间和数据文件的关系
数据库、表空间和数据文件是紧密相关的,但它们之间又有着重要 区别,关系如图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 --【实例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 命令手动增加或减少数据文件的大小,而不必通过添加数据文 件或更改自动扩展属性更改表空间的大小。命令格式如下:
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 --【实例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 操作,必须将表空间改为可写状态,可以使用
命令,但是表空间内的所有数据文件都必须联机。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
在这里建表操作成功,也说明上一实例在只读状态下对表的删除是成功的。
3. 修改表空间的ONLINE/OFFLINE 属性
通过将一个表空间置于联机或脱机状态来控制表空间的可用性。当表空间处于联机状态 时,用户可以访问其中的数据。当某一表空间处于脱机状态时,用户无法访问它的数据,但 是允许正常访问数据库的其余处于联机的表空间。以下几种情况下数据库管理员可以让表空 间脱机:
• 使数据库的一部分表空间不可用,但允许正常访问数据库的其余表空间
• 执行脱机表空间备份(尽管表空间可以在联机使用时备份)
• 在数据库打开时恢复表空间或数据文件
• 在数据库打开时移动数据文件
可以使用如下命令对表空间进行脱机和联机操作:
1 ALTER TABLESPACE tablespace
专业专注超越Oracle 体系结构篇之对象空间管理
其中:
NORMAL:将该表空间中所有数据文件内的所有块从SGA 中写入数据文件并将数 据文件关闭。这是缺省设置。在使该表空间重新联机之前,无须对其执行介质恢复。尽可能 使用NORMAL 子句。
TEMPORARY:对表空间内的所有联机数据文件执行检查点操作,但是在执行检查 点时并不检查数据文件的状态,即使某些文件无法写入检查点,Oracle 也会忽略这些错误。 在使用此种表空间重新联机之前,所有脱机文件可能都需要进行介质恢复。
IMMEDIATE:不保证表空间文件可用,而且不执行检查点操作。在使表空间重新联 机前,必须对其执行介质恢复操作。
FOR RECOVER:使表空间脱机以进行表空间时间点恢复。
只要数据库打开,数据库管理员就可以使任意一个表空间脱机(SYSTEM 表空间和任 何具有活动还原段或临时段的表空间除外)。当一个表空间脱机后,Oracle 服务器将使与之
相关联的所有数据文件脱机。
1 --【实例8-15】将mytbs3 表空间改为脱机状态,并向test 表中插入一条数据进行验证。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)改为脱机状态 5 SQL> ALTER TABLESPACE mytbs3 OFFLINE NORMAL; 6 --表空间已更改。 7 --3)查询数据 8 SQL> SELECT * FROM test; 9 SELECT * FROM test 10 --* 11 --ERROR 位于第1 行: 12 --ORA-00376: 此时无法读取文件16 13 --ORA-01110: 数据文件16: 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF'
说明:执行查询操作时用户将收到一条错误消息,因为当表空间脱机后,Oracle 不允 许有任何SQL 语句引用该表空间含有的对象,即用户不能访问该表空间。
当表空间脱机或者重新联机后,该事件记录在数据字典和控制文件内。如果关闭数据库 时表空间仍然脱机,则当随后数据库装载并重新打开时,该表空间仍保持脱机状态且不会被 检查。如果遇到某些错误(例如,当数据库写入程序进程DBWn 几次试图向某表空间的数 据文件写入都失败时),Oracle 实例(Instance)自动将表空间从联机状态切换为脱机状态。
不能设为脱机的表空间:SYSTEM 表空间,具有活动的还原段的表空间,缺省临时表空 间。 当希望访问表空间中的数据如表、索引等对象时,表空间必须处于联机状态。
1 --【实例8-16】将mytbs3 表空间改为联机状态,并向test 表中插入一条数据进行验证。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)改为联机状态 5 SQL> ALTER TABLESPACE mytbs3 ONLINE; 6 --表空间已更改。 7 -3)插入数据 8 SQL> INSERT INTO test VALUES('SHEN'); 9 --已创建1 行。 10 ---说明:插入数据成功,因为表空间处于联机状态。
4. 数据文件的脱机与联机
与表空间类似,联机的数据文件也可以被设置为脱机状态。脱机的数据文件对于数据库 来说是不可用的,直到它们被恢复为联机状态为止。如果数据文件发生损坏时,Oracle 会自 动将这个数据文件设置为脱机状态,并且记录在警告文件中。如果损坏的文件恢复后,需要 以手工方式重新将数据文件恢复为联机状态。 将数据文件设置为脱机状态,不会影响表空间的状态,但是反过来,将表空间设置为脱 机状态后,属于该表空间的数据文件同时会进入脱机状态。如果想改变数据文件的状态,可 以使用ALTER ATABASE 命令。
1 --【实例8-17】将数据文件D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 改为脱机状态,然后再改为联机状态。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)改为脱机状态 5 SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' OFFLINE; 6 --数据库已更改。 7 --3)改为联机状态 8 SQL> ALTER DATABASE DATAFILE 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' ONLINE; 9 10 -- 数据库已更改。
5. 数据文件的移动
为了防止数据丢失和减少I/O 冲突,提高I/O 性能,应该将数据文件尽可能分布到不同 磁盘上,并且尽可能均衡不同磁盘之间的I/O 操作。移动数据文件一方面是出于性能方面 的考虑,另一方面出于安全考虑。因此在实际数据库应用中可能会移动数据文件。移动数据 文件有两种方法,一种方法是使用ALTER TABLESPACE 命令,另一种方法是使用ALTER DATABASE 命令,具体采用哪种方法取决于表空间类型。
1.使用ALTER TABLESPACE 命令
1 --使用ALTER TABLESPACE 命令格式如下: 2 ALTER TABESPACE tablespace RENAME DATAFILE 'filename'[, 'filename']... TO 'filename'[, 'filename']... 3 --它仅适用于不含活动还原段或临时段的非SYSTEM 表空间中的数据文件的移动。源文 件名必须与存储在控制文件--内的名称匹配,表空间必须脱机,并且TO 子句后的目标数据文 件必须存在。
ALTER TABLESPACE 命令重命名数据文件的步骤:
• 使表空间脱机。
• 使用操作系统命令移动或复制文件。
• 执行ALTER TABLESPACE RENAME DATAFILE 命令。
• 使表空间联机。
• 必要时使用操作系统命令删除原来的数据文件。
1 --【实例8-18】将mytbs3 表空间的第三个数据文件由D:盘移动到E:盘。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2)使表空间脱机 5 SQL> ALTER TABLESPACE mytbs3 OFFLINE; 6 --表空间已更改 7 --3) 使用操作系统命令移动或复制文件 8 --复制mytbs3 表空间的第三个数据文件到E:盘相同目录下(需要先创建目录)。如果不能确定mytbs3 表空间包含的数据文件,请查询dba_data_files。 9 --4)执行ALTER TABLESPACE RENAME DATAFILE 命令 10 SQL> ALTER TABLESPACE mytbs3 DATAFILE 'd:\oracle\oradata\db01\mytbs3c.dbf' TO 'e:\oracle\oradata\db01\mytbs3c.dbf'; 11 --表空间已更改 12 --5) 使表空间联机 13 SQL> ALTER TABLESPACE mytbs3 ONLINE; 14 --表空间已更改 15 --6) 查询表空间的数据文件 16 SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='MYTBS3'; 17 FILE_NAME 18 ----------------------------------------------------------------- 19 D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF 20 D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF 21 E:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 22 --可见第三个数据文件已经由D:盘移动到了E:盘。 23 --说明:必要时使用操作系统命令删除原来的数据文件。
2.使用ALTER DATABASE 命令
ALTER DATABASE 命令可用来移动任意类型的数据文件,但是数据库必须处于已装载 状态,且目标数据文件必须存在。步骤如下:
• 关闭数据库。
• 使用操作系统命令移动文件。
• 装载数据库。
• 执行ALTER DATABASE RENAME FILE 命令。
• 打开数据库。
1 --【实例8-19】将system 表空间由D:盘移动到E:盘。 2 --1)以管理员身份登录 3 SQL>CONNECT / AS SYSDBA 4 --2) 关闭数据库 5 SQL> SHUTDOWN NORMAL; 6 --数据库已经关闭。 7 --已经卸载数据库。 8 --ORACLE 例程已经关闭。 9 --3)使用操作系统命令将system 表空间对应的数据文件移到E:盘相同目录下。 10 --4)将数据启动至装载状态 11 SQL> STARTUP MOUNT; 12 --ORACLE 例程已经启动。 13 --Total System Global Area 34675092 bytes 14 --Fixed Size 453012 bytes 15 --Variable Size 29360128 bytes 16 --Database Buffers 4194304 bytes 17 --Redo Buffers 667648 bytes 18 --数据库装载完毕。 19 --5)执行ALTER DATABASE RENAME FILE 命令 20 SQL>ALTER DATABASE RENAME FILE 'd:\oracle\oradata\db01\system01.dbf' TO 'e:\oracle\oradata\db01\system01.dbf'; 21 --数据库已更改 22 --6) 打开数据库 23 SQL> ALTER DATABASE OPEN; 24 --数据库已更改。; 25 --因为SYSTEM 表空间无法脱机,必须使用该方法移动SYSTEM 表空间内的数据文件。使用此命令重命名无法脱机的表空间内的文件。
(六)、删除表空间
当不再需要表空间及其内容时,可以通过下面的DROP TABLESPACE 命令从数据库中 删除表空间,格式如下:
1 DROP TABLESPACE tablespace [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]] 2 --其中: 3 --tablespace:指定要删除的表空间的名称 4 --INCLUDING CONTENTS:删除表空间内的所有段 5 --AND DATAFILES:删除关联的操作系统文件 6 --CASCADE CONSTRAINTS:如果要删除的表空间之外的表引用了该表空间内表的主 键和唯一键,则删除这种引用完整性约束。
1 --【实例8-21】删除表空间mytbs3, system,查看出现什么现象。 2 --1)以管理员身份登录 3 SQL>CONNECT / AS SYSDBA 4 --2) 删除表空间mytbs3 5 SQL> DROP TABLESPACE mytbs3; 6 --DROP TABLESPACE mytbs3 7 --* 8 --ERROR 位于第1 行: 9 --ORA-01549: 表空间非空,请使用INCLUDING CONTENTS 选项 10 --3) 删除表空间mytbs3,增加选项 11 SQL> DROP TABLESPACE mytbs3 INCLUDING CONTENTS AND DATAFILES; 12 --表空间已丢弃。 13 --4) 删除表空间system 14 SQL> DROP TABLESPACE system INCLUDING CONTENTS AND DATAFILES CASCADE CONSTRAINTS; 15 --DROP TABLESPACE system 16 --* 17 --ERROR 位于第1 行: 18 --ORA-01550: 无法删除系统表空间 19 --说明:表空间mytbs3 中包含一个表段,因此必须带INCLUDING CONTENTS 子句,即删除表空间的同时删除表空间中的对象,加上AND DATAFILES 子句可以删除表空间的数据文件。SYSTEM 表空间中包含了多种段且可能引用其它表空间中的主键,因此加了CASCADE CONSTRAINTS 子句,但是SYSTEM 表空间是不能删除的。
使用DROP TABLESPACE 命令须遵守如下原则:
• 如果表空间中包含数据段,必须使用INCLUDING CONTENTS 选项。当表空间包 含许多对象时,该选项可能会生成许多Undo 数据。
• 删除表空间后,其数据将不再包含在数据库内。
• 在删除表空间时,只删除关联数据库控制文件内的文件指针。操作系统文件仍然存 在,如果未使用AND DATAFILES 子句或数据文件是OMF,则必须使用适当的操 作系统命令明确删除这些文件。
• 即使将表空间切换到只读状态,仍可以删除该表空间以及其中的段。- • 删除表空间之前,建议将表空间脱机,以确保没有事务处理访问该表空间内的任何 段。
• 不能删除下列表空间:SYSTEM 表空间和具有活动段的表空间
(七)、获取表空间的相关信息
可以使用下列数据字典视图和动态性能视图获取表空间和数据文件的相关信息。
与表空间相关:DBA_TABLESPACE,V$TABLESPACE。
与数据文件相关:DBA_DATA_FILES,V$DATAFILE。
与临时数据文件相关:DBA_TEMP_FILES,V$TEMPFILE。
1 --【实例8-26】查询数据文件的基本信息。 2 --1)以管理员身份登录 3 SQL> CONNECT / AS SYSDBA 4 --2) 查询 5 SQL> SELECT name,file#,status,bytes,checkpoint_change# last_scn FROM ; 6 NAME FILE# STATUS BYTES LAST_SCN 7 ----------- ---------- ------- ---------- ---------- 8 D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF 1 SYSTEM 419430400 5083126 9 D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF 2 ONLINE 209715200 5083126 10 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF 3 ONLINE 20971520 5083126 11 --字段的含义如下: 12 --Name:数据文件的名称和位置; 13 --File#:数据文件的绝对编号; 14 --Status:数据文件的状态,可以有三种:联机、脱机或者属于SYSTEM 表空间; 15 --Bytes:数据文件的大小; 16 --Last_scn:数据文件中最后一次写入事务的SCN。 17 --【实例8-27】查询表空间users 的大小。 18 --1)以管理员身份登录 19 SQL> CONNECT / AS SYSDBA 20 --2) 查询 21 SQL> SELECT sum(bytes) FROM dba_data_files WHERE tablespace_name='SYSTEM'; 22 SUM(BYTES) 23 ---------- 24 419430400
(八)、大表空间
在Oracle 中用户可以创建大文件表空间(bigfile tablespace)。这样Oracle 数据库使用的 表空间(tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件。这使Oracle 可以发挥64 位系统的能力,创建、管理超大的文件。在64 位系统中,Oracle 数据库的存储 能力被扩展到了8 EB(1EB = 1024PB,1PB = 1024TB,TB=1024GB)。 只有本地管理的(locally managed),且段空间自动管理(automatic segment-space management)的表空间(tablespace)才能使用大文件表空间(bigfile tablespace)。但是有两 个例外:本地管理的撤销表空间(undo tablespace)和临时表空间(temporary tablespace), 即使其段(segment)为手工管理(manually managed),也可以使用大文件表空间。
使用大文件表空间(bigfile tablespace)可以显著地增强Oracle 数据库的存储能力。 一个小文件表空间(smallfile tablespace)最多可以包含1024 个数据文件(datafile), 而一个大文件表空间中只包含一个文件,这个数据文件的最大容量是小数据文件的 1024 倍。这样看来,大文件表空间和小文件表空间的最大容量是相同的。但是由 于每个数据库最多使用64K 个数据文件,因此使用大文件表空间时数据库中表空 间的极限个数是使用小文件表空间时的1024 倍,使用大文件表空间时的总数据库
容量比使用小文件表空间时高出三个数量级。换言之,当一个Oracle 数据库使用 大文件表空间,且使用最大的数据块容量时(32K),其总容量可以达到8EB。
在超大型数据库中使用大文件表空间减少了数据文件的数量,因此也简化了对数据 文件的管理工作。由于数据文件的减少,SGA 中关于数据文件的信息,以及控制
文件(control file)的容量也得以减小。
由于数据文件对用户透明,由此简化了数据库管理工作。
(九)、小结
Oracle 数据库在逻辑上由一个或多个表空间组成,每个表空间由一个或多数据文件组 成,并且一个数据文件只能属于一个表空间。表空间根据管理方式可以分为本地管理表空间 和字典管理表空间两种,前者是Oracle 9i 默认的管理方式。表空间的大小是构成表空间的 数据文件大小的总和,可以通过修改数据文件的大小、增减数据文件或将数据文件设置为自 动增长来调整表空间的大小。通过移动数据文件,可以将数据文件分布到不同的磁盘驱动器 可以减少I/O 冲突和防止数据损失。
(十)、练习
1.哪一个表空间不能切换为脱机状态
A.临时表空间temp B.用户表空间user
C.索引表空间index D.系统表空间system
2.假如一个表空间只具有一个大小为100MB 的数据文件,现需将该数据文件的大小 修改为10MB,哪种方法是正确的?
A.删除数据文件然后重建
B.使用带有RESIZE 子句的ALTER DATABASE DATAFILE 语句
C.使用带有RESIZE 子句的ALTER TABLESPACE DATAFILE 语句
D.将数据文件的自动扩展属性设为ON,这样数据文件会自动缩小
3.关于脱机表空间的说法哪一个是正确的?
A.任何表空间都可以脱机
B.可以使用ALTER DATABASE 语句将脱机的表空改为联机
C.在表空间脱机时,属于这个表空间的数据文件仍然联机
D.如果将表空间设置为脱机状态,下次启动数据库时,不会对该表空间的数据文件 进行可用性检查。
4.DBA 在执行下列语句时返回了错误,DROP TABLESPACE USRES;可能的原因是下 列哪个?
A.该表空间处于联机状态
B.该表空间处于脱机状态
C.该表空间处于只读状态
D.该表空间为非空,包含数据库对象。
5、如果标准块的尺寸为8KB,若想创建一个数据块为16KB 的表空间,需要指定哪个 初始化参数?
A.DB_8k_CACHE_SIZE
B.DB_16k_CACHE_SIZE
C.UNDO_MANAGEMENT
D.DB_CREATE_FILE_DEST
三、段
在数据库中包含了, 每个表空间物理上对应着磁盘上的一个或多个数据文件 (DATAFILE),一个数据文件只能属于一个表空间。每个表空间又有多个段(SEGMENT) 组成。
(一)、段类型
当建立数据对象(表、索引、簇等)时,Oracle 会自动给这些数据对象分配相应的存储 空间,以存放它们的数据信息,这些为数据对象所分配的存储空间被称为段。一个段只能存 放在一个表空间上,但是可分布在属于这个表空间中的多个数据文件中。段是由一个或多个 区组成的,段的大小是该段所有区大小总和。在Oracle 数据库中,每个段只属于一个特定 的数据库对象(表、索引等),在这个段中至少包含一个区(初始区)。每种数据对象都具有 相应的段,Oracle 提供了以下一些段类型:
1)表段(Table):
表是在数据库内存储数据的最常用方法。表段用于存储常规表(非集簇且未分区)的中 的数据。表段中的所有数据都必须存储在一个表空间内。例如,当在USERS_DATA 表空间 上建立表S_EMP 时,Oracle 会建立名称为S_EMP 的表段,并且将该表的所有数据存放在 USERS_DATA 表空间上。如果表中有LOB 列或VARRAY 列,那么该表不会将这些数据列 存储在同一个段。
2)表分区段(Table Partition):
表分区主要用于数据仓库应用。当表中包含大量数据且表的并发使用率很高时,可以把 一张大表数据划分成几个小的分区,其中每个分区对应于一个段,这种段类型被称为表分区 段,并且每个表分区段可以存放到不同表空间上。使用表分区可以降低I/O 次数,提高I /O 性能。表分区后,每个分区都是一个段,可以指定存储参数单独对它们进行控制。假定 一张销售表年数据总量达到10GB,每个季度平均2.5GB,如果使用普通表存储数据,那么 10GB 数据会存放到一个表段中,那么在统计一季度销售数据时需要扫描10GB 数据;而如 果使用表分区段,那么可以将一、二、三、四季度数据分别存放到不同表分区段中,此时统 计一季度销售数据只需要扫描2.5GB 数据。显然,使用表分区段可以大大降低I/O 次数, 并提高I/O 性能。
注意:使用这种类型的段需要在Oracle9i 企业版内选择分区(Partitioning) 组件。
3)簇段(Cluster):
簇与表一样,是一种数据段类型。簇内的行是基于键值存储的,一个簇可以包含一个或 多个表,一个簇内所有的表属于同一个段,并且区和块的存储管理方式也完全相同。例如, 如果经常要执行主从表之间的连接查询,那么可以将这两张表的数据组织到簇中。簇段的名 称与簇名完全相同。注意,当将表放到簇中时,表的数据存放在簇段中,而不会为该表建立 专门的表段。假定在USERS 表空间上建立簇ORD_ITEM_CLU,并且将表ORD 和ITEM 组 织到该簇中,此时只会建立簇段ORD_ITEM_CLU,而不会建立表段ORD 和ITEM。
4)索引段(Index):
索引是用于加快查询速度的数据库对象。当建立索引时,Oracle 会为该索引建立相应的 索引段,索引段的名称与索引名完全相同,并且一个索引段只能存放在一个表空间中。如果 一个表有三个索引,则使用三个索引段。使用索引段的目的是根据指定的关键字来查找行在 表内的位置。例如,当在EMP 表的EMPNO 列上建立索引PK_EMP 时,Oracle 会自动建立 索引段PK_EMP。
5)按索引组织的表段(Index-organized table):
一般情况下,表与索引数据分别存放在表段和索引段中。例如,表EMP 及其索引 PK_EMP 的数据分别存放在表段EMP 和索引段PK_EMP 中。但是,如果经常要通过主键列
检索数据,那么Oracle 建议将这种表建立为索引组织表。当建立索引组织表时,表和其主 键索引的数据会存放到同一个段中,该段被称为索引组织表段。在按索引组织的表内,数据 基于主键键值存储在索引内。按索引组织的表无需在表中进行查找,因为所有数据都可以直 接从索引树中检索到。
6)索引分区段(Index Partition):
索引分区类似于表分区,而且只能在分区表上建立索引分区。通过对索引进行分区,可 以将一个大的索引划分成几个小的分区,并且每个分区对应一个段,这种段被称为索引分区 段。分区索引的主要用途在于,通过分散索引输入/输出(I/O) 来最大限度地降低对系统资源 的争用。使用这种类型的段需要在Oracle9i 企业版内选择分区(Partitioning) 组件。
7)还原段(Undo):
还原段由正在对数据库进行更改的事务处理使用,还原段用于存放事务所修改数据的旧 值。在修改表或索引数据时,Oracle 会将修改前的数据存放到还原段中,以使得用户可以取 消错误操作。例如,当执行"UPDATE emp SET sal=1000 WHERE empno=7788"语句时,假 定雇员7788 原有工资为800,那么800 将会存放到还原段中,而新数据1000 将会存放到 EMP 段中。
8)临时段(Temporary Segment):
当用户执行CREATE INDEX、SELECT DISTINCT 和SELECT GROUP BY 等命令时, Oracle 服务器就会在内存中(排序区中,大小由初始化参数SORT_AREA_SIZE 确定)执行排
序。如果排序所需空间大于内存中的可用空间,则将中间结果写入到磁盘上。临时段用来存 储这些中间结果。假定某表的数据为7788,7235,8769,2020,8986,那当使用ORDER BY 子句 进行排序时,会返回数据2020,7235,7788,8769,8986。这些返回的数据被称为临时数 据,这些数据存放到临时段中。
当执行以下操作时会产生临时数据:
1 • CREATE INDEX 2 • SELECT...ORDERBY 3 • SELECT DISTINCT... 4 • SELECT...GROUPBY 5 • SELECT...UNION 6 • SELECT...INTERSECT 7 • SELECT...MINUS 8 • ANALYZE 命令
9)LOB 段:
当表中的数据包含文本文档、图像或者视频时,使用普通数据类型如VARCHAR 等可 能无法存储,必须使用CLOB 或BLOB 数据类型存储大型对象(LOB)。如果LOB 列数据 长度大于4000B,Oracle 服务器将把这些值存储在独立的段(称为“LOB 段”)中。而在 基表(Base Table)中只包含一个定位器或者指针,指向对应的LOB 数据所在的位置。
除了上述9 种段类型外,还有LOB 索引段,嵌套表段,引导程序段(也称为高速缓存 段)等多种段类型,在此不做介绍。
1 --【实例10-1】查询scott 用户拥有的段类型和个数。 2 --1)以sys 用户登录 3 CONN / AS SYSDBA 4 --已连接 5 --2) 查询 6 SQL> SELECT SEGMENT_TYPE,COUNT(*) SEG_COUNT FROM dba_segments WHERE owner='SCOTT' GROUP BY SEGMENT_TYPE; 7 SEGMENT_TYPE SEG_COUNT 8 ------------------ ---------- 9 INDEX 3 10 TABLE 9; 11 --SCOTT 模式有3 个索引段和9 个数据段。
(二)、存储从句的优先关系
在创建段时,可以为它指定pctfree、pctused 等参数,来控制其中块存储空间管理方式, 也可以为它指定initial、next、pctincrease 等存储参数,以指定其中区的分配方式。这些参数 设置可以是数据库级别的,即使用数据库默认的区分配和管理方式,也可以在表空间级别的, 即通过EXTENT MANAGEMENT 子句及DEFAULT STORAGE 子句指定区的分配和管理方 式,也可以在段级别,即指定存储子句(DEFAULT STORAGE 子句),以控制如何向段分配 区。那么存储子句的优先关系如何呢,Oracle 服务器按以下的方式进行区的管理(如图10-2 所示):
• 除了MINIMUM EXTENT 和UNIFORM SIZE 表空间参数外,在段级别指定的任 何存储参数优先级最高,覆盖在表空间级别设置的相应选项。
• 如果没有在段级别明确设置存储参数,那么存储参数缺省值为在表空间级别所设置 的值。
• 如果没有在表空间级别明确设置存储参数,那么将使用Oracle 服务器系统的缺省 设置。
还要注意,某些参数无法在表空间级别指定,而只能在段级别指定。如果存储参数改变, 参数的改变只影响新分配区,而对已分配的区不产生影响。如果指定了表空间的最小区大小, 分配给该表空间内的段的最小区个数是固定的。
四、区的分配和撤销
数据扩展(extent)是由一组连续的数据块(data block)构成的数据库逻辑存储分配单 位。而段(segment)则是由一个或多个数据扩展构成。当一个段中已有空间已经用完,Oracle 为这个段分配新的数据扩展。
(一)、数据扩展何时被分配
当用户创建数据表时,Oracle 为此表的数据段(data segment)分配一个包含若干数据 块(data block)的初始数据扩展(initial extent)。虽然此时数据表中还没有数据,但是在此 初始数据扩展中的数据块已经为插入新数据做好了准备。
如果一个段(segment)的初始数据扩展(initial extent)中的数据块(data block)都已 装满,且有新数据插入需要空间时,Oracle 自动为这个段分配一个增量数据扩展(incremental extent)。增量数据扩展是一个段中继已有数据扩展之后分配的后续数据扩展,她的容量大于 或等于之前的数据扩展。 为了管理的需要,每个段(segment)的段头(header block)中包含一个记录此段所有 数据扩展(extent)的目录。
(二)、如何决定数据扩展分配时的数量与容量
每个段(segment)的定义中都包含了数据扩展(extent)的存储参数(storage parameter)。 存储参数适用于各种类型的段。这个参数控制着Oracle 如何为段分配可用空间。例如,用 户可以在CREATE TABLE 语句中使用STORAGE 子句设定存储参数,决定创建表时为其 数据段(data segment)分配多少初始空间,或限定一个表最多可以包含多少数据扩展。如 果用户没有为表设定存储参数,那么表在创建时使用所在表空间(tablespace)的默认存储 参数。
用户既可以使用数据字典管理的表空间(dictionary managed tablespace)(依赖数据字典 表监控空间的利用情况),也可以使用本地管理的表空间(locally managed tablespace)(使用 位图(bitmap)来标记可用与已用空间)。由于本地管理的表空间性能较好且易于管理,当用户没有显式地设定数据扩展(extent)管理参数时,除了SYSTEM 之外的所有永久表空 间(permanent tablespace)默认使用本地管理方式。
在一个本地管理的表空间中,其中所分配的数据扩展(extent)的容量既可以是用户设 定的固定值,也可以是由系统自动决定的可变值。当用户创建表空间(tablespace)时可以 使用UNIFORM (用户指定)或AUTOALLOCATE (由系统管理)子句设定数据扩展的 分配方式。
对于固定容量(UNIFORM)的数据扩展,用户可以为数据扩展设定容量或使用默认大 小(1 MB)。用户须确保每个数据扩展的容量至少能包含5 个数据块(database block)。本 地管理(locally managed)的临时表空间(temporary tablespace)在分配数据扩展时只能使 用此种方式。
对于由系统管理(AUTOALLOCATE)的数据扩展,由Oracle 决定新增数据扩展的最 佳容量,其最小容量为64 KB。如果创建表空间时使用了“segment space management auto” 子句,且数据块容量大于等于16 KB,Oracle 扩展一个段时(segment)所创建的数据扩展 的最小容量为1 MB。对于永久表空间(permanent tablespace)上述参数均为默认值。 在本地管理的表空间(locally managed tablespace)中,INITIAL,NEXT,PCTINCREASE, 和MINEXTENTS 这四个存储参数可以作用于段(segment),但不能作用于表空间。 INITIAL,NEXT,PCTINCREASE,和MINEXTENTS 相结合可以用于计算段的初始容量。 当段容量确定后,Oracle 使用内部算法确定其中每个初始数据扩展(extent)的容量。
(三)、数据扩展如何被分配
依据表空间管理方式的不同(本地管理(locally managed)或数据字典管理(dictionary managed)),选择不同的算法分配数据扩展(extent)。 对于本地管理的表空间(locally managed tablespace),Oracle 在为新的数据扩展(extent) 寻找可用空间时,首先选择一个属于此表空间的数据文件(datafile),再搜索此数据文件的 位图(bitmap)查找连续的数据块(free block)。如果此数据块中没有足够的连续可用空间, Oracle 将查询其他数据文件。 举例说明,当创建表段时,Oracle 将为段分配一个“初始区”(Initial Extent),这 时,由于表不存在任何数据,初始区中的每个块每是未使用的。随着不断向表插入数据,初 始区的块不断写满,当初始区中的块都被写满后,数据段会向Oracle 申请新的存储空间, 这时Oracle 为表段再分配一个“后继区”,后继区写满后再分配新区。这些区被标记为“已 用区”通常分配给段的区将一直保留在段中,不论区中是否存有数据.当删除数据库对象时, 组成对象段的所有区全部回收,即变为“空闲区”。 专业专注超越Oracle 体系结构篇之对象空间管理
五、数据块
块是Oracle 数据库执行输入/输出(I/O) 的最小单位,相应地,操作系统执行输入/输 出(I/O) 的最小单位为一个操作系统块的大小。假定某用户执行“SELECT* FROM emp WHERE empno=7788”只会返回100Byte 的数据,而数据块尺寸为2KB,那么Oracle 会在数据文件 上读取多少数据到数据高速缓存呢?因为Oracle 数据库输入/输出的最小单位是块,所以一 次读取的数据是一个数据块,即读取是2 KB 的数据。 在Oracle9i 之前,同一个数据库的所有表空间必须具有相同的数据块尺寸;而从 Oracle9i 开始,不同表空间可以具有不同的数据块尺寸。
(一)、多重数据块支持
Oracle9i 支持创建具有多种块大小的数据库。此功能在下列情况下非常有用:
• 将表空间从联机事务处理(OLTP) 数据库传送到企业数据仓库时。使用Oracle9i, 可方便地在具有不同块大小的数据库之间传送数据。
• 要求能够在具有相应块大小的表空间中定位对象以最大限度地提高I/O 性能时。 使用Oracle9i,除了标准的块大小外,还可以指定最多四种非标准的块大小,如果想 使用非标准大小的块,必须在初始化参数文件中,为每个非标准块大小配置子高速缓存。也 可以在实例运行过程中配置子高速缓存,可以创建具有其中任意块大小的表空间。如果创建 的表空间是非标准块大小,那么在建立表空间时使用BLOCKSIZE 选项定义表空间所使用的非 标准块尺寸。
(二)、标准块与非标准块大小
1.标准块大小
在SYSTEM 表空间以及任何临时表空间中使用的块大小为标准块大小,除非进行指定, 表空间的缺省块大小为标准块。数据块尺寸是由初始化参数DB_BLOCK_SIZE 指明,其尺寸应 该设置为操作系统(OS)块尺寸的整数倍,所以一个数据块由一个或多个操作系统块组,并 且该参数的取值一般为2KB、4KB、8KB、16KB、32KB 等。
通常,将DB_BLOCK_SIZE 设置为4 KB 或8 KB。如果没有指定,则使用缺省数据块大 小,缺省数据块大小取决于所用的操作系统,在创建数据库后将不能更改标准块大小,如果 想更改标准块大小,只能重新创建数据库。使用DB_CACHE_SIZE 参数指定标准块大小缓冲 区的高速缓存大小。DB_CACHE_SIZE 最小值为一个粒组(granule),默认为48MB.粒组大小 由SGA 来决定,如果SGA<128MB,一个granule 则是4MB,如果SGA>128MB,一个granule 则 是16MB。
2.非标准块大小
从Oracle 9i 开始,除可以使用标准块大小外,还可以使用非标准块大小,取值范围是 2KB、4KB、8KB、16KB、32KB。如果希望使用非标准块,必须在数据库缓冲区为数据库使用 的各种块大小指定高速缓存大小。即如果要在数据库中使用多种块大小,则必须设置 DB_CACHE_SIZE 和至少一个DB_nK_CACHE_SIZE 参数。每个参数为相应的块大小指定了缓冲 区高速缓存大小。
如下所示:
DB_2K_CACHE_SIZE 为2KB 的块指定数据库高速缓存大小
DB_4K_CACHE_SIZE 为4KB 的块指定数据库高速缓存大小
DB_8K_CACHE_SIZE 为8KB 的块指定数据库高速缓存大小
DB_16K_CACHE_SIZE 为16KB 的块指定数据库高速缓存大小
DB_32K_CACHE_SIZE 为32KB 的块指定数据库高速缓存大小
如果nK 是标准块大小,则不能指定的大小,DB_nK_CACHE_SIZE 参数的缺省值为零。
如果存在块大小为nKB 的联机表空间,则不要将此参数设置为零。最小可以设一个granule。
(三)、创建非标准块表空间
可创建标准块大小的表空间,也可以创建非标准块大小表空间,使用BLOCKSIZE 子句 为表空间指定非标准块大小,要指定该子句,必须设置DB_CACHE_SIZE 和至少一个
DB_nK_CACHE_SIZE 参数,在该子句中指定的整数必须与某个DB_nK_CACHE_SIZE 参数中的n 对应。
1 --【实例10-2】创建一个2K 块大小的表空间mytbs2k,并验证。 2 --1)以sys 用户登录 3 CONN / AS SYSDBA 4 --已连接 5 --2)设置初始化参数DB_2K_CACHE_SIZE, 重新启动使参数设置生效 6 SQL> ALTER SYSTEM SET ; 7 --系统已更改。 8 SQL> SHUTDOWN 9 --数据库已经关闭。 10 --已经卸载数据库。 11 --ORACLE 例程已经关闭。 12 SQL> 13 --ORACLE 例程已经启动。 14 --Total System Global Area 47258064 bytes 15 --Fixed Size 453072 bytes 16 --Variable Size 29360128 bytes 17 --Database Buffers 16777216 bytes 18 --Redo Buffers 667648 bytes 19 --数据库装载完毕。 20 --数据库已经打开。 21 --3)创建表空间 22 CREATE TABLESPACE mytbs2k DATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10M 2K; 23 --表空间已创建。 24 --4)验证 25 SQL> SELECT tablespace_name,block_size FROM WHERE tablespace_name='MYTBS2K'; 26 TABLESPACE_NAME BLOCK_SIZE 27 ------------------------------ ---------- 28 MYTBS2K 2048 29 ---执行上述命令后,创建名为mytbs2k 的表空间,表空间中块的大小为2KB,查询DBA_TABLESPACES 数据字典视图,可以看新建表空间的块大小为2K。
多种块大小使用要注意:
• 分区对象的所有分区必须位于具有相同块大小的表空间中。
• 所有临时表空间必须采用标准块大小,包括用作缺省临时表空间的永久表空间。
• 按索引组织的表溢出和外部LOB 段可以存储在块大小与基表不同的表空间中。
(四)、数据块的存储参数
当建立数据对象(表、索引、簇)时,通过指定合理的块空间使用参数可以提高块访问性 能和并发性,使用参数可用来控制对数据段和索引段空间的使用。参数分为:控制并性的参 数和控制空间使用的参数两类。
1.控制并发性的参数
INITRANS 和MAXTRANS:指定初始的和最大的事务槽(Transaction slot)数,这些事 务槽在索引块或者数据块内创建。事务槽用来存储在某一时间点对块进行更改的事务处理的 有关信息。一个事务只占用一个事务槽。
INITRANS:保证最低级别的并发性。对于数据段和索引段,INITRANS 的缺省值分别 为1 和2,以保证最低级别的并发性。例如,设置INITRANS 的值为3,那么初始阶段可以 有3 个事务同时访问一个数据块。如果需要,也可以从块空闲空间内分配更多事务槽,以允 许更多的事务处理并发修改块内的行。
MAXTRANS:缺省值为255,它用于设置可更改数据块或者索引块的并发事务处理数 的限制。例如MAXTRANS 的值设为10 时,访问同一数据块的事务数超过3 之后,需要为 新事务分配新的事务槽,并且最大并发事务个数为10。
2.控制数据空间使用的参数
PCTFREE:对于数据段而言,此参数用于指定每个数据块中保留空间所占的百分比, 当更新块内的行需要更多空间,就会使用保留空间。PCTFREE 的缺省值为10%。
PCTUSED:对于数据段而言,此参数表示Oracle 服务器为表内每个数据块所保留的已 用空间的最低百分比。如果一个块的已用空间低于PCTUSED,则将该块放回到空闲列表中。 加入段的空闲列表的块可以用于重新插入数据。缺省情况下,每个段在创建时都有一个空闲 列表。通过设置存储子句的FREELISTS 参数,可以创建有更多空闲列表的段。PCTUSED 的 缺省值为40%。 PCTFREE 和PCTUSED 都按可用数据空间百分比来计算,可用数据空间是从整个块大 小减去块头空间后剩余的块空间。
六、段空间的管理
可以使用两种方法来管理数据块:
• 自动段空间管理
• 手动管理
(一)、手动数据块管理
在以前的Oracle 版本中,这是唯一可用的方法。而且默认的块管理方式为手动管理。 手动数据块管理允许手动配置数据块使用参数,例如:PCTFREE 参数,PCTUSED 参数, FREELIST 参数。
下面过程介绍对于PCTFREE=20 且PCTUSED=40 的数据段如何管理块内的空间(如 图10-5 所示):
当向块中插入行时,块的空闲空间在减少,直到块内的空闲空间等于或者小于20%, 此时行所占用的块内可用数据空间达到80% (100 – PCTFREE) 或者更多后,此后则无法在 该块内插入数据 剩余的20% 可在行大小增长时使用。例如,更新初始为NULL 的列并分配一个值。这 样,更新后的块使用率可能超过80%。
如果由于更新,删除了块内的行或者行大小减少,块使用率可能跌至80% 以下。但是, 仍然无法向块中插入,直到块使用率跌至PCTUSED(在本例中为40%) 以下,则该块可 用于重新插入.
(二)、段空间自动管理
段空间管理方式可以采用自动段空间管理的方式,它是一种在数据库段内管理空闲空间 的方法。自动段空间管理使用位图完成对段内空闲和已用空间的跟踪(与使用空闲列表相 对)。位图段包含一个位图,它描述了与段中的可用空间相关的每个块的状态。该位图包含 在单独的一组块中,这些块称为“位图块”,插入新行时,服务器就会在该位图中搜索是否 具有足够空间的块,有则插入数据。当块中的可用空间数量发生变化时,位图中就会反映出 它的新状态。使用自动段空间管理更方便、空间使用率更高,并且改进了并发INSERT 操 作性能。但是不能用于包含LOB 的表空间。管理方便表现在PCTUSED、FREELISTS、 FREELIST GROUPS 均是自动管理的。所有对象都可以更有效地使用空间,尤其是行大小 变化很大的对象。
但要注意:
• 自动段空间管理仅能在表空间级别启用,用于在本地管理的表空间。
• 创建表空间后,这些配置将应用于在该表空间中创建的所有段。
自动段空间管理是通过CREATE TABLESPACE 命令的SEGMENT SPACE MANGEMENT AUTO 子句指定的,此后不能更改这些段。如果定义了PCTUSED、FREELIST 和FREELISTGROUPS,则将其全部忽略。 因为自动段空间管理仅能在表空间级别启用,且只用于在本地管理的表空间,所以只需 要创建本地管理的表空间进行指定即可。以下例子创建了一个自动段空间管理表空间。
1 --【实例10-3】设置自动段空间管理 2 --1)管理员方式登录 3 CONN /AS SYSDBA 4 --2)创建表空间并设置自动段空间管理 5 SQL> CREATE TABLESPACE mytbs10 DATAFILE 'D:/oracle/oradata/db01/mytbs10.dbf' SIZE 5M EXTENT MANAGEMENT LOCAL UNIFORM SIZE 64K SEGMENT SPACE MANAGEMENT AUTO; 6 --只要是创建在mytbs10 表空间中所有段都是采用自动段空间管理。可以用位图管理的段为:表、索引、按索引组织的表(IOT) 以及LOB。
(三)、查询存储信息
可以通过以下视图查询表空间、数据文件、段和空闲区与已用区之间的关系等信息:
DBA_EXTENTS
DBA_SEGMENTS
DBA_TABLESPACES
DBA_DATA_FILES
DBA_FREE_SPACE
1 --【实例10-4】通过DBA_SEGMENTS 视图,查看段的区和块的数目。 2 --1)以管理员方式登录 3 CONN / AS SYSDBA 4 --已连接。 5 --2)查询分配给EMP 段的区和块的数目。 6 SQL> SELECT segment_name,extents,blocks,bytes FROM dba_segments WHERE owner = 'SCOTT' AND segment_name='EMP'; 7 SEGMENT_NAME EXTENTS BLOCKS BYTES 8 -------------------------------------------- 9 EMP 1 8 65536 10 --以上查询结果可以看出,SCOTT 模式中EMP 段,包含了一个区,总大小是8 个数据块(65536Byte)。 11 --【实例10-5】使用DBA_EXTENTS 视图。 12 --1)以管理员方式登录 13 CONN / AS SYSDBA 14 15 --2)检查给定段的区的信息 16 SQL> SELECT extent_id,file_id,block_id,blocks FROM dba_extents WHERE owner = 'SCOTT' AND segment_name='EMP'; 17 EXTENT_ID FILE_ID BLOCK_ID BLOCKS 18 ---------- ---------- ---------- ---------- 19 0 1 50465 8 20 --该实例查询出EMP 段包含的区号,文件号,块号和块数。 21 --【实例10-6】使用DBA_FREE_SPACE 视图。 22 --1)以管理员方式登录 23 CONN / AS SYSDBA 24 --2)查询所有表空间的自由空间 25 SQL> SELECT tablespace_name, count(*),max(blocks), sum(blocks) FROM dba_free_space GROUP BY tablespace_name; 26 TABLESPACE_NAME COUNT(*) MAX(BLOCKS) SUM(BLOCKS) 27 ------------------------------ ---------- ----------- ----------- 28 CWMLITE 2 1328 1360 29 DRSYS 1 1320 1320 30 EXAMPLE 1 64 64 31 INDX 1 3192 3192 32 MYTBS10 1 632 632 33 ODM 1 1360 1360 34 SYSTEM 1 176 176 35 TOOLS 1 504 504 36 UNDOTBS1 5 24552 25128 37 USERS 1 3192 3192 38 XDB 1 24 24 39 --可见,SYSTEM 表空间的可用空闲空间为176 个数据块。
七、小结
Oracle 为数据对象所分配的存储空间被称为段,段有多种类型,常见的是表段、还原段、 索引段和临时段。存储空间的分配是以区为单位进行的,区由连续的数据块组成。通过指定 pctfree、pctused 等参数,来控制其中块存储空间管理方式;通过指定initial、next、pctincrease 等存储参数,以指定其中区的分配方式。可以创建非标志块表空间,以满足不同的存储空间 需求。