一步一步學DataGuard(13)邏輯standby之建立示例

junsansi發表於2008-03-24

假設當前架構為一個primary+二個物理standby,我們轉換其中一個物理standby成為邏輯standby,專用於查詢服務,另一個物理standby用於執行備份操作及提供災備。這裡我們直接借用之前建立的物理standby,只演示建立過程,我們假設當前primary資料庫狀態良好,沒有任何不被邏輯standby支援的物件或型別。

為了方便區分當前操作的資料庫,我們設定一下操作符:

SQL> set sqlprompt JSSWEB>    --表示primary資料庫

SQL> set sqlprompt JSSPDG>    --表示物理standby

SQL> set sqlprompt JSSLDG>    --表示邏輯standby

一、 建立物理standby

此步跳過,如有不明,具體可參考第二部分。

提示:表忘記暫停該standby的redo應用

JSSLDG>alter database recover managed standby database cancel;

資料庫已更改。

二、 設定primary資料庫

由於有前期建立物理standby時的基礎,此處primary資料庫的初始化引數可以不做修改,最重要的是不要忘記生成LogMiner字典資訊。

JSSWEB>execute dbms_logstdby.build;

PL/SQL 過程已成功完成。

三、 轉換物理standby為邏輯standby

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

JSSLDG>show parameter db_name;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_name                              string      jssweb

JSSLDG> alter database recover to logical standby jssldg;

資料庫已更改。

JSSLDG>shutdown immediate

ORA-01507: 未裝載資料庫

ORACLE 例程已經關閉。

JSSLDG>startup mount;

ORACLE 例程已經啟動。

Total System Global Area  167772160 bytes

Fixed Size                  1289484 bytes

Variable Size              79692532 bytes

Database Buffers           79691776 bytes

Redo Buffers                7098368 bytes

資料庫裝載完畢。

JSSLDG>show parameter db_name;

NAME                                 TYPE        VALUE

------------------------------------ ----------- ------------------------------

db_name                              string      JSSLDG

JSSLDG>select database_role from v$database;

DATABASE_ROLE

----------------

LOGICAL STANDBY

四、 重建邏輯standby的密碼檔案

E:\ora10g>orapwd file=e:\ora10g\product\10.2.0\db_1\database\PWDjssldg.ora password=verysafe entries=30

注意保持sys密碼與primary資料庫一致。

五、 調整邏輯standby初始化引數

注意歸檔檔案路徑不要衝突:

JSSLDG>alter system set log_archive_dest_1='location=E:\ora10g\oradata\JSSLDG\arc\ valid_for=(online_logfiles,all_roles) db_unique_name=JSSLDG';

系統已更改。

JSSLDG>alter system set log_archive_dest_2='location=E:\ora10g\oradata\JSSLDG\std\ valid_for=(standby_logfiles,standby_role) db_unique_name=JSSLDG';

系統已更改。

另外,由於之前我們建立JSSLDG時並未建立standby redologs,但對於邏輯standby的sql應用,standby redologs是必須的,因此我們在此處也要為該standby建立幾組standby redologs:

JSSLDG>alter database add standby logfile group 4 ('E:\ora10g\oradata\JSSLDG\standbyrd01.log') size 20m;

資料庫已更改。

JSSLDG>alter database add standby logfile group 5 ('E:\ora10g\oradata\JSSLDG\standbyrd02.log') size 20m;

資料庫已更改。

JSSLDG>alter database add standby logfile group 6 ('E:\ora10g\oradata\JSSLDG\standbyrd03.log') size 20m;

資料庫已更改。

JSSLDG>select member from v$logfile;

MEMBER

----------------------------------------------------------

E:\ORA10G\ORADATA\JSSLDG\REDO01.LOG

E:\ORA10G\ORADATA\JSSLDG\REDO02.LOG

E:\ORA10G\ORADATA\JSSLDG\REDO03.LOG

E:\ORA10G\ORADATA\JSSLDG\STANDBYRD01.LOG

E:\ORA10G\ORADATA\JSSLDG\STANDBYRD02.LOG

E:\ORA10G\ORADATA\JSSLDG\STANDBYRD03.LOG

已選擇6行。

六、 開啟邏輯standby

由於邏輯standby與primary資料庫事務並不一致,因此第一次開啟時必須指定resetlogs選擇,如下:

SQL> alter database open resetlogs;

資料庫已更改。

然後執行下列sql命令應用redo資料:

SQL> alter database start logical standby apply immediate;

資料庫已更改。

七、 檢查一下

首先在primary資料庫執行:

JSSWEB> select *from jss.b;

        ID

----------

         1

         2

         3

已選擇3行。

JSSWEB> insert into jss.b values (4);

已建立 1 行。

JSSWEB> insert into b values (5);

已建立 1 行。

JSSWEB> insert into b values (6);

已建立 1 行。

JSSWEB> commit;

提交完成。

JSSWEB> alter system switch logfile;

系統已更改。

查詢物理standby的同步情況,由於物理standby處於mount狀態,無法直接查詢,因此我們需要先暫停redo應用,然後以read only模式開啟資料庫再執行查詢:

JSSPDG>alter database recover managed standby database cancel;

資料庫已更改。

JSSPDG>alter database open read only;

資料庫已更改。

JSSPDG>select * from jss.b;

        ID

----------

         1

         2

         3

         4

         5

         6

已選擇6行。

查詢邏輯standby的同步情況:

JSSLDG>select * from jss.b;

        ID

----------

         1

         2

         3

         4

         5

         6

已選擇6行。

提示:細心觀察,發現邏輯standby有一點很好,從primary接收到的redo檔案,應用過之後會自動刪除,節省磁碟空間。

Ok,邏輯standby也建立完成了,我們再回過頭來回憶回憶我們最開始的假設:

對於相機拍照而言,有種傻瓜相機功能強大而操作簡便,而對於素描,即使是最簡單的畫法,也需要相當多的練習才能掌握。這個細節是不是也說明邏輯standby相比物理standby需要操作者擁有更多的操作技能呢?

現在看起來,操作呢相比物理standby是稍稍複雜了一點點,但機理呢與物理standby大同小異,功能呢也不見的就比物理standby強到哪裡,主要是前期準備工作略嫌繁瑣(尤其你的資料庫系統比較巨集大時,畢竟有那麼多支援和不支援的資料型別/操作/語句需要dba手工處理),這麼看來,畫畫的彷彿是要比搞攝影的更講究基本功啊,不過事物要辯證著看,愛好攝影的朋友千萬莫因此而感\到沮喪,從實用角度看,搞攝影不知要比畫畫強多少倍啊,效率在那擺著呢,要出片子按下快門就成啦!對於standby也是如此,你究竟是想要物理的,還是想要邏輯的呢,這是個問題~~~~~

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-217027/,如需轉載,請註明出處,否則將追究法律責任。

相關文章