2020-03-15-Oracle_RMAN2

Category

  • 1.RMAN与闪回
      • 1.1RMAN
        • 1.1.1增量备份
        • 1.1.2差异增量备份的语法
        • 1.1.3累计增量备份的语法
        • 1.1.4块更改跟踪文件
        • 1.1.5实验--增量备份后丢失数据文件
        • 1.1.6实验--数据文件分区损坏,利用RMAN备份恢复数据文件到新分区
        • 1.1.6实验--不完全恢复之将数据库恢复到过去某一时间点
        • 1.1.7实验--基于坏块的恢复
        • 1.1.8实验--自动增量脚本备份数据库
        • 1.1.9RMAN的好处
        • 1.1.9RMAN维护命令
      • 1.2闪回
        • 1.2.1闪回简介
        • 1.2.2闪回参数
        • 1.2.3闪回开启
        • 1.2.3闪回语法
        • 1.2.3闪回删除
        • 1.2.4闪回查询

1.RMAN与闪回

1.1RMAN

1.1.1增量备份

级别:0,1,2,3,4
企业一般设成2以下
0级:相当于全备
1级:在0级的基础上哪些数据块发生变化,备份哪些
2级:在1级的基础上哪些数据块发生变化,备份哪些

2020-03-15-Oracle_RMAN2_第1张图片
2020-03-15-Oracle_RMAN2_第2张图片

1.1.2差异增量备份的语法

增量备份
backup incremental level = 0 database
backup incremental level 0 database

增量备份归档日志单路删除
备份完归档再删除原数据库单路归档
在这里插入图片描述
增量备份-归档日志多路删除
备份完归档再删除原数据库多路归档
在这里插入图片描述
增量备份是针对数据文件的
2020-03-15-Oracle_RMAN2_第3张图片

1.1.3累计增量备份的语法

#累计增量备份的语法:
RMAN>backup incremetal level 2 cumulative database;

1.1.4块更改跟踪文件

进行增量备份的前提
每当数据块发生变化,会在文件里注册,下次备份时会从此文件获取消息

#启用块更改跟踪
SQL> alter database enable block change tracking using file '/dat/DBData/orcl/orcl_block_change.fil';
Database altered.

可以查看视图v$block_change_tracking来确定是否启用了块更改跟踪

这个文件的大小一般不需要太大,它和数据库的大小有关,一般为数据库的1/30000.这个文件的增长是以10M的大小增长的

1.1.5实验–增量备份后丢失数据文件

#RMAN下备份
开启块跟踪
backup incremental level 1 database
backup incremental level 0 database

#sqlplus下模拟灾难
模拟灾难场景--删除一个数据文件
启动报错

#RMAN下恢复
restore database; #数据库自动判断是否启用增量备份
recover database;
alter database open;

#RMAN下模拟灾难2--日志,参数文件完好无损,控制文件和数据文件丢失
alter system switch logfile;
exit
rman target sys/123456
shutdown immediate
exit

rm -rf *.ctl #删掉所有路径下的控制文件
rm -rf 1.dbf
rm -rf 2.df

#还原控制文件
rman target sys/123456
restore controlfile from '备份片路径';
#控制文件备份放到闪回恢复区,可以用restore controlfile from autobackup;
#控制文件放到人为指定的地方,则用restore controlfile from '备份片路径';

alter database mount;
restore datafile;
recover database;
alter database open resetlogs;
马上做一次数据库全备

会从闪回拿很旧的控制文件回来,恢复起来非常复杂
因此↓需要格外注意
restore controlfile from autobackup;
restore controlfile from ‘备份片路径’;;
2020-03-15-Oracle_RMAN2_第4张图片
分区坏了,不能把控制文件还原到原来分区上
control,spfile都支持把备份拿到新分区
restore controlfile to ‘/’ from ‘备份片’

1.1.6实验–数据文件分区损坏,利用RMAN备份恢复数据文件到新分区

数据库全备
操作系统命令创建一个文件夹ttt
把数据文件1.dbf移到ttt
删除库路径下的数据文件1.dbf
mount状态下执行以下run代码块

run{
set newname for datafile '/dat/DBData/SHIDA/shi01.dbf' to '/dat/DBData/SHIDA/SHIMING/shi01.dbf'; 
set newname for datafile '/dat/DBData/SHIDA/ming01.dbf' to '/dat/DBData/SHIDA/SHIMING/ming01.dbf';  
restore database;
switch datafile all; #让数据库识别数据文件的新分区
recover database;
alter database open;
}

