邏輯備用使用主的複製建立出來,但是建立出來以後,該備用的物理結構就與主不同了。邏輯備用透過應用SQL語句進行更新。這樣就允許使用者在任何時候都可以在備用上執行查詢和報表了。
因為邏輯備用使用SQL語句進行與主的同步,所以邏輯備用必須開啟。而且,在邏輯備用上,還可以建立其他的索引和物化檢視來提高效率。不過邏輯備用在資料型別、表的型別和DDL以及DML上有些限制。
邏輯備用的優點:
a、更加有效利用了備用的硬體資源
b、減小了主的負載,例如將非實時性的查詢轉移到備用等
c、可以作為主的備份
2.建立邏輯備用前對主的準備
在建立邏輯備用的過程中,必須確保在主上做配置所用的使用者帳號具有以下角色:
a、logstdby_administrator角色,用來使用邏輯備用功能
b、select_catalog_role角色,能夠訪問所有資料字典檢視。
下面詳細說明了建立一個邏輯備用前,必須在主上進行的準備工作。
2.1 啟用forced logging
將主設定為force logging模式:
SQL>alter database force logging;
2.2 啟用歸檔,並在本地定義一個歸檔路徑
確保主設定成歸檔模式,啟用自動歸檔,並且必須有一個本地的歸檔路徑。
SQL> alter system set log_archive_dest_1='location=D:\oradata\rmantgt\archive mandatory' scope=both;
2.3 確認log_parallelism初始化引數
在主上,使用show parameter的命令顯示當前log_parallelism初始化引數的值。邏輯備用要求你將該初始化引數設定為1,同時這也是該引數的預設值。如果該引數已經是1了,則跳到2.4步驟。否則,設定log_parallelism=1,如下:
SQL>alter system set log_parallelism=1 scope=spfile;
設定完以後,需要重啟以使設定生效。
2.4 確定所能支援的資料型別和表型別
在建立邏輯備用前,確保在當前主中的資料型別和表型別都是邏輯備用所能支援的。
邏輯備用所支援的資料型別有:char、nchar、varchar2和varchar、nvarchar2、number、date、timestamp、timestamp with time zone、timestamp with local time zone、interval year to month、interval year to second、raw、clob、blob
邏輯備用不支援的資料型別有:nclob、long、long raw、bfile、rowid、urowid、user-defined types、object types refs、varrays、nested tables
邏輯備用不支援的表、sequences和檢視有:使用者在sys schema裡定義的表和sequences、那些含有不支援的資料型別的表、使用了segment compression的表、索引組織表(index-organized tables)
確定主是否含有不支援的物件,檢視dba_logstdby_unsupported檢視,該檢視列出了邏輯備用所不支援的物件:
SQL> select distinct owner,table_name from dba_logstdby_unsupported order by owner,table_name;
如果主含有不支援的物件,則日誌應用服務在邏輯備用上運用重做日誌會自動剔除那些不支援的物件。
如果以下SQL語句在主上執行了的話,那麼傳到邏輯備用以後,也不會在邏輯備用上執行:ALTER DATABASE、ALTER SESSION、ALTER SNAPSHOT、ALTER SNAPSHOT LOG、ALTER SYSTEM SWITCH LOG、CREATE CONTROL FILE、CREATE DATABASE、CREATE DATABASE LINK、CREATE PFILE FROM SPFILE、CREATE SCHEMA AUTHORIZATION、CREATE SNAPSHOT、CREATE SNAPSHOT LOG、CREATE SPFILE FROM PFILE、CREATE TABLE AS SELECT FROM A CLUSTER TABLE、DROP DATABASE LINK、DROP SNAPSHOT、DROP SNAPSHOT LOG、EXPLAIN、LOCK TABLE、RENAME、SET CONSTRAINTS、SET ROLE、SET TRANSACTION。
那些在主上修改後設資料的pl/sql儲存過程也不會在邏輯備用上執行。比如在主上執行了dbms_mview_refresh,但是傳到備用後並不會被應用。唯一的例外是dbms_job包,job後設資料會應用到邏輯備用上,但是jobs本身不會執行。
2.5 確認主裡表的行都可以唯一標識
由於在邏輯備用裡rowid可能不等於主裡的rowid,所以必須採取一些機制來保證在主裡所更新的行能夠對應到備用裡相應的行。
可以採用以下對應方法:主鍵或唯一索引。
在主裡,無論合適與否,每個表都新增主鍵或唯一索引。這樣就能確保應用SQL操作時可以有效的更新邏輯備用裡的資料了。
採用以下的方法來確保日誌應用服務可以唯一的標識表裡的行。
2.5.1 在主裡找到那些沒有唯一標識的表
查詢dba_logstdbby_not_unique檢視,來確定主裡那些還沒有主鍵或唯一索引的表。
SQL> select owner,table_name,bad_column from dba_logstdby_not_unique where table_name not in(select table_name from dba_logstdby_unsupported);
該語句找出的表仍然能夠支援,因為supplemental logging在重做日誌裡新增了唯一標識行的資訊。主鍵或唯一索引的存在與否,能夠影響追加的日誌(supplemental logging):
a、如果表有主鍵或唯一索引,則在supplemental logging的時候,向重做日誌新增的資訊是最少的。
b、如果表沒有主鍵或唯一索引,supplemental logging會自動在重做日誌裡記錄所有欄位的值。
2.5.2 新增一個disabled的主鍵型別的rely的限制(disabled primary key rely constraint)
如果應用程式確保表裡的行是唯一標識的,你可以在表上建立一個disabled主鍵型別的rely的限制:
SQL>alter table mytab add primary key(id,name) rely disable;
rely constraint告訴系統確保了所有的行都是唯一的。如果rely constraint所指定的列沒有唯一,則在邏輯備用應用SQL時將會失敗。最好新增主鍵或唯一索引,這樣在邏輯備用應用SQL語句時也會速度快些。
2.6 確保啟用追加的日誌(supplemental logging)
在建立邏輯備用前,在主上,必須啟用supplemental logging。因為oracle只會對那些修改的列生成日誌,這對唯一標識那些被修改的行時並不總是足夠的,額外的資訊(supplemental)必須被加到重做日誌裡。這些被加到聯機日誌裡的supplemental資訊能夠幫助日誌應用服務正確的標識邏輯備用裡的表和表裡的行。
確定在主上,supplemental logging是否被啟用,可以查詢v$database,如下:
SQL> select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
如果為NO,則說明supplemental logging沒有被啟用。如果被啟用,則轉到2.7,否則如果沒有被啟用,則採用下面的方法來啟用。
2.6.1 啟用supplemental logging
在主上,執行下面語句以便將主鍵和唯一索引資訊新增到歸檔日誌裡:
SQL> alter database add supplemental log data(primary key,unique index) columns;
該語句在主中向重做日誌新增了唯一標識行的資訊,從而日誌應用服務可以在備用里正確的標識相同的行了。
2.6.2 切換到一個新的重做日誌
在主上,執行以下語句:
SQL> alter system archive log current;
透過切換到一個新的日誌檔案,這樣,你就可以保證當前重做日誌既不含有supplemental日誌資料也不含有nonsupplemental日誌資料。邏輯備用不能使用那些既含有supplemental日誌資料又含有nonsupplemental日誌資料的重做日誌。
2.6.3 確保啟用supplemental logging
SQL> select supplemental_log_data_pk as primaryKey,supplemental_log_data_ui as uniqueIndex from v$database;
如果都為yes則說明啟動了。
如果在一個已經含有物理備用的data guard配置中啟用了supplemental logging的話,那麼必須在每個物理備用中分別執行alter database add supplemental log data,以便將來在switchover的時候能夠正常工作。
2.7 建立一個可替代的表空間
如果希望在主和邏輯備用之間進行switchover,你必須在主上建立一個替代表空間,並且將邏輯備用裡system錶轉移到這個替代表空間裡。
邏輯備用使用一組在sys和system schema下的表。這些表預設建立在system表空間下。這些表可能會增長非常快。透過預先準備一個單獨的表空間,然後將這些邏輯備用系統錶轉移到這個單獨的表空間下,從而避免了這些表將整個system表空間都填滿的情況出現。
在邏輯備用建立時,會向這些邏輯備用系統表填資料。這樣,應該在建立邏輯備用前,就將這些錶轉移到獨立的表空間裡去。
建立表空間:
SQL> create tablespace logmnrts datafile 'D:\oradata\rmantgt\logmnrts.dbf' size 25m autoextend on maxsize unlimited;
轉移表:
SQL> execute dbms_logmnr_d.set_tablespace('logmnrts');
如果在備用裡的初始化引數standby_file_management設定為true,則前面建立表空間的命令會自動應用到備用上。否則如果沒有設定為true,則需要手工在備用上執行。
3.建立邏輯備用
3.1 確認主的資料檔案和聯機日誌檔案
在主上,查詢v$datafile列出所有的邏輯備用所需要的資料檔案:
SQL> select name from v$datafile;NAME------------------------------------------------D:\ORADATA\RMANTGT\SYSTEM01.DBFD:\ORADATA\RMANTGT\USERS02.DBFD:\ORADATA\RMANTGT\USERS01.DBFD:\ORADATA\RMANTGT\UNDO02.DBF
在主上,查詢v$logfile列出所有的邏輯備用所需要的日誌檔案:
SQL> select group#,type,member from v$logfile; GROUP# TYPE MEMBER---------- ------- ------------------------------ 1 ONLINE D:\ORADATA\RMANTGT\REDO01.LOG 2 ONLINE D:\ORADATA\RMANTGT\REDO02.LOG 3 ONLINE D:\ORADATA\RMANTGT\REDO03.LOG
3.2 對主生成一份複製
在主上,進行以下步驟,以生成一份主檔案的冷複製備份。
第一步 關閉主
SQL> shutdown;
第二步 複製資料檔案到臨時目錄
使用作業系統命令將3.1所找出來的資料檔案複製到一個臨時目錄。複製到臨時目錄是因為主後面還會再次被關閉。
第三步 重啟主
SQL> startup
第四步 為備用建立一個控制檔案的備份複製在主上,為備用建立一個控制檔案的備份:
SQL> alter database backup controlfile to'D:\oradata\dataguard_logic_tmp\logicdg.ctl';
第五步 在主上啟用限制登入(restrict session)模式
在主上,啟用限制登入模式,這樣就不允許其他使用者登入進行DDL或DML操作。
SQL> alter system enable restricted session;
第六步 建立logminer目錄
為了建立邏輯備用,你必須為邏輯備用手工建立目錄結構。在主上,採用以下命令建立logminer目錄:
SQL> execute dbms_logstdby.build;
第七步 在主上禁用限制登入(restrict session)模式
SQL> alter system disable restricted session;
第八步 確定最後歸檔的日誌檔案
為了獲得建立邏輯備用的起點,查詢v$archived_log檢視,確定最後的歸檔日誌,並且在後面建立的過程中,輸入該歸檔日誌的名字。
SQL> alter system archive log current;SQL> select name from v$archived_log where (sequence#=(select max(sequence#) from v$archived_log where dictionary_begin='YES' and standby_dest='NO'));NAME----------------------------------------------------------------------------D:\ORADATA\RMANTGT\ARCHIVE\ARC00315.001
3.3 為備用準備一個初始化引數檔案
在主上透過spfile建立一個傳統的文字格式的初始化引數檔案。該文字格式的初始化引數檔案可以複製到備用所在的系統並且可以被手工修改。
SQL> create pfile='D:\oradata\dataguard_logic_tmp\initLogic.ora' from spfile;
在後面的3.11的時候,還需要修改該檔案的引數以對應備用,然後還要將其轉換為spfile。
3.4 從主所在系統向備用所在系統複製檔案
在主所在的系統上,使用作業系統命令複製以下二進位制檔案到備用所在的系統。
a、備份的資料檔案(在4.2.2處建立)
b、備份的日誌檔案(在4.2.2處建立)
c、初始化引數檔案(在4.2.3處建立)
3.5 為備用設定初始化引數
儘管從主處複製的初始化引數檔案裡的引數設定大部分都適用於邏輯備用,但是有些還是需要修改。
下面的例子顯示了為邏輯備用所作的初始化引數修改。被修改的部分用黑體表示。
1*.aq_tm_processes=1 2*.background_dump_dest='C:\oracle92\ora92\admin\logicdg\bdump' 3*.compatible='9.2.0.0.0' 4*.control_files='D:\oradata\logicdg\LOGICDG.CTL' 5*.core_dump_dest='C:\oracle92\ora92\admin\logicdg\cdump' 6*.standby_archive_dest='D:\oradata\logicdg\standby' 7*.parallel_max_servers=9 8*.db_block_size=8192 9*.db_cache_size=2516582410*.db_domain=''11*.db_file_multiblock_read_count=1612*.db_name='rmantgt'13*.dispatchers='(PROTOCOL=TCP) (SERVICE=ora920XDB)'14*.fast_start_mttr_target=30015*.global_names=TRUE16*.hash_join_enabled=TRUE17*.instance_name='logicdg'18*.java_pool_size=3355443219*.job_queue_processes=1020*.large_pool_size=838860821*.log_archive_dest=''22*.log_archive_dest_1='location=D:\oradata\logicdg\archive mandatory'23*.log_archive_start=TRUE24*.log_parallelism=125*.open_cursors=30026*.pga_aggregate_target=2516582427*.processes=15028*.query_rewrite_enabled='FALSE'29*.remote_login_passwordfile='EXCLUSIVE'30*.shared_pool_size=5033164831*.sort_area_size=52428832*.star_transformation_enabled='FALSE'33*.timed_statistics=TRUE34*.undo_management='AUTO'35*.undo_retention=1080036*.undo_tablespace='UNDOTBS2'37*.user_dump_dest='C:\oracle92\ora92\admin\logicdg\udump'38#如果主和備用在同一臺機器上,就需要做以下引數配置39*.lock_name_space=logicdg
這裡,對上面的設定做一個簡單解釋:
a、db_name:不需要修改,與主保持一致。
b、compatible:不需要修改,與主保持一致。
c、control_files:說明了備用的控制檔案所在的路徑。
d、log_archive_start:不需要修改,與主保持一致。
e、standby_archive_dest:說明了主向備用傳遞迴檔日誌的路徑。需要主上配置歸檔路徑為備用,這樣,主在歸檔時,會將歸檔日誌檔案傳送到備用上該引數指定的位置。
f、log_archive_dest_1:說明備用的歸檔日誌所存放的路徑。一旦出現switchover,那麼該備用成為主,則該引數指定了聯機日誌檔案的歸檔路徑。
g、log_parallelism:不需要修改,與主保持一致。
h、instance_name:如果主和備用在同一臺機器上的話,就需要定義該引數並且與主不同。
i、lock_name_space:指定備用所在的例項名稱。該引數與instance_name相同。
記住,可能還需要修改一些引數,比如background_dump_dest、user_dump_dest等。
3.6 建立一個windows服務
如果備用所在機器為windows系統,則需要使用oradim建立windows服務。
C:\>oradim -new -sid logicdg -startmode manual
3.7 為主和備用配置監聽
在主和備用上,分別為彼此配置監聽器。如果使用了data guard broker,則必須使用TCP/IP協議配置監聽器。
如果在安裝oracle介質的時候就自動建立了的話,則不用配置。
3.8 在備用所在系統啟用死亡連線檢測
透過在sqlnet.ora檔案裡設定sqlnet.expire_time引數來檢測死亡連線。比如
sqlnet.expire_time=2
3.9 建立Oracle Net連線名
在主和備用裡,分別建立連線到主和備用的tnsnames名稱。
3.10 啟動並mount備用
在備用上,啟動並mount備用。
注意,如果是windows系統,則還需要建立密碼檔案。
C:\>orapwd file=C:\oracle92\ora92\DATABASE\PWDlogicdg.ORA password=hanson entries=5SQL>startup mount pfile=C:\oracle92\ora92\admin\logicdg\pfile\initLogic.ora
3.11 在邏輯備用上重新命名資料檔案
在邏輯備用上,需要將從主複製來的資料檔案所在的路徑重新命名,因為要告訴控制檔案,現在的資料檔案所在的路徑已經與主中的路徑不一致了,需要更改為當前最新的路徑。
C:\>orapwd file=C:\oracle92\ora92\DATABASE\PWDlogicdg.ORA password=hanson entries=5SQL>startup mount pfile=C:\oracle92\ora92\admin\logicdg\pfile\initLogic.ora
3.12 在邏輯備用上重新命名聯機日誌檔案
SQL> select member from v$logfile;MEMBER----------------------------------------------------------------------------D:\ORADATA\RMANTGT\REDO01.LOGD:\ORADATA\RMANTGT\REDO02.LOGD:\ORADATA\RMANTGT\REDO03.LOGSQL> alter database rename file 'D:\ORADATA\RMANTGT\REDO01.LOG'to 'D:\oradata\logicdg\redo01.log';Database altered.SQL> alter database rename file 'D:\ORADATA\RMANTGT\REDO02.LOG'to 'D:\oradata\logicdg\redo02.log';Database altered.SQL> alter database rename file 'D:\ORADATA\RMANTGT\REDO03.LOG'to 'D:\oradata\logicdg\redo03.log';Database altered.SQL> select member from v$logfile;MEMBER----------------------------------------------------------------------------D:\ORADATA\LOGICDG\REDO01.LOGD:\ORADATA\LOGICDG\REDO02.LOGD:\ORADATA\LOGICDG\REDO03.LOG
3.13 開啟database guard
為了防止其他使用者在邏輯備用上進行DML操作,在邏輯備用上開啟database guard。
SQL>alter database guard all;
由於使用的控制檔案比資料檔案要新,所以直接open時會報錯,需要進行恢復。
SQL>recover database using backup controlfile until cancel;
然後,直接輸入cancel結束恢復。
SQL>alter database open resetlogs;
3.14 重新設定邏輯備用名
透過執行oracle的DBNEWID(nid)實用程式,來改變邏輯備用的名稱。改變邏輯備用的名稱可以防止該邏輯備用與主之間進行互動作用。在執行nid的時候,必須關閉,並啟動到mount狀態:
然後,現在可以執行nid來改變名了:
C:\>nid dbname=logicdgDBNEWID: Release 9.2.0.1.0 - ProductionCopyright (c) 1995, 2002, Oracle Corporation. All rights reserved.Connected to database RMANTGT (DBID=2455129425)Control Files in database: D:\ORADATA\LOGICDG\LOGICDG.CTLChange database ID and database name RMANTGT to LOGICDG? (Y/[N]) => yProceeding with operationChanging database ID from 2455129425 to 2205596403Changing database name from RMANTGT to LOGICDG Control File D:\ORADATA\LOGICDG\LOGICDG.CTL - modified Datafile D:\ORADATA\LOGICDG\SYSTEM01.DBF - dbid changed, wrote new name Datafile D:\ORADATA\LOGICDG\LOGMNRTS.DBF - dbid changed, wrote new name Datafile D:\ORADATA\LOGICDG\USERS01.DBF - dbid changed, wrote new name Datafile D:\ORADATA\LOGICDG\UNDO02.DBF - dbid changed, wrote new name Control File D:\ORADATA\LOGICDG\LOGICDG.CTL - dbid changed, wrote new nameDatabase name changed to LOGICDG.Modify parameter file and generate a new password file before restarting.Database ID for database LOGICDG changed to 2205596403.All previous backups and archived redo logs for this database are unusable.Shut down database and open with RESETLOGS option.Succesfully changed database name and ID.DBNEWID - Completed succesfully.
3.15 在初始化引數檔案中修改名
第一步 修改初始化引數檔案中的db_name為logicdg。
第二步 關閉邏輯備用
SQL>shutdown immediate;
第三步 根據pfile建立spfile
SQL> create spfile from pfile='C:\oracle92\ora92\admin\logicdg\pfile\initLogic.ora';
第四步 重啟邏輯備用
SQL>startup mount;SQL>alter database open resetlogs;
3.16 為邏輯備用建立一個新的臨時表空間
臨時資料檔案不需要從主複製到邏輯備用上。
第一步 確定當前臨時資料檔案
在邏輯備用上,執行如下SQL:
SQL>select * from v$tempfile;
如果沒有記錄,則跳到第三步。
第二步 在邏輯備用上刪除臨時資料檔案
SQL>alter database tempfile 'tempfilename' drop;
第三步 在邏輯備用上,新增一個新的臨時資料檔案
1、確定臨時表空間
SQL>select tablespace_name from dba_tablespaces where contents='TEMPORARY';
2、新增一個臨時檔案
SQL>alter tablespace temp add tempfile 'D:\ORADATA\LOGICDG\temp01.dbf' size 50m reuse;
注意,這裡的temp表空間空間必須足夠,否則邏輯備用在運用主傳來的歸檔日誌時會出錯。
3.17 註冊歸檔的日誌,並啟動SQL應用操作
註冊最新的歸檔日誌檔案,並應用重做日誌裡的資料。
第一步 註冊最新的歸檔日誌檔案
將3.2的第八步查到的歸檔日誌檔案註冊到邏輯備用。
SQL> alter database register logical logfile 'D:\oradata\logicdg\ARC00290.001';
第二步 在邏輯備用裡開始應用重做日誌
SQL> alter database start logical standby apply initial;
只有在邏輯備用第一次啟動應用重做日誌時,指定initial選項。以後啟動SQL應用按照以下方法:
SQL>alter database stop logical standby apply;SQL>alter database start logical standby apply;
3.18 使主向備用進行歸檔
必須在主上設定,以使得主能夠向備用歸檔。
第一步 設定定義歸檔的初始化引數
在主的log_archive_dest_n和log_archive_dest_state_n引數重設定主向備用的歸檔。
下面的例子顯示瞭如何設定這些引數:
第一步 設定遠端歸檔引數
SQL> alter system set log_archive_dest_2='service=dataguard mandatory' scope=both;SQL> alter system set log_archive_dest_state_2=enable scope=both;
第二步 啟動遠端歸檔
SQL> alter system archive log current;
4.確認邏輯備用正常工作
一旦你建立了邏輯備用,並啟動了日誌轉移服務,可能你需要確定一下主的修改已經成功轉移到備用上了。為了檢視歸檔的日誌檔案已經被備用所接收,首先,需要確定在備用下存在歸檔的日誌檔案。在主上歸檔少量的日誌檔案,然後檢查備用。
第一步 確定歸檔日誌檔案在備用上已經註冊了
SQL>select sequence#,first_time,next_time,dict_begin,dict_end from dba_logstdby_log order by sequence#;
第二步 在主上歸檔一些日誌
SQL>alter system archive log current;
第三步 再次查詢dba_logstdby_log檢視
SQL>select sequence#,first_time,next_time,dict_begin,dict_end from dba_logstdby_log order by sequence#;
檢視是否有新的歸檔日誌記錄。如果有,就說明成功註冊到備用了。這些日誌現在可以開始被應用了。
第四步 確定重做日誌的已經被正確應用了在邏輯備用上,查詢dba_logstdby_status檢視確定重做資料已經被正確應用了。
SQL>select name,value from v$logstdby_stats where name='coordinator state';
如果結果是initializing,則說明日誌應用服務已經準備好應用SQL操作了,但是從重做日誌來的資料還沒有應用到邏輯備用上。
邏輯備用如果有很多表,那麼初始化的過程會需要幾個小時,但是,一旦初始化結束,後面的應用重做日誌會快很多。
第五步 查詢v$logstdby檢視,確定當前SQL應用活動
SQL>select type,high_scn,status from v$logstdby;
一旦在邏輯備用上,coordinator程式開始應用重做日誌,v$logstdby檢視透過在status顯示applying狀態表明正在應用重做日誌。high_scn會不斷增加。
第六步 檢查日誌應用服務的進行到的程度
SQL>select applied_scn,newest_scn from dba_logstdby_progress;
如果applied_scn與newest_scn相同,這就意味著所有重做日誌裡的可用資料都被應用了。這些值可以與dba_logstdby_log檢視裡的first_change#的值做比較,來得知有多少日誌資訊已經被應用了以及有多少沒應用。