首页 > 代码库 > 11g使用非duplicate方式创建物理standby要注意的问题总结

11g使用非duplicate方式创建物理standby要注意的问题总结

在上篇博文中,使用了duplicate方式来创建物理standby http://blog.csdn.net/aaron8219/article/details/38434579

今天来说说在11g中采用非duplicate方式创建备库碰到的一些问题,并做个总结。


在10g中,通常可以使以下几种方法创建备库控制文件


RMAN> backup current controlfile for standby format ‘c:\ctl_%U‘;
RMAN> backup full database format ‘c:\backup\full_%U‘ include current controlfile for standby;
RMAN> copy current controlfile for standby to ‘c:\backup\control01.ctl‘;
SQL> alter database create standby controlfile as ‘c:\backup\control01.ctl‘;

前两种生成的是备库控制文件的备份集,需要在nomount状态下,用RMAN命令restore,如:
SQL> startup nomount
RMAN> restore controlfile from ‘c:\backup\xxxx‘;

而后两种是直接创建备库控制文件。一种是通过RMAN命令的方式,另一种是通过SQL命令的方式,创建出来的备库控制文件,可以直接复制到备库目标路径后用来启动备库到mount状态,如:
复制到C:\app\oracle\oradata\tc并冗余(CONTROL01.CTL,CONTROL02.CTL)后,可以直接在备库执行
SQL> startup mount --直接启动到mount状态,不需要RMAN恢复

但是在11g中,RMAN备份不再支持以“backup current controlfile for standby”或“include current controlfile for standby”来创建备库控制文件,虽然命令仍然可以执行成功,但是当你在备库恢复完控制文件并启动到mount状态下,你会发现这个控制文件依旧是主库的控制文件,如:
RMAN> restore controfile from ‘c:\backup\xxxx‘;
RMAN> alter database mount;
SQL> select database_role from v$database;


DATABASE_ROLE
----------------
PRIMARY --注意,数据库角色是由控制文件决定的,这里是primary,说明是用主库控制文件启动的


如果没有注意到这点,那么当你恢复完数据库文件,并启用REDO APPLY的时候,就会报错,提示不是备用数据库。
所以,如果不是用duplicate方式来创建备库的话,要注意使用创建文件的方式直接生成备库控制文件,而不是生成RMAN备份集


上次使用了RMAN的duplicate方式来配置DG物理备库,那么这次就用非duplicate方式来做一次,其实步骤大致和10g是一致的,可以参考我以前搭建10g DG的博客,惟一不同的是,不再使用备份集来恢复备库控制文件


具体步骤(略),直接跳到完成数据库数据文件恢复后


--查看备库的日志文件

SQL> set lin 120 pages 120
SQL> col member for a60
SQL> select group#,member from v$logfile;


    GROUP# MEMBER
---------- ------------------------------------------------------------
         2 C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605
         2 +FRA/tc/onlinelog/group_2.258.855057607
         1 C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597
         1 +FRA/tc/onlinelog/group_1.257.855057601
         3 C:\APP\ORACLE\ORADATA\TC\GROUP_3.266.855058587
         3 +FRA/tc/onlinelog/group_3.259.855058591
         4 C:\APP\ORACLE\ORADATA\TC\GROUP_4.267.855058593
         4 +FRA/tc/onlinelog/group_4.260.855058595
         5 C:\APP\ORACLE\ORADATA\TC\STB_REDO05.LOG
         6 C:\APP\ORACLE\ORADATA\TC\STB_REDO06.LOG
         7 C:\APP\ORACLE\ORADATA\TC\STB_REDO07.LOG
         8 C:\APP\ORACLE\ORADATA\TC\STB_REDO08.LOG
         9 C:\APP\ORACLE\ORADATA\TC\STB_REDO09.LOG


--对比一下主库的日志文件

SQL> set lin 120 pages 120
SQL> col member for a60
SQL> select group#,member from v$logfile;


    GROUP# MEMBER
---------- ------------------------------------------
         2 +DATA/tc/onlinelog/group_2.262.855057605
         2 +FRA/tc/onlinelog/group_2.258.855057607
         1 +DATA/tc/onlinelog/group_1.261.855057597
         1 +FRA/tc/onlinelog/group_1.257.855057601
         3 +DATA/tc/onlinelog/group_3.266.855058587
         3 +FRA/tc/onlinelog/group_3.259.855058591
         4 +DATA/tc/onlinelog/group_4.267.855058593
         4 +FRA/tc/onlinelog/group_4.260.855058595


