540 likes | 704 Views
第 7 章 表空间与数据文件管理. 内容提要. 表空间的创建与管理维护. 一个 Oracle 数据库是大量数据的集合,这些数据物理上存储于一个个 数据文件 中,而逻辑上却存储于一个个的 表空间 中。由此可见,表空间与数据文件之间有着非常紧密的联系,有着明确的对应关系,两者只是从不同角度看到的但却是同一个数据库的不同的组成部分。 表空间 是 Oracle 数据库的 逻辑构成 , 数据文件 则是 Oracle 数据库的 物理组成 。.
E N D
内容提要 • 表空间的创建与管理维护
一个Oracle数据库是大量数据的集合,这些数据物理上存储于一个个数据文件中,而逻辑上却存储于一个个的表空间中。由此可见,表空间与数据文件之间有着非常紧密的联系,有着明确的对应关系,两者只是从不同角度看到的但却是同一个数据库的不同的组成部分。表空间是Oracle数据库的逻辑构成,数据文件则是Oracle数据库的物理组成。一个Oracle数据库是大量数据的集合,这些数据物理上存储于一个个数据文件中,而逻辑上却存储于一个个的表空间中。由此可见,表空间与数据文件之间有着非常紧密的联系,有着明确的对应关系,两者只是从不同角度看到的但却是同一个数据库的不同的组成部分。表空间是Oracle数据库的逻辑构成,数据文件则是Oracle数据库的物理组成。
作为DBA,在需要的时候应该创建出更多的表空间,以分离不同类型的数据,比如,如果将表数据与索引数据存储在不同的表空间将有利于性能的提高。另外,随着数据的不断增长,表空间的空闲空间会慢慢变少,这将要求:DBA要对表空问的空间使用情况进行经常性监控,发现空间不足时及时进行扩展。作为DBA,在需要的时候应该创建出更多的表空间,以分离不同类型的数据,比如,如果将表数据与索引数据存储在不同的表空间将有利于性能的提高。另外,随着数据的不断增长,表空间的空闲空间会慢慢变少,这将要求:DBA要对表空问的空间使用情况进行经常性监控,发现空间不足时及时进行扩展。
7.1 表空间 • Oracle数据库通过表空间来组织数据库数据。一个数据库逻辑上由一个或多个表空间组成,一个表空间由一或多个段组成,一个段由一或多个区组成,一个区由多个连续的数据库块组成。 • 而表空间物理上是由一个或多个数据文件组成的,并且一个数据文件只能属于一个表空间。表空间的空间大小是所有从属于它的数据文件大小的总和。如果一个表空问的空间不够用,可以通过添加数据文件的办法来增加表空问的大小。一旦数据文件加入到某个表空间之后,就不能从该表空间中删除该数据文件了。
Tablespace Segment 112K Database Blocks Extent 84K DataFile Database 逻辑结构图示
数据库中的对象如表、索引及其数据必须存储于表空间中。而且表空间上数据的可用性是可以控制的。如果允许用户或应用程序访问,那么该表空间必须要处于联机状态(ONLINE),脱机(OFFLINE)状态下的表空间,其数据是不可用的。SYSTEM表空间必须联机。数据库中的对象如表、索引及其数据必须存储于表空间中。而且表空间上数据的可用性是可以控制的。如果允许用户或应用程序访问,那么该表空间必须要处于联机状态(ONLINE),脱机(OFFLINE)状态下的表空间,其数据是不可用的。SYSTEM表空间必须联机。
Oracle根据区的管理方式,将表空间分为字典管理(DICTIONARY)和本地管理(LOCAL)的表空间两种。如果将表空间中区的使用与空闲信息记录在数据字典中,就称为字典管理的表空间。如果区的使用与空闲信息是记录在了表空问对应的每个数据文件内的位图中,则称为本地管理的表空间。Oracle根据区的管理方式,将表空间分为字典管理(DICTIONARY)和本地管理(LOCAL)的表空间两种。如果将表空间中区的使用与空闲信息记录在数据字典中,就称为字典管理的表空间。如果区的使用与空闲信息是记录在了表空问对应的每个数据文件内的位图中,则称为本地管理的表空间。 • 但是从0racle9iR2开始,字典管理方式已经废弃。因为与字典管理方式相比,本地管 • 理的表空问具有明显优点:一方面,由于本地管理表空间的“自由空间”信息没有被记录
到数据字典,所以分配和释放区避免了访问数据字典,从而降低了在数据字典上的冲突;到数据字典,所以分配和释放区避免了访问数据字典,从而降低了在数据字典上的冲突; • 另外,本地管理表空间会自动跟踪并合并相邻空闲空问,而字典管理表空间则可能需要手工合并空间碎片。
7.2创建表空间 • 当建立数据库时会自动建立SYSTEM表空间,该表空间用于存放数据字典对象。尽管SYSTEM表空间也可以存放用户数据,但Oracle建议用户数据应存放在另外的表空问中。 • 因此,建立数据库之后,DBA应该建立其他表空间,以存放不同类型的数据。
1.命令常用选项 • 建立表空间的用户需具有CREATE TABLESPACE系统权限,使用CREATE TABLESPACE命令建立。该命令的常用格式如下: • CREATE TABLESPACE tablespace_name • DATAFILE ‘[path]<file_name>’SIZE n[k| M] • [,’[path]<file_name>’SIZE n[k|M],...] • [ONLINE l OFFLINE] • [EXTENT MANAGEMENT DICTIONARY | • LOCAL [AUTOALLOCATE |UNIFORM[SIZE n[K l M]]]]
(1)tablespace name:为表空间定义唯一的名字。 • (2)DATAFILE必须指定,列出表空间对应的每一个物理文件的信息,包括文件名称、路径以及大小。 • (3)ONLINE:联机,表示表空间创建后立即可以使用;OFFLINE脱机,表空间创建后不能使用。默认值为ONLINE。 • (4)EXTENT MANAGEMENT:指定表空间是字典管理的还是本地管理的,从oracle9i开始,默认为本地管理。如果是本地管理的表空间,则还可以继续指定区的大小情况:AUTOALLOCATE表示由系统管理,用户无法指定区大小,这是默认设置;UNIFORM表示区使用统一大小,大小由SIZE指定,默认SIZE则大小为1MB。
2.创建表空间示例 • 以下举例说明各种表空间的创建方法与命令。 • 【例7-1】 建立本地管理表空间test,文件位于D磁盘当前目录下,名字为test01.dbf, • 200MB大小。 • SQL>CREATE TABLESPACE test • DATAFILE。D:test01.dbf。SIZE 200M • EXTENT MANAGEMENT LOCAL; • 最后一行的EXTENT MANAGEMENT LOCAL也可以省略,因为默认就是本地管理的。
【例7.2】建立本地管理表空间edu,其大小为1.5GB。假设使用2个数据文件edu01.dbf【例7.2】建立本地管理表空间edu,其大小为1.5GB。假设使用2个数据文件edu01.dbf • 与edu02.dbf,分别位于D、E磁盘的子目录XXW下,区尺寸由Oracle自动分配。 • SQL>CREATE TABLESPACE edu • DATAFILE ‘D:\xxw\edu01.dbf’ SIZE 1000M, • ’E:\xxw\edu02.dbf’ SIZE 500M • EXTENT MANAGEMENT LOCAL AUTOALLOCATE;
【例7-3】 建立本地管理表空间index_tbs,用于存放索引数据。其包含1个数据文件 • index01.dbf,区尺寸指定为统一大小128KB。 • SQL>CREATE TABLESPACE index_tbs • DATAFILE’index01.Dbf’ SIZE 100M • EXTENT MANAGEMENT LOCAL UNIFORM SIZE 128K;
【例7.4】 建立临时表空间tmp_tbs。临时表空间主要用来提高排序操作。 • SQL>CREATE TEMPORARY TABLESPACE tmp_tbs TEMPFILE ‘tmp.dbf’ SIZE 300M; • 使用如下的命令可以改变数据库的默认临时表空间: • SQL>ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tmp_tbs;
【例7.5】 建立UNDO表空间und001。撤销表空间必须是本地管理的且不能指定区大小,区由系统管理。 • SQL>CREATE UNDO TABLESPACE und001 • DATAFILE ’E:\Oracle\oradata\Student\und001.dbf’SIZE 50M EXTENT MANAGEMENT LOCAL AUTOALLOCATE; • 撤销表空间用于存放UNDO数据(也称为回退数据),它用于确保数据的一致性。当执行DML操作(INSERT、UPDATE、DELETE等)时,事务操作前的数据被称为UNDO记录,被存放于UNDO表空间中。当该事务结束时,UNDO数据才被删除。
一个Oracle数据库可以包含多个UNDO表空间,但同一时刻一个实例只能使用一个UNDO表空间。初始化参数UNDO_TABLESPACE用于指定实例所要使用的UNDO表空间,使用如下的命令可以启用新的UNDO表空间: 一个Oracle数据库可以包含多个UNDO表空间,但同一时刻一个实例只能使用一个UNDO表空间。初始化参数UNDO_TABLESPACE用于指定实例所要使用的UNDO表空间,使用如下的命令可以启用新的UNDO表空间: • SQL>ALTER SYSTEM SET UNDO_TABLESPACE=und00 1;
【例7.6】 创建字典管理表空间userdata,仅包含一个数据文件,大小100MB。因为从Oracle9i开始,默认会创建本地管理表空间,因此在创建命令中必须用EXTENT MANAGEMENT DICTIONARY指明是字典管理的。 • SQL>CREATE TABLESPACE userdata • DATAFILE‘E:\Oracle\oradata\USerdata01.dbf‘SIZE 100M EXTENT MANAGEMENT DICTIONARY; • 注意,创建字典管理表空间命令只能在Oracle 9.0.1.1.1或更低版本中执行。
3.查看表空间与数据文件信息 . • (1)使用如下命令可以获得所有表空间的名字列表。 • SQL>SELECT tablespace_name FROM dba_tablespaces; 或 • SQL>SELECT name FROM v$tablespace;
(2)如果需要查询表空间edu对应的数据文件,应该使用dba_data__files数据字典。(2)如果需要查询表空间edu对应的数据文件,应该使用dba_data__files数据字典。 • SQL>SELECT file name FROM dba_data_files • WHERE tablespace_name=‘EDU’; • dba_data_files返回结果将不包括临时表空间的数据文件,临时文件信息只能从dba_tempfiles中查询得到,如下所示: • SQL>SELECT file_name FROM dba_temp_files;
(3)查看各表空问的区管理方式是本地管理还是字典管理。(3)查看各表空问的区管理方式是本地管理还是字典管理。 • SQL>SELECT tablespace_name,extent_management· FROM dba_tablespaces; • (4)查看本地管理的表空间的区分配类型。SYSTEM表示由系统管理,UNIFORM表示指定区为统一大小。 • SQL>SELECT tablespace_name,allocation_type • FROM dba_tablespaces • WHERE extent_management=’LOCAL’;
7.3表空间维护 • 在数据库使用过程中,有时候需要对表空间进行一些修改。比如出现了某种故障需要使表空间脱机,表空间存放的是一些历史数据禁止对其更改,表空间所在的磁盘损坏需要改变其物理位置,表空间的可用空间太少等,这些情况出现时,管理人员就需要进行相应的维护操作。
7.3.1 改变表空间状态 • 1.使表空间联机或脱机 当建立表空间时,其默认状态为ONLINE。如果要对表空间执行恢复操作,往往需要将其改为OFFLINE脱机状态。 • SQL>ALTER TABLESPACE edu OFFLINE; 恢复完成后再将其联机: • SQL>ALTER TABLESPACE edu ONLINE; 由于表空间物理上由一个或多个数据文件组成,所以在将表空间脱机后,该表空间的
所有数据文件也会自动脱机。而将数据文件联机后,其所属的表空间并不会自动联机。 也可以使某个数据文件脱机不可用,命令为: • SQL>ALTER DATABASE DATAFILE ‘D:\xxw\edu01.dbf’ OFFLINE; • 如下命令将一个数据文件进行联机: • SQL>ALTER DATABASE DATAFILE ‘D:\xxw\edu01.dbf’ ONLINE;
2.使表空间只读或可读写 按默认选项新建的表空间是处于联机状态的,此时用户不仅可以做SELECT查询操作,也可以对该表空间进行更改操作。但是根据维护的需要,有时会限制用户对某个表空间的访问,比如只允许查询,禁止修改。这样就涉及到表空间的只读或可读写状态的改变。 • SQL>ALTER TABLESPACE edu READ ONLY; • SQL>ALTER TABLESPACE edu READ WRITE ;
3.查看表空间状态 • 通过如下命令可以了解每个表空间及其状态信息。status值可能为READ ONLY(联机但只读)、ONLINE(联机且可读写)、OFFLINE(脱机)。 • SQL>SELECT tablespace_name,status FROM dba_tablespaces:
7.3.2 监控表空间使用 • 为了掌握表空间的空问使用情况,便于在空间不够的情况下及时扩展,作为DBA必须随时监控表空间,尤其是数据量增长比较迅速的表空间。 • 表空间大小是其所包含的每一个数据文件大小的和。通过如下命令从dba_data-files数据字典中可以计算出每个表空间的总的大小: • SQL>SELECT tablespace_name,sum(bytes)/1024/1024 total MB • FROM dba_data_files • GROUP BY tablespace_name; • 以上命令中,sum(bytes)/1024/1024表达式用于将空间大小换算成以MB为单位。
而数据字典dba_free_space可以反映每个表空间的空闲情况,如下命令所示:而数据字典dba_free_space可以反映每个表空间的空闲情况,如下命令所示: • SQL>SELECT tablespace_name,sum(bytes)/1024/1024 free MB • FROM dba_free_space GROUP BY tablespace_name;
事实上,DBA更习惯于直接看到每个表空间的空闲百分比,此时需要结合dba_data_illes与dba_free_space作连接查询,命令如下:事实上,DBA更习惯于直接看到每个表空间的空闲百分比,此时需要结合dba_data_illes与dba_free_space作连接查询,命令如下: • SQL>SELECT b.tablespace_name’’tablespace”, • sum(b.bytes)/1024/1024 total_MB”, • sum(a.bytes)/1024/1024 free_MB”, • round(sum(a-bytes)/sum(b.bytes)*i00,1) ”free/total%” • FROM dba__free__space a,dba__data__files b • WHERE a.file_id=b.file_id • GROUP BY b.tablespace name;
7.3.3 改变表空间大小 • 从图7.1看到,USERS表空间数据己满,仅空闲了0.2%。导致用户插入数据时总是出现错误,但是可以查询该表数据。解决的办法是扩展该表空间的尺寸。 • 通常可以采用两种办法予以扩展。 (1)更改现有数据文件的大小,无论是自动还是手动。 (2)向表空间内添加数据文件。
1.更改现有数据文件的大小 • (1)现有数据文件允许自动扩展。DBA可以为每个数据文件设置是否允许自动扩展。如果允许自动扩展,则当数据库数据占满了数据文件的所有空间,并且该数据文件不能容纳新数据时,系统会自动扩展该数据文件。 • 查询dba_data_files数据字典可以了解某个数据文件的自动扩展选项是否允许: • SQL>SELECT file_name,autoextensible • FROM dba_data_files • WHERE tablespace_name=’USERS’;
显示结果中,autoextensible列的值如果为YES,表示允许自动扩展,为NO表示禁止自动扩展。使用ALTER DATABASE DATAFILE命令,可以随时更改一个文件的自动扩展设置。例如: • SQL>ALTER DATABASE DATAFILE ‘E:\Oracle\oradata\student\users01.dbf’ AUTOEXTEND ON NEXT 10M MAXSIZE 500M;
命令中通过AUTOEXTEND ON允许users01.dbf文件自动扩展,NEXT指定扩展尺寸,MAXSIZE指定数据文件的最大长度,若没有最大限制则设置为UNLIMITED。如果文件现有大小为455MB,允许自动扩展之后则系统会根据需要来自动增大文件大小,一次增加10MB,文件最大不超过500MB。以后任何时候可以在ALTER DATABASE DATAFILE命令中用AUTOEXTEND OFF选项关闭自动扩展功能。 实际上,在创建表空问时就可以对数据文件指定自动扩展,例如: • SQL>CREATE TABLESPACE userdata02 • DATAFILE ·userdata02.dbf。 SIZE 5M AUTOEXTEND ON NEXT 2M;
(2)现有数据文件手工重置大小。尽管指定自动扩展选项,可以使得数据文件在数据充满的情况下自动扩展,但这会导致系统性能的下降。如果需要扩展的空间大小能大致估计出来,也可以重新指定文件的大小。例如,users01.dbf文件现在大小455MB,现(2)现有数据文件手工重置大小。尽管指定自动扩展选项,可以使得数据文件在数据充满的情况下自动扩展,但这会导致系统性能的下降。如果需要扩展的空间大小能大致估计出来,也可以重新指定文件的大小。例如,users01.dbf文件现在大小455MB,现 • 在需要增加一大批数据,这批数据大致需要200MB空间,那么可以直接指定该文件大小为700MB。 • SQL>ALTER DATABASE DATAFILE-E:\Oracle\oradata\student\users01.dbf RESIZE 700M; • 将文件一次性扩充,然后再增加数据。值得注意的是,使用RESIZE子句也可以缩减数据文件尺寸,但是,缩减后的大小应能容纳已有的数据库对象,否则会出错。
2.添加新数据文件 • 通过向表空间内添加新的数据文件,同样可以增加表空间。例如,USERS表空间需要扩充200MB的空间,但是原有数据文件所在的磁盘E所剩空间已经不足200MB,这时无论是打开自动扩展功能还是手I增大,都无法扩充,只能用增加数据文件的方法,从其他 • 磁盘来分配空间。添加命令如下: • SQL>ALTER TABLESPACE users • ADD DATAFILE ‘F:\Student\users02.dbf’ SIZE 200M;
如果,担心200MB空间可能也不是很充裕,此时在添加时,也可以同时启用自动扩展选项,如:如果,担心200MB空间可能也不是很充裕,此时在添加时,也可以同时启用自动扩展选项,如: • SQL>ALTER TABLESPACE users • ADD DATAFILE ‘f:\ Student\USers02.dbf’SIZE 200M AUTOEXTEND ON NEXT 1 0M; • 添加数据文件的方法不仅可以扩展表空间的大小,而且也可以分布表空问上数据对象(表、索引等)的数据,平衡I/O,提高系统性能。 随着数据量的增加,可能需要新增磁盘,此时需要将部分数据文件迁移到新增的硬盘上。或者某个磁盘被损坏,该磁盘上的数据文件必须迁移到其他位置。 • 如果要迁移的是非SYSTEM表空问的数据文件,遵照尽可能少地影响用户的原则,那
么就可以在数据库打开的情况下进行迁移。但是如果要迁移SYSTEM表空间的数据文件,由于该表空间不可能脱机,因此只能关闭数据库进行移动。么就可以在数据库打开的情况下进行迁移。但是如果要迁移SYSTEM表空间的数据文件,由于该表空间不可能脱机,因此只能关闭数据库进行移动。 • 1.对非SYSTEM表空间的数据文件进行移动 • 移动时必须先将表空间脱机,然后使用操作系统命令把与表空间相应的数据文件复制到新位置,此时也可以对文件重命名,在将表空间联机之前必须将位置更改的信息通知给控制文件。 • 以users01.dbf为例,移动的具体步骤如下。 • (1)使表空间脱机。 • SQL>ALTER TABLESPACE users OFFLINE;
(2)使用操作系统命令以移动或者复制文件。 • SQL>HOST COPY E:\Oracle\oradata\student\users01·dbf • F:\student\users01.dbf;
(3)执行ALTER TABLESPACE RENAME DATAFILE命令,通知控制文件。 • SQL>ALTER TABLESPACE users RENAME DATAFILE • ·E:\Oracle\0radata\student\users01.dbf。 • TO tF.\student\users01.dbf’; • (4)使表空间联机。 • SQL>ALTER TABLESPACE users ONLINE • (5)必要时使用操作系统命令删除原文件。 • 通过以上步骤,实现了将文件users01.dbf从磁盘E到磁盘F的位置移动。
2.对SYSTEM表空间的数据文件进行移动 • 因为SYSTEM表空间无法脱机,因此SYSTEM表空间内的数据文件,必须使用如下方法进行移动。但是这种方法其实可以用来移动任何类型的数据文件以及联机日志文件。 • 移动无法脱机的表空间内的文件,如system01.dbf,具体步骤如下。 • (1)关闭数据库。 • SQL>SHUTDOWN IMMEDIATE
(2)使用操作系统命令移动文件。 • SQL>HOST COPY E:\Oracle\oradata\student\system01·dbf • F:\student\system01.dbf;
(3)装载(M0uNT)数据库。 • SQL>STARTUP MOUNT • (4)执行ALTER DATABASE RENAME FILE命令,通知控制文件。 • SQL>ALTER DATABASE RENAME FILE • ‘E.\0racle\oradata\student\system01.dbf’ • TO ‘F.\student\system01.dbf’;
(5)打开数据库。 • SQL>ALTER DATABASE OPEN;
7.4删除表空间 • 当表空间损坏无法被恢复时,或者当表空间不再需要时,就可以删除该表空间了。删除表空间通常由DBA或者具有系统权限DROPTABLESPACE的用户来完成。 • 删除表空间的命令语法如下: • DROP TABLESPACE tablespace_name • [INCLUDING CONTENTS [AND DATAFILES] [CASCADE CONSTRAINTS]] • 其中 • (1)INCLUDING CONTENTS:如果表空间包含有数据库对象则必须带有该选项。
(2)AND DATAFILES:删除表空间通常只是从控制文件中逻辑删除了表空间信息,而其数据文件还需要使用操作系统命令手工删除。若带上该选项,则同时删除表空间对应的操作系统文件。 • (3)CASCADE CONSTRAINTS:删除参照完整性约束。如果两个表空间之间存在完整性约束关系则必须带有该选项。 • 例如,如下命令将删除表空间tt,但是由于表空间内存有数据,因此提示了错误信息: • SQL>DROP TABLESPACE tt; • DROP TABLESPACE tt
ERROR位于第l行: • ORA一01549:表空间非空,请使用INCLUDING CONTENTS选项 • 使用如下命令,不仅能删除表空间tt,同时也删除了该表空间相关联的操作系统文件: • SQL>DROP TABLESPACE tt INCLUDING CONTENTS AND DATAFILES ;
小 结 • 表空间与数据文件是数据库数据的存储结构,DBA确保表空间的正常访问和使用是其日常维护工作的重中之重。表空间相关的维护工作包括创建表空间、查看表空间基本信息、监控表空间使用情况,空间不足时及时进行扩展,有时还需要对数据文件进行移动操作。
选择题 • 1.查看数据文件的名称与路径信息,可以查询( )。 • A.v$controlfile B.v$datafile • C.v$logfile D、v$tablespace