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) * 數據庫線程數;單機線程數為1RAC一般為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; #執行此命令后備庫會處於手動恢復狀態。

 啟動primary 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將破壞dataguard模式,需要重新配置dataguard,網上也說不需要配置,但是還沒有測試成功
 
 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM