二、表空间和数据文件

Oracle 数据库(tablespace)是由若干个表空间构成的。

任何数据库对象在存储时都必须存储在某个表空间中。表空间对应于若干个磁盘文件,即表空间是由一个或多个磁盘文件构成的。表空间相当于操作系统中的文件夹,也是数据库逻辑结构与物理文件之间的一个映射。每个数据库至少有一个表空间,表空间的大小等于所有从属于它的数据文件大小的总和。

(一)、常用表空间

在 Oracle 11g 中有以下几种比较特殊的表空间:

1. 系统表空间

系统表空间(SYSTEM tablespace)是每个 Oracle 数据库都必须具备的。

SYSTEM 表空间是 Oracle 数据库最重要的一个表空间,存放了一些 DDL 语言产生的信息以及 PL/SQL 包、视图、函数、过程等,称之为数据字典。

1) 系统表空间的特性

SQL> alter tablespace system offline; alter tablespace system offline * ERROR at line 1: ORA-01541: system tablespace cannot be brought offline; shut down if necessary

SQL> alter tablespace system read only; alter tablespace system read only * ERROR at line 1: ORA-01643: system tablespace can not be made read only

SQL> alter tablespace system rename to system2; alter tablespace system rename to system2 * ERROR at line 1: ORA-00712: cannot rename system tablespace

SQL> drop tablespace system including contents and datafiles; drop tablespace system including contents and datafiles * ERROR at line 1: ORA-01550: cannot drop system tablespace

总结:普通表空间所具有的更名、删除、只读、脱机不为 system 表空间所拥有。

2) 系统表空间的管理

//为数据库设定默认表空间 SQL>ALTER DATABASE DEFAULT TABLESPACE tablespace_name; //修改 property_value 参数格式长度为 30 SQL> col property_value format a30 //查询系统默认表空间 SQL> SELECT property_name,property_value2 FROM database_properties3 WHERE property_name like 'DEFAULT%'; PROPERTY_NAME PROPERTY_VALUE ---------------------------------------------------- ------------------------------ DEFAULT_TEMP_TABLESPACE TEMP DEFAULT_PERMANENT_TABLESPACE USERS //应为非 SYSTEM 表空间 DEFAULT_TBS_TYPE SMALLFILE //查询某用户默认表空间 SQL> SELECT username,default_tablespace2 FROM DBA_users WHERE username='SCOTT'; USERNAME DEFAULT_TABLESPACE ------------------------------------------------ ------------------------------ SCOTT USERS

2. SYSAUX 表空间

SYSAUX 表空间是随着数据库的创建而创建的,由 Oracle10g 引入,充当 SYSTEM 的辅助表空间,主要存储除数据字典以外的其他对象。

以前一些使用独立表空间或系统表空间的数据库组件现在在 SYSAUX 表空间中创建,通过分离这些组件和功能,SYSTEM 表空间的负荷得以减轻.反复创建一些相关对象及组引起 SYSTEM 表空间的碎片问题得以避免。

查询表空间及数据文件的信息

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 SYSTEM D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF UNDOTBS1 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF CWMLITE D:\ORACLE\ORADATA\DB01\DRSYS01.DBF DRSYS D:\ORACLE\ORADATA\DB01\EXAMPLE01.DBF EXAMPLE D:\ORACLE\ORADATA\DB01\INDX01.DBF INDXD:\ORACLE\ORADATA\DB01\ODM01.DBF ODM D:\ORACLE\ORADATA\DB01\TOOLS01.DBF TOOLS D:\ORACLE\ORADATA\DB01\USERS01.DBF USERS D:\ORACLE\ORADATA\DB01\XDB01.DBF XDB

已选择 10 行。在查询结果中,FILE_NAME 列为数据文件的位置和名称,TABLESPACE_NAME 列为对应的表空间名称。

(三)、Oracle 管理文件(OMF) 1. 什么是 OMF(Oracle-Managed Files)

如果使用 OMF,则不需要直接管理构成 Oracle 数据库的操作系统文件。

