基於多種場景DataGuard切換方案

yingyifeng306發表於2021-05-06

 

描述

架構說明

為了簡單明瞭的描述生產庫、本地容災、異地容災三者之間的架構關係以及搭建步驟,現分別用以A 機、B 機、C 機來表示。

本地主庫伺服器:A

本地備庫伺服器:B

異地備庫伺服器:C

硬體環境

以下為方案編寫時採用的測試環境,DataGuard 搭建需要在同平臺同版本前提下實現,且更多是資料庫層面的引數設定,對使用何種作業系統關係不大。

 

A 機規劃:

主機名

IP

型號

作業系統版本

資料庫版本

oracledb01

192.168.200.71

X86

RHEL6.4

11.2.0.4

 

B 機規劃:

主機名

IP

型號

作業系統版本

資料庫版本

oracledb02

192.168.200.75

X86

RHEL6.4

11.2.0.4

 

C 機規劃:

主機名

IP

型號

作業系統版本

資料庫版本

oracledb03

192.168.200.67

X86

RHEL6.4

11.2.0.4

 

切換說明

在異常情況下,本地主庫異常當機,若主庫重啟之後,能正常使用,只需確保DataGuard 環境保持同步即可;若本地主庫,在異常情況下,不可用或暫不可用,為保證業務的連續性,採用DataGuard 切換方案。 本文件針對異常情況發生,主庫不可用或暫不可用的場景下,給出的各種切換方案以及主庫正常後回切方案。


 

同時搭建本地& 異地備庫

搭建步驟

步驟

內容

Step 1

主庫引數配置

Step 2

本地備庫引數檔案配置

Step 3

本地備庫資料同步

Step 4

異地備庫引數檔案配置

Step 5

異地備庫資料同步

 

主庫引數配置

主庫引數配置包括確認歸檔是否開啟,force_logging 是否開啟,修改主庫引數檔案,新增網路連線串等等一系列的主庫配置資訊。

歸檔開啟

確認歸檔是否開啟:

[root@oracledb01 ~]# su - oracle

 [oracle@oracledb01 ~]$ sqlplus "/ as   sysdba"

SQL*Plus: Release 11.2.0.4.0 Production   on Wed Aug 5 10:56:20 2015

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Connected to:

Oracle Database 11g Enterprise Edition   Release 11.2.0.4.0 - 64bit Production

With the Partitioning, Real Application   Clusters, Automatic Storage Management, OLAP,

Data Mining and Real Application Testing   options

SQL> archive log list

Database log mode              Archive Mode

Automatic archival             Enabled

Archive destination            /oradata/test/arch

Oldest online log sequence     82

Next log sequence to archive   0

Current log sequence           83

SQL>

 

以上說明歸檔已經開啟,如果沒有開啟請參照一下方法開啟歸檔:

[root@oracledb01 ~]# su - oracle

[oracle@oracledb01 ~]$ sqlplus "/ as   sysdba"

SQL> alter system set   log_archive_dest_1='location=/oradata/test/arch' scope =both sid='*';

關閉資料庫:

SQL>shutdown immediate;

例項啟動:

SQL>startup mount;

SQL> alter database archivelog ;

Database altered.

SQL> alter database open;

Database altered

 

開啟資料庫force_logging

檢查是否開啟了force_logging

SQL> SELECT FORCE_LOGGING FROM   V$DATABASE;

FOR

---

YES

// 如果狀態為YES ,則已經開啟,如果狀態為NO ,則參考下面步驟:

SQL> ALTER DATABASE FORCE LOGGING;

 

新增網路連線串

網路連線串用於連線主備兩端資料庫,傳輸歸檔等作用,具體需要配置如下幾個:主庫連線串,本地備庫連線串,異地備庫連線串,詳細配置資訊如下:

su – oracle

cd $ORACLE_HOME/network/admin

vi tnsnames.ora 新增如下資訊:(如果已經存在以下連線串,酌情考慮新增刪除)

###################A 機連線串#########################

test =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.71)(PORT = 1521))

      (CONNECT_DATA =

        (SERVER = DEDICATED)

        (SERVICE_NAME = test)

      )

  )

 

###################B 機連線串#########################

local =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.75)(PORT = 1521))

      (CONNECT_DATA =

        (SERVER = DEDICATED)

        (SERVICE_NAME = test)

      )

  )

 

###################C 機連線串######################### 

remote =

    (DESCRIPTION =

      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.200.67)(PORT = 1521))

      (CONNECT_DATA =

        (SERVER = DEDICATED)

        (SERVICE_NAME = test)

      )

    ) 

 

 

修改主庫引數檔案

備份引數檔案:(方便修改引數出現問題及時回退)

