1. 程式人生 > >Oracle之DataGurd(DG)環境搭建

Oracle之DataGurd(DG)環境搭建

DataGurd(DG)這個是什麼就無需在這裡費周張了,自行百度。公司會經常用的哦。

配置最大效能模式DG:
最大效能模式:
1、預設模式,提供主庫的最高可用效能
2、保證主庫在執行之中不會受到從庫的干擾
優點:避免從庫對主庫的影響
缺點:不能保證資料不丟失(通過歸檔的方式,一直查一個arch,如果主庫徹底沒了,那麼redo中的資料會丟失),最低的情況,丟失一個redo組

步驟如下

1.前期規劃
2.配置網路監聽
3.修改引數檔案
4.rman duplicate 複製資料庫
5.啟動除錯資料庫
6.測試

1.規劃

主庫(1.1.1.11):
db_name orcl
db_unique_name orcl_pd
service_name orcl
instance_name orcl
本地歸檔路徑 /home/oracle/orcl_arclog
tnsnames to_sd --配置去備庫的tns


備庫(1.1.1.10):
db_name orcl  資料庫名要一樣
db_unique_name orcl_sd 在一個dg環境裡面,每一個成員的名字。
servicer_name vicdb 
instance_name vicdb  例項名可以不一樣
本地歸檔路徑 /home/oracle/vicdb_arclog
tnsnames to_pd --配置去主庫的tns

2.配置網路監聽

基礎配置,配置兩邊的oracle net,保證兩邊能互通(需要使用靜態註冊),這步不過下面的基本沒戲。
位置:/oracle/app/db/network/admin。

主庫上的listener配置

cat listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME =orcl)
      (ORACLE_HOME = /oracle/app/db)
      (SID_NAME = orcl)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.11)(PORT = 1521))
  )

ADR_BASE_LISTENER = /oracle/app

從庫上的listener配置
cat listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = vicdb)
      (ORACLE_HOME = /oracle/app/db)
      (SID_NAME = vicdb)
    )
  )

LISTENER =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.10)(PORT = 1521))
  )

ADR_BASE_LISTENER = /oracle/app

兩邊使用相同的tnsnames.ora
cat tnsnames.ora
to_sd =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.10)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = vicdb)
    )
  )

to_pd =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 1.1.1.11)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )


3.修改引數檔案

在主庫上的配置(必須在歸檔模式)

建立目錄

mkdir /home/oracle/orcl_arclog

配置force logging
alter database force logging;

SQL> select FORCE_LOGGING from v$database;

FORCE_
------
YES

新增引數
樣板需要替換

db_unique_name='主庫唯一名'
log_archive_config='dg_config=(主庫唯一名,從庫唯一名)'
log_archive_dest_1='location=本地歸檔路徑 VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=主庫唯一名' --就是說不管你是主庫還是備庫,都把你的online放到“本地歸檔路徑”裡面去
log_archive_dest_2='service=去從庫的TNS valid_for=(online_logfiles,primary_role) db_unique_name=從庫唯一名' --當角色是主庫的時候,使用"去從庫的tns“傳送online_redolog
log_archive_dest_state_1=enable
log_archive_dest_state_2=enable
standby_file_management='auto'
SQL> create pfile from spfile;

vi initorcl.ora
*.audit_file_dest='/oracle/app/admin/vicdb/adump'
*.audit_trail='db'
*.compatible='11.2.0.0.0'
*.control_files='/oracle/app/oradata/vicdb/control01.ctl','/oracle/app/flash_recovery_area/vicdb/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='orcl'
*.db_recovery_file_dest='/oracle/app/flash_recovery_area'
*.db_recovery_file_dest_size=4039114752
*.diagnostic_dest='/oracle/app'
*.memory_target=0
*.open_cursors=300
*.pga_aggregate_target=10485760
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=532676608
*.undo_tablespace='UNDOTBS1'
db_unique_name='orcl_pd'  
log_archive_config='dg_config=(orcl_pd,orcl_sd)'
log_archive_dest_1='location=/home/oracle/orcl_arclog VALID_FOR=(ONLINE_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl_pd'  
log_archive_dest_2='service=to_sd valid_for=(online_logfiles,primary_role) db_unique_name=orcl_sd'
log_archive_dest_state_1=enable
log_archive_dest_state_2=enable
standby_file_management='auto'
重啟據庫然後使用pfile啟動;
也可以如下
SQL> CREATE SPFILE FROM PFILE;
SQL> STARTUP OPEN;