#set newname for datafile '/dat/DBData/SHIDA/shi01.dbf'  旧分区 to '/dat/DBData/SHIDA/SHIMING/shi01.dbf' 新分区

2020-03-15-Oracle_RMAN2_第5张图片

1.1.6实验–不完全恢复之将数据库恢复到过去某一时间点

建立恢复点,执行不完全恢复RMAN>run{
Set until time “to_date(14/03/14 15:00:00,’dd/mm/yy hh24:mi:ss’);
Restore database;
Recover database;
alter database open resetlogs;
}

前提:RMAN备份
2020-03-15-Oracle_RMAN2_第6张图片
shutdown immediate;
startup mount;
把数据库恢复到创建表之前
实行run代码块

补充:
不用润代码块的情况
2020-03-15-Oracle_RMAN2_第7张图片
补充:
基于scn的恢复
2020-03-15-Oracle_RMAN2_第8张图片
基于scn的不完全恢复Startup mount;
Restore database until scn 2257708;
Recover database until scn 2257708;
Alter database open resetlogs;

1.1.7实验–基于坏块的恢复

1.创建表空间
create tablespace lian datafile ‘/dat/DBData/orcl/lian.dbf’ size 50m;

2.创建用户
create user lian identified by lian default tablespace lian;
grant connect,resource to lian;
conn lian/lian;

3.创建表
create table lian(id number,name varchar2(10));

4.插入数据
insert into lian values (2,‘dalian’);
commit;
conn sys/123456;
alter system flush buffer_cache;
exit

5.RMAN备份数据库
backup database;

6.破坏数据文件
vi

7查询后发现坏块
2020-03-15-Oracle_RMAN2_第9张图片
7.1RMAN检查坏块
validate check logical database
显示数据头部损坏
2020-03-15-Oracle_RMAN2_第10张图片
7.1.1断电后进行介质恢复
rm -rf 损坏的数据文件
RMAN mount状态下还原数据文件 :restore database
alter database open;

7.2块级别的恢复:
2020-03-15-Oracle_RMAN2_第11张图片
blockrecover datafile 12 block 130;

RMAN> blockrecover datafile 12 block 130;

Starting recover at 15-MAR-20
using channel ORA_DISK_1

channel ORA_DISK_1: restoring block(s)
channel ORA_DISK_1: specifying block(s) to restore from backup set
restoring blocks of datafile 00012
channel ORA_DISK_1: reading from backup piece /home/oracle/rmanbk/db0_ORCL_20200315_54
channel ORA_DISK_1: piece handle=/home/oracle/rmanbk/db0_ORCL_20200315_54 tag=DB0
channel ORA_DISK_1: restored block(s) from backup piece 1
channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

starting media recovery
media recovery complete, elapsed time: 00:00:03

Finished recover at 15-MAR-20

1.1.8实验–自动增量脚本备份数据库

库路径下创建脚本
touch backuplevel0.sh
touch backuplevel1.sh

赋予文件可执行权限(root)
chmod 777 backuplevel0.sh
chmod 777 backuplevel1.sh

编辑脚本
vi backuplevel0.sh
vi backuplevel1.sh

1级增量备份的脚本:
#!/bin/bash
# script.:bakuplevel0.sh
# creater:liu shiming
# date:2020/3/15
# desc:backup level0 database datafile in archive with rman
# connect database
export ORACLE_BASE=/dat/DBSoftware/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=SHIDA
export PATH=$ORACLE_HOME/bin:$PATH
rman target sys/shida << EOF_RMAN
run{
allocate channel c1 type disk;
backup incremental level 1 tag 'db1' format '/home/oracle/rmanbk/db1_%d_%T_%s' database include current controlfile;
sql'alter system archive log current';
backup filesperset 3 format '/home/oracle/rmanbk/arch1_%d_%T_%s' archivelog all delete input;
release channel c1;
}
# end

------