[root@oracledb01 ~]# su - oracle

[oracle@oracledb01 ~]$ sqlplus "/ as   sysdba"

SQL> create pfile='/tmp/inittest20170809.ora' from   spfile;

File created.

 

主庫需要修改的引數如下:

引數

閥值

定義

standby_file_management

AUTO

primary 資料庫資料檔案發生修改(如新建,重新命名等)則按照本引數的設定在standby   中做相應修改。

log_archive_dest_2

 

'SERVICE=local   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

歸檔檔案的生成路徑,location代表本地機上,service指明在另一臺機器上

log_archive_dest_3

 

'SERVICE=remote   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

歸檔檔案的生成路徑,location代表本地機上,service指明在另一臺機器上

fal_server

local,remote

 

備庫端的引數,給出Oracle網路服務名,通常為指向主庫的連線串

fal_client

test

備庫端的引數,給出Oracle網路服務名,通常為指向備庫的連線串

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

資料庫和備用資料庫的資料檔案轉換目錄對映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主資料庫和備用資料庫的log檔案轉換目錄對映

LOG_ARCHIVE_DEST_STATE_1

ENABLE

啟用或者不啟用定義的歸檔日誌目錄,允許redo 傳輸服務傳輸redo資料到指定的路徑

LOG_ARCHIVE_DEST_STATE_2

ENABLE

啟用或者不啟用定義的歸檔日誌目錄,允許redo 傳輸服務傳輸redo資料到指定的路徑

LOG_ARCHIVE_DEST_STATE_3

ENABLE

啟用或者不啟用定義的歸檔日誌目錄,允許redo 傳輸服務傳輸redo資料到指定的路徑

 

 

具體設定如下:

SQL>alter   system set standby_file_management=auto scope=both sid='*';

SQL>alter   system set log_archive_dest_2='SERVICE=local arch ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both   sid='*';

SQL>alter   system set log_archive_dest_3='SERVICE=remote arch ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test' scope=both   sid='*';

SQL>alter   system set db_file_name_convert ='/oradata/test/','/oradata/test/'   scope=spfile sid='*';

SQL>alter   system set log_file_name_convert='/oradata/test/','/oradata/test/'   scope=spfile sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_1=ENABLE scope=both sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_2=ENABLE scope=both sid='*';

SQL>ALTER   SYSTEM set LOG_ARCHIVE_DEST_STATE_3=ENABLE scope=both sid='*';

 

建立standby redo log 檔案

standby redo log 作用在備庫,用於接收從主庫傳過來的日誌資訊,在主庫部署主要是為了方便日後的主備切換

建立適當數量的 Standby Redo Log 組數

  公式如下

1. 如果主庫是單例項資料庫 :Standby Redo Log 組數 = 主庫日誌組總數 +1

2.    如果主庫是RAC資料庫:Standby Redo Log組數=(所有節點中日誌組數最大值 + 1) * RAC節點數

3.    大小和生產庫redo日誌組大小一致

alter database add standby logfile   ('/oradata/test/std_redo01.log') size 500m;

alter database add standby logfile   ('/oradata/test/std_redo02.log') size 500m;

alter database add standby logfile   ('/oradata/test/std_redo03.log') size 500m;

alter database add standby logfile ('/oradata/test/std_redo04.log')   size 500m;

 

主庫收集相關檔案

1. 建立備庫所需引數檔案

#mkdir –p /backup

#chown oracle:oinstall /backup

#chmod 775 /backup

sqlplus "/ as sysdba"

SQL> create   pfile='/backup/inittest.ora' from spfile;

 

2. 建立standby 控制檔案:

sqlplus "/as sysdba"

SQL> alter database create standby   controlfile as '/backup/control01.ctl';

 

3. 複製tnsnames.ora 檔案:

su – oracle

cd $ORACLE_HOME/network/admin

cp tnsnames.ora /backup

 

4.        複製密碼檔案:

su – oracle

cd $ORACLE_HOME/dbs

cp orapwtest /backup

 

主庫相關檔案複製至備庫( 包括本地和異地)

# su – oracle

$ cd /backup

$ scp * oracle@192.168.200.75:/backup

$ scp * oracle@192.168.200.63:/backup

 


 

備庫( 包括本地與異地) 引數配置

環境確認

備庫需要確認如下資訊:

1.        資料庫軟體已經正常安裝,版本和生產保持一致

2.        監聽已經啟動

3.        2.2 章節中備份出來的/backup 下面的檔案複製到備庫指定位置

修改備庫引數檔案

將從生產庫複製過來的引數檔案進行編輯,在保證主庫中3.2.4 修改主庫引數檔案章節中的引數已經確認生效的情況下,修改以下引數

