暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

RAC集群使用RMAN恢复到单节点实例

M小小虾米 2021-08-04
3255

导言:平常我们使用RMAN恢复数据库,都是单节点对单节点。由于项目需求,现需要从RAC的备份中恢复一个单节点用于开发的测试。


一.系统环境:

  1. 源端服务器


系统环境


2 目标端服务器


二.目标端数据的安装

分两种情况:

  1. 目标端纯净系统,前期没有安装过数据,则需要根据源端环境,创建同版本的oracle数据库软件。(注意版本必须相同或者高于源端版本,否则RMAN无法从高版本恢复到低版本)

  2. 目标端有单机oracle产品,且版本一致,则只需删除数据即可
    dbca -silent -deletedatabase -sourcedb sid

    (如果目标端的数据库与源端版本不一致,建立完全删除重新创建,不建议升级,升级太慢)

三.目标端的恢复

  1. 参数文件的恢复

    再次提供两种方式恢复

    1> 利用源端备份集中参数文件恢复。
    RMAN> restore spfile to pfile '/u01/app/oracle/product/11.2.0/dbs/initopen.ora'from '/backup/c-473387766-20110613-03';
    恢复spfile后创建出pfile
    create pfile='dir' from spfile;

    根据要求,将RAC的pfile中的内容更改成单机的内容,以下为示例
    源端RAC的参数文件

    open1.__db_cache_size=285212672

    open2.__db_cache_size=268435456

    open1.__java_pool_size=16777216

    open2.__java_pool_size=16777216

    open1.__large_pool_size=16777216

    open2.__large_pool_size=16777216

    open1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from nvironment

    open2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment

    open1.__pga_aggregate_target=553648128

    open2.__pga_aggregate_target=536870912

    open1.__sga_target=805306368

    open2.__sga_target=822083584

    open1.__shared_io_pool_size=0

    open2.__shared_io_pool_size=0

    open1.__shared_pool_size=469762048

    open2.__shared_pool_size=469762048

    open1.__streams_pool_size=0

    open2.__streams_pool_size=33554432

    *.audit_file_dest='/u01/app/oracle/admin/open/adump'

    *.audit_trail='db'

    *.cluster_database=true

    *.compatible='11.2.0.0.0'

    *.control_files='+ORADATA/open/control01.ctl','+ORADATA/open/control02.ctl'

    *.db_block_size=8192

    *.db_domain=''

    *.db_name='open'

    *.diagnostic_dest='/u01/app/oracle'

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=openXDB)'

    open1.instance_number=1

    open2.instance_number=2

    *.log_archive_dest_1='LOCATION=+ORAFLASH/arch'

    open1.log_archive_dest_1='LOCATION=+ORAFLASH/arch'

    open2.log_archive_dest_1='LOCATION=+ORAFLASH/arch'

    open1.log_archive_dest_2=''

    open2.log_archive_dest_2=''

    *.memory_target=1358954496

    *.nls_language='SIMPLIFIED CHINESE'

    *.nls_territory='CHINA'

    *.open_cursors=300

    *.processes=1500

    *.remote_listener='rac-cluster-scan:1521'

    *.remote_login_passwordfile='exclusive'

    *.sessions=1655

    open2.thread=2

    open1.thread=1

    open2.undo_tablespace='UNDOTBS2'

    open1.undo_tablespace='UNDOTBS1'

    根据源端的参数文件更改目标端的pfile

    *.db_cache_size=285212672

    *.java_pool_size=16777216

    *.large_pool_size=16777216

    *.pga_aggregate_target=553648128 pga和sga的大小根据单实例节点的实际大小设置,因为RAC的大小比单实例大

    *.sga_target=805306368

    *.shared_pool_size=469762048 同理根据单实例实际大小设置

    *.streams_pool_size=16777216 streams必须有值,因为数据泵导入导出需要

    *.audit_file_dest='/u01/app/oracle/admin/open/adump' 提前要创建好{a,b,c,u)dump文件

    *.audit_trail='db'

    *.compatible='11.2.0.0.0' 版本必须对应

    *.control_files='/oradata/open/control01.ctl','/oradata/open/control02.ctl' 导入的控制文件的目录要提前创建

    *.db_block_size=8192

    *.db_domain=''

    *.db_name='open' 实例名是与RAC节点相同

    *.diagnostic_dest='/u01/app/oracle'

    *.dispatchers='(PROTOCOL=TCP) (SERVICE=openXDB)'

    *.log_archive_dest_1='location=/arch' 归档日志存放的路径要提前创建好

    *.nls_language='SIMPLIFIED CHINESE'

    *.nls_territory='CHINA'

    *.open_cursors=300

    *.processes=1500

    *.remote_login_passwordfile='exclusive'

    *.sessions=1655

    *.undo_tablespace='UNDOTBS1'

    使用更改好的pfile进行数据库的重新启动到nomount状态,根据新的pfile创建新的spfile,然后将数据库再次重启利用spfile进行加载到nomount状态。

    2> 也可以从正式库中创建一个pfile,再导入

    startup pfile='pfile路径' nomount

    create spfile from pfile='pfile路径';

    shutdown immediate

    startup nomount

  2. 恢复控制文件

    在目标端进入RMAN命令行

    RMAN> restore controlfile from '/backup/c-473387766-20110613-03';

  3. 恢复控制文件后就可以mount了

    RMAN> alter database mount;

  4. 注册主库备份后生成的归档文件和备份集: 即把原来的备份路径指定为新拷贝的目标端备份路径。

    此例中我们将备份文件全部放到了/backup目录中

    如果备份文件和归档文件太多可以注册整个目录:catalog start with '/backup';

  5. 由于之前在RMAN中配置了默认通道,这里也要将这些配置清除,操作如下:

    RMAN> configure channel 1 device type disk clear;

    RMAN> configure channel 2 device type disk clear;

    RMAN> configure device type disk clear;

  6. 查看元数据库的数据文件、temp文件、redo文件路径

    SQL> select file#,name from v$datafile;

    SQL> select file#,name from v$tempfile;

    SQL> select member from v$logfile;

  7. RMAN 中的SET命令可以用来为数据文件和临时文件重命名;使用set命令对数据文件和临时文件的路径进行重定义,然后再执行恢复操作,如下:

    RMAN> RUN {

    SET NEWNAME FOR DATAFILE 1 to '/oradata/open/system01.dbf';

    SET NEWNAME FOR DATAFILE 2 to '/oradata/open/sysaux01.dbf';

    SET NEWNAME FOR DATAFILE 3 to '/oradata/open/undob01.dbf';

    SET NEWNAME FOR DATAFILE 4 to '/oradata/open/users01.dbf';

    SET NEWNAME FOR DATAFILE 5 to '/oradata/open/undob02.dbf';

    SET NEWNAME FOR TEMPFILE 1 to '/oradata/open/temp01.dbf';

    RESTORE DATABASE;

    SWITCH DATAFILE ALL;

    SWITCH TEMPFILE ALL;

    }

  8. 对数据库执行recover,从备份中读取归档日志

    RMAN> recover database;

  9. 重建控制文件,主要是更改redo log的目录

    sql > alter database backup controlfile to trace; 创建跟踪文件

    cd u01/app/oracle/diag/rdbms/open/trace

    more open_ora_9131.trc 查看最近时间的跟踪文件,注意跟踪文件中有线程2的日志组

  10. 获取控制文件创建脚本之后,稍加修改(主要是改redolog的路径),然后在sqlplus命令行环境下执行:

    SQL> startup nomount

    SQL> CREATE CONTROLFILE REUSE DATABASE "OPEN" RESETLOGS ARCHIVELOG

    MAXLOGFILES 192

    MAXLOGMEMBERS 3

    MAXDATAFILES 1024

    MAXINSTANCES 32

    MAXLOGHISTORY 292

    LOGFILE

    GROUP 1 '/oradata/open/redo01.log' SIZE 200M BLOCKSIZE 512, 创建时不包括线程2的日志组,删除掉standby logfile的日志组

    GROUP 2 '/oradata/open/redo02.log' SIZE 200M BLOCKSIZE 512,

    GROUP 5 '/oradata/open/redo05.log' SIZE 200M BLOCKSIZE 512,

    GROUP 6 '/oradata/open/redo06.log' SIZE 200M BLOCKSIZE 512

    -- STANDBY LOGFILE

    DATAFILE

    '/oradata/open/system01.dbf',

    '/oradata/open/sysaux01.dbf',

    '/oradata/open/undob01.dbf',

    '/oradata/open/users01.dbf',

    '/oradata/open/undob02.dbf'

    CHARACTER SET ZHS16GBK

    ;

  11. 根据跟踪文件中控制文件内容手动添加线程2的日志组

    以resetlogs 打开数据库

    ALTER DATABASE ADD LOGFILE THREAD 2

    GROUP 3 '/oradata/open/redo03.log' size 200m,

    GROUP 4 '/oradata/open/redo04.log' size 200m;

  12. SQL> alter database open resetlogs;

