Oracle备份恢复文档
中移通讯工程有限公司
2013年3月
备份数据库建议使用rman备份,对于小库可以使用expdp,exp每天夜间做全备。
计划周六进行全库备份,其它日则备份archive log
一创建rman恢复目录
使用rman之前,最好是先创建rman恢复目录,恢复目录是位于数据库里的一个schema,该schema下面包含多个表、视图、以及存储过程。在恢复目录中存放了RMAN的元数据。恢复目录里的数据就是控制文件中记录的RMAN元数据的副本。 使用恢复目录的好处
1、同一个恢复目录中可以存放多个目标数据库的RMAN元数据
2、恢复目录就是一个schema,可以在表中存放很长的时间,不像控制文件只能存放7天的数据
3、我们可以将一些RMAN备份命令作为脚本,存放在恢复目录中
4、建议将恢复目录单独存放在一个数据库里面,不要与产品数据库放在一起。
创建恢复目录
1、在恢复目录所在的数据库上创建表空间,该表空间用于存放恢复目录所包含的表 2、创建一个用户,作为恢复目录的所有对象的所有者 3、为该用户赋予相应的权限
4、使用RMAN命令创建恢复目录
5、使用RMAN连接目标数据库和恢复目录数据库,将目标数据库注册到恢复目录中
sqlplus system/...@cat (cat(tnsnames.ora))
创建rman备份恢复信息目录需要的表空间. sql>create tablespacerman_ts
datafile '/data/oradata/ORACLE_SID/rman01.dbf' size200M;
创建rman用户:
sql>create user rman identified by rman defaulttablespacerman_ts;
sql>grant connect,resource,recovery_catalog_owner to rman;
rman catalog rcat_owner/rcat_owner@cat rman>create catalog; quit
rman catalog rcat_owner/rcat_owner@cat target sys/oracle@10g
rman>register database; rman>report schema; rman>show all;
rman>configure controlfileautobackup on; 在数据文件备份之后,控制文件和spfile 被自动备份.
rman>configure retention policy to redundancy 2; or
rman>configure retention policy to recovery window of 8 days;
rman>configure channel device type disk maxpiecesize 300M; 配置每个备份片的大小 (可建立多个备份片) rman>configure backup optimization on; 跳过完全相同的备份(如果已存在备份)
如果恢复目录所在的数据库损坏,则无法访问RMAN元数据,也就无法进行备份恢复工作。因此对恢复目录所在的数据库也要进行备份。
只有在发生了备份恢复以后,恢复目录所在的数据库里的数据才会发生变化。,不建议再次对恢复目录启用RMAN备份。
一般建议采用导出(exp/expdp)的方式对恢复目录进行逻辑备份。 完成目标数据库的备份恢复以后,将恢复目录导出,生成导出文件。
rcat_owner用户备份
1.创建expdp需要的目录
create directory my_dir_dump as '/u01/oracle/backup'; grantread,write on direcotry dump to rman;
2.逻辑备份rcat_owner脚本
在/home/oracle/dbbackup/rman目录下创建dbexpdp.sh文件,内容如下: dbexpdp.sh文件内容 #!/bin/bash
# database backup WEEK=`date +%w`
if [ -r /home/oracle/dbbackup/rman ]; then cd /home/oracle/dbbackup/rman else
mkdir–p /home/oracle/dbbackup/rman
fi
expdp rman/rman directory=my_dir_dump
dumpfile=rman${week}.dmp>>/home/oracle/dbbackup/rman/expdp.log
3.添加计划任务,凌晨4点开始备份rman用户 编辑crontab(命令是crontab -e),增加
00 04 * * * su - oracle –c\"/home/oracle/dbbackup//rman/dbexpdp.sh\"
rman用户恢复
找到最新的rman最新的备份,执行下面的命令恢复:
Impdp rman/rman directory=my_dir_dumpdump file=rman_5.dmp >> /u01/dbbackup/rman/impdp.log
二 备份脚本
1) startrman.sh
# DefineEnv variables
ORACLE_SID=ORA_SID; export ORACLE_SID
ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/oracle/product/10.2.0/db_1;export ORACLE_HOME
PATH=/usr/kerberos/bin:/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/oracle/bin:/u01/app/oracle/oracle/product/10.2.0/db_1/bin; export PATH
SH_HOME=/home/oracle export SH_HOME
DATE=`date +%Y%m%d` week=`date +\"%w\"`
# Confirm whether the oracle is running
ps -ef |grep dbw0_$ORACLE_SID |grep -v grep>> /dev/null
# Begin backup
if [ $? -eq0 ] ; then if [ $week = \"6\" ]; then
rman target / @$SH_HOME/fullbackup.sql log=$SH_HOME/logs/rmanfullback_$DATE.log else
rman target / @$SH_HOME/archbackup.sql log=$SH_HOME/logs/archback_$DATE.log
fi fi
2)fullbackup.sql
run {
backup full tag '备份数据库名' database include current controlfile
format '/data/oradata/backup/ora_sid_full_bak_%d_%T_%s' plus archivelog
format '/data/oradata/backup/ora_sid_arch_bak_%d_%T_%s' delete all input;
deletenoprompt obsolete; }
3)archbackup.sql
run {
backup archivelog all
format '/data/oradata/backup/ora_sid_arch_bak_%d_%T_%s' delete all input; }
4) RMAN的备份保留策略
根据业务需要来定。如:CONFIGURE RETENTION POLICY TO REDUNDANCY 3
三 数据库恢复
数据库参数文件,控制文件,数据文件(非系统表空间,undo),系统表空间,undo表空间损坏,归档日志丢失的恢复。
1)参数文件丢失的恢复
控制文件和spfile所在的备份集位于闪回恢复区,该区域的文件名是随机生成的,因此,要从其中恢复spfile,必须仔细找到spfile所在的最新备份集。因为没有从控制文件中得到备份信息,因此需要手工的寻找spfile所在 备份集的名字。
一般控制文件和spfile都在一个备份集中,而且文件比较小,一般在10M以下。找到备份集以后,执行命令进行恢复。
具体流程就是
1、寻找spfile和控制文件所在的备份集,然后恢复出来。
rman>restore spfile to ‘/u01/backup/spfileoorcl11g.ora’ from ‘/u01/app/oracle/flash_recover_area/ORACLE11G/backupset/2013_03_27/ol_mf_mns…bkp’;
如果没有指定spfile的恢复路径,默认恢复到$ORACLE_HOME/dbs目录中去.
2) 控制文件恢复
还原控制文件和spfile的步骤都是一样的 1、找到spfile所在的路径 2、找到文件所在的备份集
3、使用命令restore spfile from ‘备份集的路径名称’
4、使用命令restore controlfile from ‘备份集的路径名称’
rman>restore controlfileto ‘/u01/backup/control01.ctl’ from ‘/u01/app/oracle/flash_recover_area/ORACLE11G/backupset/2013_03_27/ol_mf_mns…bkp’;
分为几种情况
1、启用了自动备份控制文件,而且备份集位于闪回恢复区
随便找一个ora参数文件将数据库启动到nomount状态,因为闪回恢复区的文件名字是数据库自己管理的,因此我们只能尝试着使用每一个备份片,使用restore进行恢复尝试。
2、启用了自动备份控制文件,且备份集位于不同的指定路径中,那么备份集的名字和路径一定是按照我们指定的format参数来命名的。 我们直接可以使用下面的命令进行恢复
Rman>configure controlfileautobackup format for device disk to ‘/u01/backup/control/%F’;
获得dbid的方式有两种
1、通过自动备份控制文件的名字获得
2、通过mount数据库以后的select dbid from v$database
setdbid=1209353873 run{
setcontrolfileautobackup format for device type disk to ‘/u01/backup/control/%F’;
restorespfile from autobackup; }
run{
setcontrolfileautobackup format for device type disk to ‘/u01/backup/control/%F’;
restorecontrolfile from autobackup; }
restorespfile to pfile ‘/u01/initoraclr10g.ora’ from autobackup; //将spfile还原出来,然后转换成为pfile
3、没有启用自动备份控制文件
如果没有启用自动备份控制文件,那么每次备份1号数据文件的时候,都会强制备份控制文件和spfile,因此还是需要找到备份片,然后使用restore进行还原。
Rman>restore spfile from ‘/u01/backup/control/07qwjljsad’;
Rman>restore controlfile from ‘/u01/backup/control/07qwjljsad’;
3) 数据文件恢复
数据文件恢复分为非归档模式和归档模式,生产系统必须使用归档模式,所以这里就不介绍非归档模式数据文件的恢复。
1.归档模式下面的完全恢复
前提必须具有自备份以来以来所有的归档日志,如果缺少归档日志文件或者丢失联机重做日志文件,则只能进行不完全恢复,如果丢失控制文件,则需要创建控制文件或者按照前面讲到的从以前的备份中还原控制文件,显然后者更好一些。 一、非系统表空间损坏,而控制文件和联机日志文件没有损坏 例如users表空间损坏. Rman>run{
2>Sql‘alter tablespace users offline immediate’; 3> restore tablespace users; 4> recover tablespace users;
5>sql‘alter tablespaceuesers online’; 6>}
2) 系统表空间损坏,控制文件和联机重做日志文件没有损坏。 只能将数据库启动到mount状态,然后进行恢复。
关闭数据库启动到mount状态 Sql>shutdown immediate; Sql>startup mount;
Rman>run{
2>sql‘alter database datafile 1 offline’; 3>restore datafile 1; 4>recover datafile 1;
5>sql‘alter database datafile online’; 6>}
3) 所有的数据文件丢失,控制文件和联机日志文件没有丢失。 不完全恢复
1、不完全恢复只能在mount下执行
2、必须使用基于数据库的还原,必须还原所有的数据文件 有三种方式
1、基于时间点的恢复
export NLS_DATE_FORMAT=’yyyy-mm-dd hh24:mi:ss’; export NLS_LANG=American
sql>select sysdate from dual;
比如某次系统上线失败,需要恢复数据库到上线前。 rman>run{
2>set until time=”to_date(‘2013-03-27 14:02:30’,’yyyy-mm-dd hh24:mi:ss’)”; 3>restore database; 4>recover database;
5>alter database open resetlogs; 6}
4) 基于日志序列号的不完全恢复 如果一个日志文件损坏,那么经常使用这种恢复方式,恢复一直进行到损坏的日志文件为止。
rman>run{
2> set until sequence 57 thread 1; 3> restore database; 4> recover database;
5> alter database open resetlogs; 6>}
恢复进程应用完56号归档日志文件以后就停止。
基于SCN号,类似于基于时间点的不完全恢复 run{
set until scn 677917; restore database; recover database;
alter database open resetlogs;
}
因篇幅问题不能全部显示,请点此查看更多更全内容