一直想做一個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",
|
二:在備庫上停止接收和應用歸檔日誌
SQL> alter database recover managed standby database cancel; Database altered. |
三:配置主庫
SQL> show parameter log_archive_config; NAME TYPE VALUE SQL> show parameter dest_1; NAME TYPE VALUE NAME TYPE VALUE SQL> !mkdir -p /u01/arch/standby/orcl 在主庫生成LogMiner字典,切換日誌 |
四:配置備庫
將物理備庫轉換成邏輯備庫,在這之前請確保物理備庫使用spfile啓動
SQL> alter database recover to logical standby logdb; SQL> shutdown immediate NAME TYPE VALUE SQL> alter system set db_unique_name='logdb' scope=spfile; SQL> alter system set log_archive_dest_1='LOCATION=/u01/arch/orcl valid_for=(online_logfiles,all_roles) db_unique_name=logdb' scope=spfile; 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)'; SQL> shutdown immediate 修改tnsnames.ora文件,主庫上也需要修改 Used TNSNAMES adapter to resolve the alias SQL> alter database start logical standby apply immediate; SQL> alter database add standby logfile group 4 '/u01/app/oracle/oradata/orcl/standby04.dbf' size 50M; SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standby05.dbf' size 50M; SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standby06.dbf' size 50M; SQL> alter database start logical standby apply immediate; SQL> select name, database_role from v$database; NAME DATABASE_ROLE |
五:測試
主庫更新: SYSDATE SQL> update hr.employees set salary=200 where employee_id=100; 備庫查詢: SALARY SQL> select sysdate from dual; SYSDATE 主庫提交,切換日誌 SQL> alter system switch logfile; 備庫再次查詢 SALARY |
六:驗證
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 SQL> select file_name,applied from DBA_LOGSTDBY_LOG ; FILE_NAME APPLIED EVENT_TIME STATUS EVENT 2011-09-28:11:28:04 ORA-16128: User init
2011-09-28:11:28:04 ORA-16112: log minin
2011-09-28:11:28:14 ORA-16111: log minin
2011-09-28:11:53:23 ORA-16226: DDL skipp ALTER DATABASE OPEN 2011-09-28:12:49:31 ORA-16128: User init EVENT_TIME STATUS EVENT 2011-09-28:12:50:11 ORA-16111: log minin 2011-09-28:13:23:59 ORA-16226: DDL skipp ALTER DATABASE OPEN 8 rows selected.
[oracle@orcl ~]$ ll /u01/arch/standby/orcl/* NAME VALUE NAME VALUE NAME VALUE 33 rows selected.
APPLIED_SCN LATEST_SCN MINING_SCN RESTART_SCN |
七:排錯
先前一直出現如下錯誤 TYPE STATUS_CODE STATUS SQL> SELECT * FROM V$LOGSTDBY_STATE; PRIMARY_DBID SESSION_ID REALTIME_APPLY STATE SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_12_760125331.arc'; SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_13_760125331.arc'; SQL> ALTER DATABASE REGISTER LOGICAL LOGFILE '/u01/arch/orcl/1_14_760125331.arc'; SQL> select session_id,state from v$logstdby_state; SESSION_ID STATE 值得一提的是邏輯備庫會自動刪除已經應用的日誌 SQL> select file_name,applied from DBA_LOGSTDBY_LOG ; FILE_NAME APPLIED |
八:備註
以下數據類型不被邏輯備庫支持: 檢查不被邏輯備庫支持的表: 以下操作不被邏輯備庫支持: 高級隊列的管理和物化視圖的刷新不被支持(DBMS_AQADM,DBMS_MVIEW_REFRESH) Logical Standby要求每張表應該有Primary key或者Unique index,如果必須有沒有唯一性標示的表,那麼可以激活Primary庫的supplemental logging屬性,但是這樣將會在redo log中記錄該表中每一條記錄的所有字段作爲標示,會大大增加redo log的記錄量。 用以下方法激活Primary庫的supplemental logging屬性: 激活supplemental logging屬性以後,作一次日誌切換,保證當前日誌中不包含非追加日誌數據(nonsupplemental log)。 無論是物理備庫還是邏輯備庫,都應該先啓動備庫,再啓動主庫;先關閉主庫,後關閉備庫! |
參考文檔:
http://avdeo.com/2010/05/04/converting-physical-standby-to-logical-oracle-dataguard-10g/