2009年2月6日星期五

表空间、数据文件和控制文件

数据库(database)、表空间(tablespace)及数据文件(datafile)之间的联系与区别:
一个oracle数据库是由一个或多个表空间构成的,表空间是逻辑存储单元,这些表空间共同用于存储数据库中的数据。
oracle数据库中的每个表空间由一个或多个数据文件构成,数据文件是物理文件,这些文件由数据库所在的操作系统管理。
数据库的数据实际存储在构成各个表空间的数据文件中。
注:表空间由一个或多个数据文件组成。数据文件只能属于一个表空间。属于一个表空间的对象(object,例如表、索引等)可以跨越多个数据文件。

一、表空间
数据库是由一个或多个被称为表空间的逻辑单元构成的。表空间内的逻辑存储单位为段,段又可以继续划分为数据扩展,数据扩展是由一组连续的数据块构成的。
1、大文件表空间bigfile tablespace
在oracle中,用户可以创建大文件表空间,这样oracle数据库使用的表空间可以由一个单一的大文件构成,而不是若干小数据文件。这使得oracle可以发挥64位系统的威力,创建、管理超大的文件。在64位系统中,oracle的数据库的存储能力被扩展到了8EB(1EB=1024PB,1PB=1024TB,1TB=1024GB)。
数据库默认创建的是小文件表空间,即oracle中传统的表空间类型。数据库中SYSTEM和SYSAUX表空间在创建时总是使用传统类型。
2、SYSTEM表空间
每个oracle数据库都包含一个名为SYSTEM的表空间,它在数据库创建时,由oracle自动创建。只要数据库处于开启(open)状态,SYSTEM表空间就一定是联机(online)状态。
管理员可以创建本地管理(locally managed)的SYSTEM表空间,或将已有的数据字典管理(dictionary managed)的SYSTEM表空间转换为本地管理,来发挥本地管理表空间的优势。
如果数据库中的SYSTEM表空间为本地管理的。那么此数据库中就不能创建数据字典管理的表空间。我们可以通过可移动表空间(transportable tablespace)功能向其中添加数据字典管理的表空间,但是这个表空间只能是只读的。
注:如果一个表空间为本地管理的,则不能将它转换为数据字典管理的。
SYSTEM表空间总是为整个数据库存储数据字典表。数据字典表存储在编号为1的数据文件中。
3、SYSAUX表空间
SYSAUX表空间是SYSTEM表空间的一个辅助性空间。在10g数据库创建,或从低版本升级到10g时,一定会创建SYSAUX表空间。
此外,SYSAUX表空间还被用来集中存储所有不应放在SYSTEM表空间的数据库元数据。使用SYSAUX表空间可以减少默认创建的表空间的数量。
在正常的数据库操作中,不允许移除、重命名SYSAUX表空间。SYSAUX表空间也不支持可驿动表空间功能。
4、撤销表空间undo tablespace
撤销表空间(undo tablespace)是一个特殊的表空间,只用于存储撤销信息(undo information)。用户不能在撤销表空间中创建段(例如表或索引)。一个数据库中可以没有撤销表空间,也可以有多个。在自动撤销管理模式(automatic undo management mode)下,每个实例有且仅有一个撤销表空间。oracle在撤销表空间内自动地创建和维护撤销段(undo segment),对撤销数据(undo data)进行管理。
5、默认的临时表空间
如果SYSTEM表空间是本地管理的,用户必须在创建数据库时定义一个默认的临时表空间(temporary tablespace)。本地管理的SYSTEM表空间不能作为默认的临时存储空间。
如果SYSTEM表空间是数据字典管理的,窃创建数据库时没有定义默认的临时表空间,那么oracle会将SYSTEM表空间作为默认的临时存储空间使用。此时用户在ALERT.LOG文件中会发现一条警告:建议创建默认的临时表空间,以后的oracle版本将会需要。
6、在数据库中使用多个表空间
一个小型数据库可能只需要使用SYSTEM表空间,但是oracle建议用户至少创建一个额外的表空间来存储用户数据,使之与系统的数据字典信息(data dictionary information)分离。这使得用户在进行数据库管理操作时更灵活,并减少由于数据字典对象(dictionary object)与用户方案对象(schema object)处于同一数据文件而导致竞争。
7、表空间内的空间管理
表空间内为各个方案对象(schema object)分配空间的单位是数据扩展。oracle采用两种方式监控表空间内,空间的已用/可用情况:
本地管理的表空间(locally managed tablespace):通过位图(bitmap)管理数据扩展
数据字典管理的表空间(dictionary managed tablespace):通过数据字典管理数据扩展
当用户创建表空间时,需要选择空间管理方式。在此之后,用户还可以通过DBMS_SPACE_ADMIN PL/SQL包改变管理方式。
注:当用户在创建表空间时没有指定数据扩展的管理方式,默认使用本地管理。
8、多种数据块容量
oracle支持在数据库中使用多种数据块容量(multiple block size)。SYSTEM表空间使用标准数据块容量(standard block size)。这个容量在数据库创建时被设定,可以为任何有效值。用户可以使用DB_BLOCK_SIZE初始化参数(initialization parameter)设定标准数据块容量。数据块容量的合法值(legitimate value)范围是2K到32K。
在初始化参数(initalization parameter file)或服务器参数文件(server parameter file)中,用户可以为数据缓存(buffer cache)内的不同子缓存区(subcache)设定不同的数据块容量(block size)。子缓存区也可以在实例(instance)运行时配置。此外用户还可以创建使用不同数据块容量的表空间。但是SYSTEM表空间及绝大多数表空间还是使用标准数据块容量(standard block size)。
注:一个分区对象(partitioned object)的所有分区(partition)所在的表空间必须使用相同的数据块容量。
多种数据块容量功能主要用于从OLTP数据库向企业级数据仓库(enterprise data warehouse)迁移(transporting)表空间时使用。这有助于在拥有不同数据块容量的数据库间迁移数据。
9、联机/脱机表空间
数据库管理员可以在数据库处于开启(open)状态时,将除SYSTEM表空间之外的任何表空间联机(online)(可访问)或者脱机(offline)(不可访问)。SYSTEM表空间在数据库处于开启状态时总是处于联机状态,因为oracle需要使用其中的数据字典。
表空间通常处于联机状态,以便数据库用户访问其中的数据。但是数据库管理员可以在对表空间进行维护、备份或恢复操作时,令表空间脱机(offline)。
10、只读表空间
使用只读表空间(read-only tablespace)的主要目的是为了避免对静态且容量大的数据库内容进行备份和恢复操作。oracle不会更新只读表空间内的数据,因为这类表空间的数据文件可以放置正在CD-ROM或WORM之类的只读介质(read-only media)上。
注:用户只能将一个表空间联机到创建它的数据库,因此只读表空间(read-only tablespace)技术不适合用于存档(archiving)。
只读表空间不能被修改。如果需要更新一个只读表空间,首要要使表空间可读写。在更新后,还可以将表空间恢复到只读状态。
因为只读表空间不能被修改,只要没有将只读表空间置于可读写状态,就无需对其进行重复的备份操作。当用户需要恢复数据库时,也没必要恢复只读空间。
11、排序操作使用的临时表空间
用户可以为排序操作(sort operation)指定一个或多个专用的临时表空间(temporary tablespace),这可使排序操作所需的空间管理工作更高效。使用专用的临时表空间进行排序,可以有效地避免频繁的排序空间分配与回收而造成的空间管理操作(space management operation)。一个SQL语句可以同时使用多个临时表空间(temporary tablespace)进行排序。例如当用户为一个大表创建索引时所需的排序操作就可以在多个临时表空间上进行。
所有会用到排序(sort)的数据库操作,例如连接(join),创建索引,排序(order by),计算汇总(group by),及手机优化器(optimizer)所需的统计信息,都可以利用临时表空间。在RAC(real application cluster)环境中使用临时表空间带来的性能提升更加显著。
12、在数据库之间移动表空间
用户可以利用可移动表空间(transportable tablespace)将oracle数据库的一部分移动到另一个数据库中,这种操作还可以跨平台。用户可以在数据库间复制表空间,即首先克隆一个表空间再加入到另一个数据库;用户也可以在数据库间移动表空间,即从一个oracle数据库移出一个表空间,并放入另一个数据库。
通过可移动表空间(transportable tablespace)迁移数据与使用export/import相比,速度可以提高几个数量级。因为使用可移动表空间技术只需复制数据文件,并整合表空间元数据(tablespace metadata)即可。用户在使用可移动表空间时还可以同时迁移索引数据,因此数据被移动后无需重建索引。
用户可以跨平台移动表空间(跨平台移动表空间并不支持所有平台,但支持大多数平台),跨平台移动表空间的用途有:
使内容提供者(content provider)向其在不同平台上使用oracle的客户发送结构化数据(structured data)变得简单、高效。
简化了从数据仓库环境(data warehouse enviroment)向数据集市环境(data mart enviroment)发布数据的工作。数据集市通常运行在更小的平台上。
在异构的集群(heterogeneous cluster)中共享只读表空间(read only tablespace)。
在不同平台间迁移数据库
二、数据文件datafile
oracle数据库中每个表空间都是由一个或多个物理数据文件构成的。一个数据文件只能由一个数据库的一个表空间使用。
oracle为表空间创建数据文件时,分配的磁盘空间总和为用户指定的存储容量加上管理开销所需的文件头空间。当数据文件被创建后,oracle所在的系统负责清除文件的数据及授权信息,并将它分配给oracle使用。如果文件很大,这个过程会消耗较长时间。oracle数据库中的第一个表空间总是SYSTEM表空间,因此oracle在创建数据库时总是将第一个数据文件分配给SYSTEM表空间。
1、数据文件的内容
当一个数据文件首次被创建时,为其分配的磁盘空间被格式化为oracle格式,此时其中尚不包含任何用户数据。oracle将使用这些空间存储属于(与此数据文件对应的)表空间的段,这些空间专为oracle使用。随着表空间内数据增长,oracle使用数据文件中的可用空间为段分配新的数据扩展。
属于一个表空间的各个方案对象(schema object)的数据,在物理上,存储于构成此表孔吉爱你的一个或多个数据文件中。需要注意的是,并不是一种类型的方案对象需要存储在特定的数据文件中,相反,一个数据文件可以存储表空间内各种类型的方案对象。oracle为表空间内的方案对象分配空间时可以使用一个或多个数据文件。也就是说,方案对象是可以跨数据文件的。除非使用表分布(striping)技术(数据可以分布存储在多个磁盘上),否则数据库管理员和用户都不能控制方案对象使用哪个数据文件。
2、数据文件的容量
用户可以在数据文件被创建后改变其容量,也可以在创建时设定数据文件随表空间内方案对象(schema object)的增长而动态增长。这个功能可以减少表空间内数据文件的数量,从而简化数据文件的管理操作。
注:当然用户使用的操作系统中也要有足够的空间供数据文件扩展。
3、脱机数据文件
除了SYSTEM表空间之外,用户可以随时将任何表空间置为联机(online)或脱机(offline)状态。此时一个表空间的所有数据文件也被作为一个整体同时被置为联机或脱机状态。
4、临时数据文件
本地管理的临时表空间使用临时的数据文件(临时文件),这样的文件与普通数据文件类似,但有以下区别:
临时文件总是被设置为NOLOGGING模式。
用户不能将临时文件设置为只读
用户不能使用ALTER DATABASE语句创建临时文件
介质恢复(media recovery)不能使识别临时文件,BACKUP CONTROLFILE不会产生与临时文件有关的信息,CREATE CONTROLFILE不能设置与临时文件有关的信息
当用户创建临时文件或改变其容量时,oracle并不保证按照用户指定的文件容量为其分配磁盘空间。在某些文件系统中(例如UNIX)磁盘块(disk block)并不会在文件创建或改变容量时分配,而是在其被使用之前才分配。
注:这样会使得临时文件创建与改变容量操作执行更快,但是随着临时文件的使用可能会导致磁盘空间不足。
临时文件(tempfile)信息可以从DBA_TEMP_FILES数据字典及V$TEMPFILE动态性能视图(dynamic performance view)中查询,但是不存在于DBA_DATA_FILES或V$DATAFILE视图中。
三、控制文件
数据库控制文件(control file)是一个二进制文件,供数据库启动及正常工作时使用。在数据库运行过程中,控制文件会被oracle修改,因此数据库处于开启(open)状态时,控制文件必须可写。如果控制文件因故不能访问,数据库也将无法正常工作。
每个控制文件只能供一个oracle数据库使用。
1、控制文件的内容
控制文件中包含了其所属数据库的信息,实例的在启动、及正常工作期间都需要存取这些信息。控制文件的内容只能由oracle修改,数据库管理员或用户都不应编辑控制文件。
控制文件主要包含以下内容:
数据库名(database name)
数据库创建时的时间戳(timestamp)
属于此数据库的数据文件及重做日志文件(redo log file)的名称与存储位置
表空间信息
脱机的数据文件(datafile offline ranges)
日志离世信息(the log history)
归档日志(archived log)信息
备份集(backup set)与备份块(backup piece)信息
数据文件与重做日志的备份信息
数据文件复制信息
当前的日志序列号(log sequence number)
检查点(checkpoint)信息
数据库名和数据库创建时间戳都来源于数据库创建过程。数据库名既可以来自DB_NAME初始化参数中的设定值,也可以来自CREATE DATABASE语句中的指定值。
每当添加、重命名、或移除数据库中的数据文件及重做日志文件时,控制文件就会更新以反映这些数据库物理结构变化。进行这些记录的目的是:
oracle可以藉此在数据库启动(startup)时识别打开的数据文件和重做日志文件
oracle可以藉此在恢复数据库时识别当前可用及需要恢复的文件
因此,用户每次更改数据库的物理结构后(使用ALTER DATABASE语句),一定要及时备份控制文件。
控制文件还被用于保存检查点信息。每隔三秒钟,检查点进程(checkpoint porcess,CKPT)将会在控制文件中记录重做日志(redo log)检查点的位置(checkpoint position)信息。当数据库恢复时,重做日志中此点之前的重做条目(redo entry)都无需恢复,因为这些数据已经被写入数据文件中。
注:这里的数据库恢复,是指类似服务器突然断电,导致缓存中的数据没有写入数据文件,当数据库再启动时,控制文件会根据检查点,使用重做条目,来对数据库进行恢复,这样做可以减少恢复数据库所用的时间,不用从一开始进行恢复。如果保存完整的重做日志,则可以恢复到任何时候的数据库状态。
2、多重控制文件
如同重做日志文件(redo log file)一样,oracle也可以为一个数据库同时维护多个完全相同的控制文件。通过在不同磁盘上为一个数据库存储多重控制文件(multiple control file),可以有效地避免控制文件的单点脆弱性(single point of failure)。当一个包含控制玩呢间的磁盘发生故障时,如果oracle试图访问这个控制文件就会导致当前的实例出现故障。但如果其他磁盘中存在此控制文件的备份,实例就可以被立即重新启动而无需进行数据库恢复。
如果一个数据库的所有控制文件永久丢失了,那么实例将中止且需要进行介质恢复(media recovery)。如果没有当前控制文件的副本而必须使用较早的备份,那么介质恢复过程将会比较复杂。因此oracle强烈建议用户遵循以下规则:
在每个数据库中使用多重控制文件(multiple control file)
将控制文件的副本存储在不同的物理磁盘上
使用操作系统的镜像功能(operatin system mirroring)
监控备份工作

没有评论:

发表评论