看到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