简介
RMAN(Recovery Manager)恢复管理器,它是一种oracle的专用备份恢复工具。是一种用于备份backup,还原restore,恢复recover的工具。很多第三方的备份软件,比如赛门铁克、NBU、TSM,其实都是调用RMAN提供的API进行备份。
为什么需要备份?
备份和恢复的主要目的就是避免数据库的数据丢失,恢复数据。断电、机器故障、地质灾害。跨机房备份、跨地区备份、异机备份。
数据库的故障类型
介质故障:硬件损坏 用户错误:应用程序逻辑错误或者手动错误导致数据库的数据更改错误 应用程序错误:软件故障会损坏数据块
Oracle的备份通常分为2种类型:物理备份和逻辑备份
逻辑备份 |
---|
导入导出工具:exp/imp |
数据泵工具:expdp/impdp |
缺点:无法做到任意时间点的恢复。 |
物理备份 |
---|
RMAN实际上是物理备份,可以进行任意时间点的恢复。 |
RMAN在归档和非归档模式都可以执行脱机备份。 |
如果数据库处于归档模式,RMAN既可以做脱机备份(冷备份)也可以做联机备份(热备份). |
如果数据库处于非归档模式,RMAN是不能进行联机备份的。 |
开启归档
--查询归档模式是否开启:
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
--配置归档的位置:log_archive_dest_1如果设置了,则log_archive_dest无法设置
SQL> alter system set log_archive_dest='/u01/arch';
SQL> alter system set log_archive_dest_1='location=/u01/arch2' scope=spfile;
##查看归档日志位置
SQL> show parameter log_archive_dest;
--归档文件名的格式:
alter system set
log_archive_format='%t_%s_%r.arc' scope=spfile;
%t:线程号
%s:日志序列号
%r:resetlogs id
%d:database id
--开启归档
--必须先干净地关闭数据库
shutdown immediate
startup mount
alter database archivelog;
alter database open;
使用RMAN
#服务器端使用RMAN;
#Catalog 则必须要首先要创建目录备份数据库,建立恢复目录。Nocatalog方式 就是用control file作为catalog,每一次备份都要往控制文件里面写好多备份信息,控制文件里面会有越来越多的备份信息。因此,当使用rman nocatalog方式备份时,备份controlfile是非常重要的。
rman target /
rman target / nocatalog
rman target / catalog
##客户端使用RMAN
#RMAN链接的账户必须具有sysdba权限
rman target sys/Oracle123@192.168.230.100:1521/prod
注意:control_file_record_keep_time 时间设置为大于30天
一致性备份
#当数据库处于一致性状态的时候的备份就是一致性备份。
#当数据库关闭状态一致性状态。
shutdown immediate #一致性关闭
shutdown normal #一致性关闭
shutdown transactional #一致性关闭
shutdown abort #非一致性关闭
非一致性备份
#当数据库处于非一致性状态的备份就是非一致性备份。
#实例失败,shutdown abort
#数据库打开的时候进行的备份是非一致性备份
备份数据库
#设置rman信息在控制文件的保留时间
alter system set control_file_record_keep_time=30;
rman target /
backup database;
backup tag 'full_db_bkp' format '/u01/backup/db_%U' database;
#如果备份含有system表空间的文件,自动备份控制文件和spfile。
list backup;
list backupset;
export NLS_DATE_FORMAT='yyyy-mm-dd hh24:mi:ss'
list copy;列出映像副本
#列出包含数据文件的备份集。
list backup of datafile 1;
list copy of datafile 1;
list backupset 8;列出8号备份集
list backupset tag 'full_db_bkp';
#列出所有的归档日志:
list archivelog all;
#列出包含users表空间的备份集
list backup of tablespace users;
list backupset by file;
list backupset summary;
list backup of database;
热备与冷备 热备:数据库open状态下的备份(归档模式下),联机备份 冷备:数据库shutdown状态下的备份(归档,非归档),脱机备份 还可以数据库关闭情况下cp文件
备份集是一个逻辑概念
备份片 备份片就是一个一个文件。 备份集包含多个备份片。 默认情况下一个备份集由一个备份片组成。
crosscheck命令
crosscheck backupset;
list backupset summary;
X:expired,当删除备份文件后执行crosscheck就是此状态
A:available
delete backupset;
delete expired backupset;
delete noprompt expired backupset; --不提示Y/N,适合在脚本里面执行
--delete expired命令不删除任何文件,只更新RMAN的存储库。
--delete obsolete命令将文件删除并更新RMAN存储库。
delete noprompt backupset; --不提示直接删除,一般用于脚本中
手工注册备份集和归档日志
#注册单个备份片
catalog backuppiece '/u01/backup/db1.bkp';
#注册整个目录
catalog start with '/u01/backup';
#注册归档文件:
单个,少量:
alter database register physical logfile
'/u01/arch/arc/1_21_953704758.arc';
多个,目录:
catalog start with '/u01/arch/arc/';
使用validate验证数据库
rman命令,验证的目的主要是为了检查损坏的块和丢失的文件。验证备份集是不是可以用来做恢复。验证数据文件是否损坏,坏块。
RMAN验证有三种方式: |
---|
validate |
backup...validate |
restore...validate |
validate
validate database;验证数据库文件是否有坏块
validate tablespace users;
validate datafile 1;
validate archivelog all;验证所有归档是否可用
#验证数据文件单个数据块block是否损坏
validate datafile 1 block 10;
validate backupset 28;验证备份集28号,是否可用。
dbv file=system01.dbf 验证数据文件是否损坏
backup...validate
#不生成任何备份
backup validate database;
backup validate check logical database;
backup validate archivelog all;
backup validate database archivelog all;
restore...validate
#验证数据库是否能进行恢复
restore database validate;
#删除备份集
delete backup;
delete backupset;
delete noprompt backup;
#删除指定的备份集
delete backupset 11;
#报告过期的备份。违反保留策略(show all可以查看保留策略)
report obsolete;
expired:删除的,找不到的备份。
delete obsolete;删除obsolete备份集,删除时间最久远的。
delete archivelog all;
backup keep forever database;(恢复目录中才支持)
注意参数:control_file_record_keep_time
备份spfile
backup spfile;
备份控制文件
#备份当前控制文件
backup current controlfile;
#spfile和控制文件自动备份:
CONFIGURE CONTROLFILE AUTOBACKUP OFF;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
#设置自动备份的存储位置:
configure controlfile autobackup format for device type disk to '/u01/backup/ctl_%F';
configure controlfile autobackup format for device type disk clear;
备份归档日志
backup archivelog all;
alter system switch logfile;--归档当前日志文件
backup archivelog all delete all input;
backup archivelog all delete input;
使用映像副本,cp 表空间文件
backup as copy database;
list copy;--还可以显示归档日志文件
backup as copy datafile 4;
backup as copy datafile 4 format '/u01/backup/user01.bak
查看
RMAN> show all;查看所有默认配置
RMAN> show retention policy;
RMAN> show default device type;
v$rman_configuration
CONFIGURE DEFAULT DEVICE TYPE TO 'SBT_TAPE';修改默认设备类型为磁带
configure default device type clear;清除配置
backup device type disk database;
配置冗余策略
CONFIGURE RETENTION POLICY TO REDUNDANCY 2;
CONFIGURE RETENTION POLICY clear;
配置备份的默认类型
备份集或者映像副本
configure device type disk backup type to copy;
configure device type clear;
configure device type disk backup type to compressed backupset;
配置通道channel
--默认情况下,RMAN为所有操作分配一个磁盘通道。
configure channel device type disk format '/u01/backup/db_%U';
configure channel device type disk format '+dg1';
配置并行
configure device type disk backup type to
compressed backupset parallelism 2;
--会产生多个文件
配置优化
configure backup optimization on;
--算法比较复杂
--跳过只读表空间或者离线表空间
configure retention policy to recovery window of 7 days;
backup database;
backup database;--跳过只读表空间或者离线表空间
run代码块
run {
allocate channel c1 device type disk;
backup tablespace users;
release channel c1;
}
--run块里面的配置会覆盖RMAN的配置
配置控制文件自动备份的位置
configure controlfile autobackup format for device type disk to '/u01/backup/ctrl_%F';
配置备份集
#配置备份集最大大小
v$rman_configuration
configure maxsetsize to 500m;
configure maxsetsize clear;
配置备份片
#配置备份片的最大大小
configure channel device type disk maxpiecesize 500m;
configure channel device type disk format '/u01/backup/db_%U' maxpiecesize 500m;
备份整个数据库时可以排除部分表空间
configure exclude for tablespace sysaux;
backup database noexclude;
配置压缩
RMAN支持的备份集的预压缩处理和二进制压缩预压缩块处理:
通过合并每个数据块中的空闲空间并将改空闲空间设置为二进制0来实现更好的备份压缩,optimize for load true
支持的压缩级别:
默认压缩算法
高级压缩选型。
configure compression algorithm
'BASIC|HIGH|MEDIUM|LOW'
configure device type disk backup type to
compressed backupset;
配置备份加密
SQL> select * from v$rman_encryption_algorithms;
如果备份集没有加密,只要得到备份集文件,就可以恢复数据。
加密模式:
1.口令加密模式
2.透明加密模式(wallet钱包)
3.混合
v$rman_encryption_algorithms
AES128(默认),AES192,AES256
对称加密算法
RMAN加密CPU密集型操作,可能会对备份性能影响。
口令加密模式
--备份
set encryption on identified by "oracle" only;
backup datafile 4;backup database;
--恢复
set decryption identified by "oracle";
restore datafile 4;restore database;
recover datafile 4;recover database;
alter database open;
透明加密模式 wallet
1.创建wallet目录
mkdir -p /u01/app/oracle/admin/fxdb/wallet
2.设置秘钥
alter system set encryption key identified by
"oracle";
关闭钱包:
alter system set wallet close identified by
"oracle";
打开钱包:
alter system set wallet open identified by
"oracle";
RMAN> configure encryption for database on;
这种备份在本机还原时,无须输入密码,wallet自动解密,加
密。
把备份集复制到其他机器,无法恢复。
在本机还原。
混合模式
set encryption on identified by "oracle";
set decryption identified by "oracle";
或者
把钱包打开
alter system set wallet open identified by "oracle";
既可以在本机恢复,也可以在异机恢复。
简介:恢复指导,是一款oracle数据库工具,自动故障诊断,提供适当的恢复建议,修复。
实验
恢复情形1:
如何在丢失一个或多个数据文件后使用RMAN使数据库恢复正常运
行。
1.备份数据库
backup database;
2.删除文件
rm 数据文件
shutdown abort
3.startup mount
RMAN> list failure;需要触发才有信息
RMAN> advise failure;
RMAN> repair failure preview;查看恢复脚本内容
RMAN> repair failure;
Block Change Tracking块跟踪,主要用在RMAN的增量备份,记录自上一次备份以来数据库的变化,标识更改的块进行增量备份,CTWR(change tracking writer)只读取改变的内容,不需要对整个数据库进行扫描,从而提高RMAN的备份性能。加快备份。缩短备份时间。
配置块跟踪
查询:
select * from v$block_change_tracking;
alter database enable block change tracking using
file '/u01/ctf';
alter database disable block change tracking;
差异增量备份 累积增量备份 增量更新备份(oracle特有)
差异增量备份
自上一次同级别的差异备份或者是上一次更高级别的备份完成之后的数据库发生改变的数据块。
backup database:整库备份,不能作为增量策略的一部分
backup incremental level 0 database;整库备份,可以作为增量备份的基础。
归档打开
非归档,mount下增量备份
1.backup incremental level 0 database format
'/u01/backup/l0_%U';
2.backup incremental level 1 database format
'/u01/backup/l1_%U';
累积增量备份
自上一次上一级备份完成以来数据库改变的数据库。
1.backup incremental level 0 database;
2.backup incremental level 1 cumulative database;
注意:不要混用
增量更新备份
#执行三次
run {
recover copy of database with tag 'incr_update';
backup incremental level 1 for recover of copy
with tag 'incr_update' database;
}
1.
没有相应的备份集来应用到文件映像上。
产生映像文件。
2.
执行失败
产生增量备份集
3.
应用上一次的备份集恢复文件,应用备份集到copy
产生增量备份集
前提条件 数据库必须是归档模式 使用RMAN备份
恢复数据库
故障情形: 如何在丢失一个或多个数据文件后使用RMAN使数据库恢复正常运行。 数据文件:undo,system,users 控制文件:不考虑 redo文件:不考虑 参数文件:spfile,pfile,不考虑 临时文件:不考虑,rman不备份临时文件。
恢复步骤:
1.置于mount状态 2.恢复文件restore 3.介质恢复recover 4.open数据库
restore database(删除了所有的文件)
restore datafile '/xxxx/xx/dbf'
restore datafile 1;(当删除了部分文件的时候使用比较方便)
recover database;
recover datafile xxx;
alter database open;
故障情形: 恢复到过去某个时间点 恢复步骤:
1.rman备份
2018-05-19 12:46:29
2.创建用户,表,插入数据
SQL> create user fx identified by fx;
SQL> grant connect,resource to fx;
SQL> alter user fx quota unlimited on users;
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
T1:2018-05-19 12:54:01
insert into fxtbs select level from dual connect by level <=5000;
commit;
T2:2018-05-19 12:55:21
delete from fxtbs;
commit;
#恢复步骤
shutdown immediate
startup mount
run {
set until time "to_date('2018-05-19 12:55:21','yyyy-mm-dd hh24:mi:ss')"; 设置要恢复的时间点,也可以恢复到过去某个scn.
restore database; 恢复数据文件
recover database; 应用归档,应用到上面的时间点
}
alter database open resetlogs; 打开的时候用resetlogs打开,这是不完全恢复。完全恢复就是恢复到故障点。
简介 块恢复: 可以使用块恢复来恢复一个或者多个损坏文件块。 优点: 1.降低MTTR平均故障恢复时间,只需要恢复损坏的块。 2.恢复期间,数据文件他是联机的状态。 3.如果没有块恢复,单个块,整个数据文件离线,恢复,online。 前提条件: 1.必须得有RMAN备份
块恢复
recover datafile 4 block 132;
块屏蔽
--没有备份的话,可以屏蔽坏块,其他块不影响。 exec dbms_repair.skip_corrupt_blocks('FX','FXTBS'); select skip_corrupt from dba_tables where table_name='FXTBS'
构建pfile
手动创建initfxdb.ora,里面添加一个参数db_name=fxdb即可
恢复spfile
startup nomount
RMAN> restore spfile from '/u01/backup/c-2468455110-20201107-00';
恢复控制文件
RMAN> restore controlfile from '/u01/backup/c-2468455110-20201107-00';
恢复数据文件
SQL> alter database mount;
RMAN> list backup;
using target database control file instead of
recovery catalog
List of Backup Sets
===================
BS Key Type LV Size Device Type Elapsed
Time Completion Time
------- ---- -- ---------- ----------- ----------
-- ---------------
1 Full 1.14G DISK 00:00:07
07-NOV-20
BP Key: 1 Status: AVAILABLE
Compressed: NO Tag: TAG20201107T175618
Piece Name: /u01/backup/db_01veuli2_1_1
List of Datafiles in backup set 1
File LV Type Ckp SCN Ckp Time Abs Fuz SCN
Sparse Name
---- -- ---- ---------- --------- ----------- -
----- ----
1 Full 1576717 07-NOV-20
NO /u01/app/oracle/oradata/fxdb/system01.dbf
3 Full 1576717 07-NOV-20
NO /u01/app/oracle/oradata/fxdb/sysaux01.dbf
4 Full 1576717 07-NOV-20
NO /u01/app/oracle/oradata/fxdb/undotbs01.dbf
7 Full 1576717 07-NOV-20
NO /u01/app/oracle/oradata/fxdb/users01.dbf
--如果没有备份信息,则需要注册备份集
RMAN>catalog start with '/u01/backup';
--恢复数据文件
RMAN> restore database;
Starting restore at 07-NOV-20
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=3405 device type=DISK
channel ORA_DISK_1: starting datafile backup set
restore
channel ORA_DISK_1: specifying datafile(s) to
restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to
/u01/app/oracle/oradata/fxdb/system01.dbf
channel ORA_DISK_1: restoring datafile 00003 to
/u01/app/oracle/oradata/fxdb/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00004 to
/u01/app/oracle/oradata/fxdb/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00007 to
/u01/app/oracle/oradata/fxdb/users01.dbf
channel ORA_DISK_1: reading from backup piece
/u01/backup/db_01veuli2_1_1
channel ORA_DISK_1: piece
handle=/u01/backup/db_01veuli2_1_1
tag=TAG20201107T175618
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed
time: 00:00:07
Finished restore at 07-NOV-20
SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01152: file 1 was not restored from a
sufficiently old backup
ORA-01110: data file 1:
'/u01/app/oracle/oradata/fxdb/system01.dbf'
--出现以上错误是因为没有进行recover
RMAN> recover database;
Starting recover at 07-NOV-20
using target database control file instead of
recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1140 device type=DISK
starting media recovery
archived log for thread 1 with sequence 0 is
already on disk as file
/u01/app/oracle/oradata/fxdb/redo02.log
unable to find archived log
archived log thread=1 sequence=2
RMAN-00571:
=================================================
==========
RMAN-00569: =============== ERROR MESSAGE STACK
FOLLOWS ===============
RMAN-00571:
=================================================
==========
RMAN-03002: failure of recover command at
11/07/2020 18:24:44
RMAN-06054: media recovery requesting unknown
archived log for thread 1 with sequence 2 and
starting SCN of 1576717
--使用resetlogs打开数据库
SQL> alter database open resetlogs;
Database altered.
开启归档
SQL> select instance_name,status from gv$instance;
INSTANCE_NAME STATUS
---------------- ------------
prod1 OPEN
prod2 OPEN
SQL> archive log list;
Database log mode No Archive Mode
Automatic archival Disabled
Archive destination
/u01/app/oracle/product/12.2.0.1/db_1/dbs/arch
Oldest online log sequence 1
Current log sequence 2
--开启归档,需先干净地关闭所有实例
--启动一个实例到mount,开启归档,只需要在一个节点开启归档即可
--RAC环境下spfile在共享磁盘
SQL> show parameter spfile;
NAME TYPE VALUE
------------------------------------ -----------
------------------------------
spfile string
+DATA/PROD/PARAMETERFILE/spfil
e.294.1054727235
--设置归档文件名格式
alter system set
log_archive_format='%t_%s_%r.arc' scope=spfile;
--为节点配置归档路径,也放在共享存储里面,这样2个节点都能访问到
alter system set log_archive_dest='+DATA/arch1' scope=spfile sid='prod1';
alter system set log_archive_dest='+DATA/arch2'
scope=spfile sid='prod2';
asmcmd> cd data
asmcmd> mkdir arch1
asmcmd> mkdir arch2
备份数据库
RMAN> backup format '+data/db_%U' database;
Starting backup at 07-NOV-20
using target database control file instead of
recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=2278 instance=prod1
device type=DISK
channel ORA_DISK_1: starting full datafile backup
set
channel ORA_DISK_1: specifying datafile(s) in
backup set
input datafile file number=00001
name=+DATA/PROD/DATAFILE/system.283.1054727085
input datafile file number=00003
name=+DATA/PROD/DATAFILE/sysaux.284.1054727117
input datafile file number=00004
name=+DATA/PROD/DATAFILE/undotbs1.285.1054727131
input datafile file number=00005
name=+DATA/PROD/DATAFILE/undotbs2.291.1054727205
input datafile file number=00007
name=+DATA/PROD/DATAFILE/users.286.1054727133
channel ORA_DISK_1: starting piece 1 at 07-NOV-20
channel ORA_DISK_1: finished piece 1 at 07-NOV-20
piece handle=+DATA/db_01vetoom_1_1
tag=TAG20201107T094454 comment=NONE
channel ORA_DISK_1: backup set complete, elapsed
time: 00:00:07
Finished backup at 07-NOV-20
Starting Control File and SPFILE Autobackup at
07-NOV-20
piece
handle=/u01/app/oracle/product/12.2.0.1/db_1/dbs/
c-466565517-20201107-00 comment=NONE
Finished Control File and SPFILE Autobackup at
07-NOV-20
恢复数据库
--删除数据库文件
asmcmd> rm +DATA/PROD/DATAFILE/system.283.1054727085
--open数据库
SQL> startup
ORACLE instance started.
Total System Global Area 2466250752 bytes
Fixed Size 8623688 bytes
Variable Size 2113931704 bytes
Database Buffers 335544320 bytes
Redo Buffers 8151040 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 1 - see
DBWR trace file
ORA-01110: data file 1:
'+DATA/PROD/DATAFILE/system.283.1054727085'
--restore数据文件
RMAN> restore datafile 1;
Starting restore at 07-NOV-20
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=2280 instance=prod2
device type=DISK
channel ORA_DISK_1: starting datafile backup set
restore
channel ORA_DISK_1: specifying datafile(s) to
restore from backup set
channel ORA_DISK_1: restoring datafile 00001 to
+DATA/PROD/DATAFILE/system.283.1054727085
channel ORA_DISK_1: reading from backup piece
+DATA/db_01vetoom_1_1
channel ORA_DISK_1: piece
handle=+DATA/db_01vetoom_1_1
tag=TAG20201107T094454
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed
time: 00:00:03
Finished restore at 07-NOV-20
--recover数据文件
RMAN> recover datafile 1;
Starting recover at 07-NOV-20
using channel ORA_DISK_1
starting media recovery
media recovery complete, elapsed time: 00:00:00
Finished recover at 07-NOV-20
--open数据库
RMAN> alter database open;
Statement processed