0级增量备份的脚本:
#!/bin/bash
# script.:bakuplevel0.sh
# creater:lilianhong
# date:2020/3/15
# desc:backup level0 database datafile in archive with rman
# connect database
export ORACLE_BASE=/dat/DBSoftware/oracle
export ORACLE_HOME=$ORACLE_BASE/product/11.2.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
rman target sys/123456 << EOF_RMAN
run{
allocate channel c1 type disk;
backup incremental level 1 tag 'db0' format '/home/oracle/rmanbk/db0_%d_%T_%s' database include current controlfile;
sql'alter system archive log current';
backup filesperset 3 format '/dat/bak/arch0_%d_%T_%s' archivelog all delete input; # 每三个归档日志作为一个备份片备份
release channel c1;
}
# end

执行脚本进行测试
./backuplevel0.sh
./backuplevel1.sh

sqlplus下创建job:

begin
dbms_scheduler.create_job(
job_name=>'shida_job00', #自定义,脚本名
job_type=>'executable',
job_action=>'/dat/DBData/orcl/backuplevel0.sh', #脚本路径
repeat_interval=>'freq=weekly;byday=SUN,WED;byhour=15;byminute=04');
end;
/

启用job:
SQL> exec dbms_scheduler.enable(‘shida_job00’);

补充:

运行job
SQL> exec dbms_scheduler.run_job(‘shida_job00’);
使job失效:
SQL> exec dbms_scheduler.disable(‘shida_job0’);
删除job
SQL> exec dbms_scheduler.drop_job(‘shida_job0’);
与job相关的数据字典:
DBA_SCHEDULER_JOBS;

查看备份路径是否备份成功
cd /home/oracle/rmanbk/
ll

如何进行增量备份

模拟日志文件完好无损,丢失所有的控制文件及一个或多个数据文件

在不同的路径下还原数据库

基于时间点/SCN/sequence不完全恢复

基于坏块的恢复

配置自动增量备份

1.1.9RMAN的好处

2020-03-15-Oracle_RMAN2_第12张图片
1.RMAN会检测和报告损坏的数据块
2.不需要将表空间置于热备份模式
3.RMAN会自动跟踪新的数据文件和表空间
4.RMAN能备份使用过的数据块
5.RMAN提供备份映像的实际压缩
6.RMAN支持增量备份
7.RMAN提供自动且方便的备份和恢复操作
8.可以使用RMAN来测试备份而不需要实际还原它们

1.1.9RMAN维护命令

列出可用备份;
RMAN>list backup summary;

按照备份类型列出备份
list backup by file;

列出常用的备份信息
list backup;

列出恢复的备份
list recoverable backup

列出过期的备份
list expired backup;

验证归档日志
crosscheck archivelog all;
delete expired archivelog all;

存在于磁盘介质中,但是过期了
crosscheck backup;
delete expired backup;

找出不存在于磁盘介质中,控制文件中还有记录的备份文件
report obsolete;

补充
2020-03-15-Oracle_RMAN2_第13张图片
备份失败
将不存在的归档日志记录从control file中清楚掉,否则备份数据库时,备份会失败
crosscheck archivelog all;
delete expired archivelog all;

报告数据库模式
report schema

在这里插入图片描述

1.2闪回

1.2.1闪回简介

2020-03-15-Oracle_RMAN2_第14张图片

1.2.2闪回参数

能闪回到过去多长时间
show parameter db_flashback_retention_target;
默认分钟1440,24小时

1.2.3闪回开启

确认闪回是否开启
select FLASHBACK_ON from v$database;

开启闪回
mount
alter database flashback on;
alter database open;

※ 开启后
闪回恢复区下多一个闪回日志,
该日志受参数db_flashback_retention_target;制约;

查看scn号的另一种方式
在这里插入图片描述

1.2.3闪回语法

闪回数据库语法:flashback database to scn 1227661;

闪回表语法:SQL> flashback table mytest2 to scn 1404479;
事先要启动行移动:SQL> alter table mytest2 enable row movement;

1.2.3闪回删除

不适用于系统表空间
2020-03-15-Oracle_RMAN2_第15张图片
与回收站相关的视图
2020-03-15-Oracle_RMAN2_第16张图片
2020-03-15-Oracle_RMAN2_第17张图片
2020-03-15-Oracle_RMAN2_第18张图片

1.2.4闪回查询

应用场景:
一个人删除数据,不确定删没删错
想确认删除之前的表里的数据
select * from mytest as of scn 128726;
create table d as select * from mytest as of scn 128726;

你可能感兴趣的:(oracle)