ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 【恢复】归档模式恢复非关键数据文件

【恢复】归档模式恢复非关键数据文件

原创 Linux操作系统 作者:niuxxf 时间:2012-12-08 13:27:20 0 删除 编辑

非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# STATUS
---------- -------
         1 SYSTEM
         2 ONLINE
         3 ONLINE
         4 ONLINE
         5 ONLINE
         6 ONLINE
         7 ONLINE
         8 OFFLINE
8 rows selected.
 
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/ ,如需转载,请注明出处,否则将追究法律责任。

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

注册时间:2008-02-21

  • 博文量
    44
  • 访问量
    131607