数据文件和表空间的关系
首先,你需要明白的一点是:数据库的物理结构是由数据库的操作系统文件所决定,每一个Oracle数据库是由三种类型的文件组成:数据文件、日志文件和控制文件。数据库的文件为数据库信息提供真正的物理存储。
每一个Oracle数据库有一个或多个物理的数据文件(data file)。一个数据库的数据文件包含全部数据库数据。逻辑数据库结构(如表、索引等)的数据物理地存储在数据库的数据文件中。数据文件通常为*.dbf格式,例如:userCIMS.dbf。数据文件有下列特征:①、一个数据文件仅与一个数据库联系;②、一旦建立,数据文件只增不减;③、一个表空间(数据库存储的逻辑单位)由一个或多个数据文件组成。
其次,我们再来叙述一下Oracle的逻辑结构:Oracle的逻辑结构包括表空间(tablespace),段(segment),数据块(data block)以及模式对象(schema object)。
Oracle数据库在逻辑上是由多个表空间组成的,表空间在物理上包含一个或多个数据文件。而数据文件大小是块大小的整数倍;表空间中存储的对象叫段,比如数据段,索引段和回退段。段由区组成,区是磁盘分配的最小单位。段的增大是通过增加区的个数来实现的。每个区的大小是数据块大小的整数倍,区的大小可以不相同;数据块是数据库中的最小的I/O单位,同时也是内存数据缓冲区的单位,及数据文件存储空间单位。块的大小由参数DB_BLOCK_SIZE设置,其值应设置为操作系统块大小的整数倍。
⑴、表空间(tablespace)
表空间是数据库中最大的逻辑单位,每一个表空间由一个或多个数据文件组成,一个数据文件只能与一个表空间相联系。每一个数据库都有一个SYSTEM表空间,该表空间是在数据库创建或数据库安装时自动创建的,用于存储系统的数据字典表,程序系统单元,过程函数,包和触发器等,也可用于存储用户数据表,索引对象。表空间具有在线(online)和离线(offline)属性,可以将除SYSTME以外的其他任何表空间置为离线。
⑵、段(segment)
数据库的段可以分为四类:数据段、索引段、回退段和临时段。
⑶、区
区是磁盘空间分配的最小单位。磁盘按区划分,每次至少分配一个区。区存储与段中,它由连续的数据块组成。
⑷、数据块
数据块是数据库中最小的数据组织单位与管理单位,是数据文件磁盘存储空间单位,也是数据库I/O的最小单位,数据块大小由DB_BLOCK_SIZE参数决定,不同的Oracle版本DB_BLOCK_SIZE的默认值是不同的。
⑸、模式对象
模式对象是一种应用,包括:表、聚簇、视图、索引序列生成器、同义词、哈希、程序单元、数据库链等。
最后,在来说一下Oracle的用户、表空间和数据文件的关系:
一个用户可以使用一个或多个表空间,一个表空间也可以供多个用户使用。用户和表空间没有隶属关系,表空间是一个用来管理数据存储的逻辑概念,表空间只是和数据文件发生关系,数据文件是物理的,一个表空间可以包含多个数据文件,而一个数据文件只能隶属一个表空间。
总结一下:解释数据库、表空间、数据文件、表、数据的最好办法就是想象一个装满东西的柜子。数据库其实就是柜子,柜中的抽屉是表空间,抽屉中的文件夹是数据文件,文件夹中的纸是表,写在纸上的信息就是数据。
一、数据文件和表空间的online和offline的概念
在对单个数据文件做offline时,是立即offline,此时不会针对数据文件生成检查点,所以数据文件的终止SCN为无穷大,处于不一致状态,数据文件也需要recover,在v$recover_file视图也可以看到这个文件的信息,要想将数据文件online,必须先对文件执行recover操作,必,所以建议offline数据文件后应该立刻执行recover操作,使他处于一致状态,以免后面出现不必要的麻烦
foo表空间只有一个数据文件:/tmp/foo1.dbf(归档模式)
SQL> alter database datafile '/tmp/foo1.dbf' offline;
Database altered.
SQL> alter system checkpoint;
System altered.
SQL> alter database datafile '/tmp/foo1.dbf' online;
alter database datafile '/tmp/foo1.dbf' online
*
ERROR at line 1:
ORA-01113: file 8 needs media recovery
ORA-01110: data file 8: '/tmp/foo1.dbf'
查看一下数据文件的状态:
SQL> select FILE_NAME,ONLINE_STATUS from dba_data_files;
……
FILE_NAME ONLINE_
-------------------------------------------------------------------------------- -------
/u01/app/Oracle/oradata/orcl2/ORCL2/datafile/o1_mf_liang_7b5c21fb_.dbf ONLINE
/tmp/foo1.dbf RECOVER
显示需要RECOVER。
将数据库启动到mount:
SQL> recover datafile '/tmp/foo1.dbf';
Media recovery complete.
SQL> alter database open;
再来查看数据文件的状态:
SQL> select FILE_NAME,ONLINE_STATUS from dba_data_files;
……
FILE_NAME ONLINE_-------------------------------------------------------------------------------- -------
/u01/app/ Oracle /oradata/orcl2/ORCL2/datafile/o1_mf_liang_7b5c21fb_.dbf ONLINE
/tmp/foo1.dbf OFFLINE
此时变成了offline了,接下来就可以将它切换到online状态。
对于非归档模式下进行数据文件offline操作需要接上drop子句,他不会物理删除文件的,在归档模式下指定drop子句会被Oracle忽略
另外对于offline的数据文件,正常重起是不能对他进行recover的,因为他的状态是offline,数据库启动时是不检查offline文件的 SCN是否一致的,所以启动后你仍然可以在v$recover_file视图中看到他,需要手工对他进行recover才能恢复,如果应用的联机日志已经 switch掉,则要从归档中进行恢复,没有归档的话,文件就只能一直处于recover状态
二、表空间的offline
在对表空间进行offline时,oracle需要针对这个表空间生成检查点,刷新表空间中数据文件的相关事务,更新数据文件头SCN,数据文件 SCN,文件终止SCN,达到一致状态,当表空间被再次ONLINE时,oracle会捕捉online时刻的SCN,更新上面各个位置的SCN(当然文件结束SCN号会置为无穷大),将数据文件都打开
同时需要注意下面几点:
1、 从数据字典里删除表空间信息,删除表空间时可以是ONLINE,也可以OFFLINE
建议在OFFLINE后删除,这样确保没有相关事务的SQL语句在表空间运行
2、如果表空间不为空,你必须使用INCLUDING CONTENTS将其内容也删除
对于分区表分布在不同表空间上将不允许删除表空间,必须 MOVE PARTITION TABLESPACE。
3、如果表空间表有参考完整性约束在别的表空间,将使用CASCADE CONSTRAINTS子句
表空间的ONLINE和OFFLINE状态
1. 只要数据库处于OPEN状态,除了SYSTEM表空间外的其他表空间,都可以将其置为online或offline状态。SYSTEM表空间之所以不能置为offline,是因为其中保存的数据字典需要一直使用。将表空间置为offline,可能的原因包括维护、备份以及恢复等目的。
3. 如果表空间处于offline状态,那么Oracle不会允许任何对该表空间中对象的SQL执行。表空间置为offline时仍处于活动状态的语句在交易级别并不会受影响。Oracle会保存这些尚未完成语句相关的回滚数据到SYSTEM表空间。当表空间置为online时,如果有必要,那么Oracle会应用这些回滚数据。
3. 除了Oracle外,没有任何应用能够读取或编辑offline的表空间。因此,offline的表空间更不能导到其他数据库。
4. Oracle在一些场景下会自动切换表空间状态从online到offline。例如,当数据库写进程DBWn,尝试几次仍不能写入表空间的数据文件中。用户访问offline表空间时会收到一个报错。如果造成这种磁盘IO失败的问题是介质错误,解决这问题之后需要恢复表空间。
5. 将表空间置为offline可能包含如下原因:
(1) 需要禁止访问一部分数据库的场景。
(2) 执行一次offline表空间备份(尽管表空间可以在online和使用情况下备份)。
(3) 当更新或维护应用时,需要让应用和对应的表临时不能访问。
(4) 重命名或重分配表空间中的数据文件。
当表空间置为offline,数据库会将关联的所有数据文件都置为offline状态。但是如下表空间不能置为offline:
> SYSTEM
> UNDO表空间
> 临时表空间
6. 将表空间置为offline之前,若有用户设置该表空间为其默认表空间,需要考虑是否需要改变其默认表空间。之所以这样做,是因为这些用户将不能访问offline表空间中的对象。
7. 使用ALTER TABLESPACE ... OFFLINE语句可以添加如下参数:
NORMAL:如果表空间的任何数据文件没有出现错误,表空间能够正常地置为offline。如果出现写错误,那么表空间中的数据文件不会被置为offline。当明确使用OFFLINE NORMAL,数据库会对所有数据文件进行一次checkpoint检查点事件,NORMAL是默认设置。
TEMPORARY:表空间能够临时置为offline状态,即使一个或多个文件出现错误。当使用OFFLINE TEMPORARY,数据库会将还没有置为offline的数据文件进行置位操作,并执行检查点事件。
如果没有文件是offline,但使用了temporary语句,那么当将表空间置为online时不需要介质恢复。然而,如果表空间的一个或多个文件由于写入错误因此导致offline状态,能够临时将表空间置为offline状态,恢复online之前需要对表空间进行恢复操作。
IMMEDIATE:表空间能够立即设置为offline状态,数据库不会进行任何数据文件的检查点事件。当使用OFFLINE IMMEDIATE,那表空间置为online之前需要对表空间进行介质恢复操作。但是如果数据库处于NOARCHIVELOG模式,表空间就不能立即置为offline状态。
8. 如果必须设置表空间为offline状态,建议首先使用默认的NORMAL语句。他会确保当表空间置为online前不需要执行恢复操作,尽管在不完全恢复之后,使用LATER DATABASE OPEN RESTLOGS语句重置了redo日志sequence。
仅仅当不能使用NORMAL方式将表空间置为offline时,可以使用TEMPORARY。使用TEMPORARY后,在表空间置为online前,仅需要恢复那些出错的offline文件。
如果NORMAL和TEMPORARY都失败时,才可以选择使用IMMEDIATE选项。
9. 如果表空间没有“干净地”置为offline(也就是没有使用NORMAL语句执行的offline操作),那么置为online前需要首先对该表空间执行介质恢复操作。否则数据库会报错,表空间仍处于offline状态。