
太久没更技术文章了,听说你们想我了hahah
今天小陈给你们show上8个实验,瑟瑟发抖ing
实验一:控制文件备份及其恢复

Step1:连接实例,启动数据库
[oracle@oracle ~]$ sqlplus as sysdba
Step2:备份控制文件
SQL> alter database backup controlfile to '/u01/tt.ctl';
Step3:查看控制文件路径并且删除控制文件
SQL> show parameter control;
SQL> !rm -rf u01/app/oracle/oradata/db01/control01.ctl
SQL> !rm -rf u01/app/oracle/fast_recovery_area/db01/control02.ctl
Step4:重启数据库并查看状态
SQL> startup force;
SQL> select status from v$instance;
Step5:复制控制文件并启动数据库到mount状态
SQL> !cp u01/tt.ctl u01/app/oracle/oradata/db01/control01.ctl
SQL> !cp u01/tt.ctl u01/app/oracle/fast_recovery_area/db01/control02.ctl
SQL> alter database mount;
(此时数据库不能启动到open状态)
Step6:必须使用recover恢复备份控制文件
Step7:启动数据库(清空日志)
SQL> alter database open resetlogs;
实验二:数据结构修改后丢失所有控制文件

Step1:备份控制文件
SQL> alter database backup controlfile to '/u01/con.ctl';
Step2:查看当前数据文件
SQL> select name from v$datafile;
Step3:创建数据文件
SQL> create tablespace t1 datafile '/u01/app/oracle/oradata/db01/t1.dbf' size 10m autoextend on;
SQL> create table a(id number) tablespace t1;
Step4:备份、查看控制文件路径并删除
SQL> alter database backup controlfile to '/u01/tt.ctl';
SQL> show parameter control;
SQL> !rm -rf u01/app/oracle/oradata/db01/control01.ctl
SQL> !rm -rf u01/app/oracle/fast_recovery_area/db01/control02.ctl
Step5:重启数据库
SQL> startup force;
Step6:复制控制文件并启动数据库到mount状态
SQL> !cp u01/con.ctl u01/app/oracle/oradata/db01/control01.ctl
SQL> !cp u01/con.ctl u01/app/oracle/fast_recovery_area/db01/control02.ctl
SQL> alter database mount;
Step7:启动到open状态
SQL> alter database open resetlogs;
(此时启动不了数据库到open状态)
Step8:使用recover恢复
SQL> recover database using backup controlfile;
此时报错。
Step9:查看当前的数据文件并将重命名数据文件名
Step10:重新使用recover恢复
Step11:使用resetlog启动数据到open状态
SQL> alter database open resetlogs;
实验三:数据库修改后脱机或只读表空间

Step1:备份控制文件
SQL> alter database backup controlfile to trace as '/u01/control.sql';
SQL> alter database backup controlfile to '/u01/con1.ctl';
Step2:创建表空间并创建新表
SQL> create tablespace t2 datafile '/u01/app/oracle/oradata/db01/t2.dbf' size 20m autoextend on;
SQL> create table b(id number) tablespace t2;
SQL> insert into b values(10);
SQL> commit;
SQL> alter tablespace t2 read only
Step3:查看控制文件并删除并重启数据库
SQL> show parameter control;
SQL> !rm -rf u01/app/oracle/oradata/db01/control01.ctl
SQL> !rm -rf u01/app/oracle/fast_recovery_area/db01/control02.ctl
Step4: 运行备份控制文件脚本
SQL> @/u01/control.sql
Step5:recover恢复控制文件
此时是无法直接使用open语句直接启动到open状态的。
Step6:查看数据文件并重命名
SQL> select name from v$datafile;
SQL> alter database rename file '/u01/app/oracle/product/11.2.0/db_1/dbs/UNNAMED00006' to '/u01/app/oracle/oradata/db01/t2.dbf';
Step7:再次执行recover恢复控制文件
Step8:启动数据库
SQL> alter database open resetlogs;
Step9:查看当前数据文件信息
SQL> select name, status from v$datafile;
Step10:修改表空间为读写并验证表是否还在
SQL> alter tablespace t2 read write;
SQL> select * from b;
(证明此时还在)
实验四:非当前日志文件组丢失

Step1:查看当前日志情况
SQL> select * from v$log;
Step2:查看当前日志文件
SQL> select * from v$logfile;
Step3:删除非当前使用状态的其他日志文件
SQL> !rm u01/app/oracle/oradata/db01/redo02.log
SQL> !rm u01/app/oracle/oradata/db01/redo03.log
Step4:重启数据库报错
SQL> startup force;
Step5:重新启动数据库到mount状态
SQL> quit
[oracle@oracle ~]$ sqlplus as sysdba
SQL> startup mount;
Step6:清空未归档日志文件
SQL> alter database clear unarchived logfile group 2;
SQL> alter database clear unarchived logfile group 3;
Step7:启动数据库到mount状态
SQL> alter database open;
Step8:查看当前日志文件
SQL> select * from v$logfile;
(此时都已经恢复)
实验五:非归档丢失系统表空间