由于主库没有创建备库日志文件,所以目前只有在线日志文件,共4组,分配给2个THREAD,每个THREAD使用2组,并且每组有2个MEMBER,一个放在+DATA,另一个放在+FRA


通过观察发现,此时再备库控制文件中记录的2个日志组位置,一个是通过LOG_FILE_NAME_CONVERT参数指定的从‘+DATA/TC/ONLINELOG‘转换到了‘C:\APP\ORACLE\ORADATA\TC\‘,但是并没有指定过‘+FRA/TC/ONLINELOGFILE‘,所以也就是现在看到的状态,+FRA那部分依然是主库的结构,但是备库是采用单实例本地磁盘的结构,并没有使用ASM磁盘组,那么这样2组日志,在备库应该怎么使用呢?可以发现,其实此时再备库数据文件目录‘C:\APP\ORACLE\ORADATA\TC\’中,并没有生成‘GROUP_1.261.855057597’,‘GROUP_2.262.855057605’,‘GROUP_3.266.855058587’,‘GROUP_4.267.855058593’这4个在线日志文件,更别说是+FRA对应的4个文件了,即,在我们恢复数据库数据文件的时候,只会恢复数据文件和临时文件,那么应该如何创建这几个文件呢?


开始,我想到的是先把完全不可能存在的+FRA那组在线日志文件的内容,从备库控制文件中删除


SQL> alter database drop logfile ‘+FRA/tc/onlinelog/group_1.257.855057601‘;
alter database drop logfile ‘+FRA/tc/onlinelog/group_1.257.855057601‘
*
第 1 行出现错误:
ORA-01514: 日志说明中出现错误: 没有此类日志
ORA-01517: 日志成员: ‘+FRA/tc/onlinelog/group_1.257.855057601‘


很正常,完全没有这个路径,就算有,ONLINE REDO LOG也不会在“RMAN> restore database;”命令中恢复


--尝试重建控制文件


SQL> oradebug setmypid
已处理的语句
SQL> alter database backup controlfile to trace;


数据库已更改。


SQL> oradebug tracefile_name
C:\APP\ORACLE\diag\rdbms\tcdg\tc\trace\tc_ora_1792.trc


用oradebug可以轻松地跟踪到具体的trace文件,而不需要执行复杂的sql查询语句


去目标路径打开这个tc_ora_1792.trc文件,可以发现创建控制文件的语句,这里选择NORESETLOGS的一种,内容如下:


STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "TC" NORESETLOGS FORCE LOGGING ARCHIVELOG
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 32
    MAXLOGHISTORY 292


*** 2014-08-13 09:30:03.000
LOGFILE


