Oracle 数据库的备份与恢复

时间:2024-03-16 14:18:05

文章目录

1. 为什么要数据备份

造成数据丢失的主要原因:

  • 介质故障。
  • ⽤户的错误操作。
  • 服务器的彻底崩溃。
  • 计算机病毒。
  • 不可预料的因素

2. 故障类型

  1. 语句故障
    执⾏SQL语句过程发⽣的逻辑故障可导致语句故障。如果⽤户编写的SQL语句⽆效,就会发⽣语句故障。Oracle可⾃我修复语句故障,撤销语句产⽣的⽽印象,并将控制权交给应⽤程序。
  2. 用户进程故障
    当⽤户程序出错⽽⽆法访问Oracle数据库时,就会发⽣⽤户进程故障。⽤户进程故障只会导致当前⽤户⽆法操作数据库,但不会印象其他⽤户进程,当⽤户进程出现故障时,进程监控程序(PMON)会⾃动执⾏进程恢复。
  3. 实例故障
    当Oracle 数据库实例由于硬件或软件问题⽽⽆法继续运⾏时,就会发⽣实例故障。硬件问题包括意外断电,⽽然间问题可能是服务器操作系统崩溃。如果发现实例故障,Oracle会⾃动完成实例修复。实例修复将数据库恢复到与故障之前的事务⼀致状态,Oracle会⾃动回滚未提交的数据。
  4. 介质故障
    介质故障是当⼀个数据库⽂件或者磁盘不能读或者不能写时出现的故障。

3.备份类型

3.1 从物理角度与逻辑角度分类

  1. 物理备份
    对数据库操作系统的物理⽂件(如数据⽂件、控制⽂件和⽇志⽂件等)的备份。物理备份⼜可分为脱机备份(冷备份)和联机备份(热备份),前者是在关闭数据库的时候进⾏的,后者对运⾏在归档⽇志⽅式的数据库进⾏备份
  2. 逻辑备份
    对数据库逻辑组件(如表和存储过程等数据对象)的备份。

3.2 从数据库的状态分类:

  1. 冷备份
    冷备份数据库是将数据库关闭之后备份所有的关键性⽂件包括:数据⽂件、控制⽂件、联机REDO LOG⽂件,将其拷⻉到另外的位置。此外冷备份也可以包含对参数⽂件和⼝令⽂件的备份。冷备份实际也是⼀种物理备份。
  2. 热备份
    热备份是在数据库运⾏的情况下,采⽤archive log mode⽅式备份数据库的方法。

3.3 从数据库的备份策略角度分类

  1. 完全备份
    每次对数据进⾏完整备份。
  2. 增量备份
    只有那些在上次完全备份或者增量备份后备修改的⽂件才会被备份。
    优点是备份数据量⼩,需要的时间短。缺点是恢复的时候需要依赖之前的备份记录,出问题的⻛险较⼤。
    例如:如果在星期⼀进⾏完全备份,在星期⼆至星期五进⾏增量备份。如果星期五数据被破坏了,则数据恢复需要星期⼀的完全备份和从星期⼆⾄星期五的所有增量备份。
  3. 差异备份
    备份那些从上次完全备份之后被修改过得⽂件。因此从差异备份中恢复数据的时间⻓短,因此只需要两份数据(最后⼀次完全备份和最后⼀次差异备份),缺点是每次备份的时间较⻓。
    例如:如果在星期⼀进⾏完全备份,在星期⼆到星期五进⾏了差异备份,如果星期五数据被破坏了,则数据恢复只需要星期的完全备份和星期四的差量备份。

4. 冷备份

以DBA⽤户或特权⽤户登录,查询动态性能视图v$datafile、v$controlfile、v$logfile可以分别列出数据库的数据⽂、控制⽂件以及⽇志⽂件。将其拷⻉到另外的位置。
此外冷备份也可以包含对参数⽂件和⼝令⽂件的备份。

