Oracle 数据库逻辑结构
一、存储关系
Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的;而在逻辑上表空间又是由一个或多个段组成的。在Oracle 数据库中,通过为
每种不同的数据对象分配不同的段,来保存数据。例如EMP 表的所有数据会存放在EMP段中。在Oracle 数据库中,段是由一个或多个区组成的,而区又是由连续存储的数据块所
组成的。块则是数据库的I/O 最小的单位。
一、存储关系
Oracle 数据库逻辑上是由一个或多个表空间组成的,表空间物理上是由一个或多个数据文件组成的;而在逻辑上表空间又是由一个或多个段组成的。在Oracle 数据库中,通过为
每种不同的数据对象分配不同的段,来保存数据。例如EMP 表的所有数据会存放在EMP段中。在Oracle 数据库中,段是由一个或多个区组成的,而区又是由连续存储的数据块所
组成的。块则是数据库的I/O 最小的单位。
数据库可划分为被称为表空间的逻辑存储单元。每一个表空间可以包含很多的Oracle逻辑数据块。DB_BLOCK_SIZE 参数指定了逻辑块的大小。逻辑块的大小范围为2 KB 至
32 KB,默认大小为8 KB。特定数目的相邻逻辑块构成了一个区。为特定逻辑结构分配的一组区构成了一个段。Oracle 数据块是逻辑I/O 的最小单位。
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 表空间用于存入数据修改后的旧值。
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-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 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 INDX
D:\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 列为
对应的表空间名称。
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 INDX
D:\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 服务器更改位图值以显示块的新状态。因为表空间的存储管理
信息保存在表空间的数据文件的头部,而不是保存在表空间外部的数据字典中,所以被称为“本地管理方式”。从Oracle9i 开始,在本地管理已成为缺省设置。
• 字典管理的表空间:由数据字典管理区。数据字典的信息存储在system 表空间中,Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间
内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句, 但是需要手动合并空闲区。这比本地管理的表空间更灵活,但效率要低得多。
在表空间中区是最小的空间分配单位,对表空间的管理是以区为单位进行的。根据管理方式的不同,表空间分为本地管理表空间和字典管理表空间:
• 本地管理方式的表空间:在表空间内通过位图管理区。在本地管理的表空间中,每个数据文件内都维护一个位图,以了解该数据文件内块的空闲或使用状态。位图中
的每个位对应于一个块或一组块。其特点是分配了的某个区或释放的某个区可被重新使用时,Oracle 服务器更改位图值以显示块的新状态。因为表空间的存储管理
信息保存在表空间的数据文件的头部,而不是保存在表空间外部的数据字典中,所以被称为“本地管理方式”。从Oracle9i 开始,在本地管理已成为缺省设置。
• 字典管理的表空间:由数据字典管理区。数据字典的信息存储在system 表空间中,Oracle 服务器将在分配或回收区时更新数据字典中对应的表。字典管理的表空间
内的段可具有自定义的存储设置,因此每个段都可以有不同的存储子句, 但是需要手动合并空闲区。这比本地管理的表空间更灵活,但效率要低得多。
由于本地管理表空间是采用位图对区进行管理的,相对于字典管理有如下优点:
• 本地管理可以避免循环空间管理操作。在字典管理表空间上分配和释放区会导致访问回滚段和数据字典基表,而在本地管理表空间上的分配和释放区只需要修改其数
据文件对应的位图值。
• 由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对数据字典的争用。
• 区的本地管理可自动跟踪并合并邻近的空闲空间,因而无须合并空闲区,而字典管理表空间则可能需要手工合并空间碎片。
• 本地管理的区大小可由系统自动确定。
• 对区的位图进行更改不会生成UNDO 信息,因为它们不更新数据字典中的表(表空间限额信息等特殊情况除外)。
• 本地管理可以避免循环空间管理操作。在字典管理表空间上分配和释放区会导致访问回滚段和数据字典基表,而在本地管理表空间上的分配和释放区只需要修改其数
据文件对应的位图值。
• 由于本地管理的表空间在数据字典表中不记录空闲空间,从而减少了对数据字典的争用。
• 区的本地管理可自动跟踪并合并邻近的空闲空间,因而无须合并空闲区,而字典管理表空间则可能需要手工合并空间碎片。
• 本地管理的区大小可由系统自动确定。
• 对区的位图进行更改不会生成UNDO 信息,因为它们不更新数据字典中的表(表空间限额信息等特殊情况除外)。
(四)、创建表空间
1. 创建表空间要考虑的因素
在创建数据库完毕后,通常可以立即创建所需的非SYSTEM 表空间,在创建表空间时,除考虑到空间数量、对应的数据文件的大小等基本因素外,还要考虑表空间存储管理方式、
默认存储参数设置、块大小等问题。
Oracle 本身并不能限制表空间的数目,但是受到数据库所能拥有的数据文件数目的限制,只能创建有限数时的表空间。即所有表空间的数据文件的总和不能超过创建数据库时指
定的MAXDATAFILES 参数的限制。创建的表空间在默认情况具有标准的块大小,但是也可以创建具有非标准块大小的表空间。
1. 创建表空间要考虑的因素
在创建数据库完毕后,通常可以立即创建所需的非SYSTEM 表空间,在创建表空间时,除考虑到空间数量、对应的数据文件的大小等基本因素外,还要考虑表空间存储管理方式、
默认存储参数设置、块大小等问题。
Oracle 本身并不能限制表空间的数目,但是受到数据库所能拥有的数据文件数目的限制,只能创建有限数时的表空间。即所有表空间的数据文件的总和不能超过创建数据库时指
定的MAXDATAFILES 参数的限制。创建的表空间在默认情况具有标准的块大小,但是也可以创建具有非标准块大小的表空间。
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)。在创建本地管理的表空间时,自动段空间管理是默认值。
的可用/已用空间如何管理。可选的方式有:
1.AUTO
在这种设置下,Oracle 使用位图(bitmap)管理段内的可用空间。[注意此处的位图与本地管理的表空间使用的位图不一样]此处的位图用于描述段内每个数据块(data block)
是否有足够的可用空间来插入(insert)新数据。随着一个数据块中可用空间的变化,她的状态也被及时地反映到位图中。Oracle 使用位图可以更自动化地管理段内的可用空间。这种
空间管理形式被称为自动段空间管理(automatic segment-space management)。一个本地管理的(locally managed),且使用自动段空间管理的表空间,既可以被创
建为小文件表空间(传统的)(smallfile tablespace),也可以被创建为大文件表空间(bigfile tablespaces)。在创建本地管理的表空间时,自动段空间管理是默认值。
2.MANUAL
在这种设置下,Oracle 使用可用块列表(free list)来管理段内的可用空间。可用块列表记录了所有可以被用于插入新数据的数据块。
在这种设置下,Oracle 使用可用块列表(free list)来管理段内的可用空间。可用块列表记录了所有可以被用于插入新数据的数据块。
(五)、其他表空间操作
1. 调整表空间大小
如果登录到Oracle 数据库,并给某表插人数据时,发现在插人数据时总是显示错误信息,但是可以查询该表数据,可以考虑查看表空间大小,如果数据已占满了表空间,表空间
不能分配新的区时用户不能插入数据记录。理想情况下,在建立表空间时就应该规划好其尺寸,以避免出现以上问题。但是如果表空间不足以存放更多数据,那么DBA 可以改变表空
间的尺寸。但是如果DBA 等表空间不足时才去扩展表空间的容量,会影响Oracle 的性能,因此,DBA 需要知道现在的对象多大,对象的增长速度有多快,有规律的检查数据块对象
的大小,把注意力集中在快速增长的表上,经常查看表空间中的*空间,然后主动增加表空间的容量,提高系统的性能。
1. 调整表空间大小
如果登录到Oracle 数据库,并给某表插人数据时,发现在插人数据时总是显示错误信息,但是可以查询该表数据,可以考虑查看表空间大小,如果数据已占满了表空间,表空间
不能分配新的区时用户不能插入数据记录。理想情况下,在建立表空间时就应该规划好其尺寸,以避免出现以上问题。但是如果表空间不足以存放更多数据,那么DBA 可以改变表空
间的尺寸。但是如果DBA 等表空间不足时才去扩展表空间的容量,会影响Oracle 的性能,因此,DBA 需要知道现在的对象多大,对象的增长速度有多快,有规律的检查数据块对象
的大小,把注意力集中在快速增长的表上,经常查看表空间中的*空间,然后主动增加表空间的容量,提高系统的性能。
表空间物理上表现为一个或多个数据文件,表空间的尺寸即表空间所有数据文件尺寸的总和。因此表空间的大小由数据文件的个数和数据文件的大小来决定,可通过以下方法进行
调整:
• 重置数据文件的大小:ALTER DATABASE DATAFILE '...' | FileNo RESIZE XX
• 更改数据文件的大小:可以使用数据文件AUTOEXTEND(自动扩展)属性自动调
整数据文件的大小,也可以使用ALTER TABLESPACE 手动调整。
• 使用ALTER TABLESPACE 命令给表空间添加新的数据文件
调整:
• 重置数据文件的大小:ALTER DATABASE DATAFILE '...' | FileNo RESIZE XX
• 更改数据文件的大小:可以使用数据文件AUTOEXTEND(自动扩展)属性自动调
整数据文件的大小,也可以使用ALTER TABLESPACE 手动调整。
• 使用ALTER TABLESPACE 命令给表空间添加新的数据文件
1.数据文件的自动扩展属性(AUTOEXTEND)
当激活了数据文件的自动扩展选项之后,如果数据占满了数据文件所有空间,并且该数据文件不能容纳新数据时, 系统会自动扩展该数据文件。可以指定数据文件的
AUTOEXTEND 子句启用或禁用数据文件的自动扩展。文件将按指定的增量增加直到达到指定的最大值。使用AUTOEXTEND 子句的优点如下:
• 当表空间的空间用尽时无需过多的直接干预。
• 确保应用程序不会由于未能分配区而暂停。
创建数据文件后,可使用下列SQL 命令启用数据文件的自动扩展:
• CREATE TABLESPACE
• ALTER TABLESPACE
当激活了数据文件的自动扩展选项之后,如果数据占满了数据文件所有空间,并且该数据文件不能容纳新数据时, 系统会自动扩展该数据文件。可以指定数据文件的
AUTOEXTEND 子句启用或禁用数据文件的自动扩展。文件将按指定的增量增加直到达到指定的最大值。使用AUTOEXTEND 子句的优点如下:
• 当表空间的空间用尽时无需过多的直接干预。
• 确保应用程序不会由于未能分配区而暂停。
创建数据文件后,可使用下列SQL 命令启用数据文件的自动扩展:
• CREATE TABLESPACE
• ALTER TABLESPACE
【实例8-9】创建表空间mytbs8 并设置数据文件为自动扩展。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)创建表空间
SQL> CREATE TABLESPACE mytbs9
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs09.dbf' SIZE 5M
AUTOEXTEND ON NEXT 1M MAXSIZE 50M;
表空间已创建。
3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND
SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS8';
FILE_NAME AUT
---------------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS08.DBF YES
---------------------------------------------
/u01/app/oracle/product/11.2.0/db_1/dbs/
---------------------------------------------
SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
---------------------------------------------
【实例8-10】修改表空间mytbs7 的数据文件为自动扩展。
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)创建表空间
SQL> CREATE TABLESPACE mytbs9
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs09.dbf' SIZE 5M
AUTOEXTEND ON NEXT 1M MAXSIZE 50M;
表空间已创建。
3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND
SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS8';
FILE_NAME AUT
---------------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS08.DBF YES
---------------------------------------------
/u01/app/oracle/product/11.2.0/db_1/dbs/
---------------------------------------------
SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
---------------------------------------------
【实例8-10】修改表空间mytbs7 的数据文件为自动扩展。
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
2)修改表空间
SQL> ALTER DATABASE
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/d:oracleoradatadb01mytbs08.dbf' AUTOEXTEND ON
NEXT 1M MAXSIZE UNLIMITED;
数据库已更改。
3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND。
SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS8';
结果略
SQL> ALTER DATABASE
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/d:oracleoradatadb01mytbs08.dbf' AUTOEXTEND ON
NEXT 1M MAXSIZE UNLIMITED;
数据库已更改。
3)查询DBA_DATA_FILES 视图以确定是否启用AUTOEXTEND。
SQL> SELECT FILE_NAME,AUTOEXTENSIBLE
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS8';
结果略
2.为表空间增加数据文件
可以通过ALTER TABLESPACE ADD DATAFILE 命令,向表空间添加数据文件以增加分配给表空间的磁盘空间总量。命令格式如下:
ALTER TABLESPACE tablespace
ADD DATAFILE filespec [autoextend_clause]
-----------------------------------------
可以通过ALTER TABLESPACE ADD DATAFILE 命令,向表空间添加数据文件以增加分配给表空间的磁盘空间总量。命令格式如下:
ALTER TABLESPACE tablespace
ADD DATAFILE filespec [autoextend_clause]
-----------------------------------------
【实例8-11】为mytbs3 表空间增加一个数据文件,大小为5MB.
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
2)增加数据文件
SQL>ALTER TABLESPACE mytbs9 ADD DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs9d.dbf' SIZE 5M;
表空间已更改。
3)查询DBA_DATA_FILES 确认是否增加了数据文件
SQL> SELECT FILE_NAME
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
FILE_NAME
--------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
------------------------------------
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
2)增加数据文件
SQL>ALTER TABLESPACE mytbs9 ADD DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs9d.dbf' SIZE 5M;
表空间已更改。
3)查询DBA_DATA_FILES 确认是否增加了数据文件
SQL> SELECT FILE_NAME
FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
FILE_NAME
--------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
------------------------------------
【实例8-12】将mytbs5 表空间中数据文件的大小改为10M.
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)创建表空间
SQL> ALTER DATABASE
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs10.dbf' RESIZE 10M;
数据库已更改。
3)查询以确认更改
SQL> SELECT BYTES FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS5';
BYTES
----------
10485760
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)创建表空间
SQL> ALTER DATABASE
DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs10.dbf' RESIZE 10M;
数据库已更改。
3)查询以确认更改
SQL> SELECT BYTES FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS5';
BYTES
----------
10485760
----------------------------------------
ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs10.dbf' RESIZE 5M;
----------------------------------------
【实例8-13】在表空间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;
表已丢弃。
ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs10.dbf' RESIZE 5M;
----------------------------------------
【实例8-13】在表空间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;
表已丢弃。
------------------------------------------------------
【实例8-14】将mytbs3 表空间更改为可读写状态,验证是否能够创建表。
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
2)改为可读可写状态
SQL> ALTER TABLESPACE mytbs3 READ WRITE;
表空间已更改。
3)创建表test 验证表空间的状态
SQL> CREATE TABLE test1 (name varchar(20))
TABLESPACE mytbs3;
表已创建。
【实例8-14】将mytbs3 表空间更改为可读写状态,验证是否能够创建表。
1)以管理员身份登录
SQL>CONNECT / AS SYSDBA
2)改为可读可写状态
SQL> ALTER TABLESPACE mytbs3 READ WRITE;
表空间已更改。
3)创建表test 验证表空间的状态
SQL> CREATE TABLE test1 (name varchar(20))
TABLESPACE mytbs3;
表已创建。
--------------------------------------------------------
3. 修改表空间的ONLINE/OFFLINE 属性
通过将一个表空间置于联机或脱机状态来控制表空间的可用性。当表空间处于联机状态时,用户可以访问其中的数据。当某一表空间处于脱机状态时,用户无法访问它的数据,但
是允许正常访问数据库的其余处于联机的表空间。以下几种情况下数据库管理员可以让表空间脱机:
• 使数据库的一部分表空间不可用,但允许正常访问数据库的其余表空间
• 执行脱机表空间备份(尽管表空间可以在联机使用时备份)
• 在数据库打开时恢复表空间或数据文件
• 在数据库打开时移动数据文件
可以使用如下命令对表空间进行脱机和联机操作:
ALTER TABLESPACE tablespace
--------------------------------------------------------
【实例8-15】将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'
------------------------------------------------------------
【实例8-16】将mytbs3 表空间改为联机状态,并向test 表中插入一条数据进行验证。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)改为联机状态
SQL> ALTER TABLESPACE mytbs3 ONLINE;
表空间已更改。
3)插入数据
SQL> INSERT INTO test VALUES('SHEN');
已创建1 行。
说明:插入数据成功,因为表空间处于联机状态。
---------------------------------------------------------------
【实例8-17】将数据文件D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 改为脱机状态,
然后再改为联机状态。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)改为脱机状态
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/MYTBS3.DBF' OFFLINE;
数据库已更改。
3)改为联机状态
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/MYTBS3.DBF' ONLINE;
数据库已更改。
------------------------------------------------------------------
【实例8-18】将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 '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs3.dbf'
TO '/u01/app/oracle/product/11.2.0/db_1/dbs/dbsbak/mytbs3.dbf';
表空间已更改
5) 使表空间联机
SQL> ALTER TABLESPACE mytbs3 ONLINE;
表空间已更改
6) 查询表空间的数据文件
SQL> SELECT FILE_NAME FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
FILE_NAME
-----------------------------------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
E:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
可见第三个数据文件已经由D:盘移动到了E:盘。
-----------------------------------------------------------------
(六)、删除表空间
当不再需要表空间及其内容时,可以通过下面的DROP TABLESPACE 命令从数据库中删除表空间,格式如下:
DROP TABLESPACE tablespace [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
其中:
tablespace:指定要删除的表空间的名称
INCLUDING CONTENTS:删除表空间内的所有段
AND DATAFILES:删除关联的操作系统文件
CASCADE CONSTRAINTS:如果要删除的表空间之外的表引用了该表空间内表的主
键和唯一键,则删除这种引用完整性约束。
【实例8-21】删除表空间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 mytbs9
INCLUDING CONTENTS AND DATAFILES;
表空间已丢弃。
4) 删除表空间system
SQL> DROP TABLESPACE system
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
DROP TABLESPACE system
*
ERROR 位于第1 行:
ORA-01550: 无法删除系统表空间
-----------------------------------------------
(七)、获取表空间的相关信息
可以使用下列数据字典视图和动态性能视图获取表空间和数据文件的相关信息。
与表空间相关:DBA_TABLESPACE,V$TABLESPACE。
与数据文件相关:DBA_DATA_FILES,V$DATAFILE。
与临时数据文件相关:DBA_TEMP_FILES,V$TEMPFILE。
-----------------------------------------------
【实例8-26】查询数据文件的基本信息。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2) 查询
SQL> SELECT name,file#,status,bytes,checkpoint_change# last_scn
FROM v$datafile;
NAME
------------------------------------------------------------------
FILE# STATUS BYTES LAST_SCN
---------- ------- ---------- ----------
D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF
1 SYSTEM 419430400 5083126
D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF
2 ONLINE 209715200 5083126
D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF
3 ONLINE 20971520 5083126
字段的含义如下:
Name:数据文件的名称和位置;
File#:数据文件的绝对编号;
Status:数据文件的状态,可以有三种:联机、脱机或者属于SYSTEM 表空间;
Bytes:数据文件的大小;
Last_scn:数据文件中最后一次写入事务的SCN。
【实例8-27】查询表空间users 的大小。
-----------------------------------------
(九)、小结
Oracle 数据库在逻辑上由一个或多个表空间组成,每个表空间由一个或多数据文件组
成,并且一个数据文件只能属于一个表空间。表空间根据管理方式可以分为本地管理表空间
和字典管理表空间两种,前者是Oracle 9i 默认的管理方式。表空间的大小是构成表空间的
数据文件大小的总和,可以通过修改数据文件的大小、增减数据文件或将数据文件设置为自
动增长来调整表空间的大小。通过移动数据文件,可以将数据文件分布到不同的磁盘驱动器
可以减少I/O 冲突和防止数据损失。
-----------------------------------------
【实例10-2】创建一个2K 块大小的表空间mytbs2k,并验证。
1)以sys 用户登录
CONN / AS SYSDBA
已连接
2)设置初始化参数DB_2K_CACHE_SIZE, 重新启动使参数设置生效
SQL> ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE;
系统已更改。
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 47258064 bytes
Fixed Size 453072 bytes
Variable Size 29360128 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
3)创建表空间
CREATE TABLESPACE mytbs2k
DATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10M
BLOCKSIZE 2K;
表空间已创建。
4)验证
SQL> SELECT tablespace_name,block_size
FROM dba_tablespaces
WHERE tablespace_name='MYTBS2K';
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
MYTBS2K 2048
----------------------------------
3. 修改表空间的ONLINE/OFFLINE 属性
通过将一个表空间置于联机或脱机状态来控制表空间的可用性。当表空间处于联机状态时,用户可以访问其中的数据。当某一表空间处于脱机状态时,用户无法访问它的数据,但
是允许正常访问数据库的其余处于联机的表空间。以下几种情况下数据库管理员可以让表空间脱机:
• 使数据库的一部分表空间不可用,但允许正常访问数据库的其余表空间
• 执行脱机表空间备份(尽管表空间可以在联机使用时备份)
• 在数据库打开时恢复表空间或数据文件
• 在数据库打开时移动数据文件
可以使用如下命令对表空间进行脱机和联机操作:
ALTER TABLESPACE tablespace
--------------------------------------------------------
【实例8-15】将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'
------------------------------------------------------------
【实例8-16】将mytbs3 表空间改为联机状态,并向test 表中插入一条数据进行验证。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)改为联机状态
SQL> ALTER TABLESPACE mytbs3 ONLINE;
表空间已更改。
3)插入数据
SQL> INSERT INTO test VALUES('SHEN');
已创建1 行。
说明:插入数据成功,因为表空间处于联机状态。
---------------------------------------------------------------
【实例8-17】将数据文件D:\ORACLE\ORADATA\DB01\MYTBS3C.DBF 改为脱机状态,
然后再改为联机状态。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2)改为脱机状态
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/MYTBS3.DBF' OFFLINE;
数据库已更改。
3)改为联机状态
SQL> ALTER DATABASE DATAFILE '/u01/app/oracle/product/11.2.0/db_1/dbs/MYTBS3.DBF' ONLINE;
数据库已更改。
------------------------------------------------------------------
【实例8-18】将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 '/u01/app/oracle/product/11.2.0/db_1/dbs/mytbs3.dbf'
TO '/u01/app/oracle/product/11.2.0/db_1/dbs/dbsbak/mytbs3.dbf';
表空间已更改
5) 使表空间联机
SQL> ALTER TABLESPACE mytbs3 ONLINE;
表空间已更改
6) 查询表空间的数据文件
SQL> SELECT FILE_NAME FROM DBA_DATA_FILES
WHERE TABLESPACE_NAME='MYTBS9';
FILE_NAME
-----------------------------------------------------------------
D:\ORACLE\ORADATA\DB01\MYTBS3A.DBF
D:\ORACLE\ORADATA\DB01\MYTBS3B.DBF
E:\ORACLE\ORADATA\DB01\MYTBS3C.DBF
可见第三个数据文件已经由D:盘移动到了E:盘。
-----------------------------------------------------------------
(六)、删除表空间
当不再需要表空间及其内容时,可以通过下面的DROP TABLESPACE 命令从数据库中删除表空间,格式如下:
DROP TABLESPACE tablespace [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]]
其中:
tablespace:指定要删除的表空间的名称
INCLUDING CONTENTS:删除表空间内的所有段
AND DATAFILES:删除关联的操作系统文件
CASCADE CONSTRAINTS:如果要删除的表空间之外的表引用了该表空间内表的主
键和唯一键,则删除这种引用完整性约束。
【实例8-21】删除表空间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 mytbs9
INCLUDING CONTENTS AND DATAFILES;
表空间已丢弃。
4) 删除表空间system
SQL> DROP TABLESPACE system
INCLUDING CONTENTS AND DATAFILES
CASCADE CONSTRAINTS;
DROP TABLESPACE system
*
ERROR 位于第1 行:
ORA-01550: 无法删除系统表空间
-----------------------------------------------
(七)、获取表空间的相关信息
可以使用下列数据字典视图和动态性能视图获取表空间和数据文件的相关信息。
与表空间相关:DBA_TABLESPACE,V$TABLESPACE。
与数据文件相关:DBA_DATA_FILES,V$DATAFILE。
与临时数据文件相关:DBA_TEMP_FILES,V$TEMPFILE。
-----------------------------------------------
【实例8-26】查询数据文件的基本信息。
1)以管理员身份登录
SQL> CONNECT / AS SYSDBA
2) 查询
SQL> SELECT name,file#,status,bytes,checkpoint_change# last_scn
FROM v$datafile;
NAME
------------------------------------------------------------------
FILE# STATUS BYTES LAST_SCN
---------- ------- ---------- ----------
D:\ORACLE\ORADATA\DB01\SYSTEM01.DBF
1 SYSTEM 419430400 5083126
D:\ORACLE\ORADATA\DB01\UNDOTBS01.DBF
2 ONLINE 209715200 5083126
D:\ORACLE\ORADATA\DB01\CWMLITE01.DBF
3 ONLINE 20971520 5083126
字段的含义如下:
Name:数据文件的名称和位置;
File#:数据文件的绝对编号;
Status:数据文件的状态,可以有三种:联机、脱机或者属于SYSTEM 表空间;
Bytes:数据文件的大小;
Last_scn:数据文件中最后一次写入事务的SCN。
【实例8-27】查询表空间users 的大小。
-----------------------------------------
(九)、小结
Oracle 数据库在逻辑上由一个或多个表空间组成,每个表空间由一个或多数据文件组
成,并且一个数据文件只能属于一个表空间。表空间根据管理方式可以分为本地管理表空间
和字典管理表空间两种,前者是Oracle 9i 默认的管理方式。表空间的大小是构成表空间的
数据文件大小的总和,可以通过修改数据文件的大小、增减数据文件或将数据文件设置为自
动增长来调整表空间的大小。通过移动数据文件,可以将数据文件分布到不同的磁盘驱动器
可以减少I/O 冲突和防止数据损失。
-----------------------------------------
【实例10-2】创建一个2K 块大小的表空间mytbs2k,并验证。
1)以sys 用户登录
CONN / AS SYSDBA
已连接
2)设置初始化参数DB_2K_CACHE_SIZE, 重新启动使参数设置生效
SQL> ALTER SYSTEM SET DB_2k_CACHE_SIZE=16M SCOPE=SPFILE;
系统已更改。
SQL> SHUTDOWN
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP
ORACLE 例程已经启动。
Total System Global Area 47258064 bytes
Fixed Size 453072 bytes
Variable Size 29360128 bytes
Database Buffers 16777216 bytes
Redo Buffers 667648 bytes
数据库装载完毕。
数据库已经打开。
3)创建表空间
CREATE TABLESPACE mytbs2k
DATAFILE 'd:\oracle\oradata\db01\mytbs2k_1.dbf' SIZE 10M
BLOCKSIZE 2K;
表空间已创建。
4)验证
SQL> SELECT tablespace_name,block_size
FROM dba_tablespaces
WHERE tablespace_name='MYTBS2K';
TABLESPACE_NAME BLOCK_SIZE
------------------------------ ----------
MYTBS2K 2048
----------------------------------