如果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.
这样,表空间相关的数据文件也一并被删除了。