ITPub博客

首页 > 数据库 > Oracle > alter database offline 与 alter database offline drop效果比对

alter database offline 与 alter database offline drop效果比对

Oracle 作者:rovige 时间:2015-07-21 19:23:25 0 删除 编辑
如果datafile数据文件被误删除,导致数据库不能正常open,这时,就需要把该数据文件先offline,或者恢复该数据文件。
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01157: 无法标识/锁定数据文件 3 - 请参阅 DBWR 跟踪文件
ORA-01110: 数据文件 3: '/app/oradata/datafile/TEST02.dbf'

SQL> alter database datafile '/app/oradata/datafile/TEST02.dbf' offline drop;


Database altered.


SQL> alter database open;


Database altered.

接下来,就研究一下 offline 与 offline drop的异动。

先在归档模式下测试
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /app/archivelog/logfile
Oldest online log sequence     ....
Next log sequence to archive   ....
Current log sequence           ....


SQL> select name,status from v$datafile;


NAME                                               STATUS
-------------------------------------------------- --------------
...
/app/oradata/datafile/TEST02.dbf                   OFFLINE
...

可以看到,此时的这个数据文件的状态为OFFLINE。

首先,添加测试用的数据文件 TEST03.dbf

SQL> alter tablespace test01 add datafile '/app/oradata/datafile/TEST03.dbf' size 10m;


Tablespace altered.

先测试offline方式。

SQL> alter database datafile '/app/oradata/datafile/TEST03.dbf' offline;


Database altered.


SQL> select name,status from v$datafile;


NAME                                               STATUS
-------------------------------------------------- --------------
...
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST03.dbf                   RECOVER
...

此时数据文件的状态为RECOVER,恢复该数据文件。
SQL> alter database recover datafile '/app/oradata/datafile/TEST03.dbf';


Database altered.


SQL> alter database datafile '/app/oradata/datafile/TEST03.dbf' online;


Database altered.


SQL> select name,status from v$datafile;


NAME                                               STATUS
-------------------------------------------------- --------------
...
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST03.dbf                   ONLINE
...

接下来,测试 offline drop 方式。

SQL> alter database datafile '/app/oradata/datafile/TEST03.dbf' offline drop;


Database altered.


SQL> select name,status from v$datafile;


NAME                                               STATUS
-------------------------------------------------- --------------
...
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST03.dbf                   RECOVER
...

此时数据文件的状态还是RECOVER,恢复该数据文件。

SQL> alter database recover datafile '/app/oradata/datafile/TEST03.dbf';


Database altered.


SQL> alter database datafile '/app/oradata/datafile/TEST03.dbf' online;


Database altered.


SQL> select name,status from v$datafile;


NAME                                               STATUS
-------------------------------------------------- --------------
...
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST03.dbf                   ONLINE
...

数据文件恢复正常。
由上可知,归档模式下,offline 与 offline drop选项的作用相同。
下面把数据库切换到非归档模式。
SQL> shutdown immediate

SQL> startup mount

SQL> alter database noarchivelog;

SQL> shutdown immediate

SQL> startup

SQL> archive log list
Database log mode              No Archive Mode
Automatic archival             Disabled
...

首先,添加测试用数据文件TEST04.dbf

SQL> alter tablespace test01 add datafile '/app/oradata/datafile/TEST04.dbf' size 10m;


Tablespace altered.


SQL> select name,status from v$datafile where name like '%TEST0%';


NAME                                               STATUS
-------------------------------------------------- --------------
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST01.dbf                   ONLINE
/app/oradata/datafile/TEST03.dbf                   ONLINE
/app/oradata/datafile/TEST04.dbf                   ONLINE


SQL> alter database datafile '/app/oradata/datafile/TEST04.dbf' offline;
alter database datafile '/app/oradata/datafile/TEST04.dbf' offline
*
ERROR at line 1:
ORA-01145: 除非启用了介质恢复, 否则不允许立即脱机




SQL> alter database datafile '/app/oradata/datafile/TEST04.dbf' offline drop;


Database altered.


SQL> select name,status from v$datafile where name like '%TEST0%';


NAME                                               STATUS
-------------------------------------------------- --------------
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST01.dbf                   ONLINE
/app/oradata/datafile/TEST03.dbf                   ONLINE
/app/oradata/datafile/TEST04.dbf                   RECOVER


SQL> alter database recover datafile '/app/oradata/datafile/TEST04.dbf';


Database altered.


SQL> alter database datafile '/app/oradata/datafile/TEST04.dbf' online;


Database altered.


SQL> select name,status from v$datafile where name like '%TEST0%';


NAME                                               STATUS
-------------------------------------------------- --------------
/app/oradata/datafile/TEST02.dbf                   OFFLINE
/app/oradata/datafile/TEST01.dbf                   ONLINE
/app/oradata/datafile/TEST03.dbf                   ONLINE
/app/oradata/datafile/TEST04.dbf                   ONLINE


可以看到,非归档模式下,不允许直接 offline 数据文件,必须增加 drop 选项。而对于RECOVER状态的文件同样可以恢复回去。

既然datafile都被删除,是否可以删除对于的数据文件记录咧?

SQL> alter tablespace test01 drop datafile '/app/oradata/datafile/TEST02.dbf';
alter tablespace test01 drop datafile '/app/oradata/datafile/TEST02.dbf'
*
ERROR at line 1:
ORA-03264: 无法删除本地管理的表空间中的脱机数据文件


可以看到,offline的数据文件是不允许被删除的。那再试试删除online的数据文件
SQL> select TABLESPACE_NAME ,file_id,ONLINE_STATUS from dba_data_files;


TABLESPACE_NAME                   FILE_ID ONLINE_STATUS
------------------------------ ---------- --------------
...
TEST_DB                                 5 ONLINE
TEST_DB                                 6 ONLINE
...


SQL> alter tablespace TEST_DB drop datafile 5;                              
alter tablespace TEST_DB drop datafile 5
*
ERROR at line 1:
ORA-03263: 无法删除表空间 TEST_DB 的第一个文件




SQL> alter tablespace TEST_DB drop datafile 6;
alter tablespace TEST_DB drop datafile 6
*
ERROR at line 1:
ORA-03262: 文件非空

必须找到位于该数据文件上的对象(dba_extents),移动到其他表空间后(alter table test move tablespace test01),再删除。

由此可见,datafile不能轻易被删除了。

删除表空间却简单:

SQL> drop tablespace test01 including contents and datafiles;


Tablespace dropped.

这样,表空间相关的数据文件也一并被删除了。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/18900329/viewspace-1743610/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2015-07-09

  • 博文量
    21
  • 访问量
    68904