yywx001 发表于 2018-9-13 08:31:37

Oracle中RMAN的备份与恢复笔记

  环境:CentOS6 + Oracle11g
  Linux下先确认输入rman时,执行是那个bash
  find / -name rman (根目录下rman名称的文件)
  su -oracle
  echo $PATH
  vi ./.bash_profile (调整顺序为 PATH=$PATH:$HOME/bin)
  确认为归档模式
  sqlplus /nolog
  conn /as sysdba
  archive log list
  alter system set log_archive_start=true scope=spfile; (设置自动归档)
  nocatalog非目录模式下的备份(备份信息存放在控制文件)
  $ rman nocatalog
  RMAN> connect target /(或者RMAN> connect target sys/samis.com@poli)
  RMAN> list backupset;
  RMAN> backup database;(全备份)
  ----------------------------------------------------------------
  $ cd /u01/oracle/oradata/poli/
  $ strings control01.ctl (查看控制文件内容)
  RMAN> backup incremental level=0 database; (0级备份)
  RMAN> backup incremental level 1 database; (1级备份)
  RMAN> list backupset;
  ----------------------------------------------------------------
  备份归档日记archivelog
  RMAN> backup database plus archivelog delete input;(备份了所有文件,参数/控制/数据/归档,并删除已备份的归档日记文件)
  RMAN> show all;
  RMAN> report schema; (查看表空间)
  RMAN> backup tablespace tbs01
  备份控制文件,两种方式:
  RMAN> backup current controlfile (单独备份)
  RMAN> backup database include current controlfile (备份数据库的时候包含控制文件)
  备份集: backupset
  镜像备份:image copies
  RMAN> report schema; (查看表空间对应的编号)
  RMAN> copy datafile 5 to '/u01/oracle/oradata/poli/tbs01.dbf';
  RMAN> list copy; (查看镜像备份)
  ----------------------------------------------------------------
  单命令
  RMAN> backup database;
  批命令
  RMAN> run {
  allocate channel cha1 type disk;
  backup format "/u01/rmanbak/full_%t"
  tag full_backup_bak
  database;
  release channel cha1;
  }
  %t:备份集时间戳
  %T:年月日格式(YYYYMMDD)
  %d:数据库的名称
  %D:位于该月中的天数(DD)
  %M:位于该月中的月份(MM)
  ----------------------------------------------------------------
  自动备份:备份脚本+crontab
  创建脚本
  $ vi bakl0
  RMAN> run {
  allocate channel c1 type disk;
  backup incremental level 0
  format "/u01/rmanbak/inc0_%u_%T"
  tag monday_inc0
  database;
  release channel cha1;
  }
  $ cp bakl0 bakl1
  $ cp bakl0 bakl2
  $ vi bakl1
  $ rman target / msglog=/u01/rmanbak/bakl0.log cmdfile=/u01/rmanbak/script/bakl0 (可以先测试下)
  $ crontab -e -u oracle
  45 23 * * 0 rman target / msglog=/u01/rmanbak/bakl0.log cmdfile=/u01/rmanbak/script/bakl0 (从右到左,星期/月/日/时/分 23:45分)
  45 23 * * 1 rman target / msglog=/u01/rmanbak/bakl2.log cmdfile=/u01/rmanbak/script/bakl2
  45 23 * * 2 rman target / msglog=/u01/rmanbak/bakl2.log cmdfile=/u01/rmanbak/script/bakl2
  45 23 * * 3 rman target / msglog=/u01/rmanbak/bakl1.log cmdfile=/u01/rmanbak/script/bakl1 (1级)
  45 23 * * 4 rman target / msglog=/u01/rmanbak/bakl2.log cmdfile=/u01/rmanbak/script/bakl2 (2级)
  45 23 * * 5 rman target / msglog=/u01/rmanbak/bakl2.log cmdfile=/u01/rmanbak/script/bakl2
  45 23 * * 6 rman target / msglog=/u01/rmanbak/bakl2.log cmdfile=/u01/rmanbak/script/bakl2
  $ service crond restart (编辑完重启这个服务)
  ----------------------------------------------------------------
  # connected to target database: POLI (DBID=3742422830)
  RMAN> rman target / (记下dbid,以后恢复spfile或者controlfile时候需要)
  RMAN> configure controlfile autobackup on; (自动备份controlfile)
  RMAN> show all;
  RMAN> list backup;
  RMAN> delete backupset 24; (删除备份编号)
  RMAN> backup format '/u01/oracle/rmanbak/full_%T_%u.bak' database plus archivelog;
  以下为相关oracle文件丢失后的恢复(基于以上的备份):
  
  口令文件丢失($ORACLE_HOME/dbs目录(/u01/oracle/dbs)):
  $ orapwd file=orapwpoli password=samis.com entries=5
  ----------------------------------------------------------------
  spfile丢失(/u01/oracle/dbs),改名模拟丢失:
  $ mv spfilepoli sppoli
  $ rman target /
  RMAN> shutdown immediate;
  RMAN> startup nomount;
  RMAN> set dbid 3742422830;
  RMAN> restore spfile from autobackup;
  (如果不行,请手动指定路径
  RMAN> restore spfile from '/u01/flash_recovery_area/POLI/autobackup/2014_01_03/o1_mf_s_835894765_9ddyzfkj_.bkp')
  RMAN> shutdown immediate;
  RMAN> startup; (如果启动失败,请在nomount下指定dbid)
  ----------------------------------------------------------------
  controlfile控制文件丢失(/u01/oradata/poli/):
  $ ls -l
  $ rm *.ctl
  $ rman target /
  $ sqlplus /nolog;
  SQL> conn /as sysdba;
  SQL> shutdown abort;
  $ rman target /;
  RMAN> startup nomount;
  RMAN> restore controlfile from autobackup;
  RMAN> quit
  $ ls -l
  $ rman target /;

  RMAN>>  RMAN> recover database;

  RMAN>>
  #>  ----------------------------------------------------------------
  redolog file 丢失(/u01/oradata/poli/):
  linux下先删除文件,模拟丢失 (注意在sqlplus下进行恢复)
  $ rm *.log
  $ sqlplus /nolog;
  SQL> conn /as sysdba;
  SQL> shutdown immediate;
  SQL> startup mount;
  SQL> recover database until cancel;

  SQL>>  ----------------------------------------------------------------
  datafile 丢失(/u01/oradata/poli/与表空间恢复相似):
  $ rman target /
  RMAN> report schema;
  RMAN> quit;
  $ rm tbs01.dbf
  $ rman target /
  RMAN> report schema;
  RMAN> sql "alter database datafile 5 offline";
  RMAN> restore datafile 5;
  RMAN> recover datafile 5;
  RMAN> sql "alter database datafile 5 online";
  ----------------------------------------------------------------
  表空间 丢失(/u01/oradata/poli/与表空间恢复相似):
  $ sqlplus /nolog
  $ conn /as sysdba
  SQL> select owner,table_name from all_tables where tablespace_name='TBS1';
  SQL> select * from user1.table1;
  SQL> quit
  $ rm tbs01.dbf
  $ rman target /
  RMAN> sql "alter tablespace tbs1 offline immediate"; (immediate为强制脱机)
  RMAN> restore tablespace tbs1;
  RMAN> recover tablespace tbs1;
  RMAN> sql "alter tablespace tbs1 online";
  RMAN> quit
  $ ls
  ---------------------------------------------------------------------------------
  非catalog方式完全恢复(丢失controlfile/datafile/redolog),综合以上单个恢复
   rm *
   ls
   rman target /
   sqlplus /nolog
  SQL> conn /as sysdba;
  SQL> shutdown abort;
  SQL> quit
   rman target /
  RMAN> startup nomount;
  RMAN> restore controlfile from autobackup;

  RMAN>>  RMAN> restore database;
  RMAN> recover database; (有问题)
  RMAN> quit
   ls
   sqlplus /nolog
  SQL> conn /as sysdba
  SQL> recover database until cancel;(有问题,redolog丢失,默认不让recover)
   sqlplus /nolog
  SQL> conn /as sysdba
  SQL> create pfile from spfile
  SQL> quit
   vi /u01/oracle/dbs/initpoli.ora
  (没有redo log的日记恢复,在initpoli.ora最好添加一行_allow_resetlog_corruption='TRUE')
   sqlplus /nolog
  SQL> conn /as sysdba
  SQL> shutdown immediate;
  SQL> startup pfile=/u01/oracle/dbs/initpoli.ora mount;

  SQL>>  SQL> quit
   ls
  ----------------------------------------------------------------
  基于时间点的恢复
  run {
  set until time "to_date('13/12/30 15:00:00','mm/dd/yy hh24:mi:ss')"
  restore database;
  recover database;
  alter database open resetlogs;
  }
  ----------------------------------------------------------------
  基于SCN的恢复
  RMAN> list backup;(看SCN,643309)
  RMAN> shutdown immediate;
  RMAN> startup mount;
  RMAN> restore database until scn 643309;
  RMAN> recover database until scn 643309;

  RMAN>>  ----------------------------------------------------------------
  基于日记序列的恢复
  SQL> select * from v$log; (查看SEQUENCE是多少,current当前在使用的)
  RMAN> startup mount;
  RMAN> restore database until SEQUENCE 100 thread 1;
  RMAN> recover database until SEQUENCE 100 thread 1;

  RMAN>>  ----------------------------------------------------------------
  RMAN 几条常用命令:
  RMAN> report shcema; (列出当前数据库信息)
  RMAN> list backup; (列出当前已备份信息)
  RMAN> crosscheck database; (检查当前备份信息与系统文件是否匹配)
  RMAN> delete backupset 11; (删除备份)
  -----------------------------------------------------------------------------------------------
  catalog mode目录模式,把备份信息放在catalog下(正确的做法)

  create tablespace rman_ts datafile '/u01/oracle/poli/rmantbs.dbf'>
  create user rman>  grant recovery_catalog_owner,connect to rman; (授权)
  # 查看下相关权限
  # select * from dba_sys_privs where grantee='CONNECT';
  # select * from dba_sys_privs where grantee='RESOURCE';
  # select * from dba_sys_privs where grantee='RECOVERY_CATALOG_OWNER';
  RMAN> quit;
  rman catalog rman/rman
  RMAN> create catalog tablespace rmantbs; (创建恢复目录)
  RMAN> register database;
  RMAN> connect target / (连接目标数据)
  rman target / catalog rman/rman (同时连接目标和恢复目录)
  RMAN> backup format '/u01/oracle/bak/full_%T_%t.bak' database; (全备份,备份信息存放在catalog中,而不是放在控制文件里)
  RMAN> list backup;

页: [1]
查看完整版本: Oracle中RMAN的备份与恢复笔记