Step1:查看当前数据库归档状态
SQL> select log_mode from v$database;
Step2:开启数据库到未归档状态
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
Step3:查看当前数据文件
SQL> select name from v$datafile;
Step4:关机并进行冷备份
SQL> shutdown immediate;
SQL>!cp u01/app/oracle/oradata/db01/system01.dbf /u01/app/oracle/oradata/db01/system11.dbf
Step5:在用户表空间中创建表t3,并执行日志切换
SQL> create table t3 tablespace users as select * from scott.emp;
SQL> alter system switch logfile;
SQL>
SQL>
SQL>
SQL>
Step6:删除系统表空间,并重启数据库
SQL> !rm u01/app/oracle/oradata/db01/system01.dbf
SQL> startup force;
Step7:移动备份的表空间到原位置,recover数据库
SQL> !mv u01/app/oracle/oradata/db01/system11.dbf u01/app/oracle/oradata/db01/system01.dbf
Step8:启动数据库,执行忽略检查点检查语句,重新recover数据库
SQL> alter system set "_allow_resetlogs_corruption" = true scope = spfile;
SQL> startup force;
Step9:启动数据库到open状态并且清空日志,并退出当前连接
SQL> alter database open resetlogs;
SQL> quit
Step10:重新连接实例并启动数据库并取消不执行检查点的操作
SQL> startup
SQL> alter system reset "_allow_resetlogs_corruption" scope =spfile sid ='*';
Step11:关机重启数据库生效
SQL> shutdown immediate;
SQL> startup
注意:未开启归档丢失的系统表空间是没办法恢复的。
实验六:归档丢失系统表空间

Step1:查看当前归档状态
(不开归档无法执行热备份)
SQL> archive log list;
Step2:开启归档
SQL> shutdown immediate;
SQL> startup mount;
SQL> alter database archivelog;
Step3:启动数据库到open状态,开启热备份,并查看当前数据文件
SQL> alter database open;
SQL> alter tablespace system begin backup;
SQL> select name from v$datafile;
Step4:备份系统表空间并且停止热备份
SQL> !cp u01/app/oracle/oradata/db01/system01.dbf u01/app/oracle/oradata/db01/system01.dbf.bak
SQL> alter tablespace system end backup;
Step5:创建表tt并且执行日志文件切换
SQL> create table tt as select * from scott.emp;
SQL> alter system switch logfile;
SQL>
SQL> /
SQL> /
SQL> /
Step6:删除系统表空间
SQL> !rm -rf /u01/app/oracle/oradata/db01/system01.dbf
SQL> startup force
Step7:重启数据库,将备份还原
SQL> startup force;
SQL> !mv /u01/app/oracle/oradata/db01/system01.dbf.bak /u01/app/oracle/oradata/db01/system01.dbf
Step8:recover数据库
Step9:验证是否已经成功
SQL> select count(*) from tt;
(开启归档后丢失的系统表空间可恢复并保留数据)
实验七:热备份user表空间

Step1:查看user表空间的存放位置。
SQL> select name from v$datafile;
Step2:将表空间设置为只读模式。
SQL> alter tablespace users read only;
Step3:热备份users表空间。
SQL> host cp /u01/app/oracle/oradata/db01/users01.dbf /u01/backup
Step4:将表空间开启到读写模式。
SQL> alter tablespace users read write;
实验八:非归档丢失数据文件

Step1:开启数据库到mount状态并关闭归档状态,并开启数据库到open状态
SQL> startup mount;
SQL> alter database noarchivelog;
SQL> alter database open;
Step2:创建t3表空间并查看当前数据文件
SQL> create tablespace t3 datafile '/u01/app/oracle/oradata/db01/t3.dbf' size 50m;
SQL> col file_name format a50
SQL> col tablespace_name format a10
SQL> select file_name,tablespace_name from dba_data_files;
SQL> select file_name,tablespace_name from dba_data_files;
Step3:备份t3表空间
SQL> alter tablespace t3 read only;
SQL> !cp /u01/app/oracle/oradata/db01/t3.dbf /u01/backup/t3.dbf.bak
SQL> alter tablespace t3 read write;
Step4:往t3表空间中添加表和数据
SQL> create table c(id number) tablespace t3;
SQL> insert into c values(100);
SQL> commit;
Step5:切换日志
SQL> alter system switch logfile;
SQL> /
SQL> /
SQL> /
SQL> /
Step6:删除t3表空间并重启数据库
SQL> !rm /u01/app/oracle/oradata/db01/t3.dbf
SQL> startup force;
Step7:还原原备份表空间,启动数据库到open状态
SQL> !mv /u01/backup/t3.dbf.bak /u01/app/oracle/oradata/db01/t3.dbf
SQL> alter database open;
此时数据库无法启动到open状态
Step8:数据文件离线
在非归档模式下使用alter database ... offline for drop语句离线数据文件。offline关键字标记该数据文件离线,不论其是否损坏,所以可以打开数据库;for drop关键字标记该数据文件随后被删除,该数据文件不能再次恢复到在线状态。(实际上,在在线日志组还未发生切换之前,还是可以恢复到在线状态的)
SQL> alter database datafile '/u01/app/oracle/oradata/db01/t3.dbf' offline drop;
SQL> alter database open;
Step9:查看当前数据文件(t3属于recover状态)
Step10:删除t3表空间和数据文件
SQL> drop tablespace t3 including contents and datafiles;
到这里,相信你对oracle备份恢复的技能肯定又扑哧扑哧的上升了一大截了吧!Fighting鸭!

今天分享就到这里啦!
小陈与你期待下一期的邂逅!