非system或undo表空间的数据文件即为非关键数据文件,反之即为关键数据文件,本文标题为《 归档模式恢复非关键数据文件》,所以我们先从数据库是否开启归档开始测试。
SYS@ORA11GR2>archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/product/11.2.0/db_1/dbs/arch
Oldest online log sequence 35
Next log sequence to archive 37
Current log sequence 37
SYS@ORA11GR2>
2 : 创建测试所用表空间(ts_042_16_5)及用户并赋予相应的权限
SYS@ORA11GR2>create tablespace ts_042_16_5 datafile '/u01/app/oracle/oradata/ORA11GR2/ts_042_16_5.dbf' size 10m;
Tablespace created.
SYS@ORA11GR2>
SYS@ORA11GR2>create user xzq identified by xzq default tablespace ts_042_16_5;
User created.
SYS@ORA11GR2>grant connect,resource to xzq;
Grant succeeded.
SYS@ORA11GR2>
3 : 创建测试用表,表的默认表空间为ts_042_16_5,并插入少量测试数据
SYS@ORA11GR2>conn xzq/xzq
Connected.
XZQ@ORA11GR2>create table t(x int) tablespace ts_042_16_5;
Table created.
XZQ@ORA11GR2>insert into t select rownum from dual connect by rownum<=2;
2 rows created.
XZQ@ORA11GR2>commit;
Commit complete.
XZQ@ORA11GR2>select count(*) from t;
COUNT(*)
----------
2
XZQ@ORA11GR2>select table_name,tablespace_name from user_tables;
TABLE_NAME TABLESPACE_NAME
------------- -----------------
T TS_042_16_5
XZQ@ORA11GR2>
4 : 人为删除测试表空间ts_042_16_5的数据文件ts_042_16_5.dbf
XZQ@ORA11GR2>host ls ts_042_16_5*
ts_042_16_5.dbf
XZQ@ORA11GR2>host rm ts_042_16_5.dbf
XZQ@ORA11GR2>host ls ts_042_16_5*
ls: ts_042_16_5*: No such file or directory
XZQ@ORA11GR2>
5 : 此时我们再次查询t表,发现依然可以返回结果,因为,表t的数据已经缓存到内存中
XZQ@ORA11GR2>select * from t;
X
----------
1
2
XZQ@ORA11GR2>
6 : 尝试插入一条记录,奇怪的事儿发生了,竟然插入成功,并且提交也成功了
数据能插入,我们可以理解,因为insert操作,数据并没有真正的写入到磁盘中,是将数据先写入内存中。可是我们已经commit了,告诉dbwr进程,应该将数据库高速缓冲区中的脏数据写入到磁盘了,理论上此时应该报错了,为什么还是告诉我成功了呢?
原因是,虽然我们的commit成功了,但dbwr进程实际上还没有工作(可以肯定的是,redo中一定记录了本次操作),不过已经纳入到写入队列中,dbwr并不着急,在慢慢的处理已经提交且还没有写入磁盘的数据。
XZQ@ORA11GR2>insert into t values(3);
1 row created.
XZQ@ORA11GR2>commit;
Commit complete.
XZQ@ORA11GR2>
XZQ@ORA11GR2>select * from t;
X
----------
1
2
3
XZQ@ORA11GR2>
7 : 我们回到sys用户,手工执行一次检查点事件,再xzq下的t表,此时,立刻就返回了错误信息。
XZQ@ORA11GR2>conn / as sysdba
Connected.
SYS@ORA11GR2>alter system checkpoint;
System altered.
SYS@ORA11GR2>
-----------------------------------------------------------
此时我们查看日志,会发现如下错误信息,写的很明确,8号数据文件没了
……
ORA-01171: datafile 8 going offline due to error advancing checkpoint
ORA-01116: error in opening database file 8
ORA-01110: data file 8: '/u01/app/oracle/oradata/ORA11GR2/ts_042_16_5.dbf'
ORA-27041: unable to open file
Linux Error: 2: No such file or directory
……
-----------------------------------------------------------
--我们再查看t表,结果一定是报错的。
SYS@ORA11GR2>select count(*) from xzq.t;
select count(*) from xzq.t
*
ERROR at line 1:
ORA-00376: file 8 cannot be read at this time
ORA-01110: data file 8: '/u01/app/oracle/oradata/ORA11GR2/ts_042_16_5.dbf'
SYS@ORA11GR2>
8 : 在归档模式下,可以重新创建一个数据文件(注,这个数据文件,可以指向原来的目录,也可以指向其他的目录,这样就方便万一是硬件的故障,我们可以指向其他的目录,本次测试,将这个数据文件指向上一级目录)
SYS@ORA11GR2>alter database create datafile '/u01/app/oracle/oradata/ORA11GR2/ts_042_16_5.dbf' as '/u01/app/oracle/oradata/ts_042_16_5.dbf';
Database altered.
SYS@ORA11GR2>
SYS@ORA11GR2>host ls /u01/app/oracle/oradata/ts*
/u01/app/oracle/oradata/ts_042_16_5.dbf
SYS@ORA11GR2>
9 : 通过日志恢复8号数据文件(当然,也可以在datafile后面写上数据文件的绝对路径)
SYS@ORA11GR2>recover datafile 8;
Media recovery complete.
SYS@ORA11GR2>
10 : 恢复完成后,再次查看t表,发现还报错误,不过,这个错误跟刚才的错误是有区别的,这个错误提示我们不能read,难道这个数据文件脱机了不成?
SYS@ORA11GR2>select count(*) from xzq.t;
select count(*) from xzq.t
*
ERROR at line 1:
ORA-00376: file 8 cannot be read at this time
ORA-01110: data file 8: '/u01/app/oracle/oradata/ts_042_16_5.dbf'
SYS@ORA11GR2>
11 : 查看数据文件的状态,果然,8号数据文件变为offline
SYS@ORA11GR2>select file#,status from v$datafile;FILE# STATUS8 rows selected.
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 OFFLINE
SYS@ORA11GR2>
12 : 将8号数据文件联机
SYS@ORA11GR2>alter database datafile 8 online;
Database altered.
SYS@ORA11GR2>select file#,status from v$datafile;
FILE# STATUS
---------- -------
1 SYSTEM
2 ONLINE
3 ONLINE
4 ONLINE
5 ONLINE
6 ONLINE
7 ONLINE
8 ONLINE
8 rows selected.
SYS@ORA11GR2>
13 : 再次验证数据是否恢复,查看t表,恢复完成。
SYS@ORA11GR2>select count(*) from xzq.t;
COUNT(*)
----------
3
SYS@ORA11GR2>
14 : 小结
1)开启归档是非常重要的,且恢复教容易
2)类似这种错误(ORA-00376: file 8 cannot be read at this time),数据库是否启动的恢复步骤略有不同,如果是在数据库关闭的情况下删除数据文件,那么我们在mount下进行恢复,就不会出现数据文件offline的情况,请自行测试。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/685769/viewspace-750780/ ,如需转载,请注明出处,否则将追究法律责任。