<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Decode360's Blog

    業精于勤而荒于嬉 QQ:150355677 MSN:decode360@hotmail.com

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 ::  :: 管理 ::
      397 隨筆 :: 33 文章 :: 29 評論 :: 0 Trackbacks
    本文作者: junsansi???? 轉載網址: http://www.5ienet.com/index.shtml
    ?
    ?
    第三部分邏輯standby(1)創建步驟? 2008.02.03
    ?
    ?
    一、準備工作
    ?
    ??? 正如我們打小就被叮囑飯前一定要洗手,在創建邏輯standby 之前,準備工作同樣必不可少。
    ?
    ??? 在創建邏輯standby 之前,首先檢查primary 數據庫的狀態,確保primary 數據庫已經為創建邏輯standby做好了全部準備工作,比如說是否啟動了歸檔,是否啟用了forced logging 等,這部分可以參考創建物理standby時的準備工作。
    ?
    ??? 除此之外呢,由于邏輯standby 是通過sql 應用來保持與primary 數據庫的同步。sql 應用與redo 應用是有很大區別地,這事兒咱們前面提到過,redo 應用實際上是物理standby 端進行recover,sql 應用則是分析redo 文件,將其轉換為sql 語句在邏輯standby 端執行,因此,需要注意:
    ?
    ??? 并非所有的數據類型都能被邏輯standby支持;
    ?
    ??? 支持的數據類型有:
    ??? BINARY_DOUBLE、BINARY_FLOAT、BLOB、CHAR、CLOB and NCLOB、DATE、INTERVAL YEAR TOMONTH、INTERVAL DAY TO SECOND、LONG、LONG RAW、NCHAR、NUMBER、NVARCHAR2、RAW、TIMESTAMP、TIMESTAMP WITH LOCAL TIMEZONE、TIMESTAMP WITH TIMEZONE、VARCHAR2 andVARCHAR

    ??? 提示:
    ??? 下列類型在獲取standby 支持時需要注意兼容性:
    ??? ¤ clob,需要primary 數據庫的兼容級別運行于10.1 或更高
    ??? ¤ 含lob 字段的索引組織表(IOT),需要primary 數據庫的兼容級別運行于10.2 或更高
    ??? ¤ 不含lob 字段的索引組織表(IOT),需要primary 數據庫的兼容級別運行于10.1 或更高

    ?
    ??? 不支持的數據類型有:
    ??? BFILE、Encrypted columns、ROWID, UROWID、XMLType、對象類型、VARRAYS、嵌套表、自定義類型。
    ?
    ??? 洗手殺菌可以用肥皂或洗手液,檢查數據庫是否有不被邏輯standby 支持的對象也同樣有簡單方式,我們可以通過查詢視圖DBA_LOGSTDBY_UNSUPPORTED 來確定主數據庫中是否含有不支持的對象:

    ??? SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;

    ?

    ??? 提示:關于DBA_LOGSTDBY_UNSUPPORTED
    ??? 該視圖顯示包含不被支持的數據類型的表的列名及該列的數據類型。注意該視圖的ATTRIBUTES 列,列值會顯示表不被sql 應用支持的原因。

    ?
    ??? 并非所有的存儲類型都能被邏輯standby支持;
    ?
    ?? 支持簇表(Cluster tables)、索引組織表(Index-organized tables)、堆組織表(Heap-organized tables),不支持段壓縮(segment compression)存儲類型
    ?
    ??? 并非所有的pl/sql包都能被SQL應用支持。
    ?
    ??? 那些可能修改系統元數據的包不會被sql 應用支持,因此即使它們在primary 執行過,并且被成功傳輸到邏輯standby 端, 也不會執行, 例如: DBMS_JAVA, DBMS_REGISTRY, DBMS_ALERT,DBMS_SPACE_ADMIN, DBMS_REFRESH, DBMS_REDEFINITION, DBMS_SCHEDULER, and DBMS_AQ等。
    ??? 只有dbms_job 例外,primary 數據庫的jobs 會被復制到邏輯standby,不過在standby 數據庫不會執行這些job。
    ?
    ??? 并非所有的sql語句都能在邏輯standby執行;
    ?
    ??? 默認情況下,下列sql 語句在邏輯standby 會被sql 應用自動跳過:
    ??? ALTER DATABASE
    ??? ALTER MATERIALIZED VIEW
    ??? ALTER MATERIALIZED VIEW LOG
    ??? ALTER SESSION
    ??? ALTER SYSTEM
    ??? CREATE CONTROL FILE
    ??? CREATE DATABASE
    ??? CREATE DATABASE LINK
    ??? CREATE PFILE FROM SPFILE
    ??? CREATE MATERIALIZED VIEW
    ??? CREATE MATERIALIZED VIEW LOG
    ??? CREATE SCHEMA AUTHORIZATION
    ??? CREATE SPFILE FROM PFILE
    ??? DROP DATABASE LINK
    ??? DROP MATERIALIZED VIEW
    ??? DROP MATERIALIZED VIEW LOG
    ??? EXPLAIN
    ??? LOCK TABLE
    ??? SET CONSTRAINTS
    ??? SET ROLE
    ??? SET TRANSACTION
    ?
    ??? 另外,還有一大批ddl 操作,同樣也不會在邏輯standby 端執行,由于數目較重,此處不再一一列舉,感興趣的話請google 查看官方文檔。
    ?
    ??? 并非所有的dml操作都能在邏輯standby端SQL 應用;
    ?
    ??? 維護邏輯standby 與primary 的數據庫同步是通過sql 應用實現,SQL 應用轉換的SQL 語句在執行時,對于insert 還好說,對于update,delete 操作則必須能夠唯一定位到數據庫待更新的那條記錄。問題就在這里,如果primary 庫中表設置不當,可能就無法確認唯一條件。
    ??? 你可能會說可以通過rowid 唯一嘛?。⊥瑢W,千萬要謹記啊,邏輯standby,為啥叫邏輯standby 呢,它跟物理standby 有啥區別呢,就是因為它只是邏輯上與primary 數據庫相同,物理上可能與primary 數據庫存在相當大差異,一定要認識到,邏輯standby 的物理結構與primary 是不相同的(即使初始邏輯standby 是通過primary 的備份創建),因此想通過rowid 更新顯然是不好使的,就不能再將其做為唯一條件。那怎么辦泥,OK,話題被引入,下面請聽三思向您一一道來:
    ?
    ??? 如何確保primary庫中各表的行可被唯一標識
    ?
    ??? Oracle 通過主鍵、唯一索引/約束補充日志(supplemental logging)來確定待更新邏輯standby 庫中的行。當數據庫啟用了補充日志(supplemental logging),每一條update 語句寫redo 的時候會附加列值唯一信息,比如:
    ??? ◆ 如果表定義了主鍵,則主鍵值會隨同被更新列一起做為update 語句的一部分,以便執行時區別哪些列應該被更新。
    ??? ◆ 如果沒有主鍵,則非空的唯一索引/約束會隨同被更新列做為update 語句的一部分,以便執行時區分哪些列應該被更新,如果該表有多個唯一索引/約束,則oracle 自動選擇最短的那個。
    ??? ◆ 如果表即無主鍵,也沒有定義唯一索引/約束,所有可定長度的列連同被更新列作為update 語句的一部分。更明確的話,可定長度的列是指那些除:long,lob,long raw,object type,collection 類型外的列。
    ?
    ??? 確定在主數據庫上,補充日志是否被啟用,可以查詢v$database,如下:

    ??? SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
    ??? SUP SUP
    ??? --- ---
    ??? YES YES


    ??? 因此,Oracle 建議你為表創建一個主鍵或非空的唯一索引/約束,以盡可能確保sql 應用能夠有效應用redo 數據,更新邏輯standby 數據庫。
    ?
    ??? 執行下列語句檢查sql 應用能否唯一識別表列,找出不被支持的表

    ??? SQL> SELECT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE
    ????? 2> WHERE (OWNER, TABLE_NAME) NOT IN
    ????? 3> (SELECT DISTINCT OWNER, TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)
    ????? 4> AND BAD_COLLUMN = 'Y';

    ?

    ??? 提示:關于DBA_LOGSTDBY_NOT_UNIQUE
    ??? 該視圖顯示所有即沒主鍵也沒唯一索引的表。如果表中的列包括足夠多的信息通常也可支持在邏輯standby 的更新,不被支持的表通常是由于列的定義包含了不支持的數據類型。
    ??? 注意BAD_COLUMN 列值,該列有兩個值:
    ??? Y:表示該表中有采用大數據類型的字段,比如LONG 啦,CLOB 啦之類。如果表中除log 列某些行記錄完全匹配,則該表無法成功應用于邏輯standby。standby 會嘗試維護這些表,不過你必須保證應用不允許
    ??? N:表示該表擁有足夠的信息,能夠支持在邏輯standby 的更新,不過仍然建議你為該表創建一個主鍵或者唯一索引/約束以提高log 應用效率。

    ?
    ??? 假設某張表你可以確認數據是唯一的,但是因為效率方面的考慮,不想為其創建主鍵或唯一約束,怎么辦呢,沒關系,oracle 想到了這一點,你可以創建一個disable 的primary-key rely 約束:
    ?
    ??? 關于primary-key RELY 約束:
    ??? 如果你能夠確認表中的行是唯一的,那么可以為該表創建rely 的主鍵,RELY 約束并不會造成系統維護主鍵的開銷,主你對一個表創建了rely 約束,系統則會假定該表中的行是唯一,這樣能夠提供sql 應用時的性能。但是需要注意,由于rely 的主鍵約束只是假定唯一,如果實際并不唯一的話,有可能會造成錯誤的更新喲。
    ?
    ??? 創建rely 的主鍵約束非常簡單,只要在標準的創建語句后加上RELY DISABLE 即可,例如:

    ??? SQL> alter table jss.b add primary key (id) rely disable;
    ??? 表已更改。

    ?

    二、創建步驟
    ?
    1、創建物理standby
    ?
    ??? 最方便的創建邏輯standby 的方式就是先創建一個物理standby,然后再將其轉換成邏輯standby,因此第一步就是先創建一個物理standby。注意,在將其轉換為邏輯standby 前,可以隨時啟動和應用redo,但是如果你決定將其轉換為邏輯standby,就必須先停止該物理standby 的redo 應用,以避免提前應用含
    LogMiner 字典的redo 數據,造成轉換為邏輯standby 后,sql 應用時logMiner 字典數據不足而影響到邏輯standby 與primary 的正常同步。
    ?
    2、設置primary 數據庫
    ?
    ??? 在前面創建standby 時我們曾經設置過無數個初始化參數用于primary 與物理standby 的角色切換,我想說的是,對于邏輯standby 的角色切換,那些參數同樣好使。
    ??? 不過注意,如果希望primary 數據庫能夠正常切換為邏輯standby 角色的話,那么你還需要設置相應的log_archive_dest_N,并且valid_for 屬性,需要更改成:(STANDBY_LOGFILES,STANDBY_ROLE)。
    ?
    ??? 然后需要生成LogMiner 字典信息,通過執行下列語句生成(務必執行):

    ??? SQL> EXECUTE DBMS_LOGSTDBY.BUILD;

    ?
    ??? 該過程專門用于生成記錄的元數據信息到redo log,這樣改動才會被傳輸到邏輯standby,然后才會被邏輯standby 進行SQL 應用。

    ??? 提示:
    ??? ¤ 該過程會自動啟用primary 數據庫的補充日志(supplemental logging)功能(如果未啟用的話)。
    ??? ¤ 該過程執行需要等待當前所有事務完成,因此如果當前有較長的事務運行,可能該過程執行也需要多花一些等待時間。
    ??? ¤ 該過程是通過閃回查詢的方式來獲取數據字典的一致性, 因此oracle 初始化參數UNDO_RETENTION 值需要設置的足夠大。

    ?
    3、轉換物理standby 為邏輯standby

    ??? 執行下列語句,轉換物理standby 為邏輯standby:

    ??? SQL> alter database recover to logical standby NEW_DBNAME;

    ?
    ??? 關于db_name(注意喲,這可不是db_unique_name,不同于物理standby,邏輯standby 是一個全新的數據庫,因此建議你指定一個唯一的,與primary 不同的數據庫名),如果當前使用spfile,則數據庫會自動修改其中的相關信息,如果使用的pfile,在下次執行shutdown 的時候oracle 會提示你去修改db_name 初始化參數的值。

    ??? 提示:執行該語句前務必確保已經暫停了redo 應用,另外轉換是單向的,即只能由物理standby 向邏輯standby 轉換,而不能由邏輯standby 轉成物理standby。這并不僅僅是因為dbname 發生了修改,更主要的原因是邏輯standby 僅是數據與primary 一致,其它如存儲結構,scn 等基于dbid 都不一相同。

    ?
    ??? 另外,該語句執行過程中,需要應用全部的LogMiner 字典相關的redo 數據。這部分操作完全依賴于primary 數據庫DBMS_LOGSTDBY.BUILD 的執行以及傳輸到standby 后有多少數據需要被應用。如果primary 數據庫執行DBMS_LOGSTDBY.BUILD 失敗,則轉換操作也不會有結果,這時候你恐怕不得不先cancel 掉它,解決primary 數據庫的問題之后再嘗試執行轉換。
    ?
    4、重建邏輯standby 的密碼文件

    ??? 主要是由于轉換操作修改了數據庫名,因此密碼文件也需要重建,這個操作我們做的比較多,這里就不詳述了。
    ?
    5、調整邏輯standby 初始化參數
    ?
    ??? 之所以要調整初始化參數,一方面是由于此處我們的邏輯standby 是從物理standby 轉換來的,某些參數并不適合甚至可能造成錯誤,比如log_archive_dest_n 參數的設置。另一方面,由于邏輯standby 會有讀寫操作,因此需要讀寫本地online redologs 及并產生archivelogs,務必需要注意本地的archivelogs 路徑不要與應用接收自primary 數據庫的redo 數據生成的archivelogs 路徑沖突。當然歸根結底是因為邏輯standby是從物理standby 轉換而來,因此standby 的初始化參數就需要第二次調整(第一次是創建物理standby),這里為什么要選擇從物理standby 轉換呢?很簡單,因為前面測試過程中創建了兩個standby,所以我覺著直接轉換一個當成邏輯standby,操作更省事兒:)
    ??? 當然我相信,看完這個系列,如果你對于創建的流程能夠非常清晰,完全可以跳過先創建物理standby的過程,直接創建邏輯standby。
    ??? 關于修改初始化參數的方式有多種,通過alter system set 也可以,或者先生成pfile 修改相關參數,然后再根據修改過的pfile 生成spfile 也可以。
    ?
    6、打開邏輯standby
    ?
    ??? 由于邏輯standby 與primary 數據庫事務并不一致,因此第一次打開時必須指定resetlogs 選擇,如下:

    ??? SQL> alter database open resetlogs;

    ?
    ??? 然后可以通過執行下列sql 命令應用redo 數據:

    ??? SQL> alter database start logical standby apply immediate;

    ?
    ??? 如果想停止邏輯standby 的sql 應用,可以通過下列命令:

    ??? SQL> alter database stop logical standby apply immediate;

    ?
    ?
    posted on 2009-02-23 23:15 decode360 閱讀(124) 評論(0)  編輯  收藏 所屬分類: 10.DB_Tools
    主站蜘蛛池模板: 亚洲黄色免费网址| 亚洲无码精品浪潮| 一二三四在线观看免费高清中文在线观看 | 亚洲综合久久夜AV | 免费乱理伦在线播放| 免费大黄网站在线看| 亚洲第一区精品观看| 久久久久无码专区亚洲av| 亚洲色无码专区在线观看| 国产精品亚洲а∨无码播放| 亚洲精品国产美女久久久| 国产亚洲美女精品久久久久狼 | 成人免费午夜视频| 日韩在线免费播放| 九月婷婷亚洲综合在线| 亚洲综合色成在线播放| 亚洲国产精品无码专区| 亚洲高清中文字幕| 中文无码亚洲精品字幕| 亚洲aⅴ无码专区在线观看| 免费国产va在线观看| 精品一区二区三区高清免费观看| 免费播放在线日本感人片| 久久午夜夜伦鲁鲁片免费无码影视| 青青视频观看免费99| 欧亚一级毛片免费看| a毛片视频免费观看影院| 精品熟女少妇a∨免费久久| 亚洲欧洲免费无码| 免费少妇a级毛片人成网| 亚洲欧洲日产国码av系列天堂| 亚洲欧洲国产精品你懂的| 国产日本亚洲一区二区三区| 国产精品亚洲一区二区三区在线观看| 日本高清不卡中文字幕免费| 国产精品网站在线观看免费传媒 | 黄色短视频免费看| 57pao国产成视频免费播放| 午夜高清免费在线观看| 国产亚洲?V无码?V男人的天堂 | 亚洲国产精品自在拍在线播放|