基於同一主機配置Oracle 11g Data Guard(logical standby)
Oracle Data Guard邏輯備庫是利用主庫的一個備份首先建立一個物理備庫,然後再將其轉換為邏輯備庫。這之後主庫將日誌傳遞到備庫,備庫利用logminer從主庫 的日誌中解析出主庫所執行過的SQL,在備庫上重新執行一遍,從而保證與主庫的資料在邏輯上保持一致。與物理備庫相對應的是,物理備庫使用的是redo apply,邏輯備庫使用的是sql apply。因此邏輯備庫僅僅保證資料與主庫是在邏輯上是一致的,從而邏輯備庫可以處於open狀態下並進行相應的DML操作。本文描述了建立邏輯備庫的 注意事項以及給出瞭如何建立邏輯備庫。
相關參考:
Oracle Data Guard 重要配置引數
基於同一主機配置 Oracle 11g Data Guard
1、邏輯備庫的一些限制
對於邏輯備庫,存在很多限制,如對於一些特殊的些資料型別象object,nested table,rowid,物件型別,自定義的資料型別等不被支援,以及不
支援段壓縮,不支援一些特定的DDL語句等等一大堆的東西了。具體可以參考Oracle Data Guard Concepts and Administration。儘管如此,邏
輯備庫依舊有很多物理備庫所不具備的特點。下面僅僅列出邏輯備庫幾個重要關注的資訊。
a、確定不被支援的schema
--對於Oracle資料庫自帶的相關schema會被跳過,因此不要基於這些schema來建立物件或測試,可使用下面的查詢來檢視
SQL> SELECT OWNER FROM DBA_LOGSTDBY_SKIP WHERE STATEMENT_OPT = 'INTERNAL SCHEMA';
b、確定不被支援的資料物件及資料型別
--使用下面的查詢查詢不被支援的表
SQL> SELECT DISTINCT owner, table_name FROM dba_logstdby_unsupported ORDER BY owner, table_name;
--可以對上面的查詢結果進一步細化,來查詢為什麼表不被支援,如下查詢是由於使用了object,nested table等型別導致該表不能被邏輯standby
SQL> SELECT column_name, data_type FROM dba_logstdby_unsupported WHERE owner = 'PM' AND table_name = 'PRINT_MEDIA';
COLUMN_NAME DATA_TYPE
------------------------------ -------------------------------------------
AD_TEXTDOCS_NTAB NESTED TABLE
AD_GRAPHIC BFILE
AD_HEADER OBJECT
c、確定存在唯一性問題的物件
由於邏輯standby與原資料庫是邏輯相同,因此邏輯standby上的rowid並不等同於主庫上的rowid。關於rowid可參考:Oracle ROWID
對於主庫上的update,delete操作,Oracle透過主鍵和唯一索引/補充日誌確保主庫與備庫所操作的物件為同一物件上的同一記錄
對於啟用了主鍵和唯一索引,補充日誌的情形,每一條update語句如何去鑑別被更新的行呢?針對下面的情形在寫redo的時候會附加列值唯一資訊
表存在主鍵,則主鍵值會隨同被更新列一起做為update語句的一部分
表無主鍵,存在非空的唯一索引/約束時,則最短的非空的唯一索引/約束會隨同被更新列做為update語句的一部分
表無主鍵,無唯一索引/約束,所有可定長度的列(除long,lob,long raw,object type,collection型別列)連同被更新列作為update語句的一部分
注,存在函式唯一索引的表能夠被實現SQL Apply,只要修改的行能夠被唯一鑑別,但該索引函式不能用作唯一性去鑑別更新的行
對於那些可由應用程式確保表上的行記錄唯一的,又不希望建立主鍵的情形,可以透過建立RELY約束,以避免維護主鍵所帶來的額外開銷
--可使用下面的方式為表新增RELY約束
SQL> ALTER TABLE tb_name ADD PRIMARY KEY (id, name) RELY DISABLE;
--資料字典DBA_LOGSTDBY_NOT_UNIQUE記錄了那些不存在主鍵以及唯一索引的表或者是說沒有足夠的資訊能夠保證主庫與邏輯standby鎖定相同物件
SQL> SELECT owner, table_name FROM dba_logstdby_not_unique
2 WHERE (owner, table_name) NOT IN (SELECT DISTINCT owner, table_name FROM dba_logstdby_unsupported) AND bad_column = 'Y';
--檢視主庫是否啟用補充日誌,在主庫執行包dbms_logstdby.build後即開始啟用
SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
2、邏輯備庫的幾個重要程式
邏輯備庫需要一系列的程式來完成日誌的捕獲和應用工作。主要由兩個元件組成:挖掘引擎與應用引擎。也就是一個負責從重歸檔日誌或備用日
志提取SQL語句集,一個負責將其SQL語句集應用到邏輯備庫。這兩個引擎的相關程式可以透過V$LOGSTDBY_PROCESS檢視中查詢獲得其相關資訊。
挖掘引擎程式:
READER : 程式從主庫傳過來的歸檔或者standby redo logfile中解析重做記錄(redo record)
PREPARER :程式負責將READER程式解析到的重做記錄轉換為LCR(Logical change record)
可以有多個PREPARER程式。解析出來的LCR存放在shared pool的一個叫做LCR cache的區域中
BUILDER :程式將LCR打包成事務,將多個LCR合成單個LCR,另外還負責管理LCR cache。如進行記憶體換頁,推進日誌挖掘檢查點等
應用引擎程式:
ANALYZER :該程式負責檢查一組LCR中包含的事務片段,過濾掉不需要應用的事務,檢查不同事務的依賴關係等
COORDINATOR :該程式分配事務給APPLIER程式,監控事務依賴關係和協調提交順序
APPLIER : 可以有多個該程式,它負責將LCR應用到備庫
3、建立邏輯備庫
- a、首先建立物理備庫
- 建立物理備庫的方法很多,對於Oracle 11g而言,可以直接從active database來建立,也可以基於10g 的RMAN使用duplicate方式來建立。
- 關於物理備庫的建立,此處不演示。
- 可以參考:基於同一主機配置 Oracle 11g Data Guard http://blog.csdn.net/robinson_0612/article/details/9979405
- b、 校驗主庫與物理備庫
- --主庫: CNBO,備庫: HKBO
- --主庫上的資訊
- CNBO> select name,database_role,switchover_status from v$database;
- NAME DATABASE_ROLE SWITCHOVER_STATUS
- ----------------- ---------------- ------------------------
- CNBO PRIMARY TO STANDBY
- --備庫上的資訊
- HKBO> select name,open_mode,database_role,protection_mode from v$database;
- NAME OPEN_MODE DATABASE_ROLE PROTECTION_MODE
- --------- -------------------- ---------------- --------------------
- HKBO MOUNTED PHYSICAL STANDBY MAXIMUM PERFORMANCE
- --SRL被apply的情形
- HKBO> select sequence#, first_time, next_time,applied from v$archived_log where rownum<3 order by first_time desc;
- SEQUENCE# FIRST_TIME NEXT_TIME APPLIED
- ---------- ------------------- ------------------- ---------------------------
- 7 2013/08/16 10:38:03 2013/08/16 10:46:11 YES
- 6 2013/08/16 10:38:00 2013/08/16 10:38:03 YES
- c、停用備庫MRP程式
- 對於將物理備庫切換到邏輯備庫,我們需要在主庫構建LogMiner字典及啟用補充日誌,因此應先停用邏輯備庫的MRP程式,避免產生額外的redo apply
- 如果正在使用Broker管理現有的物理備庫,應先在Broker中禁用目標資料庫。
- HKBO> alter database recover managed standby database cancel;
- d、修改主庫LOG_ARCHIVE_DEST_n引數
- 對於將來需要將邏輯備庫轉為主庫,而主庫轉為邏輯備庫的情形,建議先修改LOG_ARCHIVE_DEST_n引數
- 一是將主庫LOG_ARCHIVE_DEST_1引數中的VALID_FOR屬性改為僅僅聯機重做日誌有效,而不包括備用重做日誌
- 二是專門為備用重做日誌新增一個新的歸檔路徑,也就是說聯機日誌與備用日誌分開,修改如下面的示例,此演示我們未做修改
- LOG_ARCHIVE_DEST_1= --主庫: cnbo 備庫:hkbo
- 'LOCATION=USE_DB_RECOVERY_FILE_DEST --當cnbo為主庫時,用於存放cnbo產生的arch
- VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) --當cnbo被切換為備庫角色後,用於存放自身作為備庫產生的歸檔
- DB_UNIQUE_NAME=cnbo';
- LOG_ARCHIVE_DEST_3= --此歸檔路徑備用,僅當主庫cnbo轉換為備庫是有效
- 'LOCATION=USE_DB_RECOVERY_FILE_DEST --當cnbo為備庫角色時,用於存放從主庫hkbo接收到的STANDBY_LOGFILES
- VALID_FOR=(STANDBY_LOGFILES,STANDBY_ROLE)
- DB_UNIQUE_NAME=cnbo';
- LOG_ARCHIVE_DEST_STATE_3=ENABLE
- d、主庫上建立LogMiner資料字典
- CNBO> exec dbms_logstdby.build;
- e、將物理備庫轉換為邏輯備庫
- HKBO> show parameter db_name
- NAME TYPE VALUE
- ------------------------------------ --------------------------------- ------------------------------
- db_name string cnbo
- HKBO> alter database recover to logical standby hkbo;
- --如果你使用了pfile檔案,此處將ORA-16254,提示需要pfile檔案的db_name
- HKBO> shutdown abort;
- HKBO> startup mount; -->重啟備庫,因為邏輯備庫更名,包括DBID、INCARNATION等均已被重新初始化
- HKBO> select name,database_role from v$database;
- NAME DATABASE_ROLE
- --------------------------- ------------------------------------------------
- HKBO LOGICAL STANDBY
- --Author : Robinson Cheng
- --Blog : http://blog.csdn.net/robinson_0612
- f、重建備庫密碼檔案
- 重建備庫密碼檔案在Oracle 11g不再是必須的。在Oracle 10g中需要,且重建時要保持密碼與主庫相同
- g、修改備庫LOG_ARCHIVE_DEST_n引數
- 與物理備庫所不同的是,邏輯備庫被open後會產生自己的重做日誌(redo),因此我們需要配置引數LOG_ARCHIVE_DEST_n。
- 對於邏輯備庫,此時存在三種日誌檔案,即online redo log, archived redo log, standby redolog。
- HKBO> select name,value from v$parameter where name in ('log_archive_dest_1','log_archive_dest_2');
- NAME VALUE
- ------------------------- ------------------------------------------------------------
- log_archive_dest_1 LOCATION=USE_DB_RECOVERY_FILE_DEST db_unique_name=hkbo valid
- _for=(ALL_LOGFILES,ALL_ROLES)
- log_archive_dest_2 SERVICE=cnbo ASYNC db_unique_name=cnbo valid_for=(ONLINE_LOG
- FILES,PRIMARY_ROLES)
- HKBO> ho ls /u02/database/hkbo/fr_area/HKBO -->這個是未修改之前的閃回區的資料夾
- archivelog onlinelog
- HKBO> alter system set log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST
- 2 VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES) DB_UNIQUE_NAME=hkbo';
- HKBO> alter system set log_archive_dest_3='LOCATION=USE_DB_RECOVERY_FILE_DEST
- 2 VALID_FOR=(STANDBY_LOGFILES, STANDBY_ROLE) DB_UNIQUE_NAME=hkbo';
- HKBO> select name,value from v$parameter where name in ('log_archive_dest_1',
- 2 'log_archive_dest_2','log_archive_dest_3');
- NAME VALUE 描述
- ------------------------- ------------------------------------------- ---------------------------
- log_archive_dest_1 LOCATION=USE_DB_RECOVERY_FILE_DEST --當hkbo為備庫時,存放備庫產生的arch
- VALID_FOR=(ONLINE_LOGFILES, ALL_ROLES) --當hkbo轉換成主庫,存放作為主庫的arch
- DB_UNIQUE_NAME=hkbo
- log_archive_dest_2 SERVICE=cnbo ASYNC db_unique_name=cnbo --當hkbo為備庫時,此引數被忽略
- VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLES) --當hkbo為主庫時,傳送redo data到備庫cnbo
- log_archive_dest_3 LOCATION=USE_DB_RECOVERY_FILE_DEST --當hkbo為備庫時,直接歸檔從主庫接收的standby log
- VALID_FOR=(STANDBY_LOGFILES, STANDBY_ROLE) --當hkbo轉換為主庫,此引數被忽略
- DB_UNIQUE_NAME=hkbo
- --建議增加主庫與備庫的歸檔程式
- HKBO> alter system set log_archive_max_processes=9;
- CNBO> alter system set log_archive_max_processes=9;
- h、開啟邏輯備庫
- --需要使用resetlog方式開啟資料庫
- HKBO> alter database open resetlogs;
- --對於同一主機上的邏輯備庫,在首次啟用SQL Apply之前需要執行下面的操作以便SQL跳過任意的ALTER TABLESPACE DDL
- --關於這個步驟是否是必須的,從Oracle Data Guard Concepts and Administration來看我的理解是要執行
- HKBO> exec dbms_logstdby.skip('ALTER TABLESPACE');
- i、啟用SQL Apply
- HKBO> alter database start logical standby apply immediate;
- HKBO> ho ls /u02/database/hkbo/fr_area/HKBO --多出了一個foreign_archivelog資料夾用於存放來自主庫的日誌
- archivelog foreign_archivelog onlinelog
- j、校驗結果
- CNBO> create user robin identified by xxx
- 2 default tablespace users;
- CNBO> grant dba to robin;
- CNBO> conn robin/xxx;
- CNBO> create table t(what varchar(20),dt varchar(20));
- CNBO> insert into t select 'LogicalStdby',to_char(sysdate,'yyyymmdd hh24:mi:ss') from dual;
- CNBO> commit;
- CNBO> alter system switch logfile;
- HKBO> select * from robin.t; --在備庫上校驗
- WHAT DT
- ---------------------- ---------------------------
- LogicalStdby 20130820 17:33:19
------->>轉載於:http://blog.csdn.net/leshami/article/details/10149891
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29119536/viewspace-1263917/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 建立Data guard logical standby database須知Database
- Oracle 11g RAC Data Guard 物理standby 建立Oracle
- 【DataGuard】同一臺主機部署Oracle 11g物理Active Data Guard詳細過程Oracle
- 【DataGuard】同一臺主機實現物理Data Guard配置安裝
- Oracle 11g Data Guard (physical standby - active dataguard) [final]Oracle
- Data Guard - Snapshot Standby Database配置Database
- oracle9204(9i)_dg(data guard)__Tuning Logical Standby DatabasesOracleDatabase
- 建立Oracle 11g logical standbyOracle
- 【DG】同一臺主機實現物理Data Guard配置安裝(精簡版)
- oracle9i(9204)data guard(dg)_logical standby_failover操作指南OracleAI
- Oracle Data Guard配置Oracle
- Oracle 11g Data Guard 使用 duplicate from active database 建立 standby databaseOracleDatabase
- Oracle 11g Data Guard 使用duplicate from active database 建立 standby databaseOracleDatabase
- Oracle 11g Data GuardOracle
- data_guard 雙standby pfile 檔案配置
- Oracle 11g Data Guard Enabling Active Data GuardOracle
- 【DataGuard】Oracle 11g物理Data Guard之Snapshot Standby資料庫功能Oracle資料庫
- oracle9i(9204)data guard(dg)_logical standby_adding_recreating tableOracle
- oracle 11g data guard維護Oracle
- 【轉】【DataGuard】Oracle 11g物理Data Guard之Snapshot Standby資料庫功能Oracle資料庫
- 【DG】Data Guard搭建(physical standby)
- Oracle Data Gurad -- Logical Standby 相關說明Oracle
- 1 關於 Oracle Data GuardOracle
- Oracle 19C Data Guard基礎運維-01安裝物理standbyOracle運維
- Oracle 11g Data guard 物理主備庫正常切換(switchover)流程Oracle
- Oracle 11g Data Guard 物理備庫快速配置指南(上)Oracle
- 非OMF管理下ORACLE 11G R2 Data Guard配置Oracle
- ORACLE 11G Data Guard 角色轉換Oracle
- Oracle 12.2 How to Generate AWRs in Active Data Guard Standby DatabasesOracleDatabase
- Oracle 11g Aix 雙機 物理Standby配置 01OracleAI
- Oracle 11g Aix 雙機 物理Standby配置 02OracleAI
- Oracle 11g Aix 雙機 物理Standby配置 03OracleAI
- Oracle 11g Aix 雙機 物理Standby配置 04OracleAI
- 配置 Oracle 10g RAC primary + RAC logical standbyOracle 10g
- Oracle 9i R2 配置 Logical StandbyOracle
- 搭建Oracle Data Guard 11g(物理備用)Oracle
- Oracle Data Guard Linux 平臺 Physical Standby 搭建例項OracleLinux
- Oracle10g Data Guard (Standby) 理論與實踐Oracle