本地備庫 需要調整的引數如下:

引數

閥值

定義

log_archive_dest_2

 

'SERVICE=remote   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

歸檔檔案的生成路徑,location代表本地機上,service指明在另一臺機器上

log_archive_dest_3

 

'SERVICE=test   arch ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

歸檔檔案的生成路徑,location代表本地機上,service指明在另一臺機器上

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

資料庫和備用資料庫的資料檔案轉換目錄對映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主資料庫和備用資料庫的log檔案轉換目錄對映

control_files

'/oradata/test/control01.ctl'

控制檔案指向最新的路徑

 

本地備庫 初始化引數修改

*.audit_file_dest='/oracle/app/admin/test/adump'

*.audit_trail='db'

*.compatible='11.2.0.4.0'

*.control_files='/oradata/test/control01.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_file_name_convert='/oradata/test/','/oradata/test/'

*.db_name='test'

*.diagnostic_dest='/oracle/app'

*.dispatchers='(PROTOCOL=TCP)   (SERVICE=testXDB)'

*.log_archive_dest_1='location=/oradata/test/arch'

*.log_archive_dest_2='SERVICE=remote ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'

*.log_archive_dest_3='SERVICE=test ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'

*.log_archive_dest_state_2='ENABLE'

*.log_archive_dest_state_3='ENABLE'

*.log_file_name_convert='/oradata/test/','/oradata/test/'

*.open_cursors=300

*.pga_aggregate_target=825229312

*.processes=150

*.remote_login_passwordfile='exclusive'

*.sga_target=2475687936

*.standby_file_management='AUTO'

*.undo_tablespace='UNDOTBS1'

 

 

異地備庫 需要調整的引數如下:

引數

閥值

定義

log_archive_dest_2

 

'SERVICE=test arch   ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test';

歸檔檔案的生成路徑,location代表本地機上,service指明在另一臺機器上

db_file_name_convert

'/oradata/test/',   '/oradata/test/'

資料庫和備用資料庫的資料檔案轉換目錄對映

log_file_name_convert

'/oradata/test/', '/oradata/test/'

指明主資料庫和備用資料庫的log檔案轉換目錄對映

control_files

'/oradata/test/control01.ctl'

控制檔案指向最新的路徑

 

異地備庫 初始化引數修改

*.audit_file_dest='/oracle/app/admin/test/adump'

*.audit_trail='db'

*.compatible='11.2.0.4.0'

*.control_files='/oradata/test/control01.ctl'

*.db_block_size=8192

*.db_domain=''

*.db_file_name_convert='/oradata/test/','/oradata/test/'

*.db_name='test'

*.diagnostic_dest='/oracle/app'

*.dispatchers='(PROTOCOL=TCP)   (SERVICE=testXDB)'

*.log_archive_dest_1='location=/oradata/test/arch'

*.log_archive_dest_2='SERVICE=test ARCH ASYNC   VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=test'

*.log_archive_dest_state_2='ENABLE'

*.log_file_name_convert='/oradata/test/','/oradata/test/'

*.open_cursors=300

*.pga_aggregate_target=825229312

*.processes=150

*.remote_login_passwordfile='exclusive'

*.sga_target=2475687936

*.standby_file_management='AUTO'

*.undo_tablespace='UNDOTBS1'

 

複製檔案到備庫指定位置

將之前從生產庫/backup 指定檔案複製到指定路徑下面:

引數檔案: 複製到$ORACLE_HOME/dbs

控制檔案: 複製到/oradata/test 下面

tnsnames.ora: 複製到$ORACLE_HOME/network/admin/

密碼檔案:複製到$ORACLE_HOME/dbs

啟動資料庫

啟動備端資料庫到mount 狀態:

su – oracle

SQL>create spfile from pfile;

SQL>startup mount;

 

主庫開啟日誌傳輸

主庫啟用RFS

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_2=defer;

SQL>alter system set   log_archive_dest_state_2=enable;

SQL>alter system set   log_archive_dest_state_3=defer;

SQL>alter system set   log_archive_dest_state_3=enable;

 

檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2 or dest_id=3;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

備庫全量同步

主庫rman 全庫備份

su -   oracle

$ rman   target /

RMAN>   backup database format '/backup/fulldb_test_%U.bak';

 

將主庫/backup/ 中的fulldb_test* 檔案複製到備庫伺服器/backup

 

備庫全量還原

$ rman target /

RMAN>catalog backuppiece   '/backup/fulldb_test_09sbfbg8_1_1.bak';

RMAN>catalog backuppiece   '/backup/fulldb_test_0asbfbhl_1_1.bak';

RMAN>restore database;

 

備庫增量同步

備庫開啟MRP 程式,進行增量同步

