9. Oracle DataGuard的介紹


一. Oracle DataGuard簡介

  Oracle DataGuard;簡稱DG。是由一個Primary Database(主庫)和一個或者多個Standby Database(備庫)組成。對Oracle來說;本身不能提高性能。通過數據冗余來保護數據。由Primary Database對外提供服務;用戶操作在Primary Database上操作;其操作的數據庫Redo Log或者Archive log通過網絡傳輸到Standby Database。Standby Database在重做這些日志。從而實現Primary Database和Standby Database數據同步。

架構圖如下:

Oracle DataGuard中的Standby庫有兩種:物理Standby和邏輯Standby。

  • 邏輯Standby接收后將其轉換成SQL語句,在Standby數據庫上執行SQL語句實現同步,這種方式叫SQL Apply。
  • 物理Standby接收完Primary數據庫生成的REDO數據后,以介質恢復的方式實現同步,這種方式也叫Redo Apply。

二. Oracle DataGuard搭建

  安裝規划:

IP ROLE
192.168.1.235 Primary
192.168.1.221 Standby

2.1. 主庫設置歸檔模式

alter database archivelog;

2.2. 主庫設置Force Logging模式

alter database force logging;

2.3. 備庫創建相應的dump文件夾

# 在主庫查詢對應的dump目錄
select name, value
  from v$parameter
 where name in ('audit_file_dest',
                'background_dump_dest',
                'control_files',
                'core_dump_dest',
                'user_dump_dest',
                'db_recovery_file_dest'
                               )
 ORDER BY name ASC;
# 備庫用oracle用戶執行創建目錄
mkdir -p $value

2.4. 配置Standby Redologs

  對於模式中最大保護和最高可用性;采用是 LGWR 模式傳送 Redo 日志;需要為 Standby庫配置 Standby Redologs。Standby Redologs 和 ONline Redologs 文件大小是相同的。比 ONline Redologs 個數要 +1 。

# 查看redologs日志信息
SQL> select group#,type,member from v$logfile;

GROUP# TYPE   MEMBER
------ ---------- --------------------------------------------------
     1 ONLINE   /u01/app/oradata/ora235/redo01.log
     2 ONLINE   /u01/app/oradata/ora235/redo02.log
     3 ONLINE   /u01/app/oradata/ora235/redo03.log

SQL> select group#,bytes from v$log;

GROUP#     BYTES
------ ----------
     1  52428800
     2  52428800
     3  52428800
# 添加Standby Redologs;添加如下:
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4('/u01/app/oradata/ora235/stdred001.log') SIZE 50 M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5('/u01/app/oradata/ora235/stdred002.log') SIZE 50 M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6('/u01/app/oradata/ora235/stdred003.log') SIZE 50 M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 7('/u01/app/oradata/ora235/stdred004.log') SIZE 50 M;

2.5. 創建實例密鑰文件

  • 主庫生成密鑰文件
orapwd FILE=/u01/app/oracle/dbs/orapwora235 password=li0924 entries=5;
  • 將密鑰文件傳輸到備庫
scp /u01/app/oracle/dbs/orapwora235 oracle@192.168.1.221:/u01/app/oracle/dbs

2.6. 創建參數文件

  本文采用 Primary 庫和 Standby 庫采用相同路徑;所以僅設置必要的參數。

  • 主庫通過spfile生成pfile文件
create pfile from spfile;
  • 添加Primary端的pfile內容如下
*.DB_UNIQUE_NAME=db_primary
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(db_primary,db_standby)'
*.LOG_ARCHIVE_DEST_2='SERVICE=tns_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_standby'
*.LOG_ARCHIVE_DEST_STATE_2=DEFER
*.LOG_FILE_NAME_CONVERT ='/u01/app/oradata/ora235/','/u01/app/oradata/ora235/'
*.FAL_SERVER=tns_standby
*.FAL_CLIENT=tns_primary
*.STANDBY_FILE_MANAGEMENT=AUTO
  • Primary重新啟動