oracle表空间和数据库的关系 Oracle逻辑结构篇之逻辑结构(1)

SQL> DB_CREATE_FILE_DEST = '/u01/oradata'; SQL> CREATE TABLESPACE tbs_1;

可以根据数据库对象而不是文件名指定操作。对于以下数据库结构,可以按需要在数据库内部使用标准文件系统接口来创建和删除文件:

在数据库中可以混合包含 Oracle 管理文件和非管理文件。由其中任一个参数制定的文件系统目录必须已存在:数据库不会创建文件系统目录。该目录还必须拥有允许数据库在其中创建文件的权限。上面的示例显示设置 DB_CREATE_FILE_DEST 后,可在 CREATE TABLESPACE 语句中省略 DATAFILE 子句。这样,会在 DB_CREATE_FILE_DEST 指定的位置创建数据文件。

2. 启用 OMF(四)、数据字典管理和本地管理方式

在表空间中区是最小的空间分配单位,对表空间的管理是以区为单位进行的。根据管理方式的不同,表空间分为本地管理表空间和字典管理表空间:

本地管理方式的表空间:在表空间内通过位图管理区。在本地管理的表空间中,个数据文件内都维护一个位图,以了解该数据文件内块的空闲或使用状态。位图中的每个位对应于一个块或一组块。其特点是分配了的某个区或释放的某个区可被重新使用时,Oracle 服务器更改位图值以显示块的新状态。因为表空间的存储管理信息保存在表空间的数据文件的头部,而不是保存在表空间外部的数据字典中,以被称为“本地管理方式”。从 Oracle9i 开始,在本地管理已成为缺省设置。

字典管理的表空间:由数据字典管理区。数据字典的信息存储在 system 表空间中Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句, 但是需要手动合并空闲区。这比本地管理的表空间更灵活,但效率要低得多。

由于本地管理表空间是采用位图对区进行管理的,相对于字典管理有如下优点:

本地管理可以避免循环空间管理操作。在字典管理表空间上分配和释放区会导致问回滚段和数据字典基表,而在本地管理表空间上的分配和释放区只需要修改其数据文件对应的位图值。

由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对数据字典的争用。

区的本地管理可自动跟踪并合并邻近的空闲空间,因而无须合并空闲区,而字典管理表空间则可能需要手工合并空间碎片。

本地管理的区大小可由系统自动确定。

对区的位图进行更改不会生成 UNDO 信息,因为它们不更新数据字典中的表(表空间限额信息等特殊情况除外)。

(五)、创建表空间 3. 创建表空间要考虑的因素

在创建数据库完毕后,通常可以立即创建所需的非 SYSTEM 表空间,在创建表空间时,除考虑到空间数量、对应的数据文件的大小等基本因素外,还要考虑表空间存储管理方式、默认存储参数设置、块大小等问题。

Oracle 本身并不能限制表空间的数目,但是受到数据库所能拥有的数据文件数目的限制,只能创建有限数时的表空间。即所有表空间的数据文件的总和不能超过创建数据库时指定的 MAXDATAFILES 参数的限制。创建的表空间在默认情况具有标准的块大小,但是也可以创建具有非标准块大小的表空间。

CREATE [BIGFILE | SMALLFILE] [TEMPORARY] TABLESPACE tablespace nameDATAFILE 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 的整数倍。
4. 本地管理的表空间中的段空间管理

用户使用 CREATE TABLESPACE 语句创建一个本地管理的表空间(locally managedtablespace)时,可以使用 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)来管理段内的可用空间。可用块列表记录了所有可以被用于插入新数据的数据块。

(六)、其他表空间操作调整表空间大小

如果登录到 Oracle 数据库,并给某表插人数据时,发现在插人数据时总是显示错误信息,但是可以查询该表数据,可以考虑查看表空间大小,如果数据已占满了表空间,表空间不能分配新的区时用户不能插入数据记录。理想情况下,在建立表空间时就应该规划好其尺寸,以避免出现以上问题。但是如果表空间不足以存放更多数据,那么 DBA 可以改变表空间的尺寸。但是如果 DBA 等表空间不足时才去扩展表空间的容量,会影响 Oracle 的性能,因此,DBA 需要知道现在的对象多大,对象的增长速度有多快,有规律的检查数据块对象的大小,把注意力集中在快速增长的表上,经常查看表空间中的自由空间,然后主动增加表空间的容量,提高系统的性能。

