看到oracle官方文檔說oracle 11g dataguard在物理standby機器上出於open狀態也能夠應用redo,因此就在本地試驗了下,確實如此,這樣既能夠應用redo也能夠進行數據查詢和數據庫的備份.既解決了數據的容災也解決了主數據庫的壓力.
Oracle dataguard 簡介
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相關進程
_ Remote file server (RFS)
負責從主數據庫上接收歸檔文件
_ Archiver (ARCn)
將日誌進行歸檔
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
Dataguard 配置:
在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> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/home/oradata/wiliiwin.ctl';
SQL> ALTER DATABASE OPEN;
複製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'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.LOG_ARCHIVE_MAX_PROCESSES=30
*.FAL_SERVER=node1 //這裏爲net
service name
*.FAL_CLIENT=node2
*.STANDBY_FILE_MANAGEMENT=AUTO
$ 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; //啓動實時應用
測試dataguard數據是否同步
測試同步是否正常方法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服務器上:
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
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狀態