• 【Oracle篇】rman时间点异机恢复:从RAC环境到单机测试环境的转移(第六篇,总共八篇)


    💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨

    💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️

    💖💖💖大佬们都喜欢静静的看文章,并且也会默默的点赞收藏加关注💖💖💖

        今天是端午假期后的第一天,拖着疲惫的身体,开始了新的一周工作。博主在端午期间去了天津,吹了天津的海风,吃了大众推荐的top1饭馆,游览了天津方特世界,确实不虚此行。不知道各位小伙伴都去哪里潇洒了,有没有玩的开心,即使不开心也要收收心,开始新的一周工作。那么今天作为oracle rman的第六篇,也是非常重要的一篇,所以各位该玩玩,该学习就要学习,那么让我们开始今天的内容——rman时间点异机恢复:从单机环境到单机测试环境的转移。 

       在第四、五篇文章中主要是介绍了rman全库异机恢复,也就是说恢复的数据文件和归档备份片都是最后备份的时间点的, 如果在实例上drop了一张表、delete数据,或者truncate清空了整张表,这时需要通过rman的备份恢复出来的话,就不能使用最新的数据文件和归档备份片了 ,那么就只能使用drop、delete、truncate之前的数据文件和归档的备份片。

    PS小提士💥:

        数据被误drop、delete、truncate的话,通过RMAN定点(时间点)恢复只是其中的一个办法。rman作为物理工具,需要将误操作的恢复的话,只能是将rman的备份片全部异机恢复出来之后,然后再通过数据泵的方式导入到生产环境中,所以对于误drop、delete、truncate的话建议rman作为最后的恢复手段,首先先通过其他的方式先恢复出来,毕竟是需要快速的将数据恢复出来,所以那种时间最短就选那种喽,下面列出了对于误drop、delete、truncate操作后有哪些恢复方式,小伙伴可以自行参考哦💨,也列出了对应恢复方式的我的博客跳转地址。  

    分类

    drop

    Truncate

    Delete

    是否删除表结构

    删除表结构及其表上的约束,且依赖于该表的存储过程和函数等将变为INVALID 状态

    只删除数据。不删除表的定义、约束、触发器和索引

    SQL 命令类型

    DDL 语句,隐式提交,不能对TRUNCATE 和

    DROP 使用ROLLBACK 命令(不可回滚)

    DML 语句,事务提交(COMMIT)之后才生效,可以使用ROLLBACK 语句撤销未提交的事务(可回滚)

    删除的数据是否放入回滚(ROLLBACK SEGMENT)

    高水位是否下降

    日志的产生

    少量(ddl语句操作的信息,数据不产生undo日志)

    少量(ddl语句操作的信息,数据不产生undo日志)

    大量undo日志

    是否可以对视图进行操作

    级联删除

    不能drop一个带有enable外键的表

    不能truncate一个带有enable外键的表,会报错ora-02266

    可以delete一个带有enable外键的表

    执行速度

    DROP>TRUNCATE>DELETE

    DROP和TRUNCATE是在底层修改了数据字典,所以无论是大表还是小表执行都非常快

    而DELETE 是需要读取数据到Undo,所以对于大表进行DELETE全表操作将会非常慢

    安全性

    DROP 和TRUNCATE 在无备份的情况下需谨慎

    使用方面

    想删除部分数据行只能用DELETE 且带上WHERE 子句;想删除表数据及其结构则使用DROP;想保留表结构而将所有数据删除则使用TRUNCATE

    恢复方法

    闪回数据库

    闪回drop(回收站)

    RMAN备份

    DUL工具等

    闪回数据库

    RMAN备份

    DUL工具等

    闪回数据库

    闪回查询

    闪回表

    LogMiner日志挖掘

    RMAN备份

    DUL工具等

                 

    恢复方法博客跳转地址:

    1. 《LogMiner日志挖掘》直通车👉Oracle篇—logminer日志挖掘恢复误操作数据_oracle 日志挖掘-CSDN博客👈

    2. 《flashback闪回(包括了闪回数据库、闪回drop、闪回查询、闪回表、闪回归档五大功能)》,关于flashback闪回,博主目前还没有写哦😯,先记录到这里,等不久写了之后,就会在这里完善啦

    3. 《RMAN备份》,那么不用再跳转了,就是这篇文章了😁

        在企业的数据库运维过程中,备份和恢复是密不可分的两个环节。备份提供了数据安全的保障,而恢复则是确保在数据丢失或系统崩溃时能够迅速恢复业务运行的关键。特别是rman时间点异机恢复的过程中,恢复流程的正确性和高效性更是至关重要。

        本文将详细介绍 如何使用RMAN定点(时间点)恢复从RAC环境的备份片中恢复数据到单机环境 。我们将从恢复前的准备工作讲起,涵盖恢复步骤的每一个环节,包括恢复控制文件、数据文件、参数文件、归档等关键组件。同时,我们还将讨论在恢复过程中可能遇到的问题和解决方案,以确保整个恢复过程的顺利进行。

        然而,RMAN所涉及的内容之广、之深,使得难以在单篇文章中全面涵盖。所以我将理论、命令、备份策略、异机恢复、坏块处理等分成八篇文章去讲,即使分为八篇也有不少内容没有涵盖到,所以这八篇文章都是精华,看完这八篇就可以解决95%以上的RMAN相关工作内容了。八篇文章的内容分别如下:

    • 第一篇:rman物理备份工具的基础理论概述
    • 第二篇:rman工具实用指南:常用命令详解与实践
    • 第三篇:rman标准化全库备份策略:完整备份or增量备份
    • 第四篇:rman全库异机恢复:从RAC环境到单机测试环境的转移
    • 第五篇:rman全库异机恢复:从单机环境到RAC测试环境的转移
    • 第六篇:rman时间点异机恢复:从RAC环境到单机测试环境的转移(当前篇)
    • 第七篇:Oracle数据库坏块处理:rman修复坏块实践与案例分析
    • 第八篇:逻辑备份工具expdp(exp)/impdp(imp)和物理备份工具rman的区别和各自的使用场景总汇

                             

    恢复所使用的rman备份片:

     在上篇文章中, 我们都知道了rman有完整备份or增量备份,所以通过那种备份都可以实现全库的异机恢复 ,但是我的建议使用rman完整备份+归档备份即可 ,而不建议使用rman基本增量备份+rman差异增量备份+归档备份(为什么使用完整备份可以参考上篇文章的原因哦,我有详细介绍,直通车👉【Oracle篇】rman标准化全库备份策略:完整备份or增量备份(第三篇,总共八篇)_rman增量备份-CSDN博客👈),所以这篇文章所使用的rman备份片为rman完整备份+归档备份。

               

    So without further ado, let's start today's recovery!!!💫

                     

    两个不同的时间进行全库备份。包括数据文件、控制文件、参数文件、归档。备份策略参考👉【Oracle篇】rman标准化全库备份策略:完整备份or增量备份(第三篇,总共八篇)_rman增量备份-CSDN博客👈

    17点00分

    1. [oracle@rac1 full]$ sqlplus user/123456
    2. SQL> create table ceshi (id number);
    3. SQL> insert into ceshi values (1);
    4. SQL> commit;

    17点20分 

    1. [oracle@rac1 full]$ sqlplus user/123456
    2. SQL> drop table ceshi;


                  

                   

    RAC源机:

    一、恢复删除表之前的数据库。oracle在recover时只能设置时间向前恢复,不能向后恢复,在恢复删除表之前的数据库需要用到有这个表数据的备份片,因为在恢复文件时,oracle会根据控制文件就近恢复记录在内的所有数据文件,如果备份片之间有数据文件差异并且需要在特定时间点恢复时就要特别注意需不需要新加的数据文件,和删除表之前和之后是一个道理,所以需要1679、1680、1681、1682数据文件,1683控制文件,1684参数文件,1685、1686、1687归档。

          

    二、通过nfs或者scp到目标FS数据库。源库和异机的备份片的路径要一致,不然报找不到备份片。如果路径不一致可以通过catalog将未识别的RMAN备份集注册到控制文件:

    scp拷贝到FS异机的/backup/full目录下:

               

              

    FS异机:

    一、FS已经安装好了一套单机,与源库实例名可以保持一致,也可以不一致。进行还原文件。

    (1)定义一个空实例的SID名,启动到nomount状态

    注意:db_unique_name、service_names、instance_name不会涉及在控制文件里,但db_name会涉及到控制文件和数据文件头部中。所以db_name进行异机迁移,不管迁移到FS还是迁移到rac环境,db_name是不能变的。想要变动db_name就只能通过expdp这种逻辑迁移等。

    1. [oracle@11g dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
    2. *.db_name='orcl'
    3. *.instance_name='orcl'
    4. [oracle@11g ~]$ export ORACLE_SID=orcl
    5. SQL> startup nomount

               

    (2)还原参数文件

    1. [oracle@rac1 ~]$ rman target /
    2. run {
    3. ALLOCATE CHANNEL ch00 TYPE disk;
    4. restore spfile to '/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora' from '/backup/full/orcl_spfile_1684_1_20240123';
    5. release channel ch00;
    6. }
    7. SQL> create pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora' from spfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora';
    8. [oracle@11g dbs]$ vi /oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora
    9. *.audit_file_dest='/oracle/app/oracle/admin/orcl/adump'
    10. *.audit_trail='NONE'
    11. *.compatible='11.2.0.4.0'
    12. *.db_block_size=8192
    13. *.db_domain=''
    14. *.db_files=8192
    15. *.db_name='orcl'
    16. *.instance_name='orcl'
    17. *.diagnostic_dest='/oracle/app/oracle'
    18. *.dispatchers='(PROTOCOL=TCP) (SERVICE=orclXDB)'
    19. *.log_archive_format='%t_%s_%r.arc'
    20. *.memory_target=2306867200
    21. *.remote_login_passwordfile='exclusive'
    22. *.log_archive_dest_1='location=/oracle/app/oracle/product/11.2.0/db_1/dbs/arch'
    23. SQL> create spfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/spfileorcl.ora' from pfile='/oracle/app/oracle/product/11.2.0/db_1/dbs/pfileorcl.ora';
    24. SQL> shutdown immediate
    25. SQL> startup nomount
    26. SQL> show parameter spfile

                   

    (3)还原控制文件

    1. [oracle@lf ~]$ rman target /
    2. run {
    3. ALLOCATE CHANNEL ch00 TYPE disk;
    4. restore controlfile to '/oracle/app/oracle/oradata/orcl/control.ctl' from '/backup/full/orcl_ctl_1683_1_20240123';
    5. release channel ch00;
    6. }
    7. 修改控制文件的参数,启动至mount状态:
    8. SQL> show parameter control
    9. SQL> alter system set control_files='/oracle/app/oracle/oradata/orcl/control.ctl' scope=spfile;
    10. SQL> shutdown immediate
    11. SQL> startup mount
    12. SQL> show parameter control

                 

    (4)重命名redo日志组

    注意:1)通过rman定义set newname for logfile设置路径失败,所以只能在sqlplus中重命名redo日志组。12c版本之后可能支持了在rman中定义set newname for logfile(待验证)

              2)只进行重命名redo日志组操作,先不进行删除和重建redo日志组,如果同时进行重建redo日志组,就会导致在后续追归档日志阶段不能应用归档日志(执行recover database using backup controlfile until cancel;命令,报错ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below ORACLE)

               3)先还原数据文件然后再重命名redo日志组,可能会导致v$logfile里面日志组的路径全部直接成为了+ASM磁盘组没有具体路径的情况,比如:全部都成了+DATA这样,这样的话部分日志组因为当前在用删除不了,并且重命名redo日志组是需要具体路径的,但是都变成了+DATA就没有办法识别到是哪一个日志组。所以先进行redo日志组的重命名,然后再进行数据文件还原,就可以避免这个问题。

    1. SQL> select * from v$logfile; ---重做日志组
    2. SQL> select * from v$standby_log; ---镜像日志组(dg)

    1. SQL>
    2. alter database rename file '+DATA/orcl/onlinelog/group_1.266.1140875825' to '/oracle/app/oracle/oradata/orcl/redo1.log';
    3. alter database rename file '+DATA/orcl/onlinelog/group_2.257.1140875825' to '/oracle/app/oracle/oradata/orcl/redo2.log';
    4. alter database rename file '+DATA/orcl/onlinelog/group_3.275.1140875827' to '/oracle/app/oracle/oradata/orcl/redo3.log';
    5. alter database rename file '+DATA/orcl/onlinelog/group_4.276.1140875827' to '/oracle/app/oracle/oradata/orcl/redo4.log';
    6. alter database rename file '+DATA/orcl/onlinelog/group_5.281.1140882455' to '/oracle/app/oracle/oradata/orcl/redo5.log';
    7. alter database rename file '+DATA/orcl/onlinelog/group_6.293.1140883981' to '/oracle/app/oracle/oradata/orcl/redo6.log';
    8. alter database rename file '+DATA/orcl/onlinelog/group_7.294.1140883981' to '/oracle/app/oracle/oradata/orcl/redo7.log';
    9. alter database rename file '+DATA/orcl/onlinelog/group_8.295.1140883981' to '/oracle/app/oracle/oradata/orcl/redo8.log';

                      

    (5)还原数据文件

    注意:rman备份记录在控制文件中,启动到mount状态时,就可以查到rman的备份信息。在恢复数据文件时,会自动找备份片的位置进行恢复,所以源库和异机的备份片的路径要一致,不然报找不到备份片。如果路径不一致可以通过catalog将未识别的RMAN备份集注册到控制文件。

    1. RMAN> CATALOG START WITH '/backup/full'; ---注册目录(多用于批量注册归档,也可以用于注册备份片)
    2. RMAN> report schema; ---显示实例的信息。根据数据文件和临时文件ID恢复

    1. RMAN>
    2. run {
    3. ALLOCATE CHANNEL ch00 TYPE disk;
    4. ALLOCATE CHANNEL ch01 TYPE disk;
    5. ###还原数据文件到新的路径
    6. set newname for datafile 1 to '/oracle/app/oracle/oradata/orcl/system.259.1140874089';
    7. set newname for datafile 2 to '/oracle/app/oracle/oradata/orcl/sysaux.260.1140874091';
    8. set newname for datafile 3 to '/oracle/app/oracle/oradata/orcl/undotbs1.261.1140874091';
    9. set newname for datafile 4 to '/oracle/app/oracle/oradata/orcl/undotbs2.263.1140874093';
    10. set newname for datafile 5 to '/oracle/app/oracle/oradata/orcl/users.264.1140874093';
    11. set newname for datafile 6 to '/oracle/app/oracle/oradata/orcl/itpux.277.1140877153';
    12. set newname for datafile 7 to '/oracle/app/oracle/oradata/orcl/liu.472.1158545801';
    13. set newname for datafile 8 to '/oracle/app/oracle/oradata/orcl/liu.427.1153721763';
    14. ###还原临时文件到新的路径
    15. set newname for tempfile 1 to '/oracle/app/oracle/oradata/orcl/temp.262.1140874091';
    16. ###自动全库恢复。restore database会导致所有文件覆盖还原所以谨慎,restore datafile是指定单个文件从rman中还原。
    17. restore database;
    18. ###将已发出SET NEWNAME for DATAFILE命令的所有数据文件切换为其新名称。如果是asm管理的文件可能在设置路径时出现问题,导致控制文件的路径和物理路径不对应。所以建议源库为asm转文件系统时不设置这个参数,手动注册和通知控制文件路径catalog datafilecopy和switch datafile。
    19. switch datafile all;
    20. release channel ch00;
    21. release channel ch01;
    22. }

                      

    (6)查看数据文件头部和控制文件头部还原的时间

    SQL> select name from v$datafile;
    SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header;       ---数据文件头部

    SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE;            ---控制文件头部

                   

    二、恢复数据

    (1)还原归档

    注意:先执行一遍recover database using backup controlfile until cancel;和v$datafile_header、V$DATAFILE就会输出当前恢复的SCN时间,然后根据时间再决定恢复几天的归档,或者也会显示从那个归档开始恢复,确定了开始恢复的归档号之后,就按照序列号恢复RESTORE ARCHIVELOG sequence,恢复到最新的序列号通过list backup查看最后一个备份的归档号。

    1. RMAN>
    2. run{
    3. ALLOCATE CHANNEL ch00 TYPE disk;
    4. set archivelog destination to '/backup/arch';
    5. restore archivelog from time 'sysdate-10';
    6. release channel ch00;
    7. } ---如果恢复报错no backup of archived log,根据序列号恢复RESTORE ARCHIVELOG sequence BETWEEN 5877 AND 5971 thread 2;

                 

    (2)追归档日志(设置恢复归档日志的时间点,设置的时间略微高出还原的时间点,因为在recover时只能设置时间向前恢复,不能向后恢复。时间设置为还原点之后,drop表之前)

    1. SQL> set logsource /backup/arch; ---set logsource +路径:设置的是数据库读取归档的路径,默认的读取的路径是archive log list,如果通过rman恢复的是其他路径,那么就需要重新设置一下读取归档的路径。
    2. SQL> recover database until time '2024-01-18 17:18:00' using backup controlfile until cancel;
    3. auto
    4. SQL> recover database until time '2024-01-18 17:18:00' using backup controlfile until cancel;
    5. Cancel
    SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999') ,TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM v$datafile_header;       ---数据文件头部

    SQL> SELECT FILE#,to_char(checkpoint_change#,'999999999999'),TO_CHAR(CHECKPOINT_TIME,'YYYY-MM-DD HH24:MI:SS') CPTIME FROM V$DATAFILE;            ---控制文件头部

                            

    (3)删除不必要的redo日志组

    1. SQL> select * from v$logfile; ---重做日志组
    2. SQL> select * from v$standby_log; ---镜像日志组(dg)

    1. SQL>
    2. alter database drop logfile group 5;
    3. alter database drop logfile group 6;
    4. alter database drop logfile group 7;
    5. alter database drop logfile group 8;

               

    (4)重建临时文件

    1. SQL> shutdown immediate
    2. SQL> startup
    3. SQL> alter database open resetlogs;
    4. SQL> select * from v$tablespace; ---表空间中有temp表空间但是告警日志中显示需要重建信息的temp数据文件

    1. temp临时文件的路径还是+ASM磁盘组,所以新增一个临时文件,然后删除临时文件为1+ASM磁盘组的临时文件:
    2. SQL> select * from v$tempfile;

    1. SQL> alter tablespace temp add tempfile '/oracle/app/oracle/oradata/orcl/temp.dbf' size 31G autoextend off;
    2. SQL> alter tablespace temp drop tempfile 1;
    3. 注意:如果删除临时文件失败,需要先删除临时表空间,然后重建。

                     

    (5)禁用重做日志线程2。因为原先是rac环境,所以每个实例都是独立的redo线程,现在恢复到单机只需要1个redo线程,单机只会在线程1的日志组来回切换

    1. SQL> select * from v$logfile; ---重做日志组
    2. SQL> select * from v$standby_log; ---镜像日志组(dg)
    3. SQL> select * from v$log; ---rac环境下有多个线程的重做日志组,所以在单机环境下重做日志只保留线程1

    1. SQL> alter database disable thread 2; ---禁用重做日志线程2
    2. SQL>
    3. alter database drop logfile group 3;
    4. alter database drop logfile group 4;

                             

    (6)删除UNDOTBS2表空间(undo同redo一样是分线程的)

    SQL> drop tablespace UNDOTBS2 including contents and datafiles;

                 

    三、启动单机数据库

    1. SQL> shutdown immediate
    2. SQL> startup

                     

    四、物理迁移完成查看状态

    (1)通过rman恢复的实例是和生产环境一模一样的,所以只需要做后续参数部分的优化

    参数优化参考RAC环境的配置即可😄

                    

    (2)检查实例情况

    1. 数据库文件和undo:
    2. set linesize 500
    3. set pagesize 99
    4. col file_name for a70
    5. col file_id for 9999999
    6. col status for a10
    7. col ts_name for a25
    8. col cur_mb for 99999
    9. col max_mb for 99999
    10. select status, file_id, file_name, tablespace_name ts_name,blocks/128 tolal_mb, maxblocks/128 max_mb,AUTOEXTENSIBLE from dba_data_files order by file_name;
    11. temp临时表空间:
    12. select username,temporary_tablespace from dba_users;
    13. set linesize 230
    14. col file_name for a65
    15. select FILE_ID,FILE_NAME,TABLESPACE_NAME,bytes/1024/1024 tolal_mb,status,AUTOEXTENSIBLE,MAXBYTES/1024/1024 max_mb from dba_temp_files;
    16. redo重做日志:
    17. set linesize 230
    18. col member for a50
    19. select * from v$logfile;
    20. select * from v$log;
    21. 查看数据库实例的状态和模式:
    22. select instance_name , status from v$instance ;
    23. select name, open_mode from v$database ;

         

    五、验证数据是否恢复

    1. [oracle@11g dbs]$ sqlplus user/123456
    2. SYS@orcl> select * from ceshi; ---通过之前的备份恢复数据

                     

    六、将数据恢复到生产库 

    少量数据的方式:

    SYS@orcl> select 'insert into ceshi values (' || id || ');' from ceshi;

                 

    大量数据的方式:

    exp/imp或者expdp/impdp。数据泵直通车👉【Oracle篇】一文搞清expdp/impdp逻辑迁移工具的用法和定时全备实例(第二篇,总共四篇)_impdp官方文档-CSDN博客👈


        各位经过第四、第五、第六篇文章,关于RMAN恢复的篇章至此圆满结束。这些精心挑选的案例不仅涵盖了多种恢复场景,而且都极具实用性和可操作性。希望能为各位在恢复工作中提供有力的支持和指导。

  • 相关阅读:
    猿创征文|GISER开发者必备高能武器库
    大事务问题到底要如何解决?
    【面试】IO多路复用
    【C++】红黑树的模拟实现
    Java 并发编程面试题(一)
    聊聊linux的文件缓存
    Android Room使用模板
    Java学习Day021(类和对象)
    性能测试场景的设计方法
    cmake入门
  • 原文地址:https://blog.csdn.net/naisiing/article/details/139581832