表空间物理上表现为一个或多个数据文件,表空间的尺寸即表空间所有数据文件尺寸的总和。因此表空间的大小由数据文件的个数和数据文件的大小来决定,可通过以下方法进行调整:

• 重置数据文件的大小:ALTER DATABASE DATAFILE '...' | FileNo RESIZE X

• 更改数据文件的大小:可以使用数据文件 AUTOEXTEND(自动扩展)属性自动调整数据文件的大小,也可以 使用 ALTER TABLESPACE 手动调整

• 使用 ALTER TABLESPACE 命令给表空间添加新的数据文

1)、数据文件的自动扩展属性(AUTOEXTEND)

当激活了数据文件的自动扩展选项之后,如果数据占满了数据文件所有空间,并且该数据 文 件 不 能 容 纳 新 数 据 时 , 系 统 会 自 动 扩 展 该 数 据 文 件 。 可 以 指 定 数 据 文 件 的AUTOEXTEND 子句启用或禁用数据文件的自动扩展。文件将按指定的增量增加直到达到指定的最大值。使用 AUTOEXTEND 子句的优点如下:

• 当表空间的空间用尽时无需过多的直接干预。

• 确保应用程序不会由于未能分配区而暂停。

创建数据文件后,可使用下列 SQL 命令启用数据文件的自动扩展

• CREATE TABLESPACE

• ALTER TABLESPACE

【实例 2-1】创建表空间 mytbs8 并设置数据文件为自动扩展。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)创建表空间

SQL> CREATE TABLESPACE mytbs8DATAFILE 'd:\oracle\oradata\db01\mytbs08.dbf' SIZE 5MAUTOEXTEND ON NEXT 1M MAXSIZE 50M; 表空间已创建。

3)查询 DBA_DATA_FILES 视图以确定是否启用 AUTOEXTEND

SQL> 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

【实例 2-2】修改表空间 mytbs7 的数据文件为自动扩展。

1)以管理员身份登录

SQL>CONNECT / AS SYSDBA

2)修改表空间

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]

【实例2-3】为 mytbs3 表空间增加一个数据文件,大小为 5MB.

1)以管理员身份登录

SQL>CONNECT / AS SYSDBA

2)增加数据文件

SQL>ALTER TABLESPACE mytbs3 ADD DATAFILE 'd:\oracle\oradata\db01\mytbs3c.dbf' SIZE 5M;

表空间已更改。

3)查询 DBA_DATA_FILES 确认是否增加了数据文件

SQL> SELECT FILE_NAMEFROM DBA_DATA_FILESWHERE TABLESPACE_NAME='MYTBS3'; FILE_NAME -------------------------------------- D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF

通过查询结果可以看到,数据文件由原来的 2 个增加为 3 个。

3)、手工修改数据文件大小

尽管指定自动扩展选项可以使得数据文件在数据写满的情况下自动扩展,但自动扩展导致递归空间操作,从而降低系统性能。例如,当使用 SQL*Loader 给表 EMP 装载大批量据时,在数据写满数据文件之后需要先扩展数据文件,然后才能装载数据,因而会导致系统性能的降低。因此,在执行批量数据装载操作之前,你应该首先确定数据文件是否能够容纳足够数据。如果不足以容纳数据的话,应该首先扩展该数据文件,然后装载数据。DBA 可以使用 ALTER DATABASE 命令手动增加或减少数据文件的大小,而不必通过添加数据文件或更改自动扩展属性更改表空间的大小。命令格式如下:

ALTER DATABASE [database]DATAFILE ‘filename’[, ‘filename’]...RESIZE integer[K|M]

其中:

Integer:以字节为单位表示的结果数据文件的绝对大小