從庫上的配置如下:
新增如下引數,需要替換
db_name='需要同主庫一樣'
db_unique_name='從庫唯一名'
log_archive_config='dg_config=(主庫唯一名,從庫唯一名)'
log_archive_dest_1='location=本地歸檔路徑 valid_for=(all_logfiles,all_roles) db_unique_name=從庫唯一名' ## 這裡的這個all_logfiles主要是為後面最大可用模式做準備
log_archive_dest_state_1=enable
standby_file_management='auto'
log_file_name_convert='主庫中日誌檔案的路徑','從庫上日誌檔案的路徑(自己定義)' ## 這個是用在rman複製時需要的,設定了這個就不需要做set new..
db_file_name_convert='主庫中資料檔案的路徑','從庫上資料檔案的路徑(自己定義)'

啟動到nomount狀態
vi initvicdb.ora

db_name='orcl'
db_unique_name='orcl_sd'
log_archive_config='dg_config=(orcl_pd,orcl_sd)'
log_archive_dest_1='location=/home/oracle/vicdb_arclog valid_for=(all_logfiles,all_roles) db_unique_name=orcl_sd' 
log_archive_dest_state_1=enable
standby_file_management='auto'
log_file_name_convert='/oracle/app/oradata/vicdb','/oradata/vicdb'
db_file_name_convert='/oracle/app/oradata/vicdb','/oradata/vicdb'

SQL> CREATE SPFILE FROM PFILE;
SQL> STARTUP nomount pfile='initvicdb.ora';
注意:由於主庫原來的名字是vicdb,修改名字之後未有修改資料檔案位置,故還是/oracle/app/oradata/vicdb

建立目錄
mkdir /home/oracle/vicdb_arclog
mkdir /oradata/vicdb

建立從庫密碼檔案
cd $ORACLE_HOME/dbs
orapwd file=orapwvicdb password=oracle force=y

4.rman duplicate 複製資料庫

使用新建立的引數檔案啟動主庫到open狀態,啟動從庫到nomount狀態(注意spfile的影響,可以mv掉對應的spfile)。

rman target sys/[email protected]_pd auxiliary sys/[email protected]_sd nocatalog
RMAN> duplicate target database for standby from active database; 一般預設引數
RMAN> duplicate target database for standby from active database nofilenamecheck; 如果從庫的資料庫的位置和主庫的位置一樣的話就要新增
                                                                                   nofilenamecheck檔名不檢查

看到這裡然後卡在這裡就可以在從機那裡看傳輸過來的檔案 記得開雙通道,多channel。

Starting backup at 30-JUL-15
using channel ORA_DISK_1
using channel ORA_DISK_2
channel ORA_DISK_1: starting datafile copy
input datafile file number=00001 name=/oradata/vicl/system01.dbf
channel ORA_DISK_2: starting datafile copy
input datafile file number=00002 name=/oradata/vicl/sysaux01.dbf
.
.
.
.
datafile 1 switched to datafile copy
input datafile copy RECID=3 STAMP=886440698 file name=/oradata/vicl/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=4 STAMP=886440698 file name=/oradata/vicl/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=5 STAMP=886440698 file name=/oradata/vicl/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=6 STAMP=886440698 file name=/oradata/vicl/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=7 STAMP=886440698 file name=/oradata/vicl/test_tspitr01.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=8 STAMP=886440698 file name=/oradata/vicl/vic01
datafile 7 switched to datafile copy
input datafile copy RECID=9 STAMP=886440698 file name=/oradata/vicl/vic02
datafile 8 switched to datafile copy
input datafile copy RECID=10 STAMP=886440698 file name=/oradata/vicl/test01.dbf
Finished Duplicate Db at 30-JUL-15
完成

