Duplicate复制数据库之附录

 

一、跳过表空间( Skipping Tablespaces in RMAN DUPLICATE DATABASE )

  有时候,并非数据库的所有表空间都需要备份,比如你在创建副本数据库时,想跳过那些read-only或OFFLINE的表空间,这个简单,来来来,跟我一起做,左三圈右三圈脖子扭扭屁股扭扭,不是跳舞,是放松放松,你已经连续盯着屏幕这么久,而且都是看些蝌蚪儿字,要注意保护眼睛啊,黑黑~~~~

  要跳过只读表空间,在执行duplicate命令时指定 SKIP READONLY 子句即可。而对于离线表空间,在执行duplicate命令之前将其置为 OFFLINE NORMAL 状态即可,RMAN复制时会跳过只读或离线表空间的数据文件。如果某个表空间即不是readonly也并非offline,但你就是不想复制,表急,duplicate还有杀手锏。在执行duplicate命令时通过 SKIP TABLESPACE XXX 子句指定你要跳过的表空间,想跳多少就跳多少,多个表空间的话,中间以,(逗号)分隔即是。

  当复制完成之后,通过查询副本数据库的v$datafile或DBA_DATA_FILES、DBA_TABLESPACES可以获取表空间以及数据文件的状态。

  例如:

  • SQL> select status,enabled,name from v$datafile;

    STATUS ENABLED NAME

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

    SYSTEM READ WRITE F:\ORACLE\ORADATA\JSSDUP\SYSTEM01.DBF

    ONLINE READ WRITE F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF

    ONLINE READ WRITE F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF

    ONLINE READ WRITE F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF

    ONLINE READ WRITE F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF

  对于readonly表空间,v$datafile中STATUS列会显示为 OFFLINE ,ENABLE列会显示为 READ ONLY , Name 列会显示为MISSING xxx。

  对于offline表空间,v$datafile中STATUS列会显示为 OFFLINE ,ENABLE列会显示为 DISABLED , Name 列会显示为MISSING xxx。

二、重命名副本数据库文件( Renaming Database Files in RMAN Duplicate Database)

  • 1 、创建过程中重命名控制文件

      创建控制文件的语法与sql语句中的创建方法一致。如果手工选择控制文件名称的话,务必确认辅助实例的初始化参数中参数设置正确。

    2 、创建过程中重命名在线日志文件

      有多种方式可以重命名在线日志文件,见下列诸条:

      1). 执行duplicate命名时指定 LOGFILE 子句设置redo logs文件名。

      2). 辅助实例初始化参数文件中设置 LOG_FILE_NAME_CONVERT 参数。该参数语法如下:

      LOG_FILE_NAME_CONVERT = ¨string1¨ , ¨string2¨ , ¨string3¨ , ¨string4¨ , ...

      将string1替换为string2,string3替换为string4,几乎无限组对。

      3). 辅助实例中设置其它的初始化参数: DB_CREATE_FILE_DEST, DB_CREATE_ONLINE_DEST_n, or DB_RECOVERY_FILE_DEST 。 这些参数的作用类似于SQL语句:ALTER DATABASE ADD LOGFILE.

      4). 如果副本数据库与目标库不 在 同一台机器上,并且副本数据库的在线日志文件路径与目标库相同,则运行duplicate命令时必须指定 NOFILENAMECHECK 参数以避免冲突提示。晕了吧,异机操作路径相同还必需指定NOFILENAMECHECK。此处oracle表现的很傻,它不知道你要恢复的路径是在另一台机器上,它只是认为要恢复到的路径怎么跟目标数据库表现的一样呢?会不会是要覆盖目标数据库啊,为了避免这种情形,于是它就报错 。 所以一旦异机恢复,并且路径相同,那么你必须通过指定NOFILENAMECHECK来避免oracle的自动识别。

      提示 :上述各方式是有优先级的,按照顺序序号最小的最先执行。如果你在操作过程中统统指定,则oracle会自动判断并以优先级最高的设置为准。

    3 、 创建过程中重命名数据文件

      这个方法也比较多:第三章第2节"不同路径结构的复制"时已经耗费了不少笔墨(o,是按键次数)并辅以各种脚本实例说明,什么,没看明白,拖出去关小黑屋 反复杀死100遍 。

    4 、 跳过文件名检测NOFILENAMECHECK

      这项操作主要是为了避免oracle错误的领会你的操作意图。

      例如:

      a 库有两个数据文件:文件号1的文件f:\oracle\oradata\file1.dbf和文件号2的文件f:\oracle\oradata\file2.dbf,当你将其复制到另一台服务器的b库时:

    • RUN

      {

      SET NEWNAME FOR DATAFILE 1 TO f:\oracle\oradata\file2.dbf;

      SET NEWNAME FOR DATAFILE 2 TO f:\oracle\oradata\file1.dbf;

      DUPLICATE TARGET DATABASE TO newdb;

      }

      执行上面的脚本oracle会报错。虽然你通过set newname命令已经将数据文件重命名,不会有文件名重复的问题,但是由于此项操作是异机的同路径复制,oracle会以为file1.dbf和file2.dbf仍在使用(目标库的确在使用,但oracle分不清你当前操作的 已经 不是同一台服务器)。于是oracle会提示报错信息,针对这种情况,你必须DUPLICATE TARGET DATABASE TO newdb NOFILENAMECHECK避免oracle的理解。

      再与第2项中的第4小项结合理解,你就能完全掌握NOFILENAMECHECK的奥妙所在:)

    5 、 创建过程中重命名临时文件

      与重命名数据文件极其相似,不过如果希望通过SET NAME方式重命名临时文件路径的话,需要指明: SET NEWNAME FOR TEMPFILE ,其它皆与之同,不详述。

