本文參考了網上幾篇文章,然後經過修改,測試成功。
一、 環境
Windows20008 server
Oracle 11.2.0.1
主機:192.168.70.170(primary), 實例名:dbtest
備機:192.168.70.164(standby),不帶實例
primary 和 standby 是數據庫唯一名。不是機器名。
二、 準備條件
分別在primary上安裝oracle 和數據庫,standby安裝oracle不帶實例;安裝路徑、數據庫實例名(dbtest)和sys和其他用戶的密碼設置爲admin
三、 Primary操作
1、 設置主數據庫爲force logging 模式
SQL>sqlplus"/as sysdba"
SQL>alterdatabase force logging;
2、 設置主數據庫爲歸檔模式,並以mount 啓動數據庫
SQL>archivelog list
SQL>shutdownimmediate
SQL>startupmount
SQL>alterdatabase archivelog;
SQL>archivelog list
3、 添加"備用聯機日誌文件"
SQL>select* from v$logfile;
再添加:
alterdatabase add standby logfile group 4 (' E:\app\Administrator \ORADATA\DBTEST\redo04.log')size 50m;
alterdatabase add standby logfile group 5 ('E:\app\Administrator \ORADATA\DBTEST\redo05.log') size 50m;
alterdatabase add standby logfile group 6 (' E:\app\Administrator \ORADATA\DBTEST\redo06.log')size 50m;
alterdatabase add standby logfile group 7 (' E:\app\Administrator \ORADATA\DBTEST\redo07.log')size 50m;
4、 創建主庫的初始化參數給備庫用
SQL>Createpfile from spfile;
產生的文件名爲initdbtest.ora 存放目錄默認放在$ORACLE_HOME/database下
5、 在主庫創建監聽和配置tnsnams.ora
listener.ora配置如下:
SID_LIST_LISTENER中添加紅色部分:這裏要特別注意了
紅色部分是添加的內容
SID_LIST_LISTENER=
(SID_LIST =
(SID_DESC =
(SID_NAME = CLRExtProc)
(ORACLE_HOME =E:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS ="EXTPROC_DLLS=ONLY:E:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll")
)
(SID_DESC=
(GLOBAL_DBNAME= dbtest)
(ORACLE_HOME= E:\app\Administrator\product\11.2.0\dbhome_1)
(SID_NAME= dbtest)
)
)
LISTENER=
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =WIN-32I7T8HE0VE)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY =EXTPROC1521))
)
)
ADR_BASE_LISTENER= E:\app\Administrator
tnsnames.ora配置如下:
添加:
primary=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.70.170)(PORT= 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbtest)
)
)
standby=
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.70.164)(PORT= 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = dbtest)
)
)
修改完成後重啓監聽:
lsnrctl stop
lsnrctl start
6、 在initdbtest.ora中添加以下內容:
*.log_archive_format='%T%S%r.ARC'
*.DB_UNIQUE_NAME='primary'
*.log_archive_config='DG_CONFIG=(primary,standby)'
*.log_archive_dest_1='location=E:\app\Administrator\oradata\archVALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=primary'
*.log_archive_dest_2='SERVICE=standby LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=standby'
*.STANDBY_FILE_MANAGEMENT=AUTO
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER='standby'
*.FAL_CLIENT='primary'
接下來關閉數據庫,並啓動,讓修改生效
SQL> shutdown immediate
SQL> create spfile from pfile;
SQL> startup
7、 用Rman備份,不用停機
$rman target /
RMAN>backupfull format 'E:/FULL_%d_%T_%s.bak' database include current controlfile forstandby;
RMAN>sql'alter system archive log current';
RMAN>BackupArchiveLog all format='E:/arch_%d_%T_%s.bak';
備份完後將3個備份文件拷到standby上同樣的目錄,強調:同樣的目錄(E盤),以便在standby進行rman恢復
四、 Standby操作
對於備機因爲只安裝軟件,沒有創建數據庫實例。因此在進行下面操作前需要首先創建同名的空閒實例
oradim -new -sid dbtest
之後即可使用:
cmd> set oracle_sid=dbtest
SQL>sqlplus / as sysdba來連接到這個空閒實例。
其中cmd表示command窗體下的命令行
拷貝閃回區內容
1、 拷貝閃回區內容
將主機的閃回目錄 e:\app\Administrator\flash_recovery_area下所有內容拷貝到備機
e:\app\Administrator\flash_recovery_area下,注意備機此時還沒有flash_recovery_area目錄
2、 拷貝配置文件
拷貝主機E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\ listener.ora 和
tnsnames.ora 到備機相應的位置下。
並且修改listener.ora文件中的IP地址爲備機IP,如下標紅部分,其餘不變
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.70.164)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
且修改tnsnames.ora文件中的IP地址,如下標紅部分,其餘不變
DBTEST =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.70.164)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = dbtest)
)
)
修改完成後重啓監聽:
lsnrctl stop
lsnrctl start
3、 拷貝initdbtest.ora和密碼文件到備機並修改initdbtest.ora
E:\app\Administrator\product\11.2.0\dbhome_1\database\initdbtest.ora
E:\app\Administrator\product\11.2.0\dbhome_1\database\PWDdbtest.ora
然後編輯$ORACLE_HOME/database目錄下的initdbtest.ora相應部分爲以下內容
*.log_archive_format='%T%S%r.ARC'
*.DB_UNIQUE_NAME='standby'
*.log_archive_config='DG_CONFIG=(primary,standby)'
*.log_archive_dest_1='location=E:\app\Administrator\oradata\archVALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=standby'
*.log_archive_dest_2='SERVICE=primary LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=primary'
*.STANDBY_FILE_MANAGEMENT=AUTO
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER='primary'
*.FAL_CLIENT='standby'
4、 手動創建下面的目錄
E:\app\Administrator\oradata\dbtest
5、 啓動備用數據庫
SQL>startup nomount;
SQL>create spfile from pfile;
SQL>shutdown immediate;
SQL>starup nomount;
6、 用Rman還原數據庫
Cmd> set oracle_sid=dbtest
cmd>rman target sys/admin@primary auxiliary /
此步驟如果報下面的錯誤:
C:\Users\Administrator>rman target sys/admin@primary auxiliary/
恢復管理器: Release 11.2.0.1.0 -Production on星期四 4月 716:05:56 2016
Copyright (c) 1982, 2009, Oracle and/or itsaffiliates. All rights reserved.
RMAN-00571:===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS===============
RMAN-00571:===========================================================
RMAN-00554: 內部恢復管理器程序包初始化失敗
RMAN-04005: 目標數據庫中存在錯誤:
ORA-12514: TNS: 監聽程序當前無法識別連接描述符中請求的服務
那麼就是前面備端listener.ora配置有問題 ,或者是主機端沒有重啓監聽
rman target sys/admin@primary auxiliary /這個命令的含義是連接2個目標,一個爲primary,一個爲本備機的dbtest
可通過在主機端上執行rman target sys/admin@primary,在備機上執行rman target /來定位分析問題。只有2個目標都成功連接,上述命令纔會成功。
恢復數據:
RMAN>duplicatetarget database for standby dorecover nofilenamecheck;
數據恢復完成後,執行下面的命令,準備測試
SQL>shutdownimmediate;
SQL>startupnomount;
SQL>alter database mount standby database;
SQL>alter database add standby logfile;
SQL>alter database add standby logfile;
SQL>alter database add standby logfile;
SQL>alter database add standby logfile;
SQL>alter database recover managed standby database using current logfile disconnect from session;
五、 測試
1、 在主庫:
SQL>alter system switch logfile;
SQL>select max(sequence#) from v$archived_log;
2、 在備庫檢查日誌是否和主庫一致
SQL>select max(sequence#) from v$archived_log;
注:主備查詢結果一致,Data Guard 搭建結束。