重建临时表空间的数据文件:

SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/oradata/open/temp01.dbf' size 200m;

清除未使用线程的redo日志组,操作如下:

SQL> select thread#,status,enabled from v$thread;

THREAD# STATUS ENABLED

---------- ------ --------

1 OPEN PUBLIC

2 CLOSED PUBLIC

SQL> select group#,thread#,archived,status from v$log;


GROUP# THREAD# ARC STATUS

---------- ---------- --- ----------------

1 1 NO CURRENT

2 1 YES UNUSED

3 2 YES ACTIVE

4 2 YES UNUSED

5 1 YES UNUSED

6 1 YES UNUSED


SQL> alter database disable thread 2;

SQL> alter database drop logfile group 3; (如果状态是inactive的,直接删除日志组就行)

SQL> alter database clear unarchived logfile group 4; (如果状态是unused的,先设置日志组不能归档,再删除)

SQL> alter database drop logfile group 4;

14. 清除多余的undo文件。

SQL> select name from v$tablespace where name like 'UNDO%';

NAME

------------------------------

UNDOTBS1

UNDOTBS2

SQL> show parameter undo_tablespace;

NAME TYPE VALUE

------------------------------------ ----------- ------------------------------

undo_tablespace string UNDOTBS1

SQL> Drop tablespace undotbs2 including contents and datafiles;


15. 最后将RAC节点的密码文件导入到单节点的目录下,赋用户,用户组,改成相应的名字即可

cd $ORACLE_HOME/dbs

设置rman的备份路径,进行全备

configure channel device type disk format '/home/oracle/rman_bak/%d_%I_%s_%p_%T.bkp';


至此 RAC 的备份集恢复到单实例数据库完成!

其实作为一个DBA只要细心,用心,信心,就会做到成功!


文章转载自M小小虾米,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论