2019独角兽企业重金招聘Python工程师标准>>>
一、RMAN原理
1.RMAN结构
RMAN(Recovery Manager)
是一种用于备份(backup)、还原(restore)和恢复(recover)数据库的Oracle工具。只能用于ORACLE8或更高的版本
中,它能够备份整个数据库或表空间、数据文件、控制文件、归档文件以及Spfile(不能备份pfile,口令文件,
redolog),跳过未使用的数据块,对使用过的数据块拷贝。允许增量数据块级别的备份,增量RMAN备份是时间和空间
有效的,只备份自上次备份以来有变化的那些数据块,并对块进行检验。RMAN连接数据库必须在dedicate模式下。通
过服务器进程(rman)驱动进行备份或还原。
RMAN 工具
用于备份与恢复的接口,起源于Oracle版本8,位于$ORACLE_HOME/bin目录下,需要配置path环境变量即可用可以
通过运行rman这个命令来启动RMAN工具。
RMAN服务进程
RMAN服务进程是一个后台进程,用于RMAN工具与数据库之间的通信,也用于RMAN 工具与磁盘/磁带等I/O 设置之间
的通信,服务进程负责备份与恢复的所有工作。
通道 channel
通道是服务进程与I/O 设备之间读写的途径,一个通道将对应一个服务进程,在分配通道时,需要考虑I/O 设备的
类型,I/O 并发处理的能力,I/O 设备能创建的文件的大小,数据库文件最大的读速率,最大的打开文件数目等因素。
目标数据库 target
就是RMAN 进行备份与恢复的数据库。
元数据(meta data)
用于找到备份信息,相当目标库的控制文件。
恢复目录 catalog
拷贝存储目标库的元数据,集中管理多个库,可以执行脚本。
媒体管理层 MML
Media Management Layer (MML)是第三方工具或软件,用于管理对磁带的读写与文件的跟踪管理。
备份,备份集与备份片,镜像拷贝
备份包含一个到多个备份集backupset;
备份集是一个逻辑结构,包含一个或多个备份片backuppiece;
备份片是最基本的物理结构;
归档日志要与其他数据分开存放在不同的备份集。数据文件可以跨备份片,不能跨备份集;
备份集与镜像拷贝
backupset:逻辑概念备份集与备份片,是否压缩都有释放环节extract
copy:镜像,CP和源文件一样大,不可以增量备份,恢复的快。可作为增量备份的0级备份;
2.连接RMAM
条件
RMAN备份恢复,都必须先启动实例并加载数据库。
目标库上使用sys用户直接连接
rman target /
多实例时,需要设置set $ORACLE_SID= export $ORACLE_SID=
ramn
connect target /
ramn target sys/oracle
连远程实例,需要配置网络服务名tnsnames.ora
ramn target sys/oracle@prod
连接带输出日志
rman target / log d:\logs\rman_log.txt
重新启动备份,对于异常结束了的备份RMAN 提供一个重新开始备份的方法。
BACKUP NOT BACKED UP SINCE TIME 'SYSDATE-14' DATABASE PLUS ARCHIVELOG;
运行脚本,注意脚本中环境变量设置
rman TARGET / @backup_db.rman
rman target / log /u01/app/backdir/rman/rman.log @/u01/app/backdir/rman/rman.sql
@backup_db.rman
RUN { @backup_db.rman }
运行存储在恢复目录中的脚本
RUN { EXECUTE backup_whole_db };
4.RMAN与手工的异同
相同点:都是CP
不同点:文件大小,压缩,增量备份,ASM裸设备,catalog目录,可以管理多个库
5.RMAN设置
查看设置
show all
设置保存策略,
expired过期,是指备份集信息和元数据不一致,crosscheck后,就会出现expired信息,
obsolate过时,该备份是否在恢复的时候需要,超过时间和冗余,不再需要或有新的备份可以替换,只有一个备份
不会obsolate过时
分为冗余和恢复窗口,这两种保留策略互不兼容,一个是时间策略,决定至少有一个备份能恢复到指定的日期,一
个冗余策略,规定至少有几个冗余的备份。大于恢复窗口,但是是恢复所需要的备份依然会被保留
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
备份优化,不备份脱机只读表空间,性能优化
CONFIGURE BACKUP OPTIMIZATION ON;
存储介质
CONFIGURE DEFAULT DEVICE TYPE TO DISK[SBT];
控制文件自动备份,控制文件的自动备份发生在任何backup或者copy命令之后,或者任何数据库的结构改变之后
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/u01/app/backdir/rman/controlfile/%F';
控制文件的快照
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u01/app/oracle/product/10.2.0/db_1/dbs/snapcf_ipemsdb.f';
默认并发通道,及压缩,默认存放路径,配置项中最好不要设置channel,放到备份语句中设置
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO compressed BACKUPSET;
CONFIGURE channel DEVICE TYPE DISK format '/u01/app/backdir/rman/controlfile/pieces/%d_%T_%U.bak' maxpiecesize 2G;
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/backup/dir1/%U', '/u01/backup/dir1/%U';
配置多个备份的冗余拷贝,或者直接在脚本中指定多路径如
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 2;
backup datafile n format '/u01/backup/%U', '/u02/backup/%U';
格式化文件名
%c 备份片的拷贝数
%d 数据库名称
%D 位于该月中的第几天 (DD)
%M 位于该年中的第几月 (MM)
%F 一个基于DBID 唯一的名称,这个格式的形式为c-IIIIIIIIII-YYYYMMDD-QQ,其中IIIIIIIIII为该数据库的DBID,YYYYMMDD为日期,QQ 是一个1-256 的序列
%n 数据库名称,向右填补到最大八个字符
%u 一个八个字符的名称代表备份集与创建时间
%p 该备份集中的备份片号,从1 开始到创建的文件数
%U 一个唯一的文件名,代表%u_%p_%c
%s 备份集的号
%t 备份集时间戳
%T 年月日格式(YYYYMMDD)
6.启用块变化跟踪
是指定一个文件用于记录数据文件中哪些块发生了变化,在RAMN进行增量备份时,仅仅需读取该文件来备份这些
发生变化的块,从而减少了备份时间和I/O资源。 使用下面的命令来启用块变化跟踪
alter database enable block change tracking using file '/u01/app/oracle/oradata/orcl/blk_ch_trc.trc';
select * from v$block_change_tracking;
disable后块变化跟踪文件被自动删除
alter database disable block change tracking;
7.RMAN命令交互
数据库启动关闭命令
shutdonw immediate;
startup [nomount] mount;
alter database open;
执行sql语句,默认是不支持执行select语句且执行后没有结果
sql 'alter system archive log current';
list命令
list backupset summary;
list backup[backupset,backuppiece];
list copy;
list backup of database[controlfile,tablespace users,datafile 3,archivelog all];
report命令,可以检测那些文件需要备份,那些备份能被删除以及那些文件能不能获得的信息
report schema[obsolete];
report need backup;
delete命令
delete noprompt backup[copy];
crosscheck copy[backup,archivelog all];
delete expired copy[backup];
delete obsolete;
DELETE BACKUPPIECE 101;
DELETE OBSOLETE RECOVERY WINDOW OF 7 DAYS;
DELETE NOPROMPT ARCHIVELOG UNTIL SEQUENCE = 300;
二、RMAN备份
在非归档模式下关闭且启动到mount状态下备份
1.冷备cold_bak.sql,数据库在mount状态下,无法切换日志,所以冷备没有备归档
run{
shutdown immediate;
startup mount;
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/app/backdir/rman/cold_bak/cold_%d_%s_%p.bak';
alter database open;
}
2.热备hot_bakup.sql
run{
sql 'alter system switch logfile';
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/app/backdir/rman/hot_bak/hot_%d_%s_%p.bak' include current controlfile plus archivelog delete input format '/u01/app/backdir/rman/archiv/arch_%U.bak' ;
}
经典整库备份:backup as compressed backupset database include current controlfile plus archivelog delete input;
个人整理完全备份标准版
run{
sql 'alter system archive log current';
allocate channel c1 type disk;
allocate channel c2 type disk;
backup database format '/u01/app/backdir/rman/hot_bak/hot_%d_%s_%p.bak';
backup current controlfile format '/u01/app/backdir/rman/controlfile/controlfile_0825.bak';
backup archivelog all format '/u01/app/backdir/rman/archiv/arch_%d_%T_%s_%p' delete input;
}
3.热备表空间,数据文件
backup tablespace users format '/u01/app/backdir/rman/hot_bak/%d_users_%U.bak';
backup datafile 1,3,5 format '/u01/app/backdir/rman/hot_bak/%d_datafiles_%U.bak';
临时表空间不需要备份
backup tablespace temp;
4.增量备份
差异增量备份,小于等于自己0 2 2 1 2 2 2 0
累计增量备份,小于自己 0 2 2 1 2 2 2 0
backup incremental level 0 format '/u01/app/backdir/rman/increment/cy_LXTB_%s.bak' tablespace LXTB;
backup incremental level 0 cumulative format '/u01/app/backdir/rman/increment/lj_example_%s_cu0.bak' datafile 5;
查询备份情况
select sid,sofar,totalwork from v$session_longops;
个人整理增量备份标准版
0级
run {
sql 'alter system archive log current';
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup incremental level 0 database format '/u01/app/backdir/rman/increment/leve0_%d_%T_%s_%p';
backup archivelog all format '/u01/app/backdir/rman/archiv/arch_leve0_%d_%T_%s_%p' delete all input;
backup current controlfile format '/u01/app/backdir/rman/controlfile/controlfile_0825_leve0.bak';
release channel ch1;
release channel ch2;
}
2级
run {
sql 'alter system archive log current';
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup incremental level 2 database format '/u01/app/backdir/rman/increment/leve2_%d_%T_%s_%p';
backup archivelog all format '/u01/app/backdir/rman/archiv/arch_leve2_%d_%T_%s_%p' delete all input;
backup current controlfile format '/u01/app/backdir/rman/controlfile/controlfile_0825_leve2.bak';
release channel ch1;
release channel ch2;
}
1级
run {
sql 'alter system archive log current';
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup incremental level 1 database format '/u01/app/backdir/rman/increment/leve1_%d_%T_%s_%p';
backup archivelog all format '/u01/app/backdir/rman/archiv/arch_leve1_%d_%T_%s_%p' delete all input;
backup current controlfile format '/u01/app/backdir/rman/controlfile/controlfile_0825_leve1.bak';
release channel ch1;
release channel ch2;
}
linux下配置为定时任务
分 时 日 月 周 命令
在root用户下设置
[root@oradb ~]# crontab -e -u oracle
45 23 * * 0 rman target / log=/u01/oracle/bk/log/bak_inc0.log append cmdfile = /u01/oracle/bk/scripts/bak_inc0.rcv
45 23 * * 1 rman target / log=/u01/oracle/bk/log/bak_inc2.log append cmdfile = /u01/oracle/bk/scripts/bak_inc2.rcv
45 23 * * 2 rman target / log=/u01/oracle/bk/log/bak_inc2.log append cmdfile = /u01/oracle/bk/scripts/bak_inc2.rcv
45 23 * * 3 rman target / log=/u01/oracle/bk/log/bak_inc1.log append cmdfile = /u01/oracle/bk/scripts/bak_inc1.rcv
45 23 * * 4 rman target / log=/u01/oracle/bk/log/bak_inc2.log append cmdfile = /u01/oracle/bk/scripts/bak_inc2.rcv
45 23 * * 5 rman target / log=/u01/oracle/bk/log/bak_inc2.log append cmdfile = /u01/oracle/bk/scripts/bak_inc2.rcv
45 23 * * 6 rman target / log=/u01/oracle/bk/log/bak_inc2.log append cmdfile = /u01/oracle/bk/scripts/bak_inc2.rcv
"/tmp/crontab.XXXXInBzgR" 7L, 791C written
保存之后重启crontab
[root@oradb ~]# service crond restart
Stopping crond: [ OK ]
Starting crond: [ OK ]
windows系统下配置ramn定时任务,.bat和txt脚本配合执行rman
auto_level_0_rman.bat
rem run rman
rman cmdfile=level_0_rman.txt msglog= c:/orabackup/level_0_rmanlog%date:~0,10%.log
level_0_rman.txt
connect target /
list backup;
report obsolete;
delete obsolete;
run {
allocate channel ch1 device type disk;
allocate channel ch2 device type disk;
backup as compressed backupset incremental level 0 database
format 'c:/orabackup/full_%d_%T_%s'
plus archivelog
format 'c:/orabackup/arch_%d_%T_%s'
delete all input;
release channel ch1;
release channel ch2;
}
然后在window的计划任务配置定时执行
6.镜像备份
copy datafile 6 to '/u01/app/backdir/rman/copy/lxtb.bak';
backup as copy datafile 6 format '/u01/app/backdir/rman/copy/lxtb_as.bak';
镜像可以作为增量备份的0级备份,镜像后可以直接执行增量2级备份
backup incremental level 2 cumulative format '/u01/app/backdir/rman/increment/lj_2_lxtb%s_.bak' tablespace lxtb;
7.备份控制文件,spfile
backup current controlfile format '/u01/app/backdir/rman/controlfile/controlfile_0814.bak';
sql "alter database backup controlfile to ''/tmp/orclcontrol.bak''";
backup spfile format '/u01/app/oracle/rmanbak/sp_%d_%U';
8.备份归档文件
backup archivelog all delete input;
list backup of controlfile;
list backup of archivelog all;
list archivelog all;
9.RMAN 动态性能视图以下是与RMAN 备份有关系的一些动态性能视图,信息是从控制文件中获取的。
V$ARCHIVED_LOG
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
V$BACKUP_DATAFILE
V$BACKUP_REDOLOG
V$BACKUP_SET
V$BACKUP_PIECE
V$BACKUP_DEVICE
V$CONTROLFILE_RECORD_SECTION
v$backup_files
v$backup_spfile
v$rman_configuration
v$database_block_corruption
通过如下的SQL脚本,可以大致的监控到RMAN备份进行的程度
SELECT SID, SERIAL#, CONTEXT, SOFAR, TOTALWORK, ROUND(SOFAR/TOTALWORK*100,2) "%_COMPLETE"
FROM V$SESSION_LONGOPS
WHERE OPNAME LIKE 'RMAN%'
AND OPNAME NOT LIKE '%aggregate%'
AND TOTALWORK != 0
AND SOFAR <> TOTALWORK;
通过如下SQL获得rman用来完成备份操作的服务进程的SID与SPID信息:
select sid, spid, client_info
from v$process p, v$session s
where p.addr = s.paddr
and client_info like '%id=rman%'
10.块级别的恢复
块恢复Block Media Recovery (BMR),块是恢复的最小单元,通过块可以减少恢复时间,而且数据文件可以在线。恢复块的时候,必
须指定具体的块号,如:BLOCKRECOVER datafile 6 BLOCK 3;要恢复的坏块信息可以从报警与跟踪文件,表与索引的分析,DBV 工具或第
三方媒体管理工具以及具体的查询语句中获得。产生块损坏的原因一般是间断或随机的IO 错误或者是内存的块错误。块的错误信息保存在
V$DATABASE_BLOCK_CORRUPTION,用如下命令恢复该视图中列出的坏块
RMAN> BLOCKRECOVER CORRUPTION LIST RESTORE UNTIL TIME 'sysdate – 10';
备份的坏块信息保存在
V$BACKUP_CORRUPTION
V$COPY_CORRUPTION
可以用如下的命令来恢复坏块。
BLOCKRECOVER datafile 2 BLOCK 12, 13 datafile 7 BLOCK 5, 98, 99 datafile 9 BLOCK 19;
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 FROM TAG "weekly_backup";
BLOCKRECOVER TABLESPACE SYSTEM DBA 4194404, 4194405 RESTORE UNTIL TIME 'SYSDATE-2';
11.归档日志的正确清理
1.备份脚本中带delete all input,清理;
2.RMAN> DELETE ARCHIVELOG ALL COMPLETED BEFORE 'SYSDATE-7';
3.list copy;命令也会将归档日志列出来
delete noprompt copy;
crosscheck copy;
delete noprompt copy;
4.手工起立归档目录下的文件,再通过RMAN检查,清理过期的归档
物理删除archivelog;
crosscheck archivelog all;
delete expried archivelog all;
三、参考资料
北风网备份恢复视频
http://edu.ibeifeng.com/view-video-id-1035.html
v$session_longops:视图主要是显示运行时间超过6秒的数据库操作的状态
SID:Session标识
SERIAL#:Session串号
OPNAME:操作简要说明
TARGET:操作运行所在的对象
TARGET_DESC:目标对象说明
SOFAR:至今为止完成的工作量
TOTALWORK:总工作量
UNITS:工作量单位
www.2cto.com
START_TIME:操作开始时间
LAST_UPDATE_TIME:统计项最后更新时间
TIME_REMAINING:预计完成操作的剩余时间(秒)
ELAPSED_SECONDS:从操作开始总花费时间(秒)
CONTEXT:前后关系
MESSAGE:统计项的完整描述
USERNAME:执行操作的用户ID
SQL_ADDRESS:用于连接查询的列
SQL_HASH_VALUE:用于连接查询的列
QCSID: