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

如果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.

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

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值