天天看點

Oracle 11g DataGuard實體standby配置1

看到oracle官方文檔說oracle 11g dataguard在實體standby機器上出于open狀态也可以應用redo,是以就在本地試驗了下,确實如此,這樣既可以應用redo也可以進行資料查詢和資料庫的備份.既解決了資料的容災也解決了主資料庫的壓力.

Dataguard分為2類:

  實體standby:  此類型分為redo應用、read-only模式、read-write模式,當處于redo應用的時候,不能進行相關的查詢操作,當處于read-only時,不能應用redo,但是在oracle 11G版本之後,在read-only下可以應用redo,當處于read-write時, 暫停從primary接受redo資料.

 邏輯 standby:  此類型可以在read-write模式下,可以從primary接受redo資料,并且可以應用redo.

關于2者的差別和特點,大家可以自己在網上進行搜尋,我這裡就不一一說了.

2種類型的相關程序:

實體standby相關程序

_ Remote file server (RFS)

負責從主資料庫上接收歸檔檔案

_ Archiver (ARCn)

将日志進行歸檔

Managed recovery process (MRP)

将歸檔檔案應用到備用機上

邏輯standby相關程序

Logical standby process (LSP)

   本次試驗使用vmware server 1.6虛拟機,相關的IP規劃如下:

   192.168.137.93                primary資料庫

   192.168.137.94                standby資料庫

   在2個伺服器上執行如下操作:

   # vi /etc/hosts

 192.168.137.93                node1

   192.168.137.94                node2

   資料庫:  oracle  11G

在primary伺服器上執行如下操作

SQL> ALTER DATABASE FORCE LOGGING;    //将primary資料庫設定

                                        FORCE LOGGING模式

SQL> create pfile from spfile;   //建立一個pfile,可以友善編輯,我這裡把spfile放到另外一個路徑,讓oracle讀取pfile.

pfile檔案添加如下内容:

*.DB_UNIQUE_NAME=uqn_node1              //自定義一個

                                          unique_name名字

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(uqn_node1,uqn_node2)'  //此處為主備伺服器unique_name

*.LOG_ARCHIVE_DEST_2='SERVICE=node2 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=uqn_node2'

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE

*.LOG_ARCHIVE_MAX_PROCESSES=30

*.FAL_SERVER=node2                        //這裡為net

                                            service name

*.FAL_CLIENT=node1

*.STANDBY_FILE_MANAGEMENT=AUTO

假如資料庫處在非歸檔模式下執行下面的sql(此步驟因是否處于歸檔模式而定)

SQL> SHUTDOWN IMMEDIATE;

SQL> STARTUP MOUNT;

SQL> ALTER DATABASE ARCHIVELOG;

SQL> ALTER DATABASE OPEN;

為STANDBY資料建立控制檔案

SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/home/oradata/wiliiwin.ctl';

複制primary伺服器的檔案(資料檔案、密碼檔案、pfile檔案、控制檔案)到STANDBY伺服器上

# cd /home/oracle/dbs

# cp initora10.ora orapwora10 /home/oradata/

# cd /home/

$ scp -r admin/ oradata/ oracle@node2:/home/oradata

到STANDBY伺服器上執行下面的操作

$ cd /home/oradata/ora10

$ rm -rf control0*

$ mv ../wiliiwin.ctl control01.ctl

$ cp control01.ctl control02.ctl

$ cp control01.ctl control03.ctl

$ cd /home/oracle/dbs

$ mv /home/oradata/initora10.ora .

$ mv /home/oradata/orapwora10 .

$ vi initora10.ora                        //需要把裡面的内

                                            容稍微修改下

  *.DB_UNIQUE_NAME=uqn_node2              //自定義一個

                                            unique_name名字

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(uqn_node1,uqn_node2)'  //此處為主備伺服器的unique_name

*.LOG_ARCHIVE_DEST_2='SERVICE=node1 ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=uqn_node1'

*.FAL_SERVER=node1                        //這裡為net

*.FAL_CLIENT=node2

$ lsnrctl start                       //在primary和

                                      STANDBY伺服器上都執行

在主伺服器上啟動資料庫執行個體

SQL> startup;

$ sqlplus system/oracle@node1    //在primary和STANDBY伺服器上都進行測試下看時候能正常連接配接

在STANDBY伺服器上啟動資料庫執行個體

//建立4個stanby redo 大小最好與主伺服器大小相同,并且多一個檔案,最好在Primary伺服器上也做如下操作,友善之後的角色切換.

SQL> startup mount;

SQL> alter database add standby logfile group 4 '/home/oradata/ora10/stdREDO01.LOG' size 50m;  

SQL> alter database add standby logfile group 5 '/home/oradata/ora10/stdREDO02LOG' size 50m;

SQL> alter database add standby logfile group 6 '/home/oradata/ora10/stdREDO03LOG' size 50m;

SQL> alter database add standby logfile group 7 '/home/oradata/ora10/stdREDO04LOG' size 50m;

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;     //啟動實時應用

測試同步是否正常方法1

在STANDBY伺服器:

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

SEQUENCE# FIRST_TIM NEXT_TIME

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

         4 04-MAY-10 04-MAY-10

         5 04-MAY-10 04-MAY-10

在Primary伺服器:

SQL> ALTER SYSTEM SWITCH LOGFILE;  //觸發歸檔

現在再回到STANDBY伺服器上:

 SEQUENCE# FIRST_TIM NEXT_TIME

         6 04-MAY-10 04-MAY-10

SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# APP

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

         4 YES

         5 YES

         6 YES

發現有一條新的記錄,說明同步是正常的.

測試同步是否正常方法2

在Primary伺服器上建立一個表

SQL> create table wiliiwin(id integer, name char(10));

SQL> insert into wiliiwin values(1,'wiliiwin');

SQL> insert into wiliiwin values(2,'wiliiwiner');

SQL> insert into wiliiwin values(3,'wiliiwinsi');

SQL> ALTER SYSTEM SWITCH LOGFILE;

在STANDBY伺服器上

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;  //取消執行redo

   //報錯ORA-16136: Managed Standby Recovery not active

     是由于MRP0服務沒有啟動,如下是檢視各服務狀态sql語句

   SQL>select process,status,sequence# from v$managed_standby;

   SQL>RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; //啟動MRP0服務

SQL> ALTER DATABASE OPEN;             //打開資料庫,由于使用

                                       的oracle 11g 是以現

                                       在也可以應用redo.

SQL> select * from wiliiwin;

        ID NAME

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

         1 wiliiwin

         2 wiliiwiner

         3 wiliiwinsi      //可以看到資料已經同步過來了,由

                             于oracle 11G 在open狀态下也可

                             以執行redo,是以現在在primary做

                             相關的操作,STANDBY也照樣可以同

                             步過來

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;  //使STANDBY恢複到mount狀态

本文轉自wiliiwin 51CTO部落格,原文連結:http://blog.51cto.com/wiliiwin/344276