三、同步副本数据库( Using DUPLICATE DATABASE to Resynchronize a Duplicate Database )

  实质上对于非standby方式的duplicate没有同步的操作,所谓同步不过就是再执行一次创建罢了。当然它跟初次执行还是有黑大区别地,比如,你不需要再配置辅助实例,这可是省了很多功夫啊。

  例如,删除目标库中jss*命名的表,然后执行同步:

  • F:\oracle >rman target / auxiliary sys/verysafe:)@jssdup

    恢复管理器: Release 10.2.0.1.0 - Production on 星期二 10月 23 16:54:43 2007

    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    已连接到目标数据库: JSSWEB (DBID=3402005373, 未打开)

    已连接到辅助数据库: JSSDUP (未装载)

    RMAN> DUPLICATE TARGET DATABASE TO jssdup;

    启动 Duplicate Db 于 23-10月-07

    使用目标数据库控制文件替代恢复目录

    分配的通道: ORA_AUX_DISK_1

    通道 ORA_AUX_DISK_1: sid=38 devtype=DISK

    内存脚本的内容:

    {

    set newname for datafile 1 to

    "F:\ORACLE\ORADATA\JSSDUP\SYSTEM01.DBF";

    set newname for datafile 2 to

    "F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF";

    set newname for datafile 3 to

    "F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF";

    set newname for datafile 4 to

    "F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF";

    set newname for datafile 5 to

    "F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF";

    restore

    check readonly

    clone database

    ;

    }

    正在执行内存脚本

    正在执行命令: SET NEWNAME

    正在执行命令: SET NEWNAME

    正在执行命令: SET NEWNAME

    正在执行命令: SET NEWNAME

    正在执行命令: SET NEWNAME

    启动 restore 于 23-10月-07

    使用通道 ORA_AUX_DISK_1

    通道 ORA_AUX_DISK_1: 正在开始恢复数据文件备份集

    通道 ORA_AUX_DISK_1: 正在指定从备份集恢复的数据文件

    正将数据文件00001恢复到F:\ORACLE\ORADATA\JSSDUP\SYSTEM01.DBF

    正将数据文件00002恢复到F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF

    正将数据文件00003恢复到F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF

    正将数据文件00004恢复到F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF

    正将数据文件00005恢复到F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF

    通道 ORA_AUX_DISK_1: 正在读取备份段 D:\BACKUP\08IV7NJE_1_1

    通道 ORA_AUX_DISK_1: 已恢复备份段 1

    段句柄 = D:\BACKUP\08IV7NJE_1_1 标记 = TAG20071023T155942

    通道 ORA_AUX_DISK_1: 恢复完成, 用时: 00:00:57

    完成 restore 于 23-10月-07

    sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "JSSDUP" RESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

    LOGFILE

    GROUP 1 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO01.LOG¨ ) SIZE 20 M REUSE,

    GROUP 2 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO02.LOG¨ ) SIZE 20 M REUSE,

    GROUP 3 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO03.LOG¨ ) SIZE 20 M REUSE

    DATAFILE

    ¨F:\ORACLE\ORADATA\JSSDUP\SYSTEM01.DBF¨

    CHARACTER SET ZHS16GBK

    内存脚本的内容:

    {

    switch clone datafile all;

    }

    正在执行内存脚本

    释放的通道: ORA_AUX_DISK_1

    数据文件 2 已转换成数据文件副本

    输入数据文件副本 recid=1 stamp=636742551 文件名=F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF

    数据文件 3 已转换成数据文件副本

    输入数据文件副本 recid=2 stamp=636742551 文件名=F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF

    数据文件 4 已转换成数据文件副本

    输入数据文件副本 recid=3 stamp=636742551 文件名=F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF

    数据文件 5 已转换成数据文件副本

    输入数据文件副本 recid=4 stamp=636742552 文件名=F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF

    内存脚本的内容:

    {

    recover

    clone database

    noredo

    ,

    delete archivelog

    ;

    }

    正在执行内存脚本

    启动 recover 于 23-10月-07

    分配的通道: ORA_AUX_DISK_1

    通道 ORA_AUX_DISK_1: sid=38 devtype=DISK

    完成 recover 于 23-10月-07

    内存脚本的内容:

    {

    shutdown clone;

    startup clone nomount ;

    }

    正在执行内存脚本

    数据库已卸载

    Oracle 实例已关闭

    已连接到辅助数据库 (未启动)

    Oracle 实例已启动

    系统全局区域总计 285212672 字节

    Fixed Size 1248552 字节

    Variable Size 226493144 字节

    Database Buffers 50331648 字节

    Redo Buffers 7139328 字节

    sql 语句: CREATE CONTROLFILE REUSE SET DATABASE "JSSDUP" RESETLOGS NOARCHIVELOG

    MAXLOGFILES 16

    MAXLOGMEMBERS 3

    MAXDATAFILES 100

    MAXINSTANCES 8

    MAXLOGHISTORY 292

    LOGFILE

    GROUP 1 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO01.LOG¨ ) SIZE 20 M REUSE,

    GROUP 2 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO02.LOG¨ ) SIZE 20 M REUSE,

    GROUP 3 ( ¨F:\ORACLE\ORADATA\JSSDUP\REDO03.LOG¨ ) SIZE 20 M REUSE

    DATAFILE

    ¨F:\ORACLE\ORADATA\JSSDUP\SYSTEM01.DBF¨

    CHARACTER SET ZHS16GBK

    内存脚本的内容:

    {

    set newname for tempfile 1 to

    "F:\ORACLE\ORADATA\JSSDUP\TEMP01.DBF";

    switch clone tempfile all;

    catalog clone datafilecopy "F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF";

    catalog clone datafilecopy "F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF";

    catalog clone datafilecopy "F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF";

    catalog clone datafilecopy "F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF";

    switch clone datafile all;

    }

    正在执行内存脚本

    正在执行命令: SET NEWNAME

    临时文件 1 在控制文件中已重命名为 F:\ORACLE\ORADATA\JSSDUP\TEMP01.DBF

    已将数据文件副本列入目录

    数据文件副本 filename=F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF recid=1 stamp=636742564

    已将数据文件副本列入目录

    数据文件副本 filename=F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF recid=2 stamp=636742564

    已将数据文件副本列入目录

    数据文件副本 filename=F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF recid=3 stamp=636742564

    已将数据文件副本列入目录

    数据文件副本 filename=F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF recid=4 stamp=636742565

    数据文件 2 已转换成数据文件副本

    输入数据文件副本 recid=1 stamp=636742564 文件名=F:\ORACLE\ORADATA\JSSDUP\UNDOTBS01.DBF

    数据文件 3 已转换成数据文件副本

    输入数据文件副本 recid=2 stamp=636742564 文件名=F:\ORACLE\ORADATA\JSSDUP\SYSAUX01.DBF

    数据文件 4 已转换成数据文件副本

    输入数据文件副本 recid=3 stamp=636742564 文件名=F:\ORACLE\ORADATA\JSSDUP\JSSWEB.DBF

    数据文件 5 已转换成数据文件副本

    输入数据文件副本 recid=4 stamp=636742565 文件名=F:\ORACLE\ORADATA\JSSDUP\USERS01.DBF

    内存脚本的内容:

    {

    Alter clone database open resetlogs;

    }

    正在执行内存脚本

    数据库已打开

    完成 Duplicate Db 于 23-10月-07

    RMAN>

  连接到副本数据库验证一下数据:

  • F:\oracle>set oracle_sid=jssdup

    F:\oracle >sqlplus jss/jss

    SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 10月 23 16:56:32 2007

    Copyright (c) 1982, 2005, Oracle. All rights reserved.

    连接到:

    Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

    With the Partitioning, OLAP and Data Mining options

    SQL> select *from tab where tname like ¨JSS%¨ and rownum<9;

    未选定行

    SQL>

  同步成功鸟:)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值