现在的位置: 首页 > 综合 > 正文

利用RMAN备份恢复ORACLE数据

2013年08月21日 ⁄ 综合 ⁄ 共 6981字 ⁄ 字号 评论关闭

备份数据库
1.nocatalog:rman target /
report schema;显示schema结构

查看数据库是否为归档模式
archive log list;
只有在归档模式下才可以执行下面的操作
shutdown immediate
数据库起动到mount状态
startup mount
修改数据库到归档模式
alter database archivelog;
alter database open;

切归档日志,每切一次,自动生成一个日志文件
alter system switch logfile;
select name  from v$archived_log;

rman target /
备份表空间文件
backup as backupset format '$HOME/bak/%s.%p'   --目标文件(文件名.序号)
datafile 33,34                    --表空间文件ID号

备份表空间
backup as backupset format '$HOME/bak/%s.%p'
tablespace tr_data,tr_indx

备份数据库
backup as backupset format '$HOME/bak/%s.%p'
database xxxxx

修改并发3个进程
configure device type disk parallelism 3;
设置冗余度:保留几个备份文件
configer retention policy to redundancy 2;

delete obsolete;  删除以前过期的

映象备份:备份的文件与原文件大小一样
copy datafile 33 to 'file.bak';

压缩备份

以上备份结果在服务器端
备份结果信息在服务器的控制文件里
$oracle_home/bin/rman.exe
显示做过的RMAN操作
RMAN>list copy of database
RMAN>list backup of database
sql>select * from v$backup_set;
sql>select table_name from dict where table_name like '%COPY%';
sql>select table_name from dict where table_name like '%BACKUP%';
显示配置
RMAN>show all;

在catalog下,把PX02数据放到px01(必须在不同的数据库下执行)
catalog db:px02(script,backup information)
target db:px01
px02:
1,create tablespace rman_ts 30M
2,create user rman
3,grant role-->rman:connect,resource,recovery_catalog_owner
4,conn rman
5,create table,view.....(catalog恢复目录,包括所有数据库对象)
6,register px01-->catalog
7,create backup scripts
8.run scripts

具体操作过程PX02
查看表空间文件
select file_name from dba_data_files;
创建表空间
create tablespace rman_ts datafile 'file' size 30m;
创建用户
create user rman identified by rman
default tablespace rman_ts
temporary tablespace temp
quota unlimited on rman_ts;
授权
grant connect,resource,recovery_catalog_owner to rman;
接到rman
conn rman/rman
查看rman下的表
select table_name from user_tables;

d:/>rman target sys/sys@px01(源) catalog rman/rman@px02(目标)
rman>create catalog;  只是创建了表结构,没有数据
rman>register database;
连到PX02查表,视图... 数据信息
px02:conn rman>rman

做脚本,备份PX01的数据文件33,34和控制文件
d:/>rman target sys/sys@px01 catalog rman/rman@px02
RMAN>create script zr1{
backup format '$home/bak/%s.%p'
datafile 33,34;   --备份指定数据文件(用文件ID号)
backup format '$home/bak/%s.%p'
database;   --备份整个数据库(不包括临时表空间)
backup format '$home/bak/%s.%p'
current controlfile; --备份控制文件
backup format '$home/bak/%s.%p'
spfile;     --备份spfile
archivelog all delete all input;--删除以前的所有归档日志
delete obsolete;--删除过期的备份文件
}
print script zr1;
conn rman/rman@px02;
desc rc_stored_script;
select DB_NAME,SCRIPT_NAME FROM rc_stored_script;
查看建的脚本
select text from rc_stored_script_line
where script_name='zr1'
order by line;
执行脚本
rman>run {
execut script zr1;
}
查看归档日志
select name from archived_log;
select name from v$archived_log
备份级别
0:全量
rman>backup incremental level 0 datafile 33;
1:增量
rman>backup incremental level 1 datafile 33;
1c:1级累积备份
rman>backup incremental level 1 cumulative datafile 33;

文件冗余备份少于2个
rman>report need backup redundancy 2;
删除备份文件
rman>delete backupset 4181

rman>backup as copy datafile 33 format
如果物理删除了备份文件,用下面的方法删除备份文件
检查RMAN备份文件
crosscheck datafilecopy all;
delete datafilecopy 5852

查看备份进程
SELECT sid, spid, client_info
FROM v$process p, v$session s
WHERE p.addr = s.paddr
AND client_info LIKE '%id=rman_zr%';
查看备份进度
SELECT sid, serial#, context, sofar, totalwork,
 round(sofar/totalwork*100,2) "% Complete"
  FROM V$SESSION_LONGOPS
  WHERE opname LIKE 'RMAN_ZR:%'
  AND opname NOT LIKE 'RMAN_ZR: aggregate%'
        AND totalwork != 0;

恢复recovery:
completed:archivelog(必须在归档模式下恢复)
non-completed:noarchivelog(冷备的,只能恢复到上次备份时间点),
              archivelog(热备,可人为控制)
数据文件损坏:完全恢复(除了system,sysaux,temp,undo)
单个数据文件坏了,
1,restore datafile backup(offline)
2.recover datafile
3.datafile onlie

