如果你只是个杯子,那就不要去干暖水壶才能做的事。
oracle备份方式有多种,今天我们不管其他的备份方式,先来锤锤其中的热备方式,进而掌握其中原理!
核心原理:热备是控制文件块头的scn号在备份是不变化,进而保证备份的数据是一致的。
oracle数据库有归档模式和非归档两种模式,下面讨论的都是在数据库归档模式下的备份恢复(非归档模式在生产系统中不建议使用,以下不讨论):
归档模式下的热备流程:
冻结块头:
SQL> alter database begin backup;
物理拷贝所有数据文件
cp /u01/app/oracle/oradata/orcl/* /u02/hotbak/
解冻块头
SQL> alter database end backup;
整个流程也可以通过脚本实现:
A,通过数据库实现所有数据文件热备脚本:
spool /tmp/hot.sql
select 'ho cp '||name||' /u02/hotbak/' from v$datafile;
spool off
ho sed -n '/^ho cp/p' /tmp/hot.sql>/tmp/hotorcl.sql
alter database begin backup;
start /tmp/hotorcl.sql
alter database end backup;
ho rm /tmp/hot*.sql
alter database backup controlfile to 'u02/hotbak/control01.ctl;
create pfile='/u02/hotbak/initorcl.ora' from spfile;
B,通过表空间方式实现所有数据文件热备脚本:
set heading off
spool /tmp/hot.sql
select 'alter tablespace '||tablespace_name||' begin backup; '||chr(10)||'ho cp '||file_name||' /u02/horcl/; '||chr(10)||'alter tablespace '||tablespace_name||' end backup;' from dba_data_files order by tablespace_name;
spool off
start /tmp/hot.sql
alter database backup controlfile to /u02/hotbak/horcl/control01.ctl';
create pfile='/u02/horcl/initorcl.ora' from spfile;
不同案例恢复:
1,恢复控制文件
recover database using backup controlfile;
SQL>startup
报错:控制文件丢失
获取控制文件位置
SQL> show parameter control_files;
拷贝备份控制文件
SQL>ho ls /u01/oracle/oradata/orcl/cont*
SQL>ho cp /u02/oracle/horcl/control* /u01/oracle/oradata/orcl/control01.ctl
SQL>ho cp /u02/oracle/horcl/control* /u01/oracle/oradata/orcl/control02.ctl
打开数据库
SQL>alter database mount;
SQL>alter database open;
ORA-01589:must use RESETLOGS or NORESETLOGS.......
报错,通过以下流程恢复
SQL>recover database using backup controlfile;
中间输入auto
如果提示找不到文件(归档文件没生成,信息存在redo日志文件中)
重新输入指令:recover database using backup controlfiles;
中间输入redo日志文件,如:
/u01/oracle/oradata/orcl/redo02.log
SQL>alter database open resetlogs;
恢复完成后,需要进行数据库的全备,因为执行resetlogs后,数据库的日志信息进行重新刷新,原来老的备份无法再对接使用。
2,恢复数据文件
数据文件丢失
----->能脱机的 可以在线还原,恢复
----->不能脱机,只能到mount阶段恢复
如果丢失user表空间
连接到该用户下面去,也可以看到该用户下的所有表信息(因为这些信息存放在数据字典中)
如果要查看表的数据,数据库报错,提示表空间不存在
查看user表空间的数据文件状态
SQL> select file#,status,enabled from v$datafile;
下线数据文件
SQL> alter database datafile 4 offline;
在此查看,发现user表空间status为recover
SQL>select file#,status,enabled from v$datafile
拷贝恢复
SQL> ho cp /u01/horcl/users01.dbf /u01/oracle/oradata/orcl/users01.dbf
SQL> alter database datafile 4 online;
提示需要media recovery
SQL> recover datafile 4;
SQL> alter database datafile 4 online;
现在可以查看该表空间下的表数据
SQL> select * from dept;
注意:system表空间,临时表空间,undo表空间都是不能脱机
系统表空间是数据库的信息中心,如果系统表空丢失,其余的数据操作将不能进行
系统表空间丢失
SQL>shutdown immediate
提示无法关闭,系统表空间丢失
关闭数据库:
SQL> shutdown abort
或者
SQL> startup force mount;
SQL> ho cp /u02/horcl/system01.dbf /u01/oracle/oradata/orcl/system01.dbf
SQL> recover datafile 1;
SQL> alter database open;
最后注意:如果执行了resetlogs打开数据库和重建了控制文件,就需要重新全备数据库
欢迎大家关注以下公众号进行数据库方面知识探讨: