文章 > Oracle > Oracle备份与恢复入门-RMAN备份

Oracle备份与恢复入门-RMAN备份

刘晓峰 · 2023-04-03 722 Oracle
分享 收藏

3. RMAN 备份

3.1 备份基本概念

RMAN 备份有很多名词,比如下面的

3.1.1 副本印象和备份集

RMAN 可以创建两类备份:映像副本和备份集。映像副本备份会生成一个输出文件,其中的每个字节都与输入文件相同。备份集是一种比较智能的结构。它可以把几个输入文件合并到一个输出文件中,不包含从来没有使用的输入文件块,可以压缩和加密,可以分解为多个块。这些块是构成备份集的物理文件。

3.1.2 热备份和冷备份

数据库打开时启用的备份文件和数据文件不一致,只有归档开启的情况下才能使用热备份.未开启归档的话只能在 mount 状态下,数据库此时是关闭的,进行冷备份,实现日志和数据文件一致性。

3.1.3 完整备份和局部备份

完整备份是备份所有数据文件和控制文件。局部备份是备份数据库的一个子集。完整备份是非归档日志模式下唯一可用的备份类型。这是由于要打开数据库,因此所有的数据文件必须有相同的系统变更号(SCN)。如果备份包含几个局部备份,每个局部备份就有不同的 SCN。之后还原时,就需要重做数据,使所有的备份具有相同的 SCN。这些重做数据不能在非归档日志模式下使用。

3.1.4 完整备份和增量备份

完整备份包含每个文件中每个使用过的块。增量备份只有自上一次备份以前改变的块。增量备份策略必须从一个完整备份开始,之后可以有随意多次增量备份,但还原总是需要先还原完整备份(称为 0 级备份,0 级备份包括未使用的块),再应用增量备份,使文件保持最新。只有进行了新的 0 级备份,才能丢弃以前的备份。

3.2 打开完整备份脚本


#!/bin/bash
rman target sys/manager <

执行完毕可以看到在对应目录生成了数据文件备份和归档重做日志备份

3.3 默认配置

3.3.1 查看默认配置

执行下面命令
RMAN> show all;
出现下面内容
RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 2 DAYS;#2 天外的备份标记为过期#如果使用了 FRA,则会自动删除过期备份,此时执行 report obsolete 将不会出现过期备份,否则需要手动执行 delete noprompt obsolete
CONFIGURE BACKUP OPTIMIZATION OFF; # default 如果为 on,表示已经备份了相同副本,则跳过此文件
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default 仅启用磁盘通道
CONFIGURE CONTROLFILE AUTOBACKUP ON; # default 自动备份控制文件
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default 指定自动备份控制文件的名称和位置
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default 备份到磁盘时默认启用一个通道
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default 备份数据文件时,生成一个副本
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default 备份归档日志时,生成一个副本
CONFIGURE MAXSETSIZE TO UNLIMITED; # default 指定备份集的最大大小,超过此大小,则分片
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default 关闭加密
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default
CONFIGURE COMPRESSION ALGORITHM 'BASIC' AS OF RELEASE 'DEFAULT' OPTIMIZE FOR LOAD TRUE ; # default
CONFIGURE RMAN OUTPUT TO KEEP FOR 7 DAYS; # default rman 作业队列结果保留 7 天
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default 自动删除不需要的归档日志
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/dbs/snapcf_ORCL.f'; # default 为控制文件的临时副本指定名称和位置

3.3.2 修改默认配置

修改备份策略优化,如果 RMAN 确定文件相同且已备份,则它是要跳过的候选项
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
RMAN> SHOW BACKUP OPTIMIZATION;

RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE BACKUP OPTIMIZATION ON;
将备份分配到两个磁盘上,每个磁盘大约占据一半空间的备份
CONFIGURE DEFAULT DEVICE TYPE TO disk;            # backup goes to disk
CONFIGURE DEVICE TYPE disk PARALLELISM 2;       # two channels used in parallel
CONFIGURE CHANNEL 1 DEVICE TYPE DISK FORMAT '/disk1/%U' # 1st channel to disk1
CONFIGURE CHANNEL 2 DEVICE TYPE DISK FORMAT '/disk2/%U' # 2nd channel to disk2
BACKUP DATABASE; # backup - first channel goes to disk1 and second to disk2
基于冗余的保留,指保留最近两个备份
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
配置高级压缩策略
CONFIGURE COMPRESSION ALGORITHM 'HIGH';
具体可以参考:

Configuring the RMAN Environment: Advanced Topics (oracle.com)

3.3.3 还原默认配置


RMAN> CONFIGURE BACKUP OPTIMIZATION CLEAR;

old RMAN configuration parameters:
CONFIGURE BACKUP OPTIMIZATION ON;
RMAN configuration parameters are successfully reset to default value

RMAN> SHOW BACKUP OPTIMIZATION;

RMAN configuration parameters for database with db_unique_name ORCL are:
CONFIGURE BACKUP OPTIMIZATION OFF; # default

RMAN> register database;

3.4 CATALOG

什么时候需要 catalog,在管理多个数据库的时候,使用恢复目录的作用特点如下:
  • 恢复目录的用途

恢复目录是 RMAN 用来存储有关一个或多个 Oracle 数据库的元数据的数据库架构。通常,将目录存储在专用数据库中。恢复目录具有以下优点:

恢复目录为每个目标数据库的控制文件中存储的 RMAN 存储库创建冗余。恢复目录用作辅助元数据存储库。如果目标控制文件和所有备份丢失,则恢复目录中仍存在 RMAN 元数据。恢复目录集中了所有目标数据库的元数据。将元数据存储在一个位置可以更轻松地执行报告和管理任务。

恢复目录可以存储元数据历史记录的时间比控制文件长得多。如果必须执行比控制文件中的历史记录更远的恢复,则此功能非常有用。管理恢复目录数据库增加的复杂性可以通过提供扩展备份历史记录的便利性来抵消。

某些 RMAN 功能仅在使用恢复目录时起作用。例如,可以将 RMAN 脚本存储在恢复目录中。存储脚本的主要优点是,它可以供任何可以连接到目标数据库和恢复目录的 RMAN 客户端使用。仅当 RMAN 客户端有权访问存储命令文件的文件系统时,命令文件才可用。在 Data Guard 环境中使用 RMAN 时,需要恢复目录。通过存储所有主数据库和备用数据库的备份元数据,该目录使您能够将备份任务卸载到一个备用数据库,同时使您能够在环境中的其他数据库上还原备份。

  • 恢复目录的基本概念
恢复目录包含有关每个已注册目标数据库的 RMAN 操作的元数据。当 RMAN 连接到恢复目录时,RMAN 以独占方式从该目录中获取其元数据。目录包括以下类型的元数据:

数据文件和存档的重做日志备份集和备份件数据文件副本

存档的重做日志及其副本

数据库结构(表空间和数据文件)

存储的脚本,这些脚本被命名为用户创建的 RMAN 命令序列

持久 RMAN 配置设置

Managing a Recovery Catalog - 11g Release 2 (11.2) (oracle.com)

--1.创建表空间

create tablespace rman datafile
'/usr/local/oracle19c/oradata/ORCL/rman.dbf' size 50m autoextend on next 50m;
--2.创建恢复目录用户
drop user rcat cascade;
create user rcat identified by rcat default tablespace rman quota unlimited on rman;
grant recovery_catalog_owner to rcat;

--3.创建恢复目录

[oracle@MyHost tmp]$ rman catalog rcat/rcat
RMAN> create catalog;

recovery catalog created

--4.注册数据库

[oracle@MyHost tmp]$ rman target sys/manager catalog rcat/rcat RMAN> register database;

--5.同步恢复目录

RMAN> resync catalog;

--6.查询

select * from RCAT.RC_ARCHIVED_LOG;
Select * from rcat.rc_backup_datafile;

3.5 全局脚本

  • 创建脚本
    RMAN> create global script global_backup_db { backup database plus archivelog;}
  • 查看脚本
    RMAN> list script names;


  • 使用脚本进行数据库备份
    RMAN> run { execute script global_backup_db; }


出现报错
ORA-19809: limit exceeded for recovery files
ORA-19804: cannot reclaim 67108864 bytes disk space from 5368709120 bytes limit

这个错误一看就是快速恢复区不够了,

直接扩容
alter system set db_recovery_file_dest_size = 10g;
优化磁盘使用空间,开启备份优化
RMAN> CONFIGURE BACKUP OPTIMIZATION ON;
再次执行
RMAN> run { execute script global_backup_db; }

3.6 增量备份

上一节 catalog 里面编写的是备份整个数据库,为了省空间我们可以进行增量备份。

增量备份包含级别 0 和级别 1 的备份。

3.6.1 级别 0

级别 0 备份包括数据库对象中的所有块,但在高水标(HWM)之上从来没有使用的块除外。

在标识有改变的块时,后续的级别 1 备份使用最近的级别 0 备份作为比较的基础。

为了演示级别 0 的部分增量备份,我们创建一个表空间和表

create tablespace backup_test datafile
'/usr/local/oracle19c/oradata/ORCL/backup_test.dbf' size 10m
autoextend on next 1m;
create table cux_backup_test(id number) tablespace backup_test;
insert into cux_backup_test(id) values(1);
commit;RMAN> backup incremental level 0 tablespace backup_test;


3.6.2 级别 1

级别 1 分为差异备份和累积备份,

差异备份:增量备份的默认类型,它备份自上次级别 0 或级别 1 增量备份以来所有变更的块。下面再次使用 USERS 表空间,进行增量备份:

RMAN>backup incremental level 1 tablespace backup_test;

累积增量备份:用于备份自上次级别 0 增量备份以来所有变更的块。累积增量级别 1 备份的方式与差异级别 1 备份相同,但要指定 CUMULATIVE 关键字,如下所示:

RMAN> backup incremental level 1 cumulative tablespace backup_test;


他们对比如下
  • 恢复速度 :累积备份比差异备份恢复速度更快 因为在恢复期间需要应用的增量备份较少。
  • 备份速度 :对于每日备份速度,差异备份的运行速度快于累积备份,因为不要重复以前备份所做的工作。但是,差异备份在执行恢复时需要更长的时间。
  • 磁盘空间使用:累积备份会占用更多磁盘空间,因为它们会重复已完成的工作通过以前的备份:
我们为了节省空间,采用差异备份
同时配置 high 压缩
RMAN> CONFIGURE COMPRESSION ALGORITHM 'HIGH';
比 BASIC 慢了一倍,但是空间占用大小是原来的一半

3.7 备份集备份选项

3.7.1 使用 backup 检查数据库错误

backup validate check logical database;

3.7.2 跳过只读、离线、不可用的数据文件

backup database skip readonly skip offline skip inaccessible;

3.7.3 备份优化下强制备份只读数据文件

backup database force;

3.7.4 新增备份

只备份上次未备份过的数据文件
backup database not backed up;
备份昨天到今天的没有备份过的数据文件
backup database not backed up since time ='sysdate-1';


3.7.5 设置备份副本

backup database copies=2;

3.7.6 备份数据库同时备份归档

backup database plus archivelog;#备份数据库同时备份归档
backup tablespace xxx plus archivelog;#备份表空间同时备份归档
backup datafile "/xxx/xxx.dbf" plus archivelog;#备份数据文件同时备份归档

3.7.7 只备份归档

backup archivelog all;#备份所有归档
backup archivelog all from time 'sysdate-1';#备份昨天到今天的归档
backup archivelog all from sequence xxx;#sequence 可以执行查询 select * from v$archived_log

3.7.8 备份归档同时删除归档日志

在 3.3.7 基础上加上 delete input 就行了,比如

backup archivelog all delete input;

3.7.9 备份参数文件和控制文件

backup current controlfile;
backup spfile;

3.7.10 双信道备份

run{
allocate channel d1 type disk;
allocate channel d2 type disk;
backup as compressed backupset database ;
backup as compressed backupset archivelog all delete all input;
}

3.7.11 增量备份

backup incremental level=0 database;#基本备份
backup incremental level=1 database;#差异增量备份
backup incremental level=1 cumulative database;#累积增量备份

3.7.12 压缩增量备份

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


可以看到压缩之后 0 级备份少了 1/3 的大小

3.7.13 备份验证

备份恢复验证

restore database validate;
restore controlfile validate;
restore archivelog validate;
restore spfile validate;
单纯验证
validate database;
validate tablespace xxx;
带时间的验证
restore database validate until scn 3160152;
restore database validate until until time 'to_date(xxxx)'

3.8 副本印象备份选项

backup as copy database;#数据库备份印象副本
backup as copy tablespace xxxx;#表空间备份印象副本
backup as copy datafile 1;数据文件
backup as copy datafile "xxxx/xxx.dbf";数据文件
backup as copy current controlfile;#控制文件副本
backup as copy archivelog all;归档日志副本,logminer 使用副本比备份集更方便

3.9 其它 RMAN 命令

#删除归档
delete archivelog all;
delete archivelog until sequence xxx;
delete archivelog all completed before 'sysdate-1'
#删除所有的备份
delete noprompt backup;
delete backup tag xxx;
#删除所有的归档备份
delete backup of archivelog all;
delete backup of archivelog all completed before 'sysdate-1'
#删除过期的备份和归档(备份目录存在,但是找不到对应的备份文件)
crosscheck backup;
delete noprompt expired backup;
delete noprompt expired archivelog all;
#删除过时的备份(超过保留期的备份)
delete noprompt obsolete;
#备份归档时删除归档
backup archivelog all delete input;

3.10 查询 sql

  • 查询备份详细情况,每次 backup 和 delete 的时候都可以运行这个查询,看看你的操作会导致什么样的结果
    SELECT decode(b.backup_type
    ,'L'
    ,'归档备份'
    ,'D'
    ,'完整备份'
    ,'I'
    ,'增量备份') backup_type --备份类型
    ,b.incremental_level --备份级别
    ,b.controlfile_included--是否包括控制文件
    ,b.start_time
    ,round(bp.bytes/1024/1024)||'m' bytes --备份片的大小
    ,bp.deleted--是否已经被删除
    ,bp.compressed--是否被压缩
    ,bp.encrypted --是否被加密
    ,bp.backed_by_osb--是有由 OSB 安全备份生成备份文件
    ,bp.handle--备份文件路径
    ,bpd.tag
    ,bpd.completion_time
    FROM v$backup_set b
    ,v$backup_piece bp
    ,v$backup_piece_details bpd
    WHERE b.set_stamp = bp.set_stamp
    and bp.SET_STAMP=bpd.SET_STAMP

3.11 时间戳和闪回

--时间戳和时间相互转换
select to_char(scn_to_timestamp(57181807),'YYYY-MM-DD HH24:MI:SS') from dual;
select timestamp_to_scn(sysdate ) from dual;
--查询当前时间戳
select d.current_scn from v$database d
union all
select dbms_flashback.get_system_change_number() from dual;
--查询还原点
select * from v$restore_point;
--查询闪回进度
select * from v$session_longops;
--闪回查询
select * from cux_trunc_backup_test as of timestamp(sysdate -3/24);
select * from cux_trunc_backup_test as of scn(57181807);
--闪回范围查询
select * from cux_trunc_backup_test versions between timestamp systimestamp -3/24 and systimestamp;
select * from cux_trunc_backup_test versions between scn 57181807 and 57183624
--查询闪回时间戳和时间范围
select * from v$flashback_database_log;
--闪回操作
flashback table cux_trunc_backup_test to before drop;--必须在回收站存在
flashback table cux_trunc_backup_test to scn 57181807;--必须在回收站存在
flashback table cux_trunc_backup_test to timestamp systimestamp -3/24 ;--必须在回收站存在


点击加载更多