oracle11g dataguard物理备库搭建
?
Dataguard 環境:操作系統:Redhat6.4 Primary數據庫: IP 地址:192.168.1.122 數據庫SID:ora11g DB_UNIQUE_NAME:ora11g_primary Standby數據庫: IP 地址:192.168.1.123 數據庫SID:ora11g DB_UNIQUE_NAME:ora11g_standby (注:oracle數據庫版本是11.2.0.1.0) 1.Primary端的配置
(1).檢查數據庫是否支持?Data Guard(企業版才支持),是否歸檔模式,Enable force logging
$ sqlplus '/as sysdba' SQL> select * from v$option where parameter = 'Managed Standby';? 確認主庫處于歸檔模式?????? SQL> archive log list????????(先檢查是否歸檔模式,不是則修改) ???? startup mount ???? alter database archivelog; ???? alter database open; ? (2)將primary?數據庫置為?FORCE LOGGING模式 ? SQL> alter database force logging;? (強制產生日志) 如果主庫沒有密碼文件則建立密碼文件,從而可以?OS驗證的方式登陸 $ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=oracle entries=5 ? (3)為主數據庫添加備用聯機日志文件 SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/ora11g/stdby_redo04.log') size 50m; alter database add standby logfile group 5 ('/u01/app/oracle/oradata/ora11g/stdby_redo05.log') size 50m; alter database add standby logfile group 6 ('/u01/app/oracle/oradata/ora11g/stdby_redo06.log') size 50m; alter database add standby logfile group 7 ('/u01/app/oracle/oradata/ora11g/stdby_redo07.log') size 50m; standby redolog的組數參考公式:(online redolog組數?+ 1) *?數據庫線程數;單機線程數為1,RAC一般為2。 standby redolog的組成員數和大小也盡量和online redolog一樣。 (注:在備庫中也要建立相同的standbylog組。) ? (4)修改主庫參數文件 SQL> create pfile from spfile; 主庫 DB_NAME=ora11g DB_UNIQUE_NAME=ora11g_primary LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary?,ora11g_standby)' ?? LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_primary' LOG_ARCHIVE_DEST_2='SERVICE=ora11g_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_standby' LOG_ARCHIVE_DEST_STATE_1=ENABLE LOG_ARCHIVE_DEST_STATE_2=ENABLE REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE LOG_ARCHIVE_FORMAT=%t_%s_%r.arc FAL_SERVER=ora11g_standby FAL_CLIENT=ora11g_primary STANDBY_FILE_MANAGEMENT=AUTO ? ? (5)建立備用庫的控制文件 SQL>shutdown immediate SQL>startup mount SQL> alter database create standby controlfile as '/u01/standby_ctl01.ctl'; ? (6)配置listener.ora和tnsnames.ora ? Listener.ora?文件: ? SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ora11g) (SID_NAME = ora11g) (ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1) ) ) LISTENER =? (DESCRIPTION_LIST =
??? (DESCRIPTION =
????? (ADDRESS = (PROTOCOL = TCP)(HOST = DG-Primary)(PORT = 1521))
??? )
? )
ADR_BASE_LISTENER = /u01/app/oracle tnsnames.ora文件: ? ORA11G_PRIMARY =
? (DESCRIPTION =
??? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.122)(PORT = 1521))
??? (CONNECT_DATA =
????? (SERVER = DEDICATED)
????? (SERVICE_NAME = ora11g)
??? )
? )
ORA11G_STANDBY =
? (DESCRIPTION =
??? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.123)(PORT = 1521))
??? (CONNECT_DATA =
????? (SERVER = DEDICATED)
????? (SERVICE_NAME = ora11g)
??? )
? ) ?
(7)主庫用修改過的PFILE 生產SPFILE 關閉主數據庫 SQL>shutdown immediate 生成spfile SQL> create spfile from pfile; ? ? ? 2.Standby端的配置 ? (1).?創建備庫存放數據文件和后臺跟蹤目錄
?mkdir -p?$ORACLE_BASE/oradata/ora11g?
?mkdir -p?$ORACLE_BASE/admin/ora11g
?mkdir -p?$ORACLE_BASE/admin/ora11g/adump?
?mkdir -p?$ORACLE_BASE/admin/ora11g/bdump?
?mkdir -p?$ORACLE_BASE/admin/ora11g/cdump?
?mkdir -p?$ORACLE_BASE/admin/ora11g/dpdump?
?mkdir -p?$ORACLE_BASE/admin/ora11g/pfile?
?mkdir -p?$ORACLE_BASE/admin/ora11g/udump?
?mkdir -p?$ORACLE_BASE/diag/rdbms
mkdir -p?$ORACLE_BASE/diag/tnslsnr mkdir?-p?$ORACLE_BASE/flash_recovery_area/ora11g mkdir -p?$ORACLE_BASE/flash_recovery_area/ORA11g mkdir -p?$ORACLE_BASE/archive (2).把文件傳輸到備庫下 關閉主庫復制文件 $scp $ORACLE_BASE/oradata/*.dbf 192.168.1.123:/$ORACLE_BASE/oradata/ora11g $scp $ORACLE_BASE/oradata/*.log 192.168.1.123:/$ORACLE_BASE/oradata/ora11g $scp /u01/standby_ctl01.ctl?192.168.1.123:/$ORACLE_BASE/oradata/ora11g $scp $ORACLE_HOME/dbs/initora11g.ora?192.168.1.123:?$ORACLE_HOME/dbs/ $ cd?$ORACLE_BASE/oradata/ora11g $ mv?standby_ctl01.ctl ?control01.ctl $ cp?control01.ctl?/u01/app/oracle/flash_recovery_area/ora11g/ $cd?/u01/app/oracle/flash_recovery_area/ora11g/ $ mv?control01.ctl ?control02.ctl ? (3)建立密碼文件 如果主庫沒有密碼文件則建立密碼文件,從而可以?OS驗證的方式登陸 $ orapwd file=$ORACLE_HOME/dbs/orapwora11g password=oracle entries=5 ?(4)修改備庫參數文件 DB_NAME=ora11g DB_UNIQUE_NAME=ora11g_standby? LOG_ARCHIVE_CONFIG='DG_CONFIG=(ora11g_primary?,ora11g_standby)' ?? LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ora11g_standby' LOG_ARCHIVE_DEST_2='SERVICE=ora11g_primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ora11g_primary' LOG_ARCHIVE_DEST_STATE_1=ENABLE LOG_ARCHIVE_DEST_STATE_2=ENABLE REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE LOG_ARCHIVE_FORMAT=%t_%s_%r.arc FAL_SERVER=ora11g_primary FAL_CLIENT=ora11g_standby STANDBY_FILE_MANAGEMENT=AUTO (4)修改備庫的listener.ora和tnsnames.ora,如果沒有的話,可以直接從主庫復制過去 ? Listener.ora?文件: ? ? SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = ora11g) (SID_NAME = ora11g) (ORACLE_HOME = /home/db/oracle/product/11.2.0/dbhome_1) ) ) LISTENER =? (DESCRIPTION_LIST =
??? (DESCRIPTION =
????? (ADDRESS = (PROTOCOL = TCP)(HOST = DG-Standby)(PORT = 1521))
??? )
? )
ADR_BASE_LISTENER = /u01/app/oracle tnsnames.ora文件: ? ORA11G_PRIMARY =
? (DESCRIPTION =
??? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.122)(PORT = 1521))
??? (CONNECT_DATA =
????? (SERVER = DEDICATED)
????? (SERVICE_NAME = ora11g)
??? )
? )
ORA11G_STANDBY =
? (DESCRIPTION =
??? (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.123)(PORT = 1521))
??? (CONNECT_DATA =
????? (SERVER = DEDICATED)
????? (SERVICE_NAME = ora11g)
??? )
? ) ? (5)復制主庫的密碼文件到備庫的相應位置(注:如果主備庫不能同步很可能就是密碼文件不一樣) ? 先查看備份庫是否有密碼文件,有就先刪除,然后再復制。 scp $ORACLE_HOME/dbs/orapwora11g 192.168.1.123:/$ORACLE_HOME/dbs/ ? ? ? 3.Dataguard啟動 (1)啟動順序,先啟動備庫,然后再啟動主庫 ? 啟動standby database
SQL>startup nomount
SQL>alter database mount standby database; #執行此命令后備庫會處于手動恢復狀態。
SQL>startup mount SQL>alter database set standby database to maximize availability; ? ? (設置為最大性能模式也是默認模式) SQL>alter database open;
啟動standby database到recover manage模式
SQL>alter database recover managed standby database disconnect from session;#執行此命令后,備庫會切換到自動恢復模式。
? 如果要啟動到實時日志應用模式 (注:前提必須創建standby logfile) alter database recover managed standby database using current logfile; #切換備庫到適時應用日志模式,即real-time apply。執行這個命令后光標會停止在那里。 或者alter database recover managed standby database using current logfile disconnect from session; ?#執行這個命令后,會切斷這個session,執行的功能與上面相同。 SQL>alter database recover managed standby database using current logfile disconnect from session;?
切換standby database到read only模式
SQL> alter database recover managed standby database cancel; ? ?#首先取消備庫的自動恢復模式SQL>alter database open read only;
如果要切換回recover manage模式(啟動日志應用或者啟動日志實時應用)
SQL>?alter database recover managed standby database disconnect from session; 啟動日志應用 SQL>alter database recover managed standby database using current logfile disconnect from session;?啟動日志實時應用 4、啟動和關閉順序 ? 啟動順序 ? (1).啟從、主庫的監聽Listener
從庫DG-Standby: $lsnrctl start
主庫DG-Primary: $lsnrctl start
(2).啟動備庫數據庫,執行如下:
$sqlplus /nolog SQL>conn /as sysdba
SQL> startup nomount
SQL> alter database mount standby database;?????????????? #讓備庫處于standby
SQL>?alter database recover managed standby database using current logfile disconnect from session;?;????????????????????????????????????????????????? #開始實時同步 (3).啟動主庫 $sqlplus /nolog SQL>conn /as sysdba
SQL> startup
.切換standby database到read only模式
SQL> alter database recover managed standby database cancel; ? ?#首先取消備庫的自動恢復模式SQL>alter database open read only;
如果要切換回recover manage模式(啟動日志應用或者啟動日志實時應用)
SQL>?alter database recover managed standby database disconnect from session; 啟動日志應用 SQL>alter database recover managed standby database using current logfile disconnect from session;?啟動日志實時應用 (3).啟動主庫數據庫(上述第二步執行完畢后,方可執行如下命令):
SQL>startup
關閉順序
關閉的時候正好相反,先關閉主庫,然后關閉從庫。
(1). ?關閉主庫
$su – oracle
SQL>sqlplus /nolog SQL>conn /as sysdba
SQL>shutdown immediate;
(2). 關閉從庫
su – oracle
SQL>sqlplus /nolog SQL>conn /as sysdba SQL>alter database recover managed standby database cancel;???? #停止同步
SQL>shutdown immediate 5、功能切換
Switchover狀態切換 首先在primary上操作: ? ?(1). ? 驗證主庫是否能執行角色轉換到備庫(原主庫執行) ? SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE; SWITCHOVER_STATUS? -----------------? TO STANDBY? 1 row selected (2).開始把物理主庫改變為物理備庫(原主庫執行) ? SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; 或 SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY with session shutdown; 注:如果有活動的session可以使用此選項,否則轉換會遇到ORA-01093錯誤,也可以殺掉活動會話或等活動會話后進行轉換? (3).關閉并重啟主庫(原主庫執行) SQL> shutdown immediate SQL> startup nomount
SQL> alter database mount standby database;?????????????? #讓備庫處于standby
SQL>?alter database recover managed standby database using current logfile disconnect from session;?;????????????????????????????????????????????????? #開始實時同步 ? 然后在standby上操作: (1).驗證備庫是否能執行角色轉換到主庫(原備庫執行) SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;? SWITCHOVER_STATUS? -----------------? TO_PRIMARY? 1 row selected (2).開始把物理備庫轉換成物理主庫(原備庫執行) SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; --如果報ORA-16139: media recovery required,可能是由于未應用日志引起,可先執行 ALTER ?DATABASE RECOVER MANAGED STANDBY ?DATABASE DISCONNECT FROM SESSION; (3)打開備庫,然后關閉重啟.(原備庫執行) SQL> SHUTDOWN IMMEDIATE; SQL> STARTUP; ?(4) ?驗證是否轉換成功(原備庫執行) SQL> ALTER SYSTEM SWITCH LOGFILE; ? ?啟動日志應用 ? (5) ?應用歸檔日志(原主庫上執行) SQL> ALTER ?DATABASE RECOVER MANAGED?STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION; 小竅門:要想順利的實現switchover,最好在每臺server上都同時設置好primary和standby的一些初始化參數,雖然其中一些參數只有在primary或者standby其中之一上起作用。
應急切換
(注:模擬主庫由于故障無法正常switchover,需要執行failover,強制備庫->pridb并接管業務)
(1).備庫:
由于是failover,所以理解主庫這時候已經無法正常使用,只需備庫切換至pridb
停止應用恢復模式
alter database recover managed standby database finish;
轉換standbydb為primary db
alter database commit to switchover to primary;
重啟數據庫,恢復正常業務
SQL>shutdown immediate
SQL>startup
select open_mode,database_role from v$database;
OPEN_MODE ? ? ? DATABASE_ROLE
---------- ? ? ? ? ? ? ----------------
OPEN ? ? ? ? ? ? ? ? PRIMARY
Failover狀態切換
在備庫上進行切換:
1.首先停止備庫的自動恢復狀態:
SQL>alter database recover managed standby database finish;
如果沒有使用過standby redo log的話執行:
SQL>alter database recover managed standby database finish skip standby logfile;
2.切換備庫到主庫:
SQL>alter database commit to switchover to primary;
3. 關閉數據庫:
SQL>shutdown immediate;
4. 啟動數據庫:
SQL>startup;
Active狀態切換:
Active是從8i延續過來的,其實不建議采用:
在備庫上執行切換:
1:alter database recover managed standby database cancel;
2:alter database activate standby database;
3:shutdown immediate
總結一下Failover 和 Switchover 的區別:
在9i 的dataguad環境中:
1:執行Switch Over 必須是Primary 正常,并且是必須Primary 主動先Switch成 standby.然后standby 才能switch 成primary。
2:如果需要作成primary出問題,standby 能接管的話,必須作 failover ,而不是SwitchOver。
Failover :
將主數據庫offline,備用數據庫online,這種操作由系統和軟件失敗引起。 即使在備用數據庫上應用重做日志,也可能出現數據丟失的現象,除非備用數據庫運行在 guaranteed protection 模式。
原主數據庫重新使用時必須重新啟動實例。
其它的備用數據庫也需重新啟動實例。
Switchover :
故意將主數據庫offline,而將另一備用數據庫online,它能夠切換到備用數據庫而不需同步操作。如:可使用 Switchover 完成系統的平滑升級。 即使在備用數據庫上不應用重做日志,也不會造成數據的丟失。
數據庫不需重新啟動實例。這使主數據庫幾乎能立即在備用數據庫上恢復它的功能,因此可經常進行定期維護而不需中斷操作。
Failover和Switchover的區別為:
當Failover發生,備用數據庫切換為主數據庫之后,它丟失了備用數據庫的所有能力,也就是說,不能再返回到備用模式;而Switchover可以,備用數據庫可切換為主數據庫,也可從主數據庫再切換回備用數據庫。
四、相關視圖
v$archive_dest
v$archive_dest_status
v$log_history
v$archvied_log
v$managed_standby
v$archive_gap
?
6、常見問題
(1).?日志無法傳送 SQL>select dest_name,status,error from v$archive_dest; 察看相應的歸檔路徑的狀態是否?valid?,否則根據error?信息進行處理 (2).?無法使用alter database?重命名?data file ??在standby?上,當設置?standby_file_management?為auto?時,不允許下列操作 alter database rename alter database add/drop logfile alter database add/drop standby logfile member alter database create datafile as (3). switchover?失敗 SQL>alter database commit to switchover to physical standby 錯誤:?ORA-01093:alter database close only permitted with no session connected 可以察看引起該錯誤的活動?session SQL> select sid,process,program from v$session where type='USER' and sid<>(select distinct sid from v$mystat); 然后根據查出的?sid?結合v$session?視圖最后用 alter system kill session?‘?sid,serial’?來kill?掉進程,斷開該?session 或者使用如下命令來做?switchover SQL>alter database commit to switchover to physical standby with session shutdown; (4).?在standby database?的?read only模式下做?report?時出現錯誤: ora-01220:file base sort illegal before database is open. 可能原因:?standby database?沒有temporary tablespace (5).當主機和備機在運行過程中,把備機停下來,主機的歸檔日志將不能傳到備機,當把備機服務起來后,主機的歸檔日志也不能傳到備機,需要把主機的所有服務都重啟一次才可以傳日志。 請問為什么需要把主機要重啟一次呢?有沒有不需要重啟主機就可以解決此問題呢? 發生這種情況時,核查幾處: (?1)?. show parameter log_archive_dest?; (?2)?. select REOPEN_SECS,MAX_FAILURE from V$ARCHIVE_DEST; 察看是否是因為由于備機沒有開機,造成?primary node?無法正常傳送?archived log,并且達到了最大允許的失敗次數。如果是這樣,可以通過?alter system set log_archive_dest...?來重置屬性值,恢復日志的正常傳送。 也可以手工傳送相關的日志到備機, ????對于物理standby?:?ALTER DATABASE REGISTER LOGFILE '/xxx/xxx/arcr_xxx.arc' ????對于邏輯standby?:?ALTER DATABASE REGISTER LOGICAL LOGFILE '/xxx/xxx/arcr_xxx.arc' (3).?執行SELECT MESSAGE FROM V$DATAGUARD_STATUS;?察看相關信息,還有根據?dataguard?的不同類型來察看相關的?view?來確定當前的狀態,具體參見?dataguard?的官方文檔。?
至于本文設置主備庫參數在此博客有詳解http://www.cnblogs.com/Elliot-wang/p/3790878.html
轉載于:https://www.cnblogs.com/Elliot-wang/p/3790852.html
總結
以上是生活随笔為你收集整理的oracle11g dataguard物理备库搭建的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何对抗硬件断点--- 调试寄存器
- 下一篇: jQuery之防止【冒泡事件】,阻止默认