(一)OFFLINE TABLESPACE
ALTER TABLESAPCE OFFLINE可用选项包括NORMAL, TEMPORARY, IMMEDIATE, FOR RECOVERY
- OFFLINE NORMAL时该表空间的所有数据文件均要ONLINE状态,ONLINE不用RECOVER
Specify NORMAL to flush all blocks in all data files in the tablespace out of the system global area (SGA). You need not perform media recovery on this tablespace before bringing it back online. This is the default.
- OFFLINE TEMPORARY会对表空间ONLINE的数据文件做检查点,OFFLINE数据文件不做检查点。ONLINE表空间时可能需要RECOVER
Specify TEMPORARY, then Oracle Database performs a checkpoint for all online data files in the tablespace but does not ensure that all files can be written. Files that are offline when you issue this statement may require media recovery before you bring the tablespace back online.
- OFFLINE IMMEDIATE对表空间所有数据文件均不做检查点,ONLINE需要RECOVER
Specify IMMEDIATE, then Oracle Database does not ensure that tablespace files are available and does not perform a checkpoint. You must perform media recovery on the tablespace before bringing it back online.
NOTE: 没有offline drop的选项
(二)OFFLINE DATAFILE
- ALTER DATABASE DATAFILE OFFLINE可用选项只有DROP
OFFLINE DROP表示强行OFFLINE并不会实际DROP数据文件,但注意OFFLINE DROP不会去管数据库是否归档,归档模式下OFFLINE DROP可通过RECOVER后ONLINE; 非归档模式无法RECOVER此文件相当于DROP.
表空间OFFLINE一般会做CHECKPOINT,而数据文件OFFLINE不会,因此前者ONLINES可以不用恢复后者需要
表空间OFFLINE可以在归档以及非归档下使用,数据文件OFFLINE只能在归档下,非归档只能OFFLINE DROP但数据文件无法恢复ONLINE
- 表空间OFFLINE则所有DATAFILE均OFFLINE,某个或全部数据文件OFFLINE不影响表空间ONLINE,表空间某个数据文件OFFLINE,查询该表空间的表时若使用了此数据文件将报错,没有使用则没问题
- 表空间OFFLINE只能在OPEN下执行,数据文件OFFLINE可以在MOUNT/OPEN下执行
- 不能对临时表空间OFFLINE
- 使用ALTER TABLESPACE .. DROP DATAFILE时,以下状态的DATAFILE无法DROP:
- OFFLINE的数据文件无法被DROP
2) 所属表空间的第一个FILE是不允许被删除的
3) 非空文件是不允许被删除的
(三)Archivelog测试
SQL> create tablespace test datafile '/oracle/test01.dbf' size 10m,'/oracle/test02.dbf' size 10m ;
SQL> select file_name , file_id from dba_data_files where TABLESPACE_NAME='TEST';
FILE_NAME FILE_ID
----------------------------------------------------------------------------
/oracle/test01.dbf 5
/oracle/test02.dbf 6
1. 表空间
SQL> alter tablespace test offline;
SQL> select file#, checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1028044
2 1028044
3 1028044
4 1028044
5 1028606
6 1028606
在offline表空间时对此表空间进行了checkpoint
SQL> alter tablespace test online;
注:没有alter tablespace test offline drop;
- 数据文件
SQL> ALTER SYSTEM CHECKPOINT; ---使上面的checkpoint_change#一致
SQL> Alter database datafile 5 offline;
SQL> select file#, checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1028769
2 1028769
3 1028769
4 1028769
5 1028769
6 1028769
并未对单个文件进行checkpoint,另外test表空间状态还是online的
此时如果有表使用了此数据文件,查询时会报错ORA-00376:
$ oerr ora 00376
00376, 00000, "file %s cannot be read at this time"
// *Cause: attempting to read from a file that is not readable. Most likely
// the file is offline.
// *Action: Check the state of the file. Bring it online
如果有表使用了其它数据文件查询时则不会报错
SQL> Alter database datafile 5 online;
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/oracle/test01.dbf'
SQL> recover datafile 5;
SQL> Alter database datafile 5 online;
SQL> select file#, checkpoint_change# from v$datafile;
FILE# CHECKPOINT_CHANGE#
---------- ------------------
1 1028769
2 1028769
3 1028769
4 1028769
5 1028851
6 1028769
(四)Noarchivelog测试
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
SQL> alter tablespace test offline;
SQL> alter tablespace test online;
SQL> alter database datafile 5 offline;
ORA-01145: offline immediate disallowed unless media recovery enabled
SQL> alter database datafile 5 offline drop; --ok
SQL> alter database datafile 5 online; ----恢复不回去了
ORA-01113: file 5 needs media recovery
ORA-01110: data file 5: '/oracle/test01.dbf'
这里注意下,即使未开归档还是可以通过redo log来recover的,如这里执行recover datafile5是可以恢复的,然后在online即可,如果这里多次执行alter system switch logfile; 肯定恢复不了了
SQL> select file_name , file_id from dba_data_files where TABLESPACE_NAME='TEST';
FILE_NAME FILE_ID
--------------------------------------------------------------------------------
/oracle/test01.dbf 5
/oracle/test02.dbf 6
可以offline drop并不会实际drop数据文件, 可以看成是强行offline
SQL> alter tablespace test drop datafile 5;
ORA-03263: cannot drop the first file of tablespace TEST
不能删除数据文件只能删除表空间了
这里要恢复应该只能导出数据,删除表空间再重建导入了
SQL> drop tablespace test including contents and datafiles;
再重新建个新表空间测试下是否能drop第二个数据文件:
SQL> create tablespace lin datafile '/oracle/lin01.dbf' size 10m,'/oracle/lin02.dbf' size 10m ;
SQL> select file_name , file_id from dba_data_files where TABLESPACE_NAME='LIN';
FILE_NAME FILE_ID
--------------------------------------------------------------------------------
/oracle/lin01.dbf 7
/oracle/lin02.dbf 8
SQL> alter database datafile 8 offline drop;
SQL> alter tablespace lin drop datafile 8;
ORA-03264: cannot drop offline datafile of locally managed tablespace
SQL> drop tablespace lin including contents and datafiles;
(五)是否只能在OPEN下使用
SQL> startup mount;
SQL> alter database archivelog;
SQL> alter tablespace test offline;
ORA-01109: database not open
SQL> alter database datafile 5 offline; --ok, 注这里不开归档还是会报上面的错的
SQL> alter database datafile 5 online; --ok
SQL> alter database datafile 5 offline drop; --ok
SQL> alter database datafile 5 online; --ok
OS执行:
$ mv test01.dbf test01.dbf.bak
$ mv test02.dbf test02.dbf.bak
SQL> alter database datafile 5 offline;
SQL> alter database datafile 6 offline;
SQL> alter database open; --ok
SQL> select status from dba_tablespaces where TABLESPACE_NAME='TEST';
STATUS
---------
ONLINE
可见非关键表空间只要offline掉数据文件还是可以open数据库的