primary>create spfile from pfile;

File created.

primary>startup
ORACLE instance started.

Total System Global Area  780824576 bytes
Fixed Size      2257312 bytes
Variable Size    511708768 bytes
Database Buffers   264241152 bytes
Redo Buffers      2617344 bytes
Database mounted.
Database opened.
  • 復制參數文件到Standby庫
scp /u01/app/oracle/dbs/initora235.ora oracle@192.168.1.221:/u01/app/oracle/dbs
  • 添加Standby端的pfile內容如下
*.DB_UNIQUE_NAME=db_standby
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(db_primary,db_standby)'
*.LOG_ARCHIVE_DEST_2='SERVICE=tns_primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_primary'
*.LOG_FILE_NAME_CONVERT ='/u01/app/oradata/ora235/','/u01/app/oradata/ora235/'
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
*.FAL_SERVER=tns_primary
*.FAL_CLIENT=tns_standby
*.STANDBY_FILE_MANAGEMENT=AUTO
  • 將Standby端啟動到nomount狀態
[oracle@oracle221 ~]$ sqlplus / as sysdba

SQL*Plus: Release 11.2.0.4.0 Production on Thu Aug 9 22:56:49 2018

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

Connected to an idle instance.

SQL> startup nomount;
ORACLE instance started.

Total System Global Area  780824576 bytes
Fixed Size      2257312 bytes
Variable Size    511708768 bytes
Database Buffers   264241152 bytes
Redo Buffers      2617344 bytes

2.7 配置主備庫的監聽文件和網絡文件

  • 設置Primary庫和Standby庫的service_name
SQL> show parameter service_name;

NAME         TYPE  VALUE
------------------------------------ ----------- ---------------
service_names        string  lottu
SQL> alter system set service_names='db_primary' scope=both;

System altered.

SQL> show parameter service_name;

NAME         TYPE  VALUE
------------------------------------ ----------- ----------------
service_names        string  db_primary
  • 備庫的service_name設置為db_standby;需要到參數文件修改。
*.service_names='db_standby'
  • Primary庫配置listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.235)(PORT = 1521)(IP = FIRST)))
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
       )
     )
  )

SID_LIST_LISTENER =
  (SID_LIST =
   (SID_DESC =
     (SID_NAME = ora235)
     (GLOBAL_DBNAME = db_primary)
     (ORACLE_HOME =/u01/app/oracle)
   )
  )
  • Standby庫配置listener.ora
LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
       (ADDRESS_LIST =(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.221)(PORT = 1521)(IP = FIRST)))
       (ADDRESS_LIST =
         (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC))
       )
     )
  )

SID_LIST_LISTENER =
  (SID_LIST =
   (SID_DESC =
     (SID_NAME = ora235)
     (GLOBAL_DBNAME = db_standby)
     (ORACLE_HOME =/u01/app/oracle)
   )
  )
  • Primary庫和Standby庫設置tnsname.ora
tns_primary=
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.235)(PORT = 1521))
      (CONNECT_DATA =
  (SERVICE_NAME = db_primary)
      )
     (HS = OK)
  )
  
tns_standby=
  (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.221)(PORT = 1521))
    (CONNECT_DATA =
    (SERVICE_NAME = db_standby)
    )
 (HS = OK)
  ) 

  重啟監聽lsnrctl restart

2.8. 克隆Standby庫

在Primary庫執行

[oracle@oracle235 admin]$ rman target sys/li0924@tns_primary auxiliary sys/li0924@tns_standby

Recovery Manager: Release 11.2.0.4.0 - Production on Thu Aug 9 23:56:46 2018

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORA235 (DBID=2047494122)
connected to auxiliary database: ORA235 (not mounted)

RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER NOFILENAMECHECK;

Starting Duplicate Db at 09-AUG-18
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=20 device type=DISK

