可以将联机的表空间脱机,当表空间为脱机状态的时候,任何用户都访问不了它(需要注意的是,system表空间无法脱机,因为数据库运行中,始终都会用到system表空间中的数据)。表空间脱机有如下四个选项:
1)Normal(正常):normal可写可不写,默认情况下即为normal
2)Temporary(临时)
3)Immediate(立即)
4)For Recover(进行恢复):FOR RECOVER设置已被淘汰。支持此语法的目的是为了实现向后兼容。
一、表空间脱机(normal)测试
SYS@ORA11GR2>col name for a48
SYS@ORA11GR2>select t.name,t.status from
v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
NAME STATUS
------------------------------------------------
-------
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf
ONLINE
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
ONLINE
SYS@ORA11GR2>alter tablespace ts_users offline
normal;
Tablespace altered.
SYS@ORA11GR2>select t.name,t.status from
v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
NAME STATUS
------------------------------------------------
-------
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf
OFFLINE
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
OFFLINE
SYS@ORA11GR2>alter tablespace ts_users online;
Tablespace altered.
SYS@ORA11GR2>select t.name,t.status from
v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
NAME STATUS
------------------------------------------------
-------
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf
ONLINE
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
ONLINE
SYS@ORA11GR2>
二、表空间脱机(temporary)测试
1)查看表空间TS_USERS的状态,均为在线状态
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
---------- ------------------------------------------------
-------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf ONLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf ONLINE
SYS@ORA11GR2>
2)将7号数据文件修改为脱机状态
SYS@ORA11GR2>alter database datafile 7 offline;
Database altered.
SYS@ORA11GR2>
注:执行上面alter命令,数据库必须处于归档模式,否则会报如下错误
ORA-01145: offline immediate disallowed unless
media recovery enabled
3)查看修改后,数据文件的状态,我们会发现,7号数据文件的状态为RECOVER,也就是说,这个数据文件如果要修改为online的话,那么需要做恢复的操作。
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6 /u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf
ONLINE
7 /u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
RECOVER
SYS@ORA11GR2>
4)我们将表空间ts_users修改为offline状态,此时报错了,因为表空间ts_users的一个数据文件已经是offline状态了,此时要么将7号文件修改为online状态,要么就使用Temporary参数
SYS@ORA11GR2>alter tablespace ts_users offline
normal;
alter tablespace ts_users offline normal
*
ERROR at line 1:
ORA-01191: file 7 is already offline - cannot do a
normal offline
ORA-01110: data file 7:
'/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf'
SYS@ORA11GR2>
5)使用Temporary参数使表空间ts_users修改为脱机状态
SYS@ORA11GR2>alter tablespace ts_users offline
temporary;
Tablespace altered.
SYS@ORA11GR2>
6)查看表空间ts_users的两个数据文件的状态,我们可以看到6号数据文件的状态已经改为offline了,7号数据文件仍然是recover
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6 /u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf
OFFLINE
7 /u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
RECOVER
SYS@ORA11GR2>
7)如果我们利用alter命令修改表空间为在线状态,会提示7号数据文件需要recover
SYS@ORA11GR2>alter tablespace ts_users online;
alter tablespace ts_users online
*
ERROR at line 1:
ORA-01113: file 7 needs media recovery
ORA-01110: data file 7:
'/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf'
SYS@ORA11GR2>
8)恢复完成后,我们再看一下数据文件的状态,7号数据文件已经变为offline,此时应该可以online了
SYS@ORA11GR2>recover datafile 7;
Media recovery complete.
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf OFFLINE
7 /u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
OFFLINE
SYS@ORA11GR2>
9)此时可以将表空间ts_users成功修改为online状态
SYS@ORA11GR2>alter tablespace ts_users online;
Tablespace altered.
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
---------- ------------------------------------------------
-------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf ONLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf ONLINE
SYS@ORA11GR2>
三、表空间脱机(immediate)测试
1)查看表空间ts_users的两个数据文件的状态,均为online
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
---------- ------------------------------------------------
-------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf ONLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf ONLINE
SYS@ORA11GR2>
2)以immediate方式脱机表空间ts_users
SYS@ORA11GR2>alter tablespace ts_users offline
immediate;
Tablespace altered.
SYS@ORA11GR2>
3)表空间ts_users以immediate方式脱机后数据文件的状态均为recover,即,如果需要online,那么就需要recover
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf RECOVER
7 /u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf
RECOVER
SYS@ORA11GR2>
4)我们尝试将表空间ts_users修改为online,结果是意料之中的,需要恢复数据文件
SYS@ORA11GR2>alter tablespace ts_users online;
alter tablespace ts_users online
*
ERROR at line 1:
ORA-01113: file 6 needs media recovery
ORA-01110: data file 6: '/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf'
SYS@ORA11GR2>
5)上面提示恢复6号数据文件,
SYS@ORA11GR2>recover datafile 6;
Media recovery complete.
SYS@ORA11GR2>
6)6号数据文件恢复完成后,我们再看一下数据文件的状态,如我们想象(做到此处时,应该可以想象得到结果),6号数据文件offline,7号数据文件依旧是recover
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf OFFLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf RECOVER
SYS@ORA11GR2>
7)我们不用等oracle提示我们恢复7号数据文件了,自己主动恢复吧
SYS@ORA11GR2>recover datafile 7;
Media recovery complete.
SYS@ORA11GR2>
8)恢复完成后,查看数据文件的状态,均为offline,此时应该可以修改为online了
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
---------- ------------------------------------------------
-------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf OFFLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf OFFLINE
SYS@ORA11GR2>
9)此时再将表空间ts_users改为online状态,成功完成
SYS@ORA11GR2>alter tablespace ts_users online;
Tablespace altered.
SYS@ORA11GR2>select t.file#,t.name,t.status
from v$tablespace d,v$datafile t where d.TS#=t.TS# and d.name='TS_USERS';
FILE#
NAME
STATUS
----------
------------------------------------------------ -------
6
/u01/app/oracle/oradata/ORA11GR2/ts_users_01.dbf ONLINE
7
/u01/app/oracle/oradata/ORA11GR2/ts_users_02.dbf ONLINE
SYS@ORA11GR2>
四、小结
1)Normal(正常):如果表空间中的任何数据文件不存在任何错误状态,通过正常方式便可使表空间脱机。当 Oracle 数据库使表空间脱机时,通过对表空间中的所有数据文件设置检查点,可以确保将所有数据写入磁盘。
2)Temporary(临时):如果表空间中的一个或多个文件存在错误状态,也可以使表空间暂时脱机。当 Oracle 数据库使(尚未脱机的)数据文件脱机时,会对这些数据文件设置检查点。如果没有任何文件脱机,但是您使用了临时子句,使表空间重新联机时便不需要执行介质恢复。但是,如果因写错误而导致表空间的一个或多个文件脱机,而且设置了表空间临时脱机,那么表空间需要执行恢复后才能重新联机。
3)Immediate(立即):表空间可以立即脱机,Oracle 数据库不需要对任何数据文件设置检查点。如果指定了“Immediate(立即)”,则必须先对表空间执行介质恢复 recover tablespace ,才能使表空间联机。如果数据库在 NOARCHIVELOG 模式下运行,则无法立即使表空间脱机。