暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

Oracle--备份

原创 杨露瑶 云和恩墨 2022-08-10
607

Table of Contents

概念

备份的定义
通过特定的方法,将数据库的必要文件复制到转储设备的过程。

转储设备
磁盘、光盘、磁带(DDS小磁带、LTO磁带)

备份策略选择的依据
丢失数据的代价与确保数据不丢失的代价之比

备份的主要分类

  • 冷备份、热备份
  • 逻辑备份、物理备份
  • 零级备份(全量备份、完全备份)、增量备份

备份工具

  • exp/imp
  • expdp/impdp
  • RMAN
  • OS拷贝
  • 文件系统快照

Oracle实例恢复

image.png

  • 已写入数据文件并提交 : 无需做任何操作
  • 已写入数据文件未提交 : 回滚
  • 未写入数据文件并提交 : 在前滚过程中在内存重现脏块,然后按正常机制提交
  • 未写入数据文件未提交 : 丢弃

image.png

冷备份与热备份

冷备份与恢复

冷备份
一致的整体数据库备份是在数据库关闭的情况下,对Oracle数据库的所有数据文件和控制文件进行的备份。

冷备份的优点

  • 简单,易操作
  • 关闭数据库后的备份
  • 一致性备份

冷备份的缺点

  • 联机业务不可用
  • 备份时间受数据文件大小决定

冷备份的过程
1、创建表,关闭数据库

SQL> conn scott/tiger SQL> create table t1 as select empno,ename,job from emp; SQL> conn / as sysdba SQL> shutdown immediate;
复制

image.png
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/
复制

image.png
3、模拟删除数据

SQL> sqlplus / as sysdba SQL> startup SQL> conn scott/tiger; SQL> delete from t1; SQL> commit; SQL> select * from t1;
复制

image.png
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;
复制

image.png
image.png
image.png

热备份

热备份:不一致的备份, 在数据库打开的情况下对当前数据苦进行备份,备份完成后需要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)

触发报错:
当对相关的数据文件进行操作时报错
image.png

# 关机 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)日志组丢失的恢复

image.png
image.png

数据库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;
复制
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
1人已赞赏
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

目录
  • 概念
  • Oracle实例恢复
  • 冷备份与热备份
    • 冷备份与恢复
    • 热备份
      • 备份数据库
      • 完全恢复
      • 不完全恢复
    • redo日志组文件丢失的恢复
      • 场景1:当前(current)日志组丢失的恢复
      • 场景2:非当前(current)日志组丢失的恢复