本文是《RMAN备份策略与异机恢复一例》的续篇,继续实验验证,最终实现两个需求:

1.异机恢复临时测试的小库

之前异机恢复的需求已经演练成功,现在需要保持之前恢复的库orcl不动,全新恢复一个用于临时测试指定时间点的小库,实例名称规划为testdb。
**注意:**风险点在于一定要注意所有步骤操作仔细,不能影响到现有环境orcl。
**知识点:**
- a.如何恢复指定时间点的数据库
- b.如何重定向数据库各文件的路径
- c.如何验证数据是否是自己需要的

查询数据库全备有两个日期的,一个是2018-06-19的全备,一个是2018-06-21的全备。

  1. RMAN> list backup of database summary;
  2. List of Backups
  3. ===============
  4. Key TY LV S Device Type Completion Time #Pieces #Copies Compressed Tag
  5. ------- -- -- - ----------- --------------- ------- ------- ---------- ---
  6. 45 B F A DISK 21-JUN-18 1 1 YES TAG20180621T073703
  7. 46 B F A DISK 19-JUN-18 1 1 YES TAG20180619T170003
  8. 54 B F A DISK 21-JUN-18 1 1 YES TAG20180621T073703
  9. 58 B F A DISK 21-JUN-18 1 1 YES TAG20180621T073703
  10. 60 B F A DISK 21-JUN-18 1 1 YES TAG20180621T073703

若直接restore database,默认会从最新的全备转储恢复,那如何可以用到之前的全备?

  1. RMAN> sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
  2. sql statement: alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''
  3. RMAN> restore database until time '2018-06-20 18:00:00' validate;
  4. Starting restore at 21-JUN-18
  5. using channel ORA_DISK_1
  6. using channel ORA_DISK_2
  7. using channel ORA_DISK_3
  8. using channel ORA_DISK_4
  9. using channel ORA_DISK_5
  10. using channel ORA_DISK_6
  11. channel ORA_DISK_1: starting validation of datafile backup set
  12. channel ORA_DISK_1: reading from backup piece /tmp/FULLBAK_ORCL_20180619_18_1.DBFILE
  13. channel ORA_DISK_1: piece handle=/tmp/FULLBAK_ORCL_20180619_18_1.DBFILE tag=TAG20180619T170003
  14. channel ORA_DISK_1: restored backup piece 1
  15. channel ORA_DISK_1: validation complete, elapsed time: 00:00:45
  16. Finished restore at 21-JUN-18
  17. RMAN>

可以看到只要指定了合适的until time参数,就自动会从之前合适的备份集中转储(这里实验就是20180619了)。

现在来恢复小库到2018-06-20 18:00:00这个时间点,实例名为testdb:

  1. [oracle@jystdrac1 ~]$ export ORACLE_SID=testdb
  2. [oracle@jystdrac1 ~]$ echo $ORACLE_SID
  3. testdb
  4. [oracle@jystdrac1 ~]$ mkdir -p /u01/oradata/testdb

参数文件,适当减少内存参数,增加db_unique_name参数:

  1. [oracle@jystdrac1 tmp]$ strings ORCL.46.1.20180621.SPFILE
  2. [oracle@jystdrac1 testdb]$ vi pfile.ora
  3. *.audit_file_dest='/u01/app/oracle/admin/testdb/adump'
  4. *.audit_trail='db'
  5. *.compatible='11.2.0.4.0'
  6. *.control_files='/u01/oradata/testdb/control01.ctl','/u01/oradata/testdb/control02.ctl'
  7. *.db_block_size=8192
  8. *.db_domain=''
  9. *.db_name='orcl'
  10. *.db_unique_name='testdb'
  11. *.diagnostic_dest='/u01/app/oracle'
  12. *.dispatchers='(PROTOCOL=TCP) (SERVICE=testdbXDB)'
  13. *.log_archive_dest_1='LOCATION=/u01/arch'
  14. *.memory_target=334173952
  15. *.open_cursors=300
  16. *.processes=150
  17. *.remote_login_passwordfile='EXCLUSIVE'
  18. *.undo_tablespace='UNDOTBS1'
  19. [oracle@jystdrac1 testdb]$ mkdir -p /u01/app/oracle/admin/testdb/adump

