熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> SQL語言 >> 正文

Oracle DG 邏輯Standby創建說明

2022-06-13   來源: SQL語言 

  一邏輯Standby的准備工作

  確認操作的對象和語句是否能被邏輯Standby支持

  由於邏輯Standby是通過SQL應用來保持與Primary數據庫的同步SQL應用與REDO應用是有很大的區別REDO應用實際上是在物理Standby端進行RECOVERSQL應用則是分析重做日志文件中的REDO信息並將其轉換為SQL語句在邏輯Standby端執行因此需要注意以下幾點

  ()並非所有的數據類型都能被邏輯Standby支持

  邏輯Standby支持的數據類型有

  BINARY_DOUBLEBINARY_FLOATBLOBCHARCLOB and NCLOB DATEINTERVAL YEAR TO MONTHINTERVAL DAY TO SECOND  LONGLONG RAWNCHARNUMBERNVARCHARRAWTIMESTAMP

  TIMESTAMP WITH LOCAL TIMEZONETIMESTAMP WITH TIMEZONEVARCHAR and VARCHAR

  說明下列類型在獲取Standby支持時需要注意兼容性

  CLOB需要Primary數據庫的兼容級別運行於或更高

  含LOB字段的索引組織表(IOT)需要Primary數據庫的兼容級別運行於或更高

  不含LOB字段的索引組織表(IOT)需要Primary數據庫的兼容級別運行於或更高

  不支持的數據類型有

  BFILEEncrypted ColumnsROWID UROWIDXMLType對象類型VARRAYS嵌套表自定義類型

  也可以通過查詢DBA_LOGSTDBY_UNSUPPORTED來確定主數據庫中是否含有不支持的對象

  SQL> select * from dba_logstdby_unsupported;

  注意該視圖的ATTRIBUTES列顯示對象不被SQL應用支持的原因

  ()並非所有的存儲類型都能被邏輯Standby支持

  邏輯Standby能夠支持簇表(Cluster Tables)索引組織表(IndexOrganized Tables)堆組織表(HeapOrganized Tables)但不支持段壓縮(Segment Compression)存儲類型

  ()並非所有的PL/SQL包都能被SQL應用支持

  通常那些不會修改系統元數據(Metadata)的Package在實際應用時不會有問題如DBMS_OUTPUTDBMS_RANDOMDBMS_METADATA之類的包

  那些可能修改系統元數據的Package不會被SQL應用支持即使它們在Primary執行過並且被成功傳輸到邏輯Standby端也不會執行如DBMS_JAVADBMS_REGISTRYDBMS_ALERTDBMS_SPACE_ADMINDBMS_REFRESHDBMS_REDEFINITIONDBMS_SCHEDULER及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

  另外由於SQL語句非常靈活即使是那些能被SQL應用支持的DDL語句可能在附加了某些特別的參數後也不會在邏輯Standby端執行由於數目較多此處不再一一列舉感興趣的話請查閱官方文檔

  ()並非所有的DML操作都能在邏輯Standby端實面SQL應用

  維護邏輯Standby與Primary的數據庫同步是通過SQL應用實現SQL應用轉換的SQL語句在執行時對於INSERT還好說對於UPDATEDELETE操作則必須能夠唯一定位到數據庫待更新的那條記錄問題就在這裡如果Primary庫中表設置不當可能就無法確認唯一條件

  你可能會說可以通過ROWID唯一嘛!千萬要謹記啊邏輯Standby為啥叫邏輯Standby就是因為它只是邏輯上與Primary數據庫相同物理上可能與Primary數據庫存在相當大差異一定要認識到邏輯Standby的物理結構與Primary是不相同的(即使初始邏輯Standby是通過Primary的備份創建)

  因此想通過ROWID更新顯然是不好使的當然也就不能再將其作為唯一條件下面來看這個問題

  確保Primary庫中各表的行可被唯一標識

  Oracle通過主鍵唯一索引/約束的補充日志(Supplemental Logging)來確定待更新邏輯Standby數據庫中的行當數據庫啟用了補充日志每一條UPDATE語句寫REDO的時候會附加列值唯一信息比如

  如果表定義了主鍵則主鍵列會隨同被更新列一起作為UPDATE語句的一部分以便執行時區分哪些列應該被更新

  如果沒有主鍵則非空的唯一索引/約束會隨同被更新列作為UPDATE語句的一部分以便執行時區分哪些列應該被更新如果該表有多個唯一索引/約束則Oracle自動選擇長度最短的那個以降低生成的重做日志大小

  如果表既無主鍵也沒有定義唯一索引/約束所有可定長度的列連同被更新列同時作為UPDATE語句的一部分更明確些可定長度的列是指除LONGLOBLONG RAWOBJECT TYPECOLLECTION類型外的列

  Oracle 建議你為表創建一個主鍵或非空的唯一索引/約束以盡可能確保SQL應用能夠有效應用REDO數據更新邏輯Standby數據庫

  下列語句可以用來檢查SQL應用能否唯一識別表列並找出不被支持的表

  SQL> SELECT OWNER TABLE_NAME FROM DBA_LOGSTDBY_NOT_UNIQUE WHERE (OWNER TABLE_N

  AME) NOT IN  (SELECT DISTINCT OWNER TABLE_NAME FROM DBA_LOGSTDBY_UNSUPPORTED)

  AND BAD_COLUMN = &#;Y&#;;

  OWNER TABLE_NAME

  

  TSMSY SRS$

  提 示 關於DBA_LOGSTDBY_NOT_UNIQUE 該視圖顯示所有既沒主鍵也沒唯一索引的表如果表中的列包括足夠多的信息通常也可支持在邏輯Standby端的更新不被支持的表通常是由於列的定義包含了不支持的數據類型

  注意BAD_COLUMN列值該列有兩個值

  Y表示該表中有采用大數據類型的字段比如LONGCLOB如果表中除LOG列某些行記錄完全匹配則該表無法成功應用於邏輯StandbyStandby會嘗試維護這些表不過你必須保證應用不允許

  N表示該表擁有足夠的信息能夠支持在邏輯Standby的更新不過仍然建議你為該表創建一個主鍵或者唯一索引/約束以提高LOG應用效率

  假設在某張表中你可以確認數據是唯一的但是基於效率方面的考慮不想為其創建主鍵或唯一約束怎麼辦呢?沒關系Oracle早想到了這一點你可以創建一個DISABLE的PrimaryKey Rely約束

  提 示 關於PrimaryKey Rely約束

  如果DBA能夠確認表中的行是唯一的那麼可以為該表創建Rely的主鍵Rely約束並不會造成系統維護主鍵的開銷如你對一個表創建了RELY約束系統則會假定該表中的行是唯一的這樣能夠提高SQL應用時的性能但是需要注意由於Rely的主鍵約束只是假定唯一如果實際並不唯一的話有可能會造成錯誤的更新喲

  創建Rely的主鍵約束非常簡單只要在標准的創建語句後加上RELY DISABLE即可例如

  SQL> ALTER TABLE USER ADD PRIMARY KEY (ID) RELY DISABLE;

  表已更改

  注 意 創建了Rely約束後Oracle會假定該列是唯一的(給DBA足夠的信任)不過並不會對該列的值進行唯一性的驗證因此該列是否唯一只能由DBA來主動維護

  二邏輯Standby創建時的操作步驟

  創建物理Standby

  創建邏輯Standby數據庫的第一步就是先創建一個物理Standby數據庫然後再將其轉換成邏輯Standby數據庫在將其轉換為邏輯Standby前可以隨時啟動REDO應用不過一旦決定將其轉換為邏輯Standby就必須先停止該物理Standby的REDO應用以避免提前應用含LogMiner字典的REDO數據造成轉換為邏輯Standby後SQL應用時LogMiner字典數據不足而影響到邏輯Standby與Primary的正常同步

  設置Primary數據庫

  在創建物理Standby數據庫時曾經設置過相關數量的初始化參數用於Primary數據庫與物理Standby的角色切換對於邏輯Standby的角色切換那些參數同樣好使

  不過注意如果希望Primary數據庫能夠正常切換為邏輯Standby角色那麼DBA在配置環境時還需要設置相應的LOG_ARCHIVE_DEST_n初始化參數並注意該參數的VALID_FOR屬性值需要更改成STANDBY_LOGFILESSTANDBY_ROLE

  完成對初始化參數的配置後必須在Primary數據庫端生成LogMiner字典信息例如

  SQL> EXECUTE DBMS_LOGSTDBYBUILD;

  提 示本步必須執行並且執行本步操作時准邏輯Standby數據庫要停止REDO應用

  該過程專門用於生成記錄的元數據信息到重做日志文件邏輯Standby未來正是通過這些元數據保持與Primary數據庫的同步

  提 示該過程會自動啟用Primary數據庫的補充日志(Supplemental Logging)功能(如果未啟用的話)

  該過程需要等待當前所有事務完成後才能執行因此如果當前有較長的事務運行可能該過程的執行也需要多花一些等待時間

  該過程是通過閃回查詢的方式來獲取數據字典的一致性因此Oracle初始化參數UNDO_RETENTION值不能太小建議設置為並且UNDO表空間也要有足夠的空間

  轉換物理Standby為邏輯Standby

  執行下列語句轉換物理Standby為邏輯Standby

  SQL> ALTER DATABASE RECOVER TO LOGICAL STANDBY DB_NAME;

  注意DB_NAME不是DB_UNIQUE_NAME不同於物理Standby邏輯Standby是一個全新的數據庫因此建議你指定一個唯一的與Primary不同的數據庫名另外如果當前准邏輯Standby使用SPFILE啟動數據庫那麼執行該語句時Oracle會自動修改SPFILE中的相關信息如果使用PFILE啟動數據庫那麼在下次執行SHUTDOWN的時候Oracle會提示你去修改DB_NAME初始化參數的值

  執行該語句前務必確保當前准邏輯Standby已經暫停了REDO應用另外轉換是單向的即只能由物理Standby向邏輯Standby轉換而不能由邏輯Standby轉成物理Standby這並不僅僅是因為DB_NAME發生了修改更主要的原因是邏輯Standby僅是數據與Primary一致其他如存儲結構SCN等甚至DBID都不相同

  執行轉換的過程中需要應用全部的與LogMiner字典相關的REDO數據這部分操作完全依賴於Primary數據庫DBMS_LOGSTDBYBUILD的執行以及傳輸到Standby數據庫端需要應用的數據量的規模而定如果Primary數據庫執行DBMS_LOGSTDBYBUILD失敗則轉換操作也不會有結果這時候你恐怕不得不先cancel它解決Primary數據庫的問題之後再嘗試執行轉換取消該操作與取消REDO應用一樣當然實際上也正是取消REDO應用

  重建邏輯Standby的密鑰文件

  主要是由於轉換操作修改了數據庫名因此密碼文件也需要重建這個操作我們做得比較多這裡就不詳述了

  [oracle@localhost dbs]$ orapwd file=/u/app/oracle/product//db_/dbs/orapworcl password=admin

  如果已經存在就不用創建了 缺省情況下win下口令文件的格式是pwdsidoraunix下的格式是orapwSID(大小寫敏感)

  調整邏輯Standby初始化參數

  之所以要調整初始化參數一方面是由於此處我們的邏輯Standby是從物理Standby轉換來的某些參數並不適合甚至可能造成錯誤如LOG_ARCHIVE_DEST_n參數的設置另一方面由於邏輯Standby默認是以OPEN READ WRITE模式打開有可能存在讀寫操作因此會讀寫本地Online Redologs並產生Archive Logs務必需要注意本地的Archive Logs路徑不要與接收自Primary數據庫的重做日志文件路徑沖突

  當然歸根結底是因為邏輯Standby是從物理Standby轉換而來因此Standby的初始化參數就需要第二次調整(第一次是創建物理Standby)

  修改初始化參數的方式有多種既可以通過ALTER SYSTEM命令也可以先生成PFILE並修改相關參數然後再根據修改過的PFILE生成SPFILE

  打開邏輯Standby及應用REDO數據

  由於邏輯Standby與Primary數據庫事務並不一致其實質相當於進行了不完全恢復因此第一次打開時必須指定RESETLOGS子句如下

  SQL> ALTER DATABASE OPEN RESETLOGS;

  在邏輯Standby端啟動SQL應用可以通過下列語句進行

  SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;

  注 意應用REDO數據時必須是在OPEN READ WRITE模式下這點與物理Standby有明顯的區別

  邏輯Standby也可以像物理Standby那樣啟用實時應用只需要在啟動REDO應用時附加IMMEDIATE子句即可

  SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;

  如果想停止邏輯Standby數據庫的SQL應用則可通過下列命令進行

  SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY IMMEDIATE;


From:http://tw.wingwit.com/Article/program/SQL/201404/30539.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.