*** 2014-08-13 09:30:04.265
  GROUP 1 (
    ‘C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597‘,
    ‘+FRA/tc/onlinelog/group_1.257.855057601‘
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 2 (
    ‘C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605‘,
    ‘+FRA/tc/onlinelog/group_2.258.855057607‘
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 3 (
    ‘C:\APP\ORACLE\ORADATA\TC\GROUP_3.266.855058587‘,
    ‘+FRA/tc/onlinelog/group_3.259.855058591‘
  ) SIZE 50M BLOCKSIZE 512,
  GROUP 4 (
    ‘C:\APP\ORACLE\ORADATA\TC\GROUP_4.267.855058593‘,
    ‘+FRA/tc/onlinelog/group_4.260.855058595‘
  ) SIZE 50M BLOCKSIZE 512
-- STANDBY LOGFILE
--   GROUP 5 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO05.LOG‘  SIZE 50M BLOCKSIZE 512,
--   GROUP 6 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO06.LOG‘  SIZE 50M BLOCKSIZE 512,
--   GROUP 7 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO07.LOG‘  SIZE 50M BLOCKSIZE 512,
--   GROUP 8 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO08.LOG‘  SIZE 50M BLOCKSIZE 512,
--   GROUP 9 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO09.LOG‘  SIZE 50M BLOCKSIZE 512
DATAFILE


*** 2014-08-13 09:30:04.765
  ‘C:\APP\ORACLE\ORADATA\TC\SYSTEM.256.855057451‘,
  ‘C:\APP\ORACLE\ORADATA\TC\SYSAUX.257.855057453‘,
  ‘C:\APP\ORACLE\ORADATA\TC\UNDOTBS1.258.855057453‘,
  ‘C:\APP\ORACLE\ORADATA\TC\USERS.259.855057453‘,
  ‘C:\APP\ORACLE\ORADATA\TC\EXAMPLE.264.855057687‘,
  ‘C:\APP\ORACLE\ORADATA\TC\UNDOTBS2.265.855058289‘
CHARACTER SET ZHS16GBK
;


去掉+FRA的那个在线日志文件内容,执行创建语句


SQL> STARTUP NOMOUNT
SQL> CREATE CONTROLFILE REUSE DATABASE "TC" NORESETLOGS FORCE LOGGING ARCHIVELOG


  2      MAXLOGFILES 192
  3      MAXLOGMEMBERS 3
  4      MAXDATAFILES 1024
  5      MAXINSTANCES 32
  6      MAXLOGHISTORY 292
  7  LOGFILE
  8    GROUP 1 (
  9      ‘C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597‘
 10    ) SIZE 50M BLOCKSIZE 512,
 11    GROUP 2 (
 12      ‘C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605‘
 13    ) SIZE 50M BLOCKSIZE 512,
 14    GROUP 3 (
 15      ‘C:\APP\ORACLE\ORADATA\TC\GROUP_3.266.855058587‘
 16    ) SIZE 50M BLOCKSIZE 512,
 17    GROUP 4 (
 18      ‘C:\APP\ORACLE\ORADATA\TC\GROUP_4.267.855058593‘
 19    ) SIZE 50M BLOCKSIZE 512
 20  -- STANDBY LOGFILE
 21  --    GROUP 5 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO05.LOG‘  SIZE 50M BLOCKSIZE
 512,
 22  --    GROUP 6 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO06.LOG‘  SIZE 50M BLOCKSIZE
 512,
 23  --    GROUP 7 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO07.LOG‘  SIZE 50M BLOCKSIZE
 512,
 24  --    GROUP 8 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO08.LOG‘  SIZE 50M BLOCKSIZE
 512,
 25  --    GROUP 9 ‘C:\APP\ORACLE\ORADATA\TC\STB_REDO09.LOG‘  SIZE 50M BLOCKSIZE
 512
 26  DATAFILE
 27    ‘C:\APP\ORACLE\ORADATA\TC\SYSTEM.256.855057451‘,
 28    ‘C:\APP\ORACLE\ORADATA\TC\SYSAUX.257.855057453‘,
 29    ‘C:\APP\ORACLE\ORADATA\TC\UNDOTBS1.258.855057453‘,
 30    ‘C:\APP\ORACLE\ORADATA\TC\USERS.259.855057453‘,
 31    ‘C:\APP\ORACLE\ORADATA\TC\EXAMPLE.264.855057687‘,
 32    ‘C:\APP\ORACLE\ORADATA\TC\UNDOTBS2.265.855058289‘
 33  CHARACTER SET ZHS16GBK
 34  ;
CREATE CONTROLFILE REUSE DATABASE "TC" NORESETLOGS FORCE LOGGING ARCHIVELOG
*
第 1 行出现错误:
ORA-01503: CREATE CONTROLFILE 失败
ORA-01565: 标识文件 ‘C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597‘ 时出错
ORA-27041: 无法打开文件
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


本地路径对应的在线日志,也是不存在的,刚才也已经说明了,那么是不是要把控制文件中的LOGFILE整段都去掉呢?
这个我没有做测试,觉得应该不用这么复杂,确保主库远程归档路径没有ERROR后,直接在备库启用REDO APPLY


SQL> recover managed standby database disconnect from session
完成介质恢复。


此时查看日志文件的状态,会发现,备库会把在线日志文件做CLEARING,从第1组到第4组,挨个进行,直到清除完毕,在清除的同时,会在数据文件目录创建在线日志文件。


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


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CURRENT
         2          3 CLEARING
         3          2 INACTIVE
         4          2 INACTIVE


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


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CURRENT
         2          3 UNUSED
         3          3 CLEARING
         4          2 INACTIVE


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


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CURRENT
         2          3 UNUSED
         3          3 UNUSED
         4          3 CLEARING


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


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CURRENT
         2          3 UNUSED
         3          3 UNUSED
         4          3 UNUSED


通过v$logfile视图可以看到,每在线日志组的3个成员都被创建了,一个在实例名tc下面,一个在DB_UNIQUE_NAME(TCDG)下面,另一个在FLASH_RECOVERY_AREA里面


SQL> col member for a70
SQL> select group#,member from v$logfile;


    GROUP# MEMBER
---------- ----------------------------------------------------------------------
         2 C:\APP\ORACLE\ORADATA\TC\GROUP_2.262.855057605
         2 C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_2_9YOKR04W_.LOG
         1 C:\APP\ORACLE\ORADATA\TC\GROUP_1.261.855057597
         1 C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_1_9YOKQ7G5_.LOG
         3 C:\APP\ORACLE\ORADATA\TC\GROUP_3.266.855058587
         3 C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_3_9YOKRRJ3_.LOG
         4 C:\APP\ORACLE\ORADATA\TC\GROUP_4.267.855058593
         4 C:\APP\ORACLE\ORADATA\TCDG\ONLINELOG\O1_MF_4_9YOKSH5V_.LOG
         5 C:\APP\ORACLE\ORADATA\TC\STB_REDO05.LOG
         6 C:\APP\ORACLE\ORADATA\TC\STB_REDO06.LOG
         7 C:\APP\ORACLE\ORADATA\TC\STB_REDO07.LOG
         8 C:\APP\ORACLE\ORADATA\TC\STB_REDO08.LOG
         9 C:\APP\ORACLE\ORADATA\TC\STB_REDO09.LOG
         1 C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_1_9YOKQC7T_.LOG
         2 C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_2_9YOKRBMK_.LOG
         3 C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_3_9YOKRY8S_.LOG
         4 C:\APP\ORACLE\FLASH_RECOVERY_AREA\TCDG\ONLINELOG\O1_MF_4_9YOKSK5C_.LOG


--查看数据文件


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


     FILE#        TS# NAME
---------- ---------- ------------------------------------------------------------
         1          0 C:\APP\ORACLE\ORADATA\TC\SYSTEM.256.855057451
         2          1 C:\APP\ORACLE\ORADATA\TC\SYSAUX.257.855057453
         3          2 C:\APP\ORACLE\ORADATA\TC\UNDOTBS1.258.855057453
         4          4 C:\APP\ORACLE\ORADATA\TC\USERS.259.855057453
         5          6 C:\APP\ORACLE\ORADATA\TC\EXAMPLE.264.855057687
         6          5 C:\APP\ORACLE\ORADATA\TC\UNDOTBS2.265.855058289


--查看临时文件


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


     FILE#        TS# NAME
---------- ---------- ------------------------------------------------------------
         1          3 C:\APP\ORACLE\ORADATA\TCDG\DATAFILE\O1_MF_TEMP_9YOKLBG5_.TMP


小结:
1.在11g中,用传统方法来创建备库可以和10g一样,但是要注意用直接创建文件的方式来生成备库控制文件,而不是用备份集。
2.开启REDO APPLY以后,会自动清除控制文件中旧的信息(这里指存放路径),并立即逐个生成ONLINE REDO LOGFILE。
3.和采用duplicate方式创建的备库结果一致,每组也是生成3个在线日志成员,惟一的区别就是在duplicate中必须用SET NEWNAME FOR TEMPFILE 1 TO ‘C:\xxxx‘,来指定一个手动路径,否则会报冲突。
4.需要拷贝主库密码文件到备库相应位置,而duplicate是自动在备库创建的,duplicate还能用spfile参数指定并在备库直接生成spfile,而普通方式在完成后需要手动创建一个,SQL> create spfile from pfile;


最后,在做一个DG同步测试(注意执行各命令时的TIME)


主库:


SQL> set time on;
10:47:59 SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     53
下一个存档日志序列   54
当前日志序列           54
10:48:05 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          2 ACTIVE
         2          2 CURRENT
         3          2 INACTIVE
         4          2 INACTIVE


10:48:31 SQL> select sequence#,thread#,applied,archived from v$archived_log wher
e sequence#>49 order by 1;


 SEQUENCE#    THREAD# APPLIED   ARC
---------- ---------- --------- ---
        50          1 YES       YES
        50          1 NO        YES
        51          1 YES       YES
        51          1 NO        YES
        52          1 YES       YES
        52          1 NO        YES
        53          1 NO        YES
        53          1 YES       YES


10:49:35 SQL> create user zlm identified by aaron8219;


用户已创建。


10:50:45 SQL> conn zlm/aaron8219
ERROR:
ORA-01045: 用户 ZLM 没有 CREATE SESSION 权限; 登录被拒绝




警告: 您不再连接到 ORACLE。
10:51:06 SQL> grant create session,resource to zlm;
SP2-0640: 未连接
10:51:37 SQL> conn /as sysdba
已连接。
10:51:43 SQL> grant create session,resource to zlm;


授权成功。


10:51:52 SQL> conn zlm/aaron8219
已连接。
10:51:59 SQL> create table test1(int number,name varchar2(10));


表已创建。


10:52:27 SQL> insert into test1 values(1,‘aaron8219‘);


已创建 1 行。


10:52:48 SQL> commit;


提交完成。


10:53:13 SQL> alter system archive log current;
alter system archive log current
*
第 1 行出现错误:
ORA-01031: 权限不足




10:53:29 SQL> conn /as sysdba
已连接。
10:53:41 SQL> alter system archive log current;


系统已更改。


10:54:16 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          2 CURRENT
         2          2 ACTIVE
         3          2 INACTIVE
         4          2 INACTIVE


10:55:32 SQL> drop user zlm;
drop user zlm
*
第 1 行出现错误:
ORA-01922: 必须指定 CASCADE 以删除 ‘ZLM‘




10:57:05 SQL> drop user zlm cascade;


用户已删除。


10:57:16 SQL> conn zlm/aaron8219
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝




警告: 您不再连接到 ORACLE。
10:58:32 SQL> alter system archive log current;
SP2-0640: 未连接
10:58:43 SQL> conn /as sysdba
已连接。
10:58:51 SQL> alter system archive log current;


系统已更改。


10:59:23 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          2 ACTIVE
         2          2 CURRENT
         3          2 INACTIVE
         4          2 INACTIVE


10:59:29 SQL>


备库:


SQL> set time on;
10:48:46 SQL> archive log list
数据库日志模式            存档模式
自动存档             启用
存档终点            USE_DB_RECOVERY_FILE_DEST
最早的联机日志序列     53
下一个存档日志序列   0
当前日志序列           54
10:48:48 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CLEARING
         2          3 CURRENT
         3          3 UNUSED
         4          3 UNUSED


10:49:07 SQL> select sequence#,thread#,applied,archived from v$archived_log wher
e sequence#>49 order by 1;


 SEQUENCE#    THREAD# APPLIED   ARC
---------- ---------- --------- ---
        50          1 YES       YES
        51          1 YES       YES
        52          1 YES       YES
        53          1 YES       YES


已选择8行。


10:50:00 SQL> conn zlm/aaron8219
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝




警告: 您不再连接到 ORACLE。
10:52:59 SQL> conn zlm/aaron8219
已连接。
10:54:41 SQL> select * from test1;


       INT NAME
---------- ------------------------------------------------------------
         1 aaron8219


10:54:50 SQL> conn /as sysdba
已连接。
10:55:58 SQL> conn zlm/aaron8219
已连接。
10:56:21 SQL> select group#,members,status from v$log;
select group#,members,status from v$log
                                  *
第 1 行出现错误:
ORA-00942: 表或视图不存在




10:56:33 SQL> conn /as sysdba
已连接。
10:56:44 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CURRENT
         2          3 CLEARING
         3          3 UNUSED
         4          3 UNUSED


10:56:47 SQL> conn zlm/aaron8219
已连接。
10:57:56 SQL> select * from test1;


       INT NAME
---------- ------------------------------------------------------------
         1 aaron8219


10:58:06 SQL> select * from test1;
select * from test1
              *
第 1 行出现错误:
ORA-00942: 表或视图不存在




10:59:46 SQL> conn zlm/aaron8219
ERROR:
ORA-01017: 用户名/口令无效; 登录被拒绝




警告: 您不再连接到 ORACLE。
10:59:50 SQL> conn /as sysdba
已连接。
11:00:02 SQL> select group#,members,status from v$log;


    GROUP#    MEMBERS STATUS
---------- ---------- ----------------
         1          3 CLEARING
         2          3 CURRENT
         3          3 UNUSED
         4          3 UNUSED


11:00:05 SQL>