contents of Memory Script:
{
   backup as copy reuse
   targetfile  '/u01/app/oracle/dbs/orapwora235' auxiliary format 
 '/u01/app/oracle/dbs/orapwora235'   ;
}
executing Memory Script

Starting backup at 09-AUG-18
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=26 device type=DISK
Finished backup at 09-AUG-18

contents of Memory Script:
{
   backup as copy current controlfile for standby auxiliary format  '/u01/app/oradata/ora235/control01.ctl';
   restore clone controlfile to  '/u01/app/oradata/ora235/control02.ctl' from 
 '/u01/app/oradata/ora235/control01.ctl';
}
executing Memory Script

Starting backup at 09-AUG-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
copying standby control file
output file name=/u01/app/oracle/dbs/snapcf_ora235.f tag=TAG20180809T235658 RECID=4 STAMP=983750219
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 09-AUG-18

Starting restore at 09-AUG-18
using channel ORA_AUX_DISK_1

channel ORA_AUX_DISK_1: copied control file copy
Finished restore at 09-AUG-18

contents of Memory Script:
{
   sql clone 'alter database mount standby database';
}
executing Memory Script

sql statement: alter database mount standby database

contents of Memory Script:
{
   set newname for tempfile  1 to 
 "/u01/app/oradata/ora235/temp01.dbf";
   switch clone tempfile all;
   set newname for datafile  1 to 
 "/u01/app/oradata/ora235/system01.dbf";
   set newname for datafile  2 to 
 "/u01/app/oradata/ora235/sysaux01.dbf";
   set newname for datafile  3 to 
 "/u01/app/oradata/ora235/undotbs01.dbf";
   set newname for datafile  4 to 
 "/u01/app/oradata/ora235/users01.dbf";
   set newname for datafile  5 to 
 "/data/oracle/data/lottu01.dbf";
   backup as copy reuse
   datafile  1 auxiliary format 
 "/u01/app/oradata/ora235/system01.dbf"   datafile 
 2 auxiliary format 
 "/u01/app/oradata/ora235/sysaux01.dbf"   datafile 
 3 auxiliary format 
 "/u01/app/oradata/ora235/undotbs01.dbf"   datafile 
 4 auxiliary format 
 "/u01/app/oradata/ora235/users01.dbf"   datafile 
 5 auxiliary format 
 "/data/oracle/data/lottu01.dbf"   ;
   sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oradata/ora235/temp01.dbf in control file

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting backup at 09-AUG-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting datafile copy
input datafile file number=00005 name=/data/oracle/data/lottu01.dbf
output file name=/data/oracle/data/lottu01.dbf tag=TAG20180809T235706
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:01:45
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/u01/app/oradata/ora235/system01.dbf
output file name=/u01/app/oradata/ora235/system01.dbf tag=TAG20180809T235706
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting datafile copy
input datafile file number=00002 name=/u01/app/oradata/ora235/sysaux01.dbf
output file name=/u01/app/oradata/ora235/sysaux01.dbf tag=TAG20180809T235706
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:35
channel ORA_DISK_1: starting datafile copy
input datafile file number=00003 name=/u01/app/oradata/ora235/undotbs01.dbf
output file name=/u01/app/oradata/ora235/undotbs01.dbf tag=TAG20180809T235706
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:25
channel ORA_DISK_1: starting datafile copy
input datafile file number=00004 name=/u01/app/oradata/ora235/users01.dbf
output file name=/u01/app/oradata/ora235/users01.dbf tag=TAG20180809T235706
channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
Finished backup at 10-AUG-18

sql statement: alter system archive log current

contents of Memory Script:
{
   backup as copy reuse
   archivelog like  "/data/arch/1_3_983660602.dbf" auxiliary format 
 "/data/arch/1_3_983660602.dbf"   ;
   catalog clone archivelog  "/data/arch/1_3_983660602.dbf";
   switch clone datafile all;
}
executing Memory Script

Starting backup at 10-AUG-18
using channel ORA_DISK_1
channel ORA_DISK_1: starting archived log copy
input archived log thread=1 sequence=3 RECID=19 STAMP=983750428
output file name=/data/arch/1_3_983660602.dbf RECID=0 STAMP=0
channel ORA_DISK_1: archived log copy complete, elapsed time: 00:00:01
Finished backup at 10-AUG-18

cataloged archived log
archived log file name=/data/arch/1_3_983660602.dbf RECID=1 STAMP=983750429

datafile 1 switched to datafile copy
input datafile copy RECID=4 STAMP=983750429 file name=/u01/app/oradata/ora235/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=5 STAMP=983750429 file name=/u01/app/oradata/ora235/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=6 STAMP=983750429 file name=/u01/app/oradata/ora235/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=7 STAMP=983750429 file name=/u01/app/oradata/ora235/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=8 STAMP=983750429 file name=/data/oracle/data/lottu01.dbf

contents of Memory Script:
{
   set until scn  955597;
   recover
   standby
   clone database
    delete archivelog
   ;
}
executing Memory Script

executing command: SET until clause

Starting recover at 10-AUG-18
using channel ORA_AUX_DISK_1

starting media recovery

archived log for thread 1 with sequence 3 is already on disk as file /data/arch/1_3_983660602.dbf
archived log file name=/data/arch/1_3_983660602.dbf thread=1 sequence=3
media recovery complete, elapsed time: 00:00:00
Finished recover at 10-AUG-18
Finished Duplicate Db at 10-AUG-18

2.9. 啟用日志傳送

在 Primary 端啟動日志傳送

alter system set LOG_ARCHIVE_DEST_STATE_2=ENABLE;

2.10. 啟用實時應用redo

  在 Primary Database 產生的 Redo 日志;傳送到 Standby Database;是通過 LGWR 或者 ARCH 進程完成。這個很好理解。默認情況下是由 ARCH 進程。有參數 *.LOG_ARCHIVE_DEST_2 控制的使用 ARCH 進程; Primary Database 和 Standby Database 存在數據延遲。若 Primary Database 出現異常;容易造成部分數據丟失。為了避免數據丟失,必須要使用 LGWR 進程,需要用到 Standby Redolog。而LGWR 又分SYNC(同步)和ASYNC(異步)兩種方式。

  • SYNC方式:對網絡要求比較高;必須等待寫入本地日志文件操作和通過LNSn進程的網絡傳送都成功,Primary Database 上的事務才能提交成功。使用LGWR SYNC方式時,可以同時使用NET_TIMEOUT參數,這個參數單位是秒,代表如果多長時間內網絡發送沒有響應,LGWR 進程會拋出錯誤。因此對 Primary Database 性能有影響。
*.LOG_ARCHIVE_DEST_2='SERVICE=tns_standby LGWR SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_standby NET_TIMEOUT = 30'
  • ASYNC方式:采用異步方式;Primary Database 上的事務提交跟日志是否已經傳送沒有影響。
*.LOG_ARCHIVE_DEST_2='SERVICE=tns_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_standby'

1. 在 Primary Database上執行;

alter system set log_archive_dest_2='SERVICE=tns_standby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_standby' scope=both;

2. 在Standby Database上執行;

alter system set log_archive_dest_2='SERVICE=tns_primary LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=db_primary' scope=both;

3. Standby Database啟動實時應用redo

alter database recover managed standby database using current logfile ;

4. 驗證結果

# 在Primary Database 上創建表t_lottu02
SQL> set SQLPROMPT Primary>
Primary>conn lottu/li0924
Connected.
Primary>create table t_lottu02 as select level id,'lottu' name from dual connect by level <= 3;

Table created.

# 在Standby Database上查看
SQL> set SQLPROMPT StandBy>
StandBy>conn lottu/li0924
Connected.
StandBy>select * from t_lottu02;

 ID NAME
---------- -----
  1 lottu
  2 lottu
  3 lottu


免責聲明!

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



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