构建Dataguard逻辑备库指南

  一直想做一个logical standby,每次都是以失败告终,在屡败屡战之后,终于迎来了胜利!据说可以使用网格控制器点几下,简单的把物理备库转换成逻辑备库,下次有工夫的时候可以测试下!相信一切问题都是时间问题,一切烦恼都是自寻烦恼!下面来描述下如何将physical standby转换成logical standby,在开始之前,请先配好dataguard 的physical standby

physical standby配置请参考:
http://ylw6006.blog.51cto.com/470441/661105
dataguard各参数含义请参考:
http://space.itpub.net/519536/viewspace-578352
http://hi.baidu.com/edeed/blog/item/f54c6e06b92bc77703088174.html
 

环境介绍:
主库:
IP地址: 192.168.227.20/24
OS版本:Rhel5.4 32位
SID名称: orcl
db_name:  orcl
db_unique_name: primary

物理备库:(转换前)
IP地址: 192.168.227.30/24
OS版本:Rhel5.4 32位
SID名称: orcl
db_name:  orcl
db_unique_name: standby

逻辑备库:(转换后)
IP地址: 192.168.227.20/24
OS版本:Rhel5.4 32位
SID名称: orcl
db_name:  logdb
db_unique_name: logdb

一:在物理备库上确认归档日志apply正常

 SQL> SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received",
          APPL.SEQUENCE# "Last Sequence Applied"
         FROM
         (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG
         WHERE (THREAD#,FIRST_TIME )
          IN
         (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH,
          (SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME )
          IN
         (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL
     WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1


    Thread Last Sequence Received Last Sequence Applied
---------- ---------------------- ---------------------
         1                     10                    10
 


二:在备库上停止接收和应用归档日志
 SQL> alter database recover managed standby database cancel;
Database altered. 

三:配置主库  

 SQL> show parameter log_archive_config;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      DG_CONFIG=(primary,logdb)

SQL> show parameter dest_1;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_online_log_dest_1          string
log_archive_dest_1                   string      LOCATION=/u01/arch/orcl valid_
                                                 for=(all_logfiles,all_roles) d
                                                 b_unique_name=primary
            
SQL> show parameter dest_2; //service=standby,这里standby指的是tns串

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_create_online_log_dest_2          string
log_archive_dest_2                   string      service=standby lgwr async val
                                                 id_for=(online_logfiles,primar
                                                 y_role) db_unique_name=logdb

SQL> !mkdir -p /u01/arch/standby/orcl
SQL> alter system set log_archive_dest_3='LOCATION=/u01/arch/standby/orcl  VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)';
System altered.  

在主库生成LogMiner字典,切换日志
SQL> execute dbms_logstdby.build;
PL/SQL procedure successfully completed. 

四:配置备库
将物理备库转换成逻辑备库,在这之前请确保物理备库使用spfile启动

 SQL> alter database recover to logical standby logdb;
Database altered. 

SQL> shutdown immediate
SQL> startup mount
SQL> show parameter log_archive_config;  //dg_config后面的参数指的是db_unique_name

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
log_archive_config                   string      DG_CONFIG=(primary,logdb)

SQL> alter system set db_unique_name='logdb' scope=spfile;
System altered

SQL> alter system set log_archive_dest_1='LOCATION=/u01/arch/orcl valid_for=(online_logfiles,all_roles) db_unique_name=logdb' scope=spfile;
System altered 

SQL> !mkdir -p /u01/arch/standby/orcl

SQL> alter system set log_archive_dest_3='LOCATION=/u01/arch/standby/orcl  VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)';
System altered.

SQL> shutdown immediate

修改tnsnames.ora文件,主库上也需要修改
[oracle@orcl u01]$ tnsping standby
TNS Ping Utility for Linux: Version 10.2.0.1.0 - Production on 28-SEP-2011 11:01:31
Copyright (c) 1997, 2005, Oracle.  All rights reserved.
Used parameter files:

Used TNSNAMES adapter to resolve the alias
 ) ERVICE_NAME = logdb.herostart.com) 192.168.227.30)(PORT = 1521))  OK (20 msec)
 