問題
常見問題:
(1)如果使用的是非catalog,在rman 連線時,加上nocatalog關鍵字,否則可能會報TARGET> begin :fhdbi := dbms_rcvcat.getDbid; end;的錯誤
(2) 在執行duplicate的時候,如果源庫和目標庫目錄相同,那麼在duplicate 時,需要加上nofilenamecheck
否則報錯
auxiliary file name/u01/app/oracle/oradata/dg/sysaux01.dbf conflicts with a file used by
thetarget database
(3)如果從庫的引數檔案是從主庫cp的,特別要注意controlfiles這個引數指定的路徑是否正確
  (4) 主庫要在歸檔模式,否則報錯ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
(5) 如果報如下錯誤,注意log_file_name_convert,及db_file_name_convert引數是否正確

RMAN-03002: failure of Duplicate Db command at 07/03/2014 21:21:23
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 07/03/2014 21:21:23
ORA-17628: Oracle error 19505 returned by remote Oracle server
alter database open read only;

6.如果報錯
RMAN-03002: failure of Duplicate Db command at 08/13/2014 17:20:29
RMAN-03015: error occurred in stored script Memory Script
RMAN-03009: failure of sql command on clone_default channel at 08/13/2014 17:20:29
RMAN-11003: failure during parse/execution of SQL statement: alter database mount standby database
ORA-01103: database name 'PROD' in control file is not 'PROD_PD'

檢查備庫中的db_name是否和主庫一致

7、如果有多個目錄需要做對映可以使用
db_file_name_convert='/oracle/app/oradata/vicdb','/oradata/vicdb','/oradata/xxx','/oradata/vicdb'

8. 如報使用者祕密錯誤,檢查兩個資料庫的sys密碼是否一樣

5.啟動除錯資料庫

從庫現在已經是mount的狀態

SQL> alter database open;

檢視後臺程序

SQL> select process,client_process,sequence#,status from v$managed_standby ;

PROCESS            CLIENT_PROCESS    SEQUENCE# STATUS
------------------ ---------------- ---------- ------------------------
ARCH               ARCH                      0 CONNECTED
ARCH               ARCH                      0 CONNECTED
ARCH               ARCH                      0 CONNECTED
ARCH               ARCH                      0 CONNECTED

啟動用於同步的程序mrp

--啟動mrp服務
SQL> alter database recover managed standby database disconnect from session;

--如果想停止mrp服務使用
SQL> alter database recover managed standby database cancel;

再次檢查後臺服務
SQL> select process,client_process,sequence#,status from v$managed_standby;

PROCESS   CLIENT_P  SEQUENCE# STATUS
--------- -------- ---------- ------------
ARCH	  ARCH		    0 CONNECTED
ARCH	  ARCH		    0 CONNECTED
ARCH	  ARCH		    0 CONNECTED
ARCH	  ARCH		    0 CONNECTED
RFS	  LGWR		   27 IDLE
RFS	  UNKNOWN	    0 IDLE
RFS	  N/A		    0 IDLE
MRP0	  N/A		   27 WAIT_FOR_LOG

6.測試

主庫上

SQL> create table dg_test as select * from scott.emp;

Table created.

SQL> insert into dg_test select * from dg_test;

14 rows created.

SQL> commit;

Commit complete.

SQL> alter system switch logfile; 主庫寫盤才會觸發MRP程序

System altered.

SQL> 



從庫上
SQL>   select sequence#,applied from v$archived_log;

 SEQUENCE# APPLIED
---------- ------------------
         5 YES
         4 YES
         6 YES

SQL> select * from dg_test; 資料同步過來了