Table of Contents
概念
备份的定义
通过特定的方法,将数据库的必要文件复制到转储设备的过程。
转储设备
磁盘、光盘、磁带(DDS小磁带、LTO磁带)
备份策略选择的依据
丢失数据的代价与确保数据不丢失的代价之比
备份的主要分类
- 冷备份、热备份
- 逻辑备份、物理备份
- 零级备份(全量备份、完全备份)、增量备份
备份工具
- exp/imp
- expdp/impdp
- RMAN
- OS拷贝
- 文件系统快照
Oracle实例恢复
- 已写入数据文件并提交 : 无需做任何操作
- 已写入数据文件未提交 : 回滚
- 未写入数据文件并提交 : 在前滚过程中在内存重现脏块,然后按正常机制提交
- 未写入数据文件未提交 : 丢弃
冷备份与热备份
冷备份与恢复
冷备份
一致的整体数据库备份是在数据库关闭的情况下,对Oracle数据库的所有数据文件和控制文件进行的备份。
冷备份的优点
- 简单,易操作
- 关闭数据库后的备份
- 一致性备份
冷备份的缺点
- 联机业务不可用
- 备份时间受数据文件大小决定
冷备份的过程
1、创建表,关闭数据库
SQL> conn scott/tiger
SQL> create table t1 as select empno,ename,job from emp;
SQL> conn / as sysdba
SQL> shutdown immediate;
复制
2、冷备份,拷贝相关文件
[oracle@node1 zzdb1]$ mkdir -p /oradata/cold/zzdb1/
[oracle@node1 zzdb1]$ cd $ORACLE_HOME/dbs/
[oracle@node1 zzdb1]$ cp spfilezzdb1.ora orapwzzdb1 /oradata/cold/20181208_zzdb1/
[oracle@node1 zzdb1]$ cd /oradata/zzdb1
[oracle@node1 zzdb1]$ cp *.dbf /oradata/cold/zzdb1/
[oracle@node1 zzdb1]$ cp *.ctl /oradata/cold/zzdb1/
[oracle@node1 zzdb1]$ cp *.log /oradata/cold/zzdb1/
复制
3、模拟删除数据
SQL> sqlplus / as sysdba
SQL> startup
SQL> conn scott/tiger;
SQL> delete from t1;
SQL> commit;
SQL> select * from t1;
复制
4、恢复数据文件
# 关闭数据库
SQL> conn / as sysdba
SQL> shutdown immediate;
# 删除当前的数据文件
[oracle@node1 zzdb1]$ cd /oradata/zzdb1
[oracle@node1 zzdb1]$ rm *.ctl
[oracle@node1 zzdb1]$ rm *.log
[oracle@node1 zzdb1]$ rm *.dbf
# 复制之前冷备份的数据文件
[oracle@node1 zzdb1]$ cd /oradata/zzdb1
[oracle@node1 zzdb1]$ cp /oradata/cold/zzdb1/*.ctl .
[oracle@node1 zzdb1]$ cp /oradata/cold/zzdb1/*.log .
[oracle@node1 zzdb1]$ cp /oradata/cold/zzdb1/*.dbf .
# 修改系统备份中的控制文件
[oracle@node1 zzdb1]$ cp ./control01.ctl /oracle/flash_recovery_area/zzdb1/
[oracle@node1 zzdb1]$ rm control02.ctl
[oracle@node1 zzdb1]$ mv control01.ctl control02.ctl
# 重启数据库
SQL> conn / as sysdba
SQL> startup
SQL> conn scott/tiger;
SQL> select * from tab;
SQL> select count(*) from t1;
复制
热备份
热备份:不一致的备份, 在数据库打开的情况下对当前数据苦进行备份,备份完成后需要recovery
备份数据库
# 开始备份数据文件
SQL> select current_scn from v$database;
SQL> alter database begin backup;
# # 备份状态查看
SQL> select * from v$backup;
# 拷贝数据文件到备份目录
SQL> select name from v$datafile;
SQL> !mkdir -p /oradata/hot/fulldb_20181208/archive/
SQL> !cd /oradata/zzdb1
SQL> !cp *.dbf /oradata/hot/fulldb_20181208/
SQL> !cp *.log /oradata/hot/fulldb_20181208/
# 备份控制文件
备份二进制的控制文件:
SQL> alter database backup controlfile to '/oradata/hot/fulldb_20181208/control01.ctl';
或
备份成创建语句的文件:
SQL>alter database backup controlfile to trace as '/oradata/hot/fulldb_20181208/ctl_create.sql';
# 结束数据文件备份
SQL> alter database end backup;
SQL> select current_scn from v$database;
# 备份归档日志
SQL> alter system archive log current;
SQL> alter system switch logfile;
mv /archive/1_*.dbf /oradata/hot/fulldb_20181208/archive/
# 备份参数文件
cp $ORACLE_HOME/dbs/spfile* /oradata/hot/fulldb_20181208/
# 备份密码文件
cp $ORACLE_HOME/dbs/orapw* /oradata/hot/fulldb_20181208/
复制
完全恢复
控制文件,redo日志文件,归档都存在。
数据库open下,rm系统表空间的数据文件(*.dbf)
触发报错:
当对相关的数据文件进行操作时报错
# 关机
SQL> shutdown abort
# 拷贝数据文件
cd /oradata/hot/fulldb_20181208/
cp *.dbf /oradata/zzdb1/
# 启动到mount
SQL> startup mount;
# 查看需要恢复的数据文件
SQL> select file#,error,change# from v$recover_file;
# 所有数据文件丢失
SQL> recover database;
# 某系统数据文件丢失
SQL> recover datafile file_id;
SQL> alter database open ;
复制
不完全恢复
根据某个SCN或者时间恢复到想恢复的时刻的数据, 数据恢复不完全, 所以叫不完全恢复
# 模拟:删除数据库文件及归档文件,redo日志
rm /oradata/zzdb1/*
# 从备份服务器拷贝备份文件到/oradata/zzdb1
cd /oradata/hot/fulldb_20181208
cp *.dbf /oradata/zzdb1/
cp control01.ctl /oradata/zzdb1/control01.ctl
cp control01.ctl /oradata/zzdb1/control02.ctl
# 启动到mount
sqlplus / as sysdba
SQL> startup mount;
SQL> select status from v$instance;
# 开始recover数据库
SQL> recover database using backup controlfile until time '2018-12-09 00:19:15';
# # 此处要提供归档路径
Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
SQL> alter database open resetlogs;
复制
redo日志组文件丢失的恢复
场景1:当前(current)日志组丢失的恢复
数据库OPEN状态下:
# 常规的方法,只能通过热备份的所有数据文件来恢复,因为数据库已经不一致。
SQL> shutdown immediate;
SQL> startup mount;
# 删除当前数据文件,从拷贝所有备份的数据文件到数据文件所在目录/oradata/zzdb1/
SQL> recover database until cancel using backup controlfile;
cancel
SQL> alter database open resetlogs;
复制
数据库处于CLOSE状态下:(上次一致性关闭数据库)
当在关闭状态下当前日志组所有日志成员全部出现介质失败时,
因为数据文件,控制文件都处于完全一致状态,所以只需要使用
RECOVER DATABASE UNTIL CANCEL 命令执行基于取消的不完全恢复,
然后用RESETLOGS选项打开数据库即可。
SQL> startup mount;
SQL> recover database until cancel;
SQL> alter database open resetlogs;
复制
数据库关闭下,不管是活动日志组还是当前日志组,都丢失,使用 resetlogs 重新创建。
redo日志组丢失,直接startup,是不会成功,数据库立即crash。
场景2:非当前(current)日志组丢失的恢复
ACTIVE的日志是可以清空重建的,只有CURRENT的日志组是不可以清空,因为是当前的。
清空重建即可,重建后的日志组状态为 unused 命令如下:
SQL> alter database clear unarchived logfile group 1;
SQL> select group#,status from v$log;
多次插入数据,然后切换日志,产生active日志组
SQL> insert into scott.t1 select * from scott.t1;
SQL> commit;
SQL> select group#,status from v$log;
SQL> alter database clear unarchived logfile group 2;
SQL> select group#,status from v$log;
复制
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
目录