全部数据文件损坏,完全恢复数据库
1.mount
2.copy all datafile backup
3.recover database
4.open db
具体操作过程:
PX01(server):FIN(tablespace)
1.backup datafile 11;
2.select * from v$log;(数据都要放到日志文件里)4
3,
SQL> conn / as sysdba
建表
SQL> create table zr(a int) tablespace fin ;
SQL> insert into zr values(1);
SQL> commit;
SQL> alter system switch logfile;
切日志文件1,里面放的数据是1;
insert into zr values(2);
commit;
alter system switch logfile;
切日志文件2,里面放的数据是2;
insert into zr values(3);
commit;
alter system switch logfile;
切日志文件3,里面放的数据是3;
insert into zr values(4);
commit;
alter system switch logfile;
切日志文件,覆盖日志文件1,里面放的数据是4;
-------------------
删除物理表空间文件,
delete  fin.dbf
rm   /soft/u01/app/oracle/oradata/PX01/fin.dbf
删除物理文件后,查询表,发现数据依然存在,如果重起服务,会出错

把对应的表空间文件脱机
alter database datafile 11 offline;
备份数据
rman target sys/sys@px01 catalog rman/rman@px02
执行恢复
RMAN> run{
2> restore datafile 11;  --用归档日志恢复物理文件
3> recover datafile 11;  --恢复数据库
4> sql 'alter database datafile 11 online';--把表空间文件联机
}

具体操作过程
1.nocatalog backup rman_57
rman target sys/sys@px02
report schema;
backup datafile *;
2.table t57-->rman_57
sqlplus sys/sys@px02
create table t57(a int) tabespace rman_57;
3.insert into t57 values(1);
commit;
4.rm rman_57.dbf
5.restor rman target sys/sys@px02
px02 :open状态
run{
aql 'alter database datafile 8 offline';
restore datafile 8;
recover datafile 8;
}
run{
aql 'alter database rman_57 offline';
restore dataspace rman_57;
recover dataspace rman_57;
sql 'alter tablespace rman_57 online';
}
px02:mount
run{
restore database;
recover database;
alter database open;
}
控制文件或参数文件的恢复
restore spfile to 'file' from autobackup;
nomount状态下
restore controlfile from autobackup;

不完全恢复
8:00 backup
12:00 update data commit;
12:30数据库坏了,要恢复到12:00
1.conn / as sysdba
archive log list 看是否归档模式
修改到归档模式下才能操作
shutdown immediate
startup mount;
alter database archivelog;
alter database open;
2:备份所有数据库文件
3.recover database until time
rman target /
report schema;
show all;
并发度调为3
CONFIGURE RETENTION POLICY TO REDUNDANCY 3;
backup format 'e:/bak/%s.%p' database;

4.修改数据库的数据,并切日志
create table t1(a int) tablespace users;
insert into t1 values(1);
commit;
alter system switch logifle;
insert into t1 values(2);
commit;
alter system switch logifle;
insert into t1 values(3);
commit;
alter system switch logifle;
insert into t1 values(4);
commit;
alter system switch logifle;
insert into t1 values(100);
commit;
alter system switch logifle;

5.backup database
shutdown immediate
startup mount
注册表加一项或环境变量里加下面的项
NLS_DATE_FORMAT='yyyy-MM-dd:HH:mm:ss'
否则下面的程序不认识时间
run{
set until time '2009-02-05:14:41:00';--此时只有前三条记录(1,2,3)
restore database;
recover database;
alter database open resetlogs;--归档日志再从1开始,以前的备份作废
}
8:00  full  backup
8:10   1
8:20   1
8:30   1c
8:50   1
9:00 recover8:50--9:00  archlog 34,35,36+current log
35文件丢失,数据库切到mount
run{
set until sequence 34;
restore database;
recover database;
alter database open resetlogs;
}

current logifle损坏
run{
restore database;
recover database until cancel;
alter database open resetlogs;
}
如果控制文件坏了
alter database backup controlfile to tracke
查看文件跟踪文件路径
show parameter user_du;
重新生成控制文件脚本
alter database backup controlfile to trace;
查看文件跟踪文件路径
show parameter user_dump_dest;
找最近的跟踪文件,里面就有生成控制文件的脚本,copy出来,重新执行一次,即可.
如:
startup nomount

CREATE CONTROLFILE REUSE DATABASE "TEST" NORESETLOGS  ARCHIVELOG
    MAXLOGFILES 16
    MAXLOGMEMBERS 3
    MAXDATAFILES 100
    MAXINSTANCES 8
    MAXLOGHISTORY 292
LOGFILE
  GROUP 1 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/REDO01.LOG'  SIZE
  GROUP 2 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/REDO02.LOG'  SIZE
  GROUP 3 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/REDO03.LOG'  SIZE
-- STANDBY LOGFILE
DATAFILE
  'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSTEM01.DBF',
  'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/UNDOTBS01.DBF',
  'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/SYSAUX01.DBF',
  'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/USERS01.DBF'
CHARACTER SET ZHS16GBK
;

alter database open;

临时表空间文件
在oracle10临时表空间不做临时表空间的备份与恢复
如果物理删除了临时表空间,oracle重起后,发现没有这个文件,系统会自动重建

如果数据库运行时,临时表空间坏了
ALTER TABLESPACE TEMP ADD TEMPFILE 'D:/ORACLE/PRODUCT/10.2.0/ORADATA/TEST/TEMP01.DBF'
     SIZE 20971520  REUSE AUTOEXTEND ON NEXT 655360  MAXSIZE 32767M;
参数文件
如果参数文件丢了,可以通过pfile恢复
create spfile from pfile;

 

抱歉!评论已关闭.