如果更改数据文件的大小比实际存储的数据库对象要小,那么数据文件大小只能减少到数据文件内最后一个对象的最后一个块为止,也就是缩减尺寸后表空间必须能容纳已存在的数据对象,否则会提示出错信息。

【实例 2-4】将 mytbs5 表空间中数据文件的大小改为 10M.

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)创建表空间

SQL> ALTER DATABASEDATAFILE 'd:\oracle\oradata\db01\mytbs05.dbf' RESIZE 10M;

数据库已更改。

3)查询以确认更改

SQL> SELECT BYTES FROM DBA_DATA_FILESWHERE TABLESPACE_NAME='MYTBS5'; BYTES ---------- 10485760

5. 修改表空间读写属性

当表空间用于存放静态数据时,因为不会对这些数据进行修改操作,所以可以将这些数据存放到只读设备上,例如存放到光盘上。为了将表空间放到只读设备上,必须将其转变为只读状态。下面的命令将表空间改为只读模式:

ALTER TABLESPACE [tablespace] READ ONLY;

执行这条命令时,与该表空间相关的所有事务会自动回滚,过渡状态期间不允许再对表空间进行任何写入操作。当所有事务处理提交或者回退后,只读命令完成,该表空间置于只读模式。【实例 2-5】在表空间 mytbs3 中创建表 test,将 mytbs3 表空间更改为只读状态,验证能否插入数据,能否删除表

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)创建表

SQL> CREATE TABLE test (name varchar(20))TABLESPACE mytbs3;

表已创建。

3)将表空改为只读状态

SQL> ALTER TABLESPACE mytbs3 READ ONLY; 表空间已更改。

4)向表中插入一条数据,能否成功,为什么?

SQL> INSERT INTO test VALUES ('SHEN'); INSERT INTO test VALUES ('SHEN') * ERROR 位于第 1 行: ORA-00372: 此时无法修改文件 16 ORA-01110: 数据文件 16: 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF'

表空间只读后不能执行 DML 操作.

5)删除表,查看能否成功,为什么?

SQL> DROP TABLE test; 表已丢弃。

由上例可以看出执行了上述命令之后,会将表空间 mytbs3 转变为只读状态。此时,用户将只能在该表空间的对象上执行查询操作(SELECT),而不能执行 DML 或 DDL 操作。但大家要注意,有一种 DDL 操作例外,可以执行 DROP TABLE 或 DROP INDEX 删除该表空间上的表或索引,因为这些命令只影响数据字典(数据字典位于 SYSTEM 表空间)。之所以可以这样操作,是因为 DROP 命令只更新数据字典,而不更新只读表空间上的物理文件。对于本地管理的表空间,删除的段将改为临时段以避免更新位图。将表空间设为只读状态之前,将会引发对表空间的数据文件执行检查点操作。将表空间设为只读可防止对表空间中的数据文件进行任何写操作,因此,数据文件可驻留在只读介质上,如 CD-ROM 或一次性写入(WORM) 驱动器。使用只读表空间的好处是可以免去对数据库大量的静态数据执行备份。

要在只读表空间上执行 DML 操作,必须将表空间改为可写状态,可以使用 ALTERTABLESPACE [tablespace] READ WRITE 命令,但是表空间内的所有数据文件都必须联机。

【实例 2-6】将 mytbs3 表空间更改为可读写状态,验证是否能够创建表。

1)以管理员身份登录

SQL>CONNECT / AS SYSDBA

2)改为可读可写状态

SQL> ALTER TABLESPACE mytbs3 READ WRITE;

表空间已更改。

3)创建表 test 验证表空间的状态

SQL> CREATE TABLE test (name varchar(20))TABLESPACE mytbs3; 表已创建。

在这里建表操作成功,也说明上一实例在只读状态下对表的删除是成功的。

6. 修改表空间的 ONLINE/OFFLINE 属性