将备库打开,置为应用sql模式
SQL> conn /as sysdba
Connected to an idle instance.
SQL> startup mount
SQL> ALTER DATABASE OPEN RESETLOGS;
Database altered.

SQL> alter database start logical standby apply immediate;
alter database start logical standby apply immediate
*
ERROR at line 1:
ORA-16239: IMMEDIATE option not available without standby redo logs

SQL> alter database add standby logfile group 4 '/u01/app/oracle/oradata/orcl/standby04.dbf' size 50M;
Database altered.

SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standby05.dbf' size 50M;
Database altered.

SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standby06.dbf' size 50M;
Database altered.

SQL> alter database start logical standby apply immediate;
Database altered

SQL> select name, database_role from v$database;

NAME      DATABASE_ROLE
--------- ----------------
LOGDB     LOGICAL STANDBY 

五:测试

 主库更新:
SQL> select sysdate from dual;

SYSDATE
-------------------
2011-09-28:14:07:04

SQL> update hr.employees set salary=200 where employee_id=100;
1 row updated.

备库查询:
SQL> select salary from hr.employees where employee_id=100;

    SALARY
----------
       100

SQL> select sysdate from dual;

SYSDATE
-------------------
2011-09-28:14:08:38

主库提交,切换日志
SQL> commit;
Commit complete.

SQL> alter system switch logfile;
System altered.

备库再次查询
SQL> select salary from hr.employees where employee_id=100;

    SALARY
----------
       200

六:验证

 SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, DICT_BEGIN, DICT_END FROM DBA_LOGSTDBY_LOG ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIME          NEXT_TIME           DIC DIC
---------- ------------------- ------------------- --- ---
        24 2011-09-28:13:19:50 2011-09-28:13:46:09 NO  NO
        25 2011-09-28:13:46:09 2011-09-28:14:09:11 NO  NO

SQL>  select file_name,applied from DBA_LOGSTDBY_LOG ;

FILE_NAME                                     APPLIED
--------------------------------------------- --------
/u01/arch/standby/orcl/1_24_760125331.arc     YES
/u01/arch/standby/orcl/1_25_760125331.arc     YES
  
  
SQL> SELECT EVENT_TIME, STATUS, EVENT FROM DBA_LOGSTDBY_EVENTS ORDER BY EVENT_TIME, COMMIT_SCN;

EVENT_TIME           STATUS               EVENT
-------------------- -------------------- --------------------------------
2011-09-28:11:09:32  ORA-16111: log minin
                     g and apply setting
                     up

2011-09-28:11:28:04  ORA-16128: User init
                     iated stop apply suc
                     cessfully completed

 

2011-09-28:11:28:04  ORA-16112: log minin
                     g and apply stopping

 


EVENT_TIME           STATUS               EVENT
-------------------- -------------------- --------------------------------

 

2011-09-28:11:28:14  ORA-16111: log minin
                     g and apply setting
                     up

 

 

2011-09-28:11:53:23  ORA-16226: DDL skipp ALTER DATABASE OPEN
                     ed due to lack of su
                     pport

2011-09-28:12:49:31  ORA-16128: User init
                     iated stop apply suc

EVENT_TIME           STATUS               EVENT
-------------------- -------------------- --------------------------------
                     cessfully completed

2011-09-28:12:50:11  ORA-16111: log minin
                     g and apply setting
                     up

2011-09-28:13:23:59  ORA-16226: DDL skipp ALTER DATABASE OPEN
                     ed due to lack of su
                     pport

8 rows selected.