su - oracle

sqlplus "/ as sysdba"

SQL>alter database recover managed   standby database disconnect from session 或者

SQL> alter database recover   managed standby database using  current logfile  disconnect from   session;

 

 

備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 


 

本地備庫切換成主庫

本地備庫強制切換成主庫

在異常情況下,主庫不可用,需要將本地備庫強制切換成主庫

su - oracle

$ sqlplus "/ as sysdba"

SQL> recover managed standby database   cancel;

SQL> recover managed standby database   finish;

SQL> select   name,open_mode,database_role,switchover_status from v$database;

SQL> alter database commit to   switchover to primary;

SQL> shutdown immediate;

SQL> startup;

 

機主庫與C 機備庫資料同步

B 機主庫啟用RFS ,進行日誌傳輸

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_2=defer;

SQL>alter system set   log_archive_dest_state_2=enable;

 

B 機主庫檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

C 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

C 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

 

機主庫與A 機備庫資料同步

A 機修復後,繼續以下操作。

B 機主庫啟用RFS ,進行日誌傳輸

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_3=defer;

SQL>alter system set   log_archive_dest_state_3=enable;

 

B 機主庫檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

A 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

A 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

 

機主庫與A 機備庫進行主備切換

B 機主庫切換成physical standby 角色

su - oracle

sqlplus "/ as sysdba"

SQL> select   name,open_mode,database_role,switchover_status from v$database;

SQL> alter database commit to   switchover to physical standby;

SQL> shutdown immediate;

SQL> startup mount;

SQL> recover managed standby database   disconnect from session;

 

A 機備庫切換成primary 角色

su - oracle

sqlplus "/ as sysdba"

SQL> select name,open_mode,database_role,switchover_status   from v$database;

SQL> alter database commit to   switchover to primary;

SQL> shutdown immediate;

SQL> startup;

 

此時 A 機是主庫, B 機是備庫

A 機主庫檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

B 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

B 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

 

機主庫與C 機備庫資料同步

A 機主庫啟用RFS ,進行日誌傳輸

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set log_archive_dest_state_3=defer;

SQL>alter system set   log_archive_dest_state_3=enable;

 

A 機主庫檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

C 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

C 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

 


 

異地備庫切換成主庫

異地備庫強制切換成主庫

在異常情況下,主庫、本地備庫均不可用,需要將異地備庫強制切換成主庫

su - oracle

$ sqlplus "/ as sysdba"

SQL> recover managed standby database   cancel;

SQL> recover managed standby database   finish;

SQL> select   name,open_mode,database_role,switchover_status from v$database;

SQL> alter database commit to   switchover to primary;

 

機主庫部署A 機及B 機資料同步

此過程可參照步驟二

 

機主庫與A 機備庫進行主備切換

C 機主庫切換成standby 角色

su - oracle

$ sqlplus "/ as sysdba"

SQL> select name,open_mode,database_role,switchover_status   from v$database;

SQL> alter database commit to   switchover to physical standby;

SQL> shutdown immediate;

SQL> startup mount;

SQL> recover managed standby database   disconnect from session;

 

A 機備庫切換成primary 角色

su - oracle

$ sqlplus "/ as sysdba"

SQL> recover managed standby database   cancel;

SQL> select   name,open_mode,database_role,switchover_status from v$database;

SQL> alter database commit to   switchover to primary;

SQL> shutdown immediate;

SQL> startup;

 

此時 A 機是主庫, C 機是備庫。

A 機主庫檢查日誌傳輸是否報錯:

su - oracle

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=3;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

C 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

C 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 

機主庫與B 機備庫資料同步

A 機主庫啟用RFS ,進行日誌傳輸

su - oracle

sqlplus "/ as sysdba"

SQL>alter system set   log_archive_dest_state_2=defer;

SQL>alter system set   log_archive_dest_state_2=enable;

 

A 機主庫檢查日誌傳輸是否報錯:

sqlplus "/ as sysdba"

SQL> select dest_name,status,error   from v$archive_dest where dest_id=2;

檢查是否存在報錯,如果有報錯,檢查報錯原因

 

B 機備庫確認日誌傳輸和應用是否正常

su - oracle

sqlplus "/ as sysdba"

SQL>select process,status from   v$managed_standby;

SQL>select thread#,max(sequence#) from   v$archived_log group by thread#;

SQL>select thread#,max(sequence#) from   v$archived_log where applied='YES' group by thread#;

 

B 機備庫檢查alert 日誌輸出是否正常

$ tail -f   /oracle/app/diag/rdbms/test/test/trace/alert_test.log

 


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/23732248/viewspace-2770905/,如需轉載,請註明出處,否則將追究法律責任。

相關文章