通过将一个表空间置于联机或脱机状态来控制表空间的可用性。当表空间处于联机状态时,用户可以访问其中的数据。当某一表空间处于脱机状态时,用户无法访问它的数据,但是允许正常访问数据库的其余处于联机的表空间。以下几种情况下数据库管理员可以让表空间脱机:

  • • 使数据库的一部分表空间不可用,但允许正常访问数据库的其余表空间
  • • 执行脱机表空间备份(尽管表空间可以在联机使用时备份
  • • 在数据库打开时恢复表空间或数据文件
  • • 在数据库打开时移动数据文件

可以使用如下命令对表空间进行脱机和联机操作:

ALTER TABLESPACE tablespace{ONLINE |OFFLINE [NORMAL|TEMPORARY|IMMEDIATE|FOR RECOVER]}

其中:

NORMAL:将该表空间中所有数据文件内的所有块从 SGA 中写入数据文件并将数据文件关闭。这是缺省设置。在使该表空间重新联机之前,无须对其执行介质恢复。尽可能使用 NORMAL 子句。

TEMPORARY:对表空间内的所有联机数据文件执行检查点操作,但是在执行检查点时并不检查数据文件的状态,即使某些文件无法写入检查点,Oracle 也会忽略这些错误。在使用此种表空间重新联机之前,所有脱机文件可能都需要进行介质恢复。

IMMEDIATE:不保证表空间文件可用,而且不执行检查点操作。在使表空间重新联机前,必须对其执行介质恢复操作。

FOR RECOVER:使表空间脱机以进行表空间时间点恢复。

只要数据库打开,数据库管理员就可以使任意一个表空间脱机(SYSTEM 表空间和任何具有活动还原段或临时段的表空间除外)。当一个表空间脱机后,Oracle 服务器将使与之相关联的所有数据文件脱机。

【实例 2-7】将 mytbs3 表空间改为脱机状态,并向 test 表中插入一条数据进行验证。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)改为脱机状态

SQL> ALTER TABLESPACE mytbs3 OFFLINE NORMAL; 表空间已更改。

3)查询数据

SQL> SELECT * FROM test; SELECT * FROM test * ERROR 位于第 1 行: ORA-00376: 此时无法读取文件 16 ORA-01110: 数据文件 16: 'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF'

说明:执行查询操作时用户将收到一条错误消息,因为当表空间脱机后,Oracle 不允许有任何 SQL 语句引用该表空间含有的对象,即用户不能访问该表空间。

当表空间脱机或者重新联机后,该事件记录在数据字典和控制文件内。如果关闭数据库时表空间仍然脱机,则当随后数据库装载并重新打开时,该表空间仍保持脱机状态且不会检查。如果遇到某些错误(例如,当数据库写入程序进程 DBWn 几次试图向某表空间的数据文件写入都失败时),Oracle 实例(Instance)自动将表空间从联机状态切换为脱机状态。

不能设为脱机的表空间:SYSTEM 表空间,具有活动的还原段的表空间,缺省临时表空间。当希望访问表空间中的数据如表、索引等对象时,表空间必须处于联机状态。

【实例 2-8】将 mytbs3 表空间改为联机状态,并向 test 表中插入一条数据进行验证。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)改为联机状态

SQL> ALTER TABLESPACE mytbs3 ONLINE; 表空间已更改。

3)插入数据

SQL> INSERT INTO test VALUES('SHEN'); 已创建 1 行。

说明:插入数据成功,因为表空间处于联机状态。

7. 数据文件的脱机与联机

与表空间类似,联机的数据文件也可以被设置为脱机状态。脱机的数据文件对于数据库来说是不可用的,直到它们被恢复为联机状态为止。如果数据文件发生损坏时,Oracle 会自动将这个数据文件设置为脱机状态,并且记录在警告文件中。如果损坏的文件恢复后,需要以手工方式重新将数据文件恢复为联机状态。

将数据文件设置为脱机状态,不会影响表空间的状态,但是反过来,将表空间设置为脱机状态后,属于该表空间的数据文件同时会进入脱机状态。如果想改变数据文件的状态,可以使用 ALTER DATABASE 命令。

【实例2-9】将数据文件 D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 改为脱机状态,然后再改为联机状态。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)改为脱机状态

