今日实验之 close状态和open状态数据库的恢复(关于数据文件)
注意
关闭数据库的时候进行恢复:
如果系统表空间和undo表空间发生损坏 只能在数据库关闭的情况下进行恢复
实验梗概:
建立表空间app1,在这个表空间上建立表t做测试表,插入一些测试数据,确保该测试数据已经成功写到数据文件上;做冷备和热备模拟恢复的起点;破坏数据文件制造一些意外的损坏情况,今天暂时假设控制文件和日志文件完好无损。
冷备的时候只有一条记录,热备的时候有两条记录,热备完后加上第三条记录进去。
步骤:
1、建立表空间app1
2、在表空间app1上建立表t做测试
3、在表t上插入第一条数据
4、建立冷备份目录 cold
5、建立热备份目录 hot
6、干净的关闭数据库进行冷备份 冷备份所有的数据到cold
7、启动数据库 插入第二条数据 然后进行热备份 仅仅将app1表空间进行备份 然后 终止备份
8、插入第三条数据(注意:成功恢复的结果是三条数据都完好无损)
9、切换日志 多切换几次确保该日志已经被归档成功
模拟关闭状态下进行恢复过程:备份+归档
10、数据库启动的时候 删除所有的数据文件,模拟数据文件坏掉的情况
11、shutdown abort
12、从cold中拷贝所有的数据文件,注意这个时候拷贝回来的文件是不一致的。
13、打开数据库 提示需要进行介质恢复
14、select * from v$recover_file 查看需要进行恢复的数据文件
15、set autorecovery off;关闭自动恢复
recover database;恢复所有的文件
recover datafile 1;使用归档日志恢复指定的文件,会提示使用哪个日志
16、再查v$recover_file查看状态
17、继续恢复其余文件
18、打开数据库 查看数据是否完整,即三条记录是否完整恢复成功。
模拟数据库open状态下进行恢复:
由于数据库要对外工作,所以不能关闭恢复
19、插入第4条记录
20、切换日志 多切换几次
21、删除app1数据文件,模拟有人恶意损坏该文件
22、插入第5条记录 提交正常没有问题 因为是记录到logfile中故没有影响
23、查v$recover_file视图查看,数据库还不知道丢失数据文件
24、alter system checkpoint;会有报错因为数据在写到数据文件上时候找不到数据文件。
25、查看报警日志 bdump下alert文件的报错 哪个文件的问题
26、再次查看v$recover_file视图,这个时候会显示需要恢复的数据文件信息
27 将需要恢复的文件offline
28、将热备的文件拷贝过来 到相应的路径下,不一致的文件需要进行恢复
29、recover datafile 6;进行恢复
30、查看v$recover_file视图 该问题消失
31、查询v$datafile发现该数据文件还是offline
32、将数据文件置为online状态
32、查询 数据是否完整正确,要确定出一共有5个记录才对。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1、创建表空间
SQL> show user;
USER 为 "SYS"
SQL> create tablespace app1 datafile 'e:\ora-product\oradata\XE\app1.dbf' size 5M autoextend on;
表空间已创建。
2、
SQL> create user apple identified by apple default tablespace app1;
用户已创建。
SQL> grant resource,connect to apple;
授权成功。
SQL> conn apple/apple
已连接。
SQL> create table t(id number,name varchar2(50));
表已创建。
3、
SQL> insert into t values(1,'aa');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID
----------
NAME
---------------------------------------------------------
1
aa
SQL>
4&5、
D:\>md ora-backup
D:\>cd ora-backup
D:\ora-backup>md cold
D:\ora-backup>md hot
D:\ora-backup>dir
驱动器 D 中的卷是 SOFTWARE
卷的序列号是 8236-DBD6
D:\ora-backup 的目录
2010-11-13 20:04
6、
SQL> conn / as sysdba
已连接。
SQL> shutdown immediate;
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> quit
从 Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 断开
E:\ora-product\oradata\XE 的目录
2010-10-18 22:01
E:\ora-product\oradata\XE>copy *.dbf d:\ora-backup\cold\
SYSAUX.DBF
SYSTEM.DBF
USERS.DBF
UNDO.DBF
CONTROL.DBF
TEMP.DBF
EXAMPLE01.DBF
APP1.DBF
已复制 8 个文件。
7、
SQL> conn apple/apple
已连接。
SQL> insert into t values(2,'bb');
已创建 1 行。
SQL> commit;
提交完成。
SQL> select * from t;
ID
----------
NAME
-----------------------------------
2
bb
1
aa
SQL> conn / as sysdba
已连接。
SQL> alter tablespace app1 begin backup;
表空间已更改。
SQL> quit
从 Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 断开
C:\>copy e:\ora-product\oradata\XE\app1.dbf d:\ora-backup\hot\
已复制 1 个文件。
SQL> alter tablespace app1 end backup;
表空间已更改。
8、
SQL> conn apple/apple
已连接。
SQL> insert into t values(3,'cc');
已创建 1 行。
SQL> commit
2 ;
提交完成。
SQL> select id from t;
ID
----------
2
3
1
9、
SQL> conn / as sysdba
已连接。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> alter system switch logfile;
系统已更改。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列 68
下一个存档日志序列 69
当前日志序列 69
SQL> alter system switch logfile;
系统已更改。
E:\ora-product\app\oracle\flash_recovery_area\XE\ARCHIVELOG\2010_11_13>DIR
驱动器 E 中的卷是 ORACLE
卷的序列号是 C352-49C7
E:\ora-product\app\oracle\flash_recovery_area\XE\ARCHIVELOG\2010_11_13 的目录
2010-11-13 11:46
10&11由于我这实验是在window下做的 无法再数据库打开的情况下删除这些数据文件,所以将11和10颠倒顺序 先将数据库关闭然后再删除数据文件。
E:\ora-product\oradata\XE>del *.dbf
E:\ora-product\oradata\XE\SYSAUX.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\SYSTEM.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\USERS.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\UNDO.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\CONTROL.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\TEMP.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\EXAMPLE01.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE\APP1.DBF
另一个程序正在使用此文件,进程无法访问。
E:\ora-product\oradata\XE>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 11月 13 20:32:32 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
连接到:
Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production
SQL> shutdown abort
ORACLE 例程已经关闭。
SQL> quit
从 Oracle Database 10g Express Edition Release 10.2.0.1.0 - Production 断开
E:\ora-product\oradata\XE>del *.dbf
E:\ora-product\oradata\XE>dir
驱动器 E 中的卷是 ORACLE
卷的序列号是 C352-49C7
E:\ora-product\oradata\XE 的目录
2010-10-18 22:01
12、拷贝回冷备的数据文件
E:\ora-product\oradata\XE>copy d:\ora-backup\cold\* .
d:\ora-backup\cold\SYSAUX.DBF
d:\ora-backup\cold\SYSTEM.DBF
d:\ora-backup\cold\USERS.DBF
d:\ora-backup\cold\UNDO.DBF
d:\ora-backup\cold\CONTROL.DBF
d:\ora-backup\cold\TEMP.DBF
d:\ora-backup\cold\EXAMPLE01.DBF
d:\ora-backup\cold\APP1.DBF
已复制 8 个文件。
13、启动数据库 当时控制文件的scn和恢复回来的数据文件的scn是不一样的
C:\>sqlplus / as sysdba
SQL*Plus: Release 10.2.0.1.0 - Production on 星期六 11月 13 20:39:37 2010
Copyright (c) 1982, 2005, Oracle. All rights reserved.
已连接到空闲例程。
SQL> startup
ORACLE 例程已经启动。
Total System Global Area 599785472 bytes
Fixed Size 1288820 bytes
Variable Size 176162188 bytes
Database Buffers 419430400 bytes
Redo Buffers 2904064 bytes
数据库装载完毕。
ORA-00314: 日志 1 (用于线程 1) 要求的序号 与 不匹配
ORA-00312: 联机日志 1 线程 1:
'E:\ORA-PRODUCT\APP\ORACLE\FLASH_RECOVERY_AREA\XE\ONLINELOG\O1_MF_1_6CRNWJ3X_.LO
G'
恢复的视图中没有任何信息
SQL> select * from v$recover_file;
未选定行
由于之前颠倒了关闭数据库和删除数据文件的顺序,所以实验出现了不一样的问题,我们来看看怎样解决它?
SQL> recover database until cancel;
完成介质恢复。
SQL> alter database open resetlogs;
数据库已更改。
SQL> select open_mode from v$database;
OPEN_MODE
--------------------
READ WRITE
数据库成功打开!但是丢失了备份以后的数据。。。并且由于使用了resetlogs之前的所有备份也都失效,无法使用,需要再重新进行备份了,所以后面的实验也就不能再做了。
。。。。。。。悲剧
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24799772/viewspace-678072/ ,如需转载,请注明出处,否则将追究法律责任。