回忆一下,user1用户的test表中还是有两条记录
- SQL> show user
- USER 为 "USER1"
- SQL> select * from test;
- ID VALUE
- ---------- --------------------
- 1 a
- 2 b
SQL> show user
USER 为 "USER1"
SQL> select * from test;
ID VALUE
---------- --------------------
1 a
2 b
再向test表中插入第3条数据。
- SQL> insert into test values(3,'c');
- 已创建 1 行。
- SQL> commit;
- 提交完成。
- SQL> select * from test;
- ID VALUE
- ---------- --------------------
- 1 a
- 2 b
- 3 c
SQL> insert into test values(3,'c');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from test;
ID VALUE
---------- --------------------
1 a
2 b
3 c
然后手动切换日志。删除ttb1这个表空间的数据文件,查看恢复表里面还是没有要恢复的记录,说明oracle还没意识到数据文件丢失了,继续查询test表还是可以正常的时候,再向表test里面插入数据也是可以的,因为数据是放在内存的,还没写到数据文件上面。
- SQL> conn /as sysdba
- 已连接。
- SQL> alter system archive log current;
- 系统已更改。
- SQL> ! rm -rf /u01/app/oracle/oradata/orcl/ttb1.dbf
- SQL> select * from v$recover_file;
- 未选定行
- SQL> conn user1/user1
- 已连接。
- SQL> insert into test values(4,'d');
- 已创建 1 行。
- SQL> commit;
- 提交完成。
- SQL> select * from test;
- ID VALUE
- ---------- --------------------
- 1 a
- 2 b
- 3 c
- 4 d
SQL> conn /as sysdba
已连接。
SQL> alter system archive log current;
系统已更改。
SQL> ! rm -rf /u01/app/oracle/oradata/orcl/ttb1.dbf
SQL> select * from v$recover_file;
未选定行
SQL> conn user1/user1
已连接。
SQL> insert into test values(4,'d');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from test;
ID VALUE
---------- --------------------
1 a
2 b
3 c
4 d
这个时候要是手动发生CKPT。可以看见alert日志文件里会记录错误信息。查看恢复表里面就会发现有需要恢复的数据文件拉。如果v$recover_file里面还是没有记录要恢复的数据文件,就shutdown immediate,然后会看见几号文件需要恢复,也可以开始恢复操作了。
- SQL> conn /as sysdba
- 已连接。
- SQL> alter system checkpoint;
- 系统已更改。
- SQL> select * from v$recover_file;
- 未选定行
- SQL> shutdown immediate
- ORA-01116: 打开数据库文件 14 时出错
- ORA-01110: 数据文件 14: '/u01/app/oracle/oradata/orcl/ttb1.dbf'
- ORA-27041: 无法打开文件
- Linux Error: 2: No such file or directory
- Additional information: 3
- SQL> select status from v$instance;
- STATUS
- ------------
- OPEN
SQL> conn /as sysdba
已连接。
SQL> alter system checkpoint;
系统已更改。
SQL> select * from v$recover_file;
未选定行
SQL> shutdown immediate
ORA-01116: 打开数据库文件 14 时出错
ORA-01110: 数据文件 14: '/u01/app/oracle/oradata/orcl/ttb1.dbf'
ORA-27041: 无法打开文件
Linux Error: 2: No such file or directory
Additional information: 3
SQL> select status from v$instance;
STATUS
------------
OPEN
恢复
- SQL> ! cp /u01/app/oracle/backup/ttb1.dbf /u01/app/oracle/oradata/orcl/
- SQL> recover datafile 14;
- ORA-00283: 恢复会话因错误而取消
- ORA-01124: 无法恢复数据文件 14 - 文件在使用中或在恢复中
- ORA-01110: 数据文件 14: '/u01/app/oracle/oradata/orcl/ttb1.dbf'
- SQL> alter database datafile 14 offline;
- 数据库已更改。
- SQL> recover datafile 14;
- ORA-00279: 更改 1004104 (在 10/08/2011 08:29:53 生成) 对于线程 1 是必需的
- ORA-00289: 建议: /u01/app/oracle/archivelog/1_70_761792499.dbf
- ORA-00280: 更改 1004104 (用于线程 1) 在序列 #70 中
- 指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
- auto
- 已应用的日志。
- 完成介质恢复。
- SQL> alter database datafile 14 online;
- 数据库已更改。
- SQL> shutdown immediate
- 数据库已经关闭。
- 已经卸载数据库。
- ORACLE 例程已经关闭。
- SQL> startup
- ORACLE 例程已经启动。
- Total System Global Area 167772160 bytes
- Fixed Size 1266392 bytes
- Variable Size 117443880 bytes
- Database Buffers 46137344 bytes
- Redo Buffers 2924544 bytes
- 数据库装载完毕。
- 数据库已经打开。
- SQL> conn user1/user1
- 已连接。
- SQL> select * from test;
- ID VALUE
- ---------- --------------------
- 1 a
- 2 b
- 3 c
- 4 d