select name from v\$datafile;
select name from v\$controlfile;
select * from v\$logfile;
cd $ORACLE_HOME/dbs

5. 热备份

热备份也叫联机备份,它是指数据库处于open状态下,对数据库的数据⽂件、控制⽂
件、参数⽂件、密码⽂件等进⾏⼀系列备份操作(其中数据⽂件是必须备份的)。

  • 它要求数据库处在归档模式下。
  • 在热备时,是可以进⾏DML操作的

热备份的过程
冻结块头–>控制SCN在备份时不发⽣变化,并产⽣检查点,发⽣在置于备份状态的时候
进⾏物理拷⻉
解冻块头–>让SCN可以变化(当对SCN解冻后,系统会⾃动更新SCN⾄最新的状态

备份可存储为

  • 映像副本:指的是数据或归档⽇志⽂件的副本
  • 备份集 :指的是⼀个或多个⼆进制⽂件的集合,其中包含⼀个或多个数据⽂件、控制⽂件、服务器参数⽂件或归档⽇志文件。
    Oracle 数据库的备份与恢复
    物理备份:数据库级别的备份与恢复
    逻辑备份
    Oracle 数据库的备份与恢复
    备份操作的内部流程
    可以采⽤交互⽅式执⾏⽤户管理的备份。但通常需要编写执⾏备份的脚本。
    以下是脚本必须执⾏的⼀些操作:
  • 查询 v$datafile以确定需要备份的数据⽂件及其当前状态
  • 查询 v$logfile以标识联机重做⽇志⽂件
  • 查询 v$controlfile以标识要备份的控制⽂件
  • 将每个表空间置于联机备份模式下
  • 查询 v$backup以查看哪些数据⽂件包含在联机备份模式下的表空间中
  • 发出操作系统复制命令,以将数据⽂件复制到备份位置。

6. RMAN—— Recovery Manager

RMAN是ORACLE提供的恢复和备份具,是随Oracle服务器软件⼀同安装的⼯具软件,它可以⽤来备份和恢复数据库⽂件、归档⽇志和控制⽂件,⽤来执⾏完全或不完全的数据库恢复。
RMAN具有独特的优势:跳过未使⽤的数据块。

Oracle 数据库的备份与恢复
RMAN环境⾄少包括两部分

  • ⽬标数据库:即需要进⾏备份和恢复的数据库。
  • RMAN客户端:默认存放于$ORACLE_HOME/bin⽬录下的可执⾏程序,⽤于执⾏
    RMAN命令进⾏数据库备份和恢复操作。

6.1 备份集和备份片

Backup sets 备份集合.

  • 包括⼀个或多个数据⽂件或归档⽇
  • 以oracle专有的格式保存
  • 有⼀个完全的所有的备份⽚集合构成
  • 构成⼀个完全备份或增量备份

Backup pieces备份⽚

  • ⼀个备份集由若⼲个备份⽚组成。
  • 每个备份⽚是⼀个单独的输出⽂件。
  • ⼀个备份⽚的⼤⼩是有限制的;如果没有⼤⼩的限制,备份集就只由⼀个备份⽚构成。
  • 备份⽚的⼤⼩不能⼤于使⽤的⽂件系统所⽀持
    的⽂件⻓度的最⼤

6.2 镜像备份 copy

镜像备份是独⽴⽂件(数据⽂件、归档⽇志、控制⽂件)的备份。
类似操作系统级的⽂件备份。它不是备份集或备份⽚,也没有被压缩。

6.3 完全备份

完全备份是⼀个或多个数据⽂件中使⽤过的数据块的的备份。没有使⽤过的数据块是不被备份的,也就是说,oracle进⾏备份集合的压缩。

6.4 差异/增量备份(Differential)

0 全备
1 差异增量 上次全备或LV1⾄今的增量(⽆论是否有,有N次LV2的备份,⼀律从上次lv1或0⾄今的变化)0/1 ~ NOW
2 累积增量 上次任意级别备份⾄今的增量(任意⼀次备份⾄今)0/1/2 ~ NOW

Oracle 数据库的备份与恢复

6.5 累积备份(Cumulative)

0 全备
1 上次全备⾄今的增量(⽆论是否有,有N次LV1的备份,⼀律从全备⾄今的变化)0 ~ NOW
2 上次0或1级别备份⾄今的增量(2次LV2间的累积,也汇总备份⾄今)0/1~ NOW(differential下的LV1)

Oracle 数据库的备份与恢复

6.6 使⽤rman ⼯具

  • 登录rman ⼯具,默认使⽤SYSDBA⻆⾊登陆。

rman target /

  • 查看⼯具默认配置

show all;

6.7 查看RMAN⼯具默认配置

RMAN> show all;
using target database control file instead of recovery catalog
RMAN configuration parameters for database with db_unique_name ORADB are:
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE BACKUP OPTIMIZATION OFF; # default
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD
TRUE ; # default
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/11204/db_1/dbs/
snapcf_oradb.f'; # default

6.7 修改RMAN配置信息

CONFIGURE DEFAULT DEVICE TYPE TO disk;
CONFIGURE DEVICE TYPE DISK BACKUP TYPE TO COPY;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE BACKUP OPTIMIZATION ON;

6.8 备份文件命名规则

The most common substitution variable is %U, which generates a unique name.
%d for the DB_NAME
%t for the backup set time stamp
%s for the backup set number
%p for the backup piece number

7. 备份数据库⽂件

7.1 备份数据库所有数据文件

RMAN> backup database;
RMAN> backup database format ‘/u01/app/oracle/rman_bak/DB_%U_%d_%t_%s_%p.bak’;

7.2 备份指定数据⽂件

RMAN> backup datafile 4 format ‘/u01/app/oracle/rman_bak/%U_%d_%t_%s_%p.bak’;
RMAN> backup datafile ‘/u04/app/oracle/ORA11204/users01.dbf’ format ‘/u01/app/
oracle/rman_bak/arch_%U_%d_%t_%s_%p.bak’;

7.3 备份指定表空间下所有数据文件

RMAN> backup tablespace users format ‘/u01/app/oracle/
rman_bak%U_%d_%t_%s_%p.bak’;

默认地在$ORACLE_HOME/dbs 或者 $ORACLE_HOME/DATABASE ⽬录中创建服务器参数⽂件与控制文件。

7.4 备份归档⽇志⽂件

Rman> backup archivelog all;–备份所有归档⽇志
Rman> backup archivelog sequence 80 —备份80号,这⼀个归档⽇志
Rman> backup archivelog sequence between 80 and 84;—备份80到84的归档⽇志
Rman> backup archivelog from sequence 80 until sequence 584;备份80到584的归档⽇志
Rman> backup archivelog from sequence 80;–备份80开始的所有归档⽇志
format 参数指定备份集路径及命名规则
delete input ——— 备份后删除。

8. 压缩备份

8.1 备份数据库所有数据文件

RMAN> backup as compressed backupset database;
RMAN> backup as compressed backupset database format ‘/u01/app/
oracle/rman_bak/DB_%U_%d_%t_%s_%p.bak’;

8.2 备份所有归档日志

RMAN> backup as compressed backupset archivelog all;
RMAN> backup as compressed backupset archivelog all format ‘/u01/
app/oracle/rman_bak/arch_%U_%d_%t_%s_%p.bak’

9. 差异/增量备份(Differential)

9.1 零级备份

backup incremental level 0 database;
backup incremental level 0 database format ‘/u01/app/oracle/
rman_bak/DB_%U_%d_%t_%s_%p.bak’;

9.2 ⼀级差异增量

backup incremental level 1 database;
backup as compressed backupset incremental level 1 database;

9.3 ⼆级差异增量

backup incremental level 2 database;

10. 累积备份(Cumulative)

10.1 零级备份

backup incremental level 0 database;

10.2 ⼀级累计增量

backup incremental level 1 cumulative database;

10.3 ⼆级累计增量

backup incremental level 2 cumulative database;

11. 全备份与0级备份

Level 0级就是对数据库⼀个全库备份,增量备份必须从0级开始,也就是说必须要有⼀个全库备份当基础。

如果你做全库备份oracle也不认为这是level 0的全库备份,尽管是⼀样的也要单独做⼀次level 0。

有了level 0当基础才能有后⾯的 level 1 level 2 level 3 level 4…

12. list 查看备份信息

12.1 列出详细备份信息

list backup;

12.2 列出备份集信息

list backupset;

12.3 列出所有数据⽂件的备份信息

list backup of database;

12.4 列出特定表空间的所有数据⽂件备份集

list backup of tablespace users;

12.5 列出指定⽂件的备份信息

list backup of datafile 1;
list backup of datafile ‘/u01/app/oracle/oradata/oradb/system01.dbf’;

13. 备份初始化参数文件和控制文件

  1. 开启了CONTROLFILE AUTOBACKUP,就算只备份⼀个归档⽇志最后⼀步也⼀定会备份控制⽂件和spfile(如果是pfile启动,则不会备份spfile)

  2. 指定 include current controlfile 选项
    backup database include current controlfile archivelog all format ‘/
    db/backup/data_arch%U.bak’ delete input;
    ① 备份数据⽂件
    ② 备份归档⽇志+删除归档⽇志(如果有的话,如果删除了归档⽇志但是备份期间⼜没有产⽣归档⽇志,则不会
    有这⼀步)
    ③ 备库控制⽂件和spfile(如果是pfile启动,则不会备份spfile)

13.1 最佳搭配

CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE BACKUP OPTIMIZATION ON;
backup database format ‘/db/backup/data%U.bak’ plus archivelog
format ‘/db/backup/arch%U.bak’ delete input;

backup spfile

  1. rman备份spfile
    [[email protected] ~]$ rman target /
    RMAN> backup spfile;

  2. 备份控制⽂件及参数⽂件
    RMAN> backup current controlfile;

  3. 备份数据⽂件是包含控制⽂件及参数⽂件

RMAN> backup datafile 4 include current controlfile;
SQL> select dbid from v$database;
DBID
----------
27466520

restore parameter
使⽤了闪回区⽬录存放备份信息时,恢复初始化参数⽂件:

  1. restore spfile from autobackup;
  1. restore spfile from ‘/u01/app/oracle/oradata/arch/ORADB/backupset/2018_12_01/o1_mf_nnsnf_TAG20181201T132403_g0d3vmmk_.bkp’;
  1. [[email protected] dbs]$ export ORACLE_SID=oradb
  2. [[email protected] dbs]$ cd $ORACLE_HOME/dbs
  3. [[email protected] dbs]$ vi initoradb.ora 新建初始换参数,指定⼏个关键参数
    db_name=‘oradb’
    control_files=’/u01/app/oracle/oradata/oradb/control01.ctl’
    compatible=’11.2.0.4’
  4. [[email protected] dbs]$ rman target /
    RMAN> set dbid=2746652028
    RMAN> startup nomount;
    RMAN> restore spfile from autobackup; rman恢复spfile⽂件
    RMAN> shutdown immediate;
    RMAN> startup nomount 关库使⽤新恢复的spflie⽂件启动数据库

备份RUN块
如果我们不想使⽤RMAN中的默认配置来备份数据库,就可以使⽤RUN代码块,RUN代码块以{开头,}结尾。{}中的语句可以做为⼀个代码块⼀起执⾏。

例如

un{
llocate channel c1 type disk;
llocate channel c2 type disk;
llocate channel c3 type disk;
ackup database include current controlfile format ‘/u01/app/oracle/oradata/rman_bak/
ata_%U.bak’;
ackup archivelog all format ‘/u01/app/oracle/oradata/rman_bak/arch_%U_%d_%p.bak’ delete input;
elease channel c1;
elease channel c2;
elease channel c3;
如果我们配置了控制⽂件,参数⽂件⾃动备份。那么控制⽂件和参数⽂件将备份

13.2 数据的恢复

在RMAN ⽤于中,还原与恢复是两个不同的概念。

  • 还原(restore)
    指访问之前⽣成的可⽤备份,从中得到⼀个或多个对象,然后在磁盘上的某个位置还原这些对象。
  • 恢复(recover)
    是⼀个数据库与给定时间点相⼀致以保证能够打开这个数据库的实际进程,该进程通常是通过应⽤重做(包括联机重做⽇志和归档的重做⽇志)来完成的。

数据库恢复类型

  1. 完全恢复 : 不丢失数据
  2. 不完全恢复 : 部分数据

restore controlfile

  1. 将控制⽂件从autobackup中恢复处理 (list backup of contolfile;)

restore controlfile from autobackup;

  1. 从指定的备份集中恢复控制⽂件

restore controlfile from ‘/u01/app/oracle/oradata/arch/ORADB/backupset/2018_12_01/o1_mf_nnsnf_TAG20181201T132403_g0d3vmmk_.bkp’;

  1. 将控制⽂件还原到不同的位置和⽂件中 (假设数据库正在启动和运⾏)

restore controlfile to ‘/u01/ctl_bak.ctl’ from autobackup;
export ORACLE_SID=oradb
shutdown immediate;

对于任何⾃动备份的还原操作来说,RMAN 只查找过去10天内⽣成的控制⽂件的⾃动备份⽚。
使⽤maxseq 和 maxdays 参数在超过默认天数(10天)的时间周期内向后查找控制⽂件备份集

export ORACLE_SID=oradb
rman target sys/pwd
startup nomount;
run
{
set controlfile autobackup format for device type disk to ‘f:/backup/%f’;
allocate channel c1 device type disk;
restore spfile from autobackup maxseq 200 maxdays 1000;
}
shutdown immediate;

restore datafiles

  • restore database;
    其主要功能是从RMAN备份中还原⽂件,为恢复做准备。

Restore 可以将数据库还原到任何时间点。

Restore 命令也可根据分配给备份的给定标记还原特定的备份。

在不同位置上还原数据⽂件(⾮原位置)

set newname for datafile ‘/u01/app/user01.dbf’ to ‘/u02/app/
user01.dbf’

定义数据⽂件的需要恢复的新位置

执⾏set newname后,使⽤restore、recover命令

打开数据库之前,告诉Oracle永久使⽤新路径 —— switch命令

switch命令可以修改数据库控制⽂件中的数据文件位置。

13.3 恢复表空间

只丢失了某个表空间的数据⽂件,此时,可以选择只恢复这个表空间,⽽不⽤恢复整个数据库。 表空间恢复可以在不关闭数据库的情况下进⾏。
示例:

SQL> Alter tablespace tablespace_name offline;
RMAN> restore tablespace tablespace_name ;
RMAN> recover tablespace tablespace_name ;
SQL> Alter tablespace tablespace_name online;

也可以同时还原多个表空间:

SQL>Alter tablespace tablespace_name1 offline;
SQL>Alter tablespace tablespace_name2 offline;
RMAN>restore tablespace tablespace_name1,tablespace_name2 ;
RMAN>recover tablespace tablespace_name1,tablespace_name2 ;
SQL>Alter tablespace tablespace_name1 online;
SQL>Alter tablespace tablespace_name2 online;

recover database;
Recover 命令⽤于恢复数据库。该命令可以执⾏数据库的完全恢复或者时间点恢复。
Recover 命令也⽤于判断是否存在可⽤的增量备份映像。
还原归档的重做⽇志时,recover 命令尝试使⽤磁盘上已有的重做日志

14. RMAN备份的保留策略

三种保留策略:

  • 基于恢复窗⼝的保留策略
  • 基于冗余的保留策
  • ⽆保留策略

三种保留策略互斥,不可同时使用

14.1 RMAN保留策略 — 恢复窗口

保留最近7天可⽤备份备份,删除其他备份

DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 7 DAYS;

Oracle 数据库的备份与恢复

14.2 RMAN保留策略 — 冗余策略

基于冗余的保留策略是依据备份数,⽽不是备份天数。该策略是默认的保留策略,
被设置为1。

如果将其设置为2,那么Oralce则会为当前备份保留2个副本,其余的、时间更早的
副本会全部被标记为过时的备份。

查看冗余策略

show retention policy;
默认为1
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default设置为冗余度2
CONFIGURE RETENTION POLICY TO REDUNDANCY 2:

14.3 无保留策略

无保留策略也就是禁⽤保留策略,不使⽤任何保留策略。

配置⽆保留策略

configure retention policy to none

恢复到缺省保留策略

configure retention policy clear

14.4 查看冗余策略

show retention policy;
默认为1
configure retention policy to none;

15. 删除归档日志

删除某个Sequence之前(包含该Sequence)的归档⽇志

RMAN>delete archivelog until sequence xxx;
RMAN>delete archivelog from sequence xxx until sequence xxx;

删除系统时间1天以前的归档⽇志,不会删除闪回区有效的归档⽇志(可以指定删除多久⽇志)

RMAN>delete archivelog all completed before ‘sysdate-1‘;

force参数表示会删除有效归档⽇志

RMAN>delete force archivelog all completed before ‘sysdate-1‘;

删除某个时间段的归档⽇志,例如删除20天前到2天前的归档⽇志。

RMAN>delete noprompt archivelog from time ‘sysdate-20‘ until time ‘sysdate-2’;

16. 删除失效的备份及文件

最不推荐的⼀种⽅式就是使⽤命令从系统系统删除归档⽇志,如果使⽤rm删除了备份⽂件
后,需要执⾏crosscheck archivelog all命令校检归档⽇志是否失效。

删除失效的⽂件

delete expired archivelog all;
delete noprompt expired backupset;

实际上此命令不会真正删除归档⽇志,它删除的是那些本来RMAN以为存在但是实际上在
磁盘或者磁带上已经被删除了⽂件的信息,实际删除的只是RMAN资料库或控制⽂件中的
记录;

delete obsolete这个是清理过期备份,它也会删除过期的归档⽇志。

RMAN> delete obsolete;
RMAN> delete noprompt obsolete;

17. 清理备份⽂件

保留最近⼀天的备份,删除其他备份

DELETE NOPROMPT OBSOLETE RECOVERY WINDOW OF 1 DAYS;

删除、清理所有的备份集

delete backupset;
delete noprompt backupset ;

删除特定的备份⽚

delete backuppiece ‘/u01/app/oracle/oradata/rman_bak/
20tk8vfa_1_1_ORA11.dbf’;

18. 不完全恢复

重做⽇志⽂件丢失或损坏
重做⽇志⽂件,数据⽂件丢失或损坏
注意事项:每次不完全恢复完成后,按照规范,数据库应⽴即做⼀次全备,防⽌意外发生。

18.1 不完全恢复的步骤

  1. 关闭数据库并备份数据库(以防⽌恢复失败)
  2. 启动数据库到mount 状态
  3. 还原数据库
  4. 将数据库恢复⾄某个时间点、序列、或系统改变号
  5. 使⽤RESETLOGS关键字打开数据库

18.2 基于时间的不完全恢复

run {
shutdown immediate;
startup mount;
set until time “to_date(‘20181213 10:09:53’,‘yyyymmdd
hh24:mi:ss’)”;
restore database;
recover database;
alter database open resetlogs;

18. 3 基于SCN的不完全恢复

run {
shutdown immediate;
startup mount;
set until scn 3400;
restore database;
recover database;
alter database open resetlogs;}

18.4 基于Sequence的不完全恢复

run {
shutdown immediate;
startup mount;
set until sequence 29;
restore database;
recover database;
alter database open resetlogs;}