启动到nomount:

  1. SQL> startup nomount pfile='/u01/oradata/testdb/pfile.ora';

恢复控制文件:

  1. [oracle@jystdrac1 tmp]$ rman target /
  2. RMAN> restore controlfile from '/tmp/ORCL.45.1.20180621.CTL';
  3. RMAN> alter database mount;
  4. select name from v$datafile union all
  5. select name from v$tempfile union all
  6. select member from v$logfile;
  7. NAME
  8. ------------------------------------------------------
  9. /u01/oradata/orcl/system01.dbf
  10. /u01/oradata/orcl/sysaux01.dbf
  11. /u01/oradata/orcl/undotbs01.dbf
  12. /u01/oradata/orcl/users01.dbf
  13. /u01/oradata/orcl/temp01.dbf
  14. /u01/oradata/orcl/redo03.log
  15. /u01/oradata/orcl/redo02.log
  16. /u01/oradata/orcl/redo01.log
  17. 8 rows selected.
  18. set linesize 140 pagesize 100
  19. select 'alter database rename file '''||name||''' to '''||name||''';' from v$tempfile union all
  20. select 'alter database rename file '''||member||''' to '''||member||''';' from v$logfile;
  21. 替换规则:`to '/u01/oradata/orcl` => to `'/u01/oradata/testdb`
  22. alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
  23. alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
  24. alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
  25. alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';
  26. --注意如果这里尝试rename数据文件,由于指定的数据文件还不存在,是会报错的,类似这样的错误:
  27. SQL> alter database rename file '/u01/oradata/orcl/sysaux01.dbf' to '/u01/oradata/testdb/sysaux01.dbf'
  28. *
  29. ERROR at line 1:
  30. ORA-01511: error in renaming log/data files
  31. ORA-01141: error renaming data file 2 - new file '/u01/oradata/testdb/sysaux01.dbf' not found
  32. ORA-01110: data file 2: '/u01/oradata/orcl/sysaux01.dbf'
  33. ORA-27037: unable to obtain file status
  34. Linux-x86_64 Error: 2: No such file or directory
  35. Additional information: 3

检查备份和归档:

  1. crosscheck backup;
  2. crosscheck archivelog all;
  3. delete noprompt expired backup;
  4. delete noprompt expired archivelog all;
  5. catalog start with '/tmp/';
  6. crosscheck backup;

重定向数据文件-方法1:

  1. run {
  2. set newname for datafile '/u01/oradata/orcl/system01.dbf' to '/u01/oradata/testdb/system01.dbf';
  3. set newname for datafile '/u01/oradata/orcl/sysaux01.dbf' to '/u01/oradata/testdb/sysaux01.dbf';
  4. set newname for datafile '/u01/oradata/orcl/undotbs01.dbf' to '/u01/oradata/testdb/undotbs01.dbf';
  5. set newname for datafile '/u01/oradata/orcl/users01.dbf' to '/u01/oradata/testdb/users01.dbf';
  6. sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
  7. set until time '2018-06-20 18:00:00';
  8. restore database;
  9. switch datafile all;
  10. }
  11. RMAN> recover database until time '2018-06-20 18:00:00';

重定向数据文件-方法2:

  1. --这里语法要求一定要指定%f或者%U,通常选择%U更易识别一些,这里测试使用%f只有文件号,不够友好。
  2. run {
  3. set newname for database to '/u01/oradata/testdb/%f';
  4. sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
  5. set until time '2018-06-20 18:00:00';
  6. restore database;
  7. switch datafile all;
  8. }
  9. RMAN> recover database until time '2018-06-20 18:00:00';

此时一定要重新确认下临时文件和redo日志文件的位置,如果没有更改正确,务必改正,否则会造成灾难性后果!!!

  1. SQL> select name from v$datafile union all
  2. 2 select name from v$tempfile union all
  3. 3 select member from v$logfile;
  4. NAME
  5. ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
  6. /u01/oradata/testdb/1
  7. /u01/oradata/testdb/2
  8. /u01/oradata/testdb/3
  9. /u01/oradata/testdb/4
  10. /u01/oradata/orcl/temp01.dbf
  11. /u01/oradata/orcl/redo03.log
  12. /u01/oradata/orcl/redo02.log
  13. /u01/oradata/orcl/redo01.log
  14. 8 rows selected.
  15. --如果不对,需要rename修改,然后再次查询确认:
  16. alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
  17. alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
  18. alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
  19. alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';

汇总一下本节开头提出的问题:

a.如何恢复指定时间点的数据库

  1. RMAN>
  2. sql "alter session set nls_date_format=''yyyy-mm-dd hh24:mi:ss''";
  3. restore database until time '2018-06-20 18:00:00';
  4. recover database until time '2018-06-20 18:00:00';

b.如何重定向数据库各文件的路径

  1. --方法1
  2. RMAN>
  3. run {
  4. set newname for datafile '/u01/oradata/orcl/system01.dbf' to '/u01/oradata/testdb/system01.dbf';
  5. restore...
  6. switch datafile all;
  7. }
  8. --方法2
  9. RMAN>
  10. run {
  11. set newname for database to '/u01/oradata/testdb/';
  12. restore...
  13. switch database to copy;
  14. }
  15. --注意:已经反复强调过多次,在open resetlogs前都需要检查文件位置是否正确,尤其是redo文件的位置!这里需要将redotemp文件都重定向到新的目录下:
  16. alter database rename file '/u01/oradata/orcl/temp01.dbf' to '/u01/oradata/testdb/temp01.dbf';
  17. alter database rename file '/u01/oradata/orcl/redo03.log' to '/u01/oradata/testdb/redo03.log';
  18. alter database rename file '/u01/oradata/orcl/redo02.log' to '/u01/oradata/testdb/redo02.log';
  19. alter database rename file '/u01/oradata/orcl/redo01.log' to '/u01/oradata/testdb/redo01.log';

c.如何验证数据是否是自己需要的

  1. SQL> alter database open read only;
  2. Check Your DATA...
  3. SQL> shutdown abort;
  4. SQL> startup mount;
  5. SQL> alter database open resetlogs;

2.传输归档时,实现增量传输

之前传输归档时,当天内的文件是scp直接传输的,现在需要实现增量传输。

知识点:

  • a.如何在Linux实现增量传输文件的功能

之前windows是通过 xcopy /y /d来实现这个需求的:

/y

禁止提示确认要覆盖已存在的目标文件。

/d [:MM-DD-YYYY]

只复制那些在指定日期或指定日期之后更改过的源文件。如果不包括“MM-DD-YYYY”值,“xcopy”会复制比现有“Destination”文件新的所有“Source”文件。该命令行选项使您可以更新更改过的文件。

实际测试将之前的scp复制部分替换成rsync --ignore-existing,之前的scp部分注释掉,添加rsync部分:

  1. --全备脚本:
  2. #echo "Begin scp at : `date`" >>${1}/backup_full.log
  3. #scp ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/tmp/
  4. #echo "End scp at : `date`" >>${1}/backup_full.log
  5. echo "Begin rsync at : `date`" >>${1}/backup_full.log
  6. rsync --ignore-existing ${1}/*`date +%Y%m%d`* oracle@192.168.1.61:/u01/orabak/
  7. echo "End rsync at : `date`" >>${1}/backup_full.log
  8. --归档备份脚本:
  9. #echo "Begin scp at : `date`" >>${1}/backup_arch.log
  10. #scp ${1}/*`date +%Y%m%d`*.{CTL,SPFILE,ARC} oracle@192.168.1.61:/tmp/
  11. #echo "End scp at : `date`" >>${1}/backup_arch.log
  12. echo "Begin rsync at : `date`" >>${1}/backup_arch.log
  13. rsync --ignore-existing ${1}/*`date +%Y%m%d`*.{CTL,SPFILE,ARC} oracle@192.168.1.61:/u01/orabak/
  14. echo "End rsync at : `date`" >>${1}/backup_arch.log

测试,定时任务调整为每个小时在整点时备份归档:

  1. [ora11204@OEL-ASM orabak]$ crontab -l
  2. 0 1 * * * /u01/orabak/scripts/backup.sh /u01/orabak
  3. 0 * * * * /u01/orabak/scripts/backuparch.sh /u01/orabak

去异机192.168.1.61去观察已经传输过来的文件修改时间,确认每小时确实只复制传输那些新文件:

  1. -rw-r----- 1 oracle oinstall 9.5M Jun 21 13:00 ORCL.79.1.20180621.CTL
  2. -rw-r----- 1 oracle oinstall 96K Jun 21 13:00 ORCL.80.1.20180621.SPFILE
  3. -rw-r----- 1 oracle oinstall 2.5K Jun 21 13:00 ORCL.82.1.20180621.ARC
  4. -rw-r----- 1 oracle oinstall 15K Jun 21 13:00 ORCL.81.1.20180621.ARC
  5. -rw-r----- 1 oracle oinstall 9.5M Jun 21 14:00 ORCL.83.1.20180621.CTL
  6. -rw-r----- 1 oracle oinstall 96K Jun 21 14:00 ORCL.84.1.20180621.SPFILE
  7. -rw-r----- 1 oracle oinstall 2.5K Jun 21 14:00 ORCL.86.1.20180621.ARC
  8. -rw-r----- 1 oracle oinstall 1.2M Jun 21 14:00 ORCL.85.1.20180621.ARC
  9. -rw-r----- 1 oracle oinstall 9.5M Jun 21 15:00 ORCL.87.1.20180621.CTL
  10. -rw-r----- 1 oracle oinstall 96K Jun 21 15:00 ORCL.88.1.20180621.SPFILE
  11. -rw-r----- 1 oracle oinstall 2.5K Jun 21 15:00 ORCL.90.1.20180621.ARC
  12. -rw-r----- 1 oracle oinstall 1.2M Jun 21 15:00 ORCL.89.1.20180621.ARC
  13. -rw-r----- 1 oracle oinstall 9.5M Jun 21 16:00 ORCL.91.1.20180621.CTL
  14. -rw-r----- 1 oracle oinstall 96K Jun 21 16:00 ORCL.92.1.20180621.SPFILE
  15. -rw-r----- 1 oracle oinstall 2.5K Jun 21 16:00 ORCL.94.1.20180621.ARC
  16. -rw-r----- 1 oracle oinstall 1.2M Jun 21 16:00 ORCL.93.1.20180621.ARC

最终考虑到一些特殊情况,比如有些文件同步一半突然断电,所以更偏向于使用rsync -t -v同步满足需求,这样也更加匹配之前windows的xcopy /y /d方式。

至此,通过rsync命令实现了增量传输文件的需求。

RMAN备份策略与异机恢复一例(续篇)的更多相关文章

  1. RMAN备份策略与异机恢复一例

    实验环境: A机器(生产用途):RHEL 6.5 + Oracle 11.2.0.4 + IP Address 192.168.1.11 B机器(备机用途):RHEL 6.5 + Oracle 11. ...

  2. linux下仅仅有rman备份集的异机不同文件夹恢复

    昨天在客户那里做了一次rman异机的恢复,把生产库弄一份给測试库用,总库大概80G,总共花费了2个小时,当时客户的环境是windows 11.2.0.3,今天早晨在linux下又一次測试了一下,记录下 ...

  3. Oracle RMAN 异机恢复一例

    背景介绍:本例需求是将NBU备份的oracle数据库恢复到另一主机上. NBU环境配置.异机上的Oracle软件安装配置忽略,下面只介绍OracleDB恢复的过程. ----------------- ...

  4. RMAN - 备份异机恢复

    OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - ...

  5. RMAN 备份异机恢复 并创建新DBID

    测试平台信息: Oracle:11gR2 操作系统:Redhat 5.5 Target DB:dave   几点说明: (1)RMAN 异机恢复的时候,db_name必须相同. 如果说要想改成其他的实 ...

  6. rman备份与异机恢复

    一.rman备份脚本并为定时任务 #!/bin/bashsource ~/.bash_profileexport LANG=en_USBACKUP_DATE=`date +%d`#RMAN_LOG_F ...

  7. rman 备份并异机恢复

    1.RMAN 备份脚本 RUN { CONFIGURE RETENTION POLICY DAYS; CONFIGURE CONTROLFILE AUTOBACKUP ON; CONFIGURE CO ...

  8. Oracle12c RAC RMAN异机恢复

    ######################################################## #编辑pfile文件initspdb.ora vi /oracle/app/oracl ...

  9. RMAN异机恢复遭遇ORA-01547、ORA-01152、ORA-01110错误案例

    测试环境:     操作系统  :  Red Hat Enterprise Linux ES release 4 (Nahant Update 4)   VMWARE     数据库     :  O ...

随机推荐

  1. redis集群,主从,持久化

    1,单机版 先安装gcc   yum install gcc-c++ 然后解压源码包,执行编译命令make(C语言写的,需要gcc环境),最后安装Redis,需要通过PREFIX指定安装路径make ...

  2. React 入门实例

    React 入门实例教程 一.安装 React 的安装包,可以到官网下载. $ git clone git@github.com:ruanyf/react-demos.git 如果你没安装 git, ...

  3. iOS10原生的语音转文字功能

    #import <Foundation/Foundation.h> #import <Speech/Speech.h> @interface SpeechListener : ...

  4. sparking water

    1 2 It provides a way to initialize H2O services on each node in the Spark cluster and to access dat ...

  5. 怎样使用 fiddler抓取网络数据包?

    今天我们使用的工具是一个非常著名的抓包工具,百度搜索一下即可找到(或者关注/私信我,查看共享,一般我在百度经验中使用到的软件类工具,都可以在共享网盘中找到),因此这里不演示下载,相信您能很容易得到它的 ...

  6. jquery基础学习之DOM篇(二)

    在此之前请牢记,jquery 是一个合集对象!!!! 1.节点创建 js创建方法: 创建元素:document.createElement 设置属性:setAttribute 添加文本:innerHT ...

  7. Pytorch安装教程

    一.准备 Window10系统+Ubuntu16.10系统.Anaconda3.5(python3.6) 二.流程 (1)由于墙的问题,用conda安装Pytorch过程中会连接失败,这是因为Anac ...

  8. nginx 负载均衡5种配置方式

    nginx 负载均衡5种配置方式 1.轮询(默认) 每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除. 2.weight 指定轮询几率,weight和访问比率成正比, ...

  9. Docker For Mac没有docker0网桥

    在使用Docker时,要注意平台之间实现的差异性,如Docker For Mac的实现和标准Docker规范有区别,Docker For Mac的Docker Daemon是运行于虚拟机(xhyve) ...

  10. centos who命令 查看当前登录系统用户信息

    who 显示当前登录系统的用户,但w显示的更为详细 默认输出 [root@mysql ~]# who //用户名.登录终端.登录时间 root pts/ -- : (192.168.0.110) -a ...