一、准備環境
1、兩台服務器、一台正常運行oracle數據庫的,一台裝了軟件沒有啟動數據庫的(沒有進行dbca)
2、主庫備庫 修改環境變量,修改主機名,將主庫備庫的主機名都寫入hosts文件
二、開始搭建
1.查看主庫是否開啟歸檔模式,查看是否開啟強制日志(若沒開啟則開啟)
SYS@WWDB1> select log_mode,force_logging from v$database;
SYS@WWDB1> alter database force logging;
SYS@WWDB1> archive log list;
SYS@WWDB1> show parameter db_recovery
SYS@WWDB11> alter system switch logfile;
2.創建STANDBY LOGFILE
SYS@WWDB1>define editor=vim
SYS@WWDB1>ed1
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/WWDB1/stlog01.log') size 100m;
alter database add standby logfile group 5 ('/u01/app/oracle/oradata/WWDB1/stlog02.log') size 100m;
alter database add standby logfile group 6 ('/u01/app/oracle/oradata/WWDB1/stlog03.log') size 100m;
alter database add standby logfile group 7 ('/u01/app/oracle/oradata/WWDB1/stlog04.log') size 100m;
SYS@WWDB1>@1
3.創建參數文件
SYS@WWDB1>create pfile from spfile;
4.修改參數文件
[oracle@oracle01 ~]$ cd /u01/app/oracle/product/11.2.4/dbhome_1/dbs/
[oracle@oracle01 dbs]$ vi initWWDB1.ora
在原有參數文件上添加 下列參數來自於官方文檔
DB_UNIQUE_NAME=WWDB1
LOG_ARCHIVE_CONFIG='DG_CONFIG=(WWDB1,SBDB1)'
LOG_ARCHIVE_DEST_1=
'LOCATION=use_db_recovery_file_dest
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=WWDB1'
LOG_ARCHIVE_DEST_2=
'SERVICE=SBDB1 lgwr ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=SBDB1'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t%s_%r.arc
下邊的在備庫上才有用,在主庫中先添加上scp到備庫
FAL_SERVER=SBDB1
DB_FILE_NAME_CONVERT='SBDB1','WWDB1'
LOG_FILE_NAME_CONVERT='SBDB1','WWDB1'
STANDBY_FILE_MANAGEMENT=AUTO
dg_broker_start=true
5.修改監聽文件
[oracle@oracle01 admin]$ vi listener.ora
添加靜態監聽
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=WWDB1)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(SID_NAME=WWDB1))
(SID_DESC=
(GLOBAL_DBNAME=WWDB1_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(SID_NAME=WWDB1))
(SID_DESC=
(SID_NAME=plsextproc)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(PROGRAM=extproc)))
[oracle@oracle01 admin]$ vi tnsnames.ora
添加如下內容
SBDB1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle02)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SBDB1)
)
)
6.將監聽文件、TNS文件、口令文件、參數文件
重要的是口令文件跟參數文件文件名要改成備庫的名稱
scp initWWDB1.ora oracle02:/u01/app/oracle/product/11.2.4/dbhome_1/dbs/initSBDB1.ora
scp orapwWWDB1 oracle02:/u01/app/oracle/product/11.2.4/dbhome_1/dbs/orapwSBDB1
scp ../network/admin/listener.ora ../network/admin/tnsnames.ora oracle02:/u01/app/oracle/product/11.2.4/dbhome_1/network/admin
7.重啟主庫使配置生效
注:重啟庫之前先重啟監聽
三、到備庫中
1.創建對應路徑
[oracle@oracle01~]$ cd /u01/app/oracle/
[oracle@oracle01 oracle]$ mkdir -p admin/SBDB1/adump
[oracle@oracle01 oracle]$ mkdir -p oradata/SBDB1
[oracle@oracle01 dbs]$ mkdir -p /home/oracle/flash
2.修改參數文件
[oracle@oracle01 oracle]$ cd $ORACLE_HOME/dbs
[oracle@oracle01 oracle]$ vi initSBDB1.ora(從主庫中scp過來的)
注:用替換SBDB1全部替換成WWDB1然后需要注意的是db_name=主庫sid
3.修改網絡配置文件(配置監聽文件)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle02)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
ADR_BASE_LISTENER = /u01/app/oracle
SID_LIST_LISTENER=
(SID_LIST=
(SID_DESC=
(GLOBAL_DBNAME=SBDB1)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(SID_NAME=SBDB1))
(SID_DESC=
(GLOBAL_DBNAME=SBDB1_DGMGRL)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(SID_NAME=SBDB1))
(SID_DESC=
(SID_NAME=plsextproc)
(ORACLE_HOME=/u01/app/oracle/product/11.2.4/dbhome_1)
(PROGRAM=extproc)))
4.重啟網絡設置
重啟監聽
[oracle@oracle01 oracle]$ lsnrctl reload
注:啟動完看一下有一個動態監聽一個靜態監聽
5.啟動備庫實例
SQL> create spfile from pfile;
備庫啟動到nomount狀態
SQL> startup nomount
創建快速閃回區的目錄
mkdir -p /u01/app/oracle/fast_recovery_area/SBDB1
6.搭建備庫:
使用復制數據庫技術搭建備庫
[oracle@oracle01 oracle]$ rman target sys/oracle@WWDB1 auxiliary sys/oracle@sbdb1
RMAN> DUPLICATE TARGET DATABASE
FOR STANDBY
FROM ACTIVE DATABASE
DORECOVER
NOFILENAMECHECK;
運行成功,即備庫搭建成功!
四、配置dg服務
主庫:
開啟日志傳輸服務
alter system set log_archive_dest_state_2='enable' scope=both sid='';
備庫:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
---(啟動實時應用日志服務)。
-------------------------------------------------------搭建完成---------------------------------------------------
搭建中遇到的報錯
報錯1:
SQL> create spfile from pfile;
create spfile from pfile
*
ERROR at line 1:
ORA-01078: failure in processing system parameters
LRM-00123: invalid character 154 found in the input file
解決方法:
在參數文件中有中文刪掉即可,即使是注釋中的也不行
報錯2:
使用rman備份恢復備庫的時候,報錯缺失‘DBMS’觸發器可能是因為無catalog日志
需要加上nocatalog參數。
即:
rman target sys/oracle@WWDB1 auxiliary sys/oracle@sbdb1 nocatalog
報錯3:
若無快速恢復區,
'LOCATION=use_db_recovery_file_dest
此處,LOCATION=(歸檔日志歸檔的本地路徑)。
報錯四:
無法創建***.cronctl.dbf
可能沒有該路徑,或者oracle沒有創建文件的權限
----------------------------------------------------------DG的管理與應用--------------------------------------------------
A、開啟實時日志應用
alter database recover managed standby database using current logfile disconnect;
1 開啟應用日志 alter database recover managed standby database disconnect;
2 檢查進程是否開啟 select client_process,process,thread#,sequence#,status from v$managed_standby;
3 取消應用日志 alter database recover managed standby database cancel;
4 開啟實時日志應用 alter database recover managed standby database using current logfile disconnect;
B、DATAGUARD驗證
1主庫切換日志
備庫接受
更改時間顯示
alter session set nls_date_format='DD-MON-YYYY HH24:MI:SS';
在線日志歸檔
alter system archive log current;
查看主庫/備庫歸檔是否同步
select sequence#,first_time,next_time,archived,applied from v$archived_log order by sequence#;
C、主庫備庫切換
1 查看主庫/備庫處於的模式
select name,database_role,open_mode,switchover_status from v$database;
2 主庫切成備庫
alter database commit to switchover to physical standby with session shutdown;
shutdown immediate
startup mount;
3 備庫切換主庫
alter database commit to switchover to primary;
shutdown immediate;
startup ;
D、修改數據保護模式步驟
1)關閉數據庫,重啟到Mount 狀態,如果是RAC,需要關閉所有實例,然后只啟動一個實例到mount狀態。
2)修改模式:
語法:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE};
如:SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
-
打開數據庫: alter database open;
-
確認修改數據保護模式:
SQL>select protection_mode,protection_level from v$database;
E、檢查是否有丟失日志
1) 查看是否有日志GAP:
SQL> SELECT UNIQUE THREAD#, MAX(SEQUENCE#) OVER(PARTITION BY THREAD#) LAST FROM V$ARCHIVED_LOG;
SQL> SELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE# FROM V$ARCHIVE_GAP;
2) 如果有,則拷貝過來
3) 手工的注冊這些日志:
SQL> ALTER DATABASE REGISTER LOGFILE '路徑';
F、DG服務的啟停
(1)啟動SQL應用。邏輯Standby數據庫啟動SQL應用沒有前、后台運行之說,語句執行完之后,控制權就會自動返回當前命令行窗口。
要啟動SQL應用,直接執行下列語句即可:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY;
如果要啟動實時應用,附加IMMEDIATE子句即可,例如:
SQL> ALTER DATABASE START LOGICAL STANDBY APPLY IMMEDIATE;
(2)停止SQL應用,如:
SQL> ALTER DATABASE STOP LOGICAL STANDBY APPLY;
由於是執行SQL語句的方式應用REDO數據,因此上述語句的執行需要等待當前執行的SQL觸發的事務結束,才能真正停止REDO應用的狀態。
如果不考慮事務執行情況,馬上停止REDO應用,可以通過下列的語句來完成:
SQL> ALTER DATABASE ABORT LOGICAL STANDBY APPLY;
(3)dg日志傳輸服務
主庫:
停用dg(日志傳輸服務)
alter system set log_archive_dest_state_2='defer' scope=both sid='*';
啟用dg(日志傳輸服務)
alter system set log_archive_dest_state_2='enable' scope=both sid='*';
G、DG架構的啟用與停止(***)
啟動
順序:
先啟從庫再起主庫
(1)查看監聽
查看監聽狀態
lsnrctl status
若無監聽,手動啟動監聽
lsnrctl start
(2)啟動數據庫
順序:
啟動從庫-----從庫上啟動實時應用日志服務-----啟動主庫----主庫上啟動日志傳輸服務
sql>startup;
備庫
sql>alter database recover managed standby database using current logfile disconnect from session;(開啟實時日志應用服務)
啟動主庫
由於主庫設置着開機自啟,使用將服務器打開就行了。
開啟dg服務
主庫:
alter system set log_archive_dest_state_2='enable' scope=both sid='*';開啟日志傳輸服務
關閉:(和開啟正好相反)
先關主庫數據庫:
停用dg服務
主庫
alter system set log_archive_dest_state_2='defer' scope=both sid='*';(關閉日志傳輸服務)
注:若備庫未停止實時應用日志服務就算關閉日志傳輸服務,備庫也會跟主庫同步。
sql>shutdown immediate;
再關從庫:
停止實時應用日志服務
sql>alter database recover managed standby database cancel;
關閉數據庫:
sql>shutdown immediate;
關閉服務器