??? 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、嵌套表、自定義類型。
??? SQL> SELECT * FROM DBA_LOGSTDBY_UNSUPPORTED;
??? 提示:關于DBA_LOGSTDBY_UNSUPPORTED
??? 該視圖顯示包含不被支持的數據類型的表的列名及該列的數據類型。注意該視圖的ATTRIBUTES 列,列值會顯示表不被sql 應用支持的原因。
??? 只有dbms_job 例外,primary 數據庫的jobs 會被復制到邏輯standby,不過在standby 數據庫不會執行這些job。
??? 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
??? ◆ 如果表定義了主鍵,則主鍵值會隨同被更新列一起做為update 語句的一部分,以便執行時區別哪些列應該被更新。
??? ◆ 如果沒有主鍵,則非空的唯一索引/約束會隨同被更新列做為update 語句的一部分,以便執行時區分哪些列應該被更新,如果該表有多個唯一索引/約束,則oracle 自動選擇最短的那個。
??? ◆ 如果表即無主鍵,也沒有定義唯一索引/約束,所有可定長度的列連同被更新列作為update 語句的一部分。更明確的話,可定長度的列是指那些除:long,lob,long raw,object type,collection 類型外的列。
??? SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
??? SUP SUP
??? --- ---
??? YES YES
??? 因此,Oracle 建議你為表創建一個主鍵或非空的唯一索引/約束,以盡可能確保sql 應用能夠有效應用redo 數據,更新邏輯standby 數據庫。
??? 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 應用效率。
??? 如果你能夠確認表中的行是唯一的,那么可以為該表創建rely 的主鍵,RELY 約束并不會造成系統維護主鍵的開銷,主你對一個表創建了rely 約束,系統則會假定該表中的行是唯一,這樣能夠提供sql 應用時的性能。但是需要注意,由于rely 的主鍵約束只是假定唯一,如果實際并不唯一的話,有可能會造成錯誤的更新喲。
??? SQL> alter table jss.b add primary key (id) rely disable;
??? 表已更改。
二、創建步驟
LogMiner 字典的redo 數據,造成轉換為邏輯standby 后,sql 應用時logMiner 字典數據不足而影響到邏輯standby 與primary 的正常同步。
??? 不過注意,如果希望primary 數據庫能夠正常切換為邏輯standby 角色的話,那么你還需要設置相應的log_archive_dest_N,并且valid_for 屬性,需要更改成:(STANDBY_LOGFILES,STANDBY_ROLE)。
??? SQL> EXECUTE DBMS_LOGSTDBY.BUILD;
??? 提示:
??? ¤ 該過程會自動啟用primary 數據庫的補充日志(supplemental logging)功能(如果未啟用的話)。
??? ¤ 該過程執行需要等待當前所有事務完成,因此如果當前有較長的事務運行,可能該過程執行也需要多花一些等待時間。
??? ¤ 該過程是通過閃回查詢的方式來獲取數據字典的一致性, 因此oracle 初始化參數UNDO_RETENTION 值需要設置的足夠大。
??? 執行下列語句,轉換物理standby 為邏輯standby:
??? SQL> alter database recover to logical standby NEW_DBNAME;
??? 提示:執行該語句前務必確保已經暫停了redo 應用,另外轉換是單向的,即只能由物理standby 向邏輯standby 轉換,而不能由邏輯standby 轉成物理standby。這并不僅僅是因為dbname 發生了修改,更主要的原因是邏輯standby 僅是數據與primary 一致,其它如存儲結構,scn 等基于dbid 都不一相同。
??? 主要是由于轉換操作修改了數據庫名,因此密碼文件也需要重建,這個操作我們做的比較多,這里就不詳述了。
??? SQL> alter database open resetlogs;
??? SQL> alter database start logical standby apply immediate;
??? SQL> alter database stop logical standby apply immediate;