SQL> ALTER DATABASE DATAFILE'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' OFFLINE; 数据库已更改。

3)改为联机状态

SQL> ALTER DATABASE DATAFILE'D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF' ONLINE; 数据库已更改。

8. 数据文件的移动

为了防止数据丢失和减少 I/O 冲突,提高 I/O 性能,应该将数据文件尽可能分布到不同磁盘上,并且尽可能均衡不同磁盘之间的 I/O 操作。移动数据文件一方面是出于性能方面的考虑,另一方面出于安全考虑。因此在实际数据库应用中可能会移动数据文件。移动数据文件有两种方法,一种方法是使用 ALTER TABLESPACE 命令,另一种方法是使用 ALTERDATABASE 命令,具体采用哪种方法取决于表空间类型。

1)、使用 ALTER TABLESPACE 命令

使用 ALTER TABLESPACE 命令格式如下:

ALTER TABESPACE tablespaceRENAME DATAFILE 'filename'[, 'filename']...TO 'filename'[, 'filename']...

它仅适用于不含活动还原段或临时段的非 SYSTEM 表空间中的数据文件的移动。源文件名必须与存储在控制文件内的名称匹配,表空间必须脱机,并且 TO 子句后的目标数据文件必须存在。

ALTER TABLESPACE 命令重命名数据文件的步骤:

  • • 使表空间脱机。
  • • 使用操作系统命令移动或复制文件。
  • • 执行 ALTER TABLESPACE RENAME DATAFILE 命令。
  • • 使表空间联机。
  • • 必要时使用操作系统命令删除原来的数据文件

【实例2-10】将 mytbs3 表空间的第三个数据文件由 D:盘移动到 E:盘。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2)使表空间脱机

SQL> ALTER TABLESPACE mytbs3 OFFLINE; 表空间已更改

3) 使用操作系统命令移动或复制文件复制 mytbs3 表空间的第三个数据文件到 E:盘相同目录下(需要先创建目录)。如果不能确定 mytbs3 表空间包含的数据文件,请查询 dba_data_files。

4)执行 ALTER TABLESPACE RENAME DATAFILE 命令

SQL> ALTER TABLESPACE mytbs3 RENAME DATAFILE 'd:\oracle\oradata\db01\mytbs3c.dbf' TO 'e:\oracle\oradata\db01\mytbs3c.dbf'; 表空间已更改

5) 使表空间联机

SQL> ALTER TABLESPACE mytbs3 ONLINE; 表空间已更改

6) 查询表空间的数据文件

SQL> SELECT FILE_NAME FROM DBA_DATA_FILES WHERE TABLESPACE_NAME='MYTBS3'; FILE_NAME ----------------------------------------------------------------- D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF E:\ORACLE\ORADATA\DB01\MYTBS3C.DBF

可见第三个数据文件已经由 D:盘移动到了 E:盘。

说明:必要时使用操作系统命令删除原来的数据文件。

2)、使用 ALTER DATABASE 命令

ALTER DATABASE 命令可用来移动任意类型的数据文件,但是数据库必须处于已装载

状态,且目标数据文件必须存在。步骤如下:

• 关闭数据库。

• 使用操作系统命令移动文件。

• 装载数据库。

• 执行 ALTER DATABASE RENAME FILE 命令。

  • • 打开数据库。

【实例 2-11】将 system 表空间由 D:盘移动到 E:盘。

1)以管理员身份登录

SQL>CONNECT / AS SYSDBA

2) 关闭数据库

SQL> SHUTDOWN NORMAL; 数据库已经关闭。 已经卸载数据库。 ORACLE 例程已经关闭。

3)使用操作系统命令将 system 表空间对应的数据文件移到 E:盘相同目录下。

4)将数据启动至装载状态

SQL> STARTUP MOUNT; ORACLE 例程已经启动。 Total System Global Area 34675092 bytes Fixed Size 453012 bytes Variable Size 29360128 bytes Database Buffers 4194304 bytes Redo Buffers 667648 bytes 数据库装载完毕。

5)执行 ALTER DATABASE RENAME FILE 命令

