--RMAN
--某个时间段备份失败的记录
SELECT * FROM V$RMAN_STATUS
WHERE START_TIME >= TO_DATE(&START_TIME, 'YYYY-MM-DD HH24:MI:SS')
AND END_TIME <= TO_DATE(&END_TIME, 'YYYY-MM-DD HH24:MI:SS')
AND OPERATION = 'BACKUP'
AND STATUS != 'COMPLETED'
AND STATUS NOT LIKE 'RUNNING%';
--查询坏块(11g开始)
--先执行
run {
allocate channel c1 device type disk;
allocate channel c2 device type disk;
allocate channel c3 device type disk;
allocate channel c4 device type disk;
allocate channel c5 device type disk;
validate database;
}
--再执行
select * from v$database_block_corruption;
--RMAN-COMMAND
1.进入rman
2.rman基础命令
3.rman基本备份命令
4.rman其他命令
5.rman实战
6.rman恢复
--1.进入rman
--(1)进入本地数据库
rman target /
--(2)进入远程数据库
rman target hk/hk@hking
--(3)使用日志功能
rman target / msglog /data/backup/logs/full_dbbackup_`date +%y%m%d`.log
--2.rman基础命令
--(1)启动关闭数据库
RMAN> shutdown immediate
RMAN> startup
--(2)执行操作系统命令
RMAN> host
--(3)执行SQL语句
RMAN> SQL 'ALTER SYSTEM SWITCH LOGFILE';
--需要注意的一点是,rman中的sql环境不能执行SELECT语句,就算执行不报错,也不出结果
--(4)查看默认RMAN配置
RMAN>show all;
CONFIGURE RETENTION POLICY TO REDUNDANCY 1; # default --设置的保留策略冗余度为1
CONFIGURE BACKUP OPTIMIZATION OFF; # default --备份优化为off
CONFIGURE DEFAULT DEVICE TYPE TO DISK; # default --默认的配置通道为磁盘,如果是sbt就为磁带设备
CONFIGURE CONTROLFILE AUTOBACKUP OFF; # default --默认配置controlfile不自动备份
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '%F'; # default --controlfile自动备份的位置
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET; # default --备份类型为backupset,备份类型的并行度为1
CONFIGURE DATAFILE BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default --数据文件备份的拷贝为1
CONFIGURE ARCHIVELOG BACKUP COPIES FOR DEVICE TYPE DISK TO 1; # default --归档日志文件备份的拷贝为1
CONFIGURE MAXSETSIZE TO UNLIMITED; # default --备份集大小不设上限
CONFIGURE ENCRYPTION FOR DATABASE OFF; # default --数据库加密技术为off
CONFIGURE ENCRYPTION ALGORITHM 'AES128'; # default --数据库加密算法'AES128'
CONFIGURE ARCHIVELOG DELETION POLICY TO NONE; # default --归档日志的删除策略为NONE
CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/data/ora11g/product/11.2.0/db_1/dbs/snapcf_zsddb.f'; # default --controlfile的快照命名为'/data/ora11g/product/11.2.0/db_1/dbs/snapcf_zsddb.f'
--(5)修改默认RMAN参数设置
CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 7 DAYS;
CONFIGURE CONTROLFILE AUTOBACKUP ON;
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/data/backup/rman/con_%F';
--Or
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/back/ctl_%F';
--3.rman基本备份命令
--(1)对数据库进行备份
--备份数据库
RMAN>BACKUP DATABASE;
--注意:也可以指定备份的位置:
RMAN> BACKUP DATABASE FORMAT '/data/backup/rman/bak_%U';
--list命令查看刚刚创建的备份信息:
RMAN>list backup of database;
--(2)对表空间进行备份
--备份表空间
RMAN>backup tablespace HKING;
--通过LIST BACKUP 查看一下备份
RMAN>list backup of TABLESPACE HKING;
--(3)备份指定数据文件
--查看对应的数据文件及其序号
select file_name,file_id,tablespace_name from dba_data_files;
--再通过BACKUP DATAFILE备份指定序号的数据文件
RMAN> BACKUP DATAFILE n;
--通过list backup查看备份
RMAN> LIST BACKUP OF DATAFILE n;
--(4)备份控制文件
--第一种,做任何备份的时候,自动备份控制文件
RMAN> CONFIGURE CONTROLFILE AUTOBACKUP ON;
--第二种,手动执行控制文件备份
RMAN> BACKUP CURRENT CONTROLFILE;
--第三种,执行BACKUP时指定INCLUDE CURRENT CONTROLFILE参数
RMAN> BACKUP DATABASE INCLUDE CURRENT CONTROLFILE;
--查看备份的控制文件
RMAN> LIST BACKUP OF CONTROLFILE;
--使用alter database backup controlfile备份控制文件
SQL> alter database backup controlfile to trace;
--Or
--SQL> alter database backup controlfile to trace as '/data/controlfile1.cof';
--(这样可以查看controlfile的构成)
--(5)备份归档日志文件
--利用BACKUP ARCHIVELOG命令备份
RMAN> BACKUP ARCHIVELOG ALL;
--BACKUP过程中利用PLUS ARCHIVELOG参数备份
RMAN> BACKUP DATABASE PLUS ARCHIVELOG;
--备份安全流程(推荐)
--1>.运行ALTER SYSTEM ARCHIVE LOG CURRENT语句对当前redolog进行归档
--2>.执行BACKUP ARCHIVELOG ALL命令备份所有已归档日志
--3>.执行BACKUP命令对指定项进行备份
--4>.再次运行ALTER SYSTEM ARCHIVE LOG CURRENT对当前redolog归档
--5>.对新生成的尚未备份的归档文件进行备份
run{
allocalte channel ch1 type disk;
sql ‘alter system archive log current’;
backup as compressed backupset database format ‘/u02/rman/testdb_%T_%U’;
sql ‘alter system archive log current’;
backup as compressed backupset archivelog all format ‘/u02/rman/testarc_%T_%U’;
backup current controlfile format ‘/u02/rman/testcon_%T_%U’;
release channel ch1;
}
--查看已备份的归档日志片段
RMAN> LIST BACKUP OF ARCHIVELOG ALL;
--4.rman其他命令
--删除命令
--删除过期备份(RMAN会根据冗余策略确定备份是否过期)
RMAN> delete obsolete;
--删除无效备份(通过CROSSCHECK命令核对备份集,如果发现备份无效,rman会将该备份集标记为EXPIRED状态)
RMAN> delete expired backup;
--删除特定备份集(通过list backup选择你所要删除的备份集)
RMAN> delete backupset 12;
--删除特定备份片
RMAN> delete backuppiece '/data/backup/zsd_bk.bak';
--删除所有备份集
RMAN> delete backup;
--删除归档目录中已备份的归档日志
RMAN> backup archivelog all delete input;
RMAN> backup as compressed backupset archivelog all filesperset 6 format '/back/arch_%U_%d_%T' delete input;
--report命令
--主要是用于当前备份信息的分析,如哪些备份已经过期,哪些文件该备份,哪些备份不可用,哪些备份可以删除
--查看过期备份
RMAN>report obsolete;
--crosscheck命令
--用来检查备份或归档物理文件的状态,如果物理文件存在,并且控制文件(或恢复目录)中有匹配记录,则标记该对象的状态为available(有效), 如果文件已经不存在,则标记该对象为expired(无效)
--检查所有归档文件
RMAN>crosscheck archivelog all;
--检查所有备份集:
RMAN>crosscheck backup;
--rman validate命令
--RMAN能够检测物理和逻辑错误。validate命令帮助保证备份文件存在于合适的位置,可读取,并且没有逻辑及物理错误
--测试任一特定备份集
RMAN>validate backupset 9;
--测试整个数据库和归档日志备份集
RMAN>backup validate database archivelog all;
--提示:
--监控和验证RMAN作业
--V$RMAN_STATUS视图显示所有完成作业的状态以及命令
select operation,status,start_time,end_time from v$rman_status;
--V$SESSION_LOGGOPS视图上查询估计备份的进度
set line 333
col OPNAME for a30
select opname,to_char(start_time,'DD-MON-YY HH24:MI') "Start of backup",Sofar,totalwork,elapsed_seconds/60 "ELAPSED TIME IN MINUTES",ROUND(sofar/totalwork*100,2) "Percentage Completed" from v$session_longops;
--rman下对数据文件重命名
run{
sql 'alter tablespace hking offline';
set newname for datafile '/u01/app/oracle/oradata/hking.dbf' to '/u01/app/oracle/oradata/hking01.dbf';
restore tablespace hking;
switch datafile all;
recover tablespace hking;
sql 'alter tablespace hking online';
}
--rman下对数据文件移动
run{
sql 'alter tablespace hking offline';
set newname for datafile '/u01/app/oracle/oradata/hking01.dbf' to '/u01/app/oracle/oradata/dbtest/hking01.dbf';
restore tablespace hking;
switch datafile all;
recover tablespace hking;
sql 'alter tablespace hking online';
}
--5.rman实战
--以下是一个实战的rman备份脚本
BACKUP AS COMPRESSED BACKUPSET
SKIP INACCESSIBLE FILESPERSET 10 DATABASE PLUS ARCHIVELOG FILESPERSET 20
DELETE ALL INPUT;
--其中 COMPRESSED: --表示压缩的备份
SKIP INACCESSIBLE:--表示跳过不可读的文件。我们知道一些offline的数据文件只要存在于磁盘上就仍然可被读取,但是可能有些文件已经被删除或移到它处造成不可读,加上这个参数就会跳过这些文件;
FILESPERSET 10: --表示一个备份集中有多少个文件,这个就是一个备份集有10个文件
--备份参考样例
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
crosscheck backup;
crosscheck archivelog all;
backup full database filesperset 5 format '/nfs/NCICASH/backup/full_%u_%d_%T';
sql 'alter system archive log current';
backup archivelog all format '/nfs/NCICASH/backup/arch_%u_%d_%T' ;
backup current controlfile format '/nfs/NCICASH/backup/ctl_%u_%d_%T';
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}
--rman恢复:
--明确两个概念:数据库修复(Restore)和数据库恢复(Recover)
--restore:是指利用备份集的数据文件来替换已经损坏的数据库文件或者将其恢复到一个新的位置
--recover:是指应用所有重做日志,将数据库恢复到崩溃前的状态,或者应用部分redo,将数据库恢复到指定的时间点.(前提是:所有重做日志文件都在,包括在线和归档的)
--restore 命令:用于还原已经备份的数据文件
(1)、restore database --还原所有的数据文件。
(2)、restore tablespace --还原特定表空间的数据文件。
(3)、restore datafile --还原特定的数据文件。
(4)、restore controlfile --还原控制文件。
(5)、restore archivelog --还原归档日志文件。
--recover 命令:当数据库需要应用归档日志文件恢复数据文件时,使用recover命令。使用该命令数据库系统会自动应用归档的日志文件
(1)、recover database --恢复所有的数据文件。
(2)、recover tablespace --恢复特定表空间的数据文件。
(3)、recover datafile --恢复特定的数据文件。
--Restore&Recover
--1.目标库恢复控制文件
rman target /
run {
allocate channel ch1 type disk;
restore controlfile from ' /nfs/NCICASH/backup/ctl_das1i6ah_NCICASH_20170413';
sql 'alter database mount';
release channel ch1;
}
--2.从源端上拷贝密码文件到目标端2个节点(注意改名)
--修改目标库redo文件路径,此时控制文件记录的路径是错误的
--查询当前控制文件redo路径
select member from v$logfile;
--修改目标库redo文件路径
alter database rename file '+ATS_DATAFILE/ncicash/onlinelog/group_30.433.824588383' to '+dgdata/NCICASH/onlinelog/group_30.433.824588383';
alter database rename file '+ATS_ARCHIVE/ncicash/onlinelog/group_30.1709.824588389' to '+dgdata/NCICASH/onlinelog/group_30.1709.824588389';
......
alter database rename file '+ATS_ARCHIVE/ncicash/onlinelog/group_8.3386.928788171' to '+dgdata/NCICASH/onlinelog/group_8.3386.928788171';
--3.在目标端服务器上恢复数据库数据文件
--目标端执行
--更改控制文件中数据库文件的路径
--Restore脚本
vi rmanrestore.sh
#!/bin/bash
. /home/oracle/.profile
export ORACLE_SID=zjquery1
echo "******Begin Restore*****";
date
rman target / <<EOF
run {
allocate channel ch1 type disk;
allocate channel ch2 type disk;
allocate channel ch3 type disk;
allocate channel ch4 type disk;
allocate channel ch5 type disk;
set newname for datafile '+ATS_DATAFILE/ncicash/datafile/system.259.749440021' to '+dgdata/NCICASH/datafile/system.259.749440021';
set newname for datafile '+ATS_DATAFILE/ncicash/datafile/sysaux.260.749440027' to '+dgdata/NCICASH/datafile/sysaux.260.749440027';
set newname for datafile '+ATS_DATAFILE/ncicash/datafile/undotbs1.261.749440031' to '+dgdata/NCICASH/datafile/undotbs1.261.749440031';
set newname for datafile '+ATS_DATAFILE/ncicash/datafile/undotbs2.263.749440049' to '+dgdata/NCICASH/datafile/undotbs2.263.749440049';
set newname for datafile '+ATS_DATAFILE/ncicash/datafile/users.264.749440049' to '+dgdata/NCICASH/datafile/users.264.749440049';
set newname for datafile '+ATS_DATAFILE/ats002_1.dbf' to '+dgdata/NCICASH/datafile/ats002_1.dbf';
.......
set newname for datafile '+ATS_DATAFILE/bizsystem_01.dbf' to '+dgdata/NCICASH/datafile/bizsystem_01.dbf';
set newname for datafile '+ATS_INDEX/atsindexes_1.dbf' to '+dgdata/NCICASH/datafile/atsindexes_1.dbf';
.......
set newname for datafile '+ATS_DATAFILE/ats002_21.dbf' to '+dgdata/NCICASH/datafile/ats002_21.dbf';
.......
set newname for tempfile '+ATS_DATAFILE/atstemp.dbf' to '+dgdata/NCICASH/datafile/atstemp.dbf';
set newname for tempfile '+ATS_DATAFILE/biztemp.dbf' to '+dgdata/NCICASH/datafile/biztemp.dbf';
set newname for tempfile '+ATS_DATAFILE/temp02.dbf' to '+dgdata/NCICASH/datafile/temp02.dbf';
set newname for tempfile '+ATS_DATAFILE/bmcdata_tmp.dbf' to '+dgdata/NCICASH/datafile/bmcdata_tmp.dbf';
restore database;
switch datafile all;
switch tempfile all;
release channel ch1;
release channel ch2;
release channel ch3;
release channel ch4;
release channel ch5;
}
exit;
EOF
echo "******End Restore******";date
--运行脚本:
nohup sh /home/oracle/scripts/rmanrestore.sh >/home/oracle/scripts/rmanrestore.log &
--4.目标库追归档
--备份源端新生成的归档
run
{
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
allocate channel c4 type disk;
allocate channel c5 type disk;
crosscheck archivelog all;
sql 'alter system archive log current';
backup archivelog all format '/nfs/NCICASH/backup/arch_%u_%d_%T' ;
release channel c1;
release channel c2;
release channel c3;
release channel c4;
release channel c5;
}
--如果源端的归档也在nfs上,就不需要进行归档备份了
--目标库直接注册归档路径进行恢复
catalog start with '/nfs/NCICASH/archive';
--目标端恢复:
rman target /
run {
allocate channel c1 type disk;
allocate channel c2 type disk;
allocate channel c3 type disk;
recover database;
release channel c1;
release channel c2;
release channel c3;
}
--1.对数据库进行完全介质恢复
--(1)启动数据库到加载状态:
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
--(2)执行恢复操作
RMAN> RESTORE DATABASE;
RMAN> RECOVER DATABASE DELETE ARCHIVELOGS SKIP TABLESPACE TEMP;
--注意:DELETE ARCHIVELOGS和SKIP TABLESPACE两个参数是可选择的,作用如下:
--DELETE ARCHIVELOGS:表示RMAN将在完成恢复过程后自动删除那些在恢复过程中修复的归档日志文件。
--SKIP TABLESPACE:跳过指定表空间,比如临时表,当然临时表空间即使你不跳过它也不会恢复的。
--(3)打开数据库
RMAN> ALTER DATABASE OPEN;
--2.恢复表空间
--(1)启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
--(2)进行恢复操作
RMAN> SQL 'ALTER TABLESPACE HDMEMBER OFFLINE IMMEDIATE';
RMAN> RESTORE TABLESPACE HDMEMBER;
RMAN> RECOVER TABLESPACE HDMEMBER;
RMAN> SQL 'ALTER TABLESPACE HDMEMBER ONLINE';
--(3)打开数据库
RMAN> ALTER DATABASE OPEN;
--3.恢复数据文件
--(1)启动数据库到加载状态
RMAN> SHUTDOWN IMMEDIATE;
RMAN> STARTUP MOUNT;
--(2)进行恢复操作
RMAN>SQL 'ALTER DATABASE DATAFILE 5 OFFLINE';
RMAN> RESTORE DATAFILE 5;
RMAN> RECOVER DATAFILE 5;
RMAN>SQL 'ALTER DATABASE DATAFILE 5 ONLINE';
--(3)打开数据库
RMAN> ALTER DATABASE OPEN;
--提示:查询对应的数据文件,表空间和数据文件序号:
--附个SQL:用来查询数据文件,临时文件与表空间对应及数据文件序号:
set linesize 333;
col FILE_NAME for a35
select ts.tablespace_name, df.file_name, df.file_id, tf.file_name
from dba_tablespaces ts, dba_data_files df, dba_temp_files tf
where ts.tablespace_name = df.tablespace_name(+)
and ts.tablespace_name = tf.tablespace_name(+);
--示例:归档模式下,假设某数据文件丢失,恢复该数据文件
--1.造假数据
sqlplus /nolog
conn member/member
create table zsd(name varchar2(50));
insert into zsd values ('test1');
insert into zsd values ('test2');
insert into zsd values ('test3');
--2.关闭,删除文件,启动数据库
SQL> conn / as sysdba
SQL> shutdown immediate;
SQL> host
[oracle@oracle-n1 ~]$ rm -rf /data/ora11g/oradata/zsddb/hdmember01.dbf
SQL> startup
SQL> archive log list;
--3.查看一下示例,并恢复数据库
select instance_name,status from v$instance;
set oracle_sid=zsddb
rman target /
RMAN> restore datafile '/data/ora11g/oradata/zsddb/hdmember01.dbf';
RMAN> recover datafile '/data/ora11g/oradata/zsddb/hdmember01.dbf';
RMAN> alter database open;
--示例:丢失控制文件的恢复
SQL> shutdown immediate;
[oracle@oracle-n1 ~]$ rm -rf /data/ora11g/oradata/zsddb/control*
--进入rman
rman target /
--随意指定一个DBID
RMAN> set dbid 3391142503;
RMAN> restore controlfile from '/data/ora11g/product/11.2.0/db_1/dbs/con_c-1552557445-20130520-06';
RMAN> sql 'alter database mount';
RMAN> restore database;
RMAN> recover database;
RMAN> sql 'alter database open resetlogs';
--(还必须重建临时表空间)