[oracle@orcl orcl]$ tail -f /u01/app/oracle/admin/orcl/bdump/alert_orcl.log   
Primary database is in MAXIMUM PERFORMANCE mode
Wed Sep 28 14:09:13 2011
LOGMINER: Log Auto Delete - deleting: /u01/arch/orcl/1_22_760125331.arc
Deleted file /u01/arch/orcl/1_22_760125331.arc
Wed Sep 28 14:09:13 2011
LOGMINER: Log Auto Delete - deleting: /u01/arch/orcl/1_23_760125331.arc
Deleted file /u01/arch/orcl/1_23_760125331.arc
Wed Sep 28 14:09:13 2011
RFS[3]: Successfully opened standby log 4: '/u01/app/oracle/oradata/orcl/standby04.dbf'
Wed Sep 28 14:09:15 2011
LOGMINER: Begin mining logfile: /u01/app/oracle/oradata/orcl/standby04.dbf
Wed Sep 28 14:09:15 2011
RFS LogMiner: Registered logfile [/u01/arch/standby/orcl/1_25_760125331.arc] to LogMiner session id [1]
 

[oracle@orcl ~]$ ll /u01/arch/standby/orcl/*
-rw-r----- 1 oracle oinstall  772608 Sep 28 13:46 /u01/arch/standby/orcl/1_24_760125331.arc
-rw-r----- 1 oracle oinstall 1597952 Sep 28 14:09 /u01/arch/standby/orcl/1_25_760125331.arc

 
SQL> SELECT NAME, VALUE FROM V$LOGSTDBY_STATS;

NAME                                                         VALUE
------------------------------------------------------------ ----------
number of preparers                                          1
number of appliers                                           5
maximum SGA for LCR cache                                    30
parallel servers in use                                      9
maximum events recorded                                      100
preserve commit order                                        TRUE
transaction consistency                                      FULL
record skip errors                                           Y
record skip DDL                                              Y
record applied DDL                                           N
record unsupported operations                                N

NAME                                                         VALUE
------------------------------------------------------------ ----------
coordinator state                                            IDLE
transactions ready                                           364
transactions applied                                         364
coordinator uptime                                           10071
realtime logmining                                           Y
apply delay                                                  0
Log Miner session ID                                         1
txns delivered to client                                     3466
DML txns delivered                                           1498
DDL txns delivered                                           11
CTAS txns delivered                                          0

NAME                                                         VALUE
------------------------------------------------------------ ----------
Recursive txns delivered                                     1957
Rolled back txns seen                                        6
LCRs delivered to client                                     11908
bytes of redo processed                                      11022032
bytes paged out                                              0
seconds spent in pageout                                     0
bytes checkpointed                                           0
seconds spent in checkpoint                                  0
bytes rolled back                                            0
seconds spent in rollback                                    0
seconds system is idle                                       2509

33 rows selected.


SQL> SELECT APPLIED_SCN, LATEST_SCN, MINING_SCN, RESTART_SCN FROM V$LOGSTDBY_PROGRESS;

APPLIED_SCN LATEST_SCN MINING_SCN RESTART_SCN
----------- ---------- ---------- -----------
     550947     550963     550948      550948

 

七:排错

 先前一直出现如下错误
SQL> SELECT TYPE, STATUS_CODE, STATUS FROM V$LOGSTDBY_PROCESS;

TYPE                           STATUS_CODE        STATUS
------------------------------ -----------------------------------
COORDINATOR                    1291              ORA-01291: missing logfile 

SQL> SELECT * FROM V$LOGSTDBY_STATE;

PRIMARY_DBID SESSION_ID   REALTIME_APPLY          STATE
------------ -------------------------------------------------------
  1287906064   1          Y              WAITING FOR DICTIONARY LOGS
 
 
后来发现是因为日志文件未从主库传送到备库,手动传送并注册后正常,传送不成功的原因是主库的log_archive_dest_2参数设置不正确导致
SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_11_760125331.arc';
Database altered.

SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_12_760125331.arc';
Database altered.

SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_13_760125331.arc';
Database altered.

SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_14_760125331.arc';
Database altered.

SQL> select session_id,state from v$logstdby_state;

SESSION_ID STATE
---------- -------------------
         1 LOADING DICTIONARY  

值得一提的是逻辑备库会自动删除已经应用的日志  
[oracle@orcl u01]$ tail -f /u01/app/oracle/admin/orcl/bdump/alert_orcl.log
Deleted file /u01/arch/orcl/1_13_760125331.arc
Wed Sep 28 11:53:54 2011
LOGMINER: End mining logfile: /u01/arch/orcl/1_15_760125331.arc
Wed Sep 28 11:53:54 2011
LOGMINER: Begin mining logfile: /u01/arch/orcl/1_16_760125331.arc
Wed Sep 28 11:53:55 2011
LOGMINER: End mining logfile: /u01/arch/orcl/1_16_760125331.arc
Wed Sep 28 11:53:55 2011
LOGMINER: Log Auto Delete - deleting: /u01/arch/orcl/1_14_760125331.arc
Deleted file /u01/arch/orcl/1_14_760125331.arc

SQL> select file_name,applied from DBA_LOGSTDBY_LOG ;

FILE_NAME                        APPLIED
-------------------------------- --------
/u01/arch/orcl/1_15_760125331.arc CURRENT
/u01/arch/orcl/1_16_760125331.arc CURRENT 

八:备注

 以下数据类型不被逻辑备库支持:
NCLOB
LONG
LONG RAW
BFILE
ROWID
UROWID

检查不被逻辑备库支持的表:
SQL> SELECT DISTINCT OWNER,TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED ORDER BY OWNER,TABLE_NAME;

以下操作不被逻辑备库支持:
ALTER DATABASE
ALTER SESSION
ALTER SNAPSHOT
ALTER SNAPSHOT LOG
ALTER SYSTEM SWITCH LOG
CREATE CONTROL FILE
CREATE DATABASE
CREATE DATABASE LINK
CREATE PFILE FROM SPFILE
CREATE SCHEMA AUTHORIZATION
CREATE SNAPSHOT
CREATE SNAPSHOT LOG
CREATE SPFILE FROM PFILE
CREATE TABLE AS SELECT FROM A CLUSTER TABLE
DROP DATABASE LINK
DROP SNAPSHOT
DROP SNAPSHOT LOG
EXPLAIN
LOCK TABLE
RENAME
SET CONSTRAINTS
SET ROLE
SET TRANSACTION

高级队列的管理和物化视图的刷新不被支持(DBMS_AQADM,DBMS_MVIEW_REFRESH)

Logical Standby要求每张表应该有Primary key或者Unique index,如果必须有没有唯一性标示的表,那么可以激活Primary库的supplemental logging属性,但是这样将会在redo log中记录该表中每一条记录的所有字段作为标示,会大大增加redo log的记录量。
 
检查没有唯一性标示的表:
SQL> SELECT OWNER, TABLE_NAME,BAD_COLUMN FROM DBA_LOGSTDBY_NOT_UNIQUE WHERE TABLE_NAME NOT IN (SELECT TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED);
 
如果可以确认表中有唯一标示的字段,但是又不想真正创建主键或者索引来增加更新的开销,那么可以创建disabled RELY类型的约束,比如:
SQL> ALTER TABLE mytab ADD PRIMARY KEY (id, name) RELY DISABLE;
 
检查supplemental logging是否已经被激活。
SQL> SELECT SUPPLEMENTAL_LOG_DATA_PK, SUPPLEMENTAL_LOG_DATA_UI FROM V$DATABASE;

用以下方法激活Primary库的supplemental logging属性:
SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY, UNIQUE INDEX) COLUMNS;

激活supplemental logging属性以后,作一次日志切换,保证当前日志中不包含非追加日志数据(nonsupplemental log)。
SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
 
创建一个新的表空间,用于LogMiner,否则Logical Standby需要的对象将默认创建在SYSTEM表空间中。
SQL> CREATE TABLESPACE logmnrts DATAFILE '/disk1/oracle/dbs/logmnrts.dbf' SIZE25MAUTOEXTEND ON MAXSIZE UNLIMITED;
SQL> EXECUTE DBMS_LOGMNR_D.SET_TABLESPACE('logmnrts');

无论是物理备库还是逻辑备库,都应该先启动备库,再启动主库;先关闭主库,后关闭备库!

参考文档:
http://avdeo.com/2010/05/04/converting-physical-standby-to-logical-oracle-dataguard-10g/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值