SQL>ALTER DATABASE RENAMEFILE 'd:\oracle\oradata\db01\system01.dbf'TO 'e:\oracle\oradata\db01\system01.dbf'; 数据库已更改

6) 打开数据库

SQL> ALTER DATABASE OPEN; 数据库已更改。

因为 SYSTEM 表空间无法脱机,必须使用该方法移动 SYSTEM 表空间内的数据文件。使用此命令重命名无法脱机的表空间内的文件。

(七)、删除表空间

当不再需要表空间及其内容时,可以通过下面的 DROP TABLESPACE 命令从数据库中删除表空间,格式如下:

DROP TABLESPACE tablespace[INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]

其中:

tablespace:指定要删除的表空间的名称

INCLUDING CONTENTS:删除表空间内的所有段

AND DATAFILES:删除关联的操作系统文件

CASCADE CONSTRAINTS:如果要删除的表空间之外的表引用了该表空间内表的主键和唯一键,则删除这种引用完整性约束。

【实例2-12】删除表空间 mytbs3, system,查看出现什么现象。

1)以管理员身份登录

SQL>CONNECT / AS SYSDBA

2) 删除表空间 mytbs3

SQL> DROP TABLESPACE mytbs3; DROP TABLESPACE mytbs3 * ERROR 位于第 1 行: ORA-01549: 表空间非空,请使用 INCLUDING CONTENTS 选项

3) 删除表空间 mytbs3,增加选项

SQL> DROP TABLESPACE mytbs3 INCLUDING CONTENTS AND DATAFILES; 表空间已丢弃。

4) 删除表空间 system

SQL> DROP TABLESPACE systemINCLUDING CONTENTS AND DATAFILESCASCADE CONSTRAINTS; DROP TABLESPACE system * ERROR 位于第 1 行: ORA-01550: 无法删除系统表空间

说明:表空间 mytbs3 中包含一个表段,因此必须带 INCLUDING CONTENTS 子句,即删除表空间的同时删除表空间中的对象,加上 AND DATAFILES 子句可以删除表空间的数据文件。SYSTEM 表空间中包含了多种段且可能引用其它表空间中的主键,因此加了ASCADE 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。【实例 2-13】查询数据文件的基本信息。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2) 查询

SQL> SELECT name,file#,status,bytes,checkpoint_change# last_scnFROM v$datafile; NAME FILE# STATUS BYTES LAST_SCN ---------------------------------------------------------------------------- ------- ---------- ---------- D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF1 SYSTEM 419430400 5083126 D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF2 ONLINE 209715200 5083126 D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF3 ONLINE 20971520 5083126 字段的含义如下: Name:数据文件的名称和位置; File#:数据文件的绝对编号; Status:数据文件的状态,可以有三种:联机、脱机或者属于 SYSTEM 表空间; Bytes:数据文件的大小; Last_scn:数据文件中最后一次写入事务的 SCN。

【实例2-14】查询表空间 users 的大小。

1)以管理员身份登录

SQL> CONNECT / AS SYSDBA

2) 查询

SQL> SELECT sum(bytes) FROM dba_data_files WHERE tablespace_name='SYSTEM'; SUM(BYTES) ---------- 419430400

(九)、大表空间

在 Oracle 中用户可以创建大文件表空间(bigfile tablespace)。这样 Oracle 数据库使用的表空间(tablespace)可以由一个单一的大文件构成,而不是若干个小数据文件。这使 Oracle可以发挥 64 位系统的能力,创建、管理超大的文件。在 64 位系统中,Oracle 数据库的存储能力被扩展到了 8 EB(1EB = 1024PB,1PB = 1024TB,1TB=1024GB)。

只有本地管理的(locally managed),且段空间自动管理(automatic segment-spacemanagement)的表空间(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 冲突和防止数据损失。

oracle表空间和数据库的关系 Oracle逻辑结构篇之逻辑结构(2)


写在最后的话

感谢各位的支持与阅读,后续会继续推送相关知识和交流,欢迎交流、转发和关注,感谢!

,