Oracle DataGuard 物理Standby 搭建(上)

物理standby database 環境搭建html

Arch asysncweb

Oracle Dataguard數據庫

hostsession

IPoracle

Oracle_sidapp

DB_unique_name性能

FAL_serverui

FAL_clientthis

primaryspa

192.168.126.136

dgtest

dg_pd

dg_st

dg_pd

standy

192.168.126.128

dgtest

dg_st

dg_pd

dg_st

 

一. Primary 端的配置

 

1.  主庫設置爲force logging 模式

SQL> alter database force logging;

 

2. 主庫設爲歸檔模式

SQL> archive log list; 

SQL> shutdown immediate 

SQL> startup mount 

SQL> alter database archivelog; 

SQL> archive log list; 

   

3. 建立備庫的密碼文件和控制文件

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

-- 說明: 判斷一個數據庫是Primary仍是Standby,就是經過控制文件來判斷的。

[oracle@localhostdbs]$ orapwd file=/u01/orapwDG password=ank88ank

若是已經存在,就不用建立了。 缺省狀況下,win下口令文件的格式是pwdsid.oraunix下的格式是orapwSID(大小寫敏感)

 

4.  修改初始化參數文件

*.DB_UNIQUE_NAME='dg_pd' 

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg_pd,dg_st)'

*.log_archive_dest_1='location=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg_pd' 

*.LOG_ARCHIVE_DEST_2='SERVICE=dg_st ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg_st '

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE 

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE 

*.standby_file_management='AUTO'

*.FAL_SERVER='dg_st' 

*.FAL_CLIENT='dg_pd'     

   

若是主庫和備庫的數據文件位置不一樣,還須要加以下2個參數:

*.log_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/dgtest/'

*.db_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/dgtest/'

  

-- 注意:orcl_st,orcl_pd 是在tnsnames文件中配置的

用'/u01/pri.ora' 這個pfile 啓動數據庫,並生成spfile

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup pfile='/u01/pri.ora';

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

Database opened.

SQL> create spfile from pfile='/u01/pri.ora';

File created.

 

6. 修改listener.ora tnsnames.ora 文件

 Listener.ora 文件: 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (SID_NAME = PLSExtProc)

      (ORACLE_HOME =/u01/app/oracle/product/10.2.0/db)

      (PROGRAM = extproc)

    )

(SID_DESC =

(GLOBAL_DBNAME = dg)

(ORACLE_HOME = /u01/app/oracle/product/10.2.0/db)

        (SID_NAME = dgtest)  

    )

  )

 

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION =

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

      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))

    )

  )

 

 

注意:SID_LIST_LISTENER 配置的是靜態註冊,若是沒有該參數,並且Data Guard 啓動順序又不正確,那麼在主庫可能會報 PING[ARC1]: Heartbeat failed to connect to standby 'orcl_st'. Error is 12514. 錯誤,致使歸檔沒法完成。

 

Oracle Listener 動態註冊 與 靜態註冊

http://blog.csdn.net/tianlesoftware/archive/2010/04/30/5543166.aspx

 

Tnsnames.ora 文件

DG_ST =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

(SERVER = DEDICATED)

      (SERVICE_NAME = dg)

    )

  ) 

DG_PD =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

          (SERVER = DEDICATED)

      (SERVICE_NAME = dg)

    )

  )

 

二. Standby 端配置

 1. 建立備庫存放數據文件和後臺跟蹤目錄, 這個目錄能夠和主庫相同, 若是不一樣,就須要在主庫的初始化文件中進行轉換。 

如:

*.log_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/orcl/'

*.db_file_name_convert='/u02/oradata/dgtest/','/u03/oradata/orcl/'

 

--建相目錄

mkdir -p $ORACLE_BASE/oradata/dgtest

mkdir $ORACLE_BASE/admin/dgtest

mkdir -p $ORACLE_BASE/admin/dgtest/adump 

mkdir $ORACLE_BASE/admin/dgtest/bdump 

mkdir $ORACLE_BASE/admin/dgtest/cdump 

mkdir $ORACLE_BASE/admin/dgtest/dpdump 

mkdir $ORACLE_BASE/admin/dgtest/pfile 

mkdir $ORACLE_BASE/admin/dgtest/udump 

mkdir $ORACLE_BASE/admin/dgtest

 

2. 將主庫的密碼文件,控制文件,數據文件,參數文件,日誌文件copy到備庫。 

說明一點,這個控制文件是咱們本身建立的standby 控制文件。將copy過來的控制文件再複製三份就能夠了。  主備的控制文件是不同的。  這裏除了採用直接copy 文件以外,還能夠採用Rman 恢復來作。 直接copy 須要停數據庫,若是採用RMAN 的話,就不須要停機了。 

 

--數據文件,redo文件

scp *.dbf 192.168.32.144:/u01/app/oracle/oradata/dgtest

scp *.log 192.168.32.144:/u01/app/oracle/oradata/dgtest

--密碼文件,參數文件

scp pri.ora 192.168.32.144:/u01

scp orapwdgtest 192.168.32.144:/u01/app/oracle/product/10.2.0/db/dbs

--listener tnsnames

scp listener.ora 192.168.32.144:/u01/app/oracle/product/10.2.0/db/network/admin

scp tnsnames.ora 192.168.32.144:/u01/app/oracle/product/10.2.0/db/network/admin

--standby 控制文件

scp *.ctl 192.168.32.144:/u01/app/oracle/oradata/dgtest/

cp control01.ctl control02.ctl 

cp control01.ctl  control03.ctl

 

3. 修改初始化參數文件

*.DB_UNIQUE_NAME='dg_st' 

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(dg_pd,dg_st)'

*.log_archive_dest_1='location=/u01/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dg_st' 

*.LOG_ARCHIVE_DEST_2='SERVICE=dg_pd ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dg_pd'

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE 

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE 

*.standby_file_management='AUTO'

*.FAL_SERVER='dg_pd

*.FAL_CLIENT='dg_sd'  

--

保存爲std.ora

4. 修改listener.ora 和 tnsnames.ora 文件,若是不存在,就從主庫上copy 過去。

  

至此,Data Guard 的操做已經完成,下面來開始驗證。

補充:

啓動備庫

SQL>startup nomount pfile='/u01/std.ora'

SQL>create spfile from pfile='/u01/std.ora'

 

 

------------------------------------環境 End-----------------------------------

-----------start------------

--注意Data Guard 啓動順序:

啓動順序:先standby ,primary;
關閉順序:先primary standby;

 

在備庫將實例啓動到mount 狀態:

SQL> startup nomount;  

SQL>alter database mount standby database ; 

SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; 

SQL>alter database recover managed standby database disconnect from session; 

 

在備庫啓動監聽:

$lsnrctl start

 

在主庫啓動實例:

SQL> startup;

 

在主庫啓動監聽:

$lsnrctl start

  

--------------------DataGuard Acitve OK------------

Now

Primary:open

Standby:mount

 

--Standby只讀模式打開

--中止redo應用

SQL>alter database recover managed standby database cancel

SQL>alter database open;

SQL>select open_mode from v$database;

OPEN_MODE

----------

READ ONLY

--Standby從新回到redo apply狀態

SQL>shutdown immediate

SQL>startup nomount  

SQL>alter database mount standby database disconnect

SQL>alter database recover managed standby database disconnect 

 

 

--驗證是否傳輸到了Standby database

--Primary database

SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIM NEXT_TIME

         7 23-FEB-11 23-FEB-11

         7 23-FEB-11 23-FEB-11

         8 23-FEB-11 23-FEB-11

         8 23-FEB-11 23-FEB-11

         9 23-FEB-11 23-FEB-11

         9 23-FEB-11 23-FEB-11

 

SQL> alter system switch logfile;

System altered.

 

--Standby database

SQL>SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# FIRST_TIM NEXT_TIME

---------- --------- ---------

         7 23-FEB-11 23-FEB-11

         8 23-FEB-11 23-FEB-11

         9 23-FEB-11 23-FEB-11

        10 23-FEB-11 23-FEB-11

 

--驗證Standby redo 是否應用

SQL>SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

 SEQUENCE# APP

---------- ---

         3 YES

         4 YES

         5 YES

         6 YES

         7 YES

         8 YES

         9 YES

        10 YES

8 rows selected.

 

 

 

 

--若是出錯

在主庫驗證歸檔目錄是否有效:

SQL> SELECT STATUS,DESTINATION, ERROR FROM V$ARCHIVE_DEST;

若是有錯誤,要排查緣由。

SQL>  SELECT STATUS ,ERROR FROM V$ARCHIVE_DEST;

STATUS    ERROR

--------- -----------------------------------------------------------------

VALID

VALID

INACTIVE

INACTIVE

INACTIVE

INACTIVE

INACTIVE

INACTIVE

INACTIVE

INACTIVE

注意:若是在主庫執行 alter database clear unarchived logfilealter database open resetlogs , dataguard要重建

 

 

補充: 

--監控日誌應用服務

SQL>select database_role,db_unique_name,open_mode,protection_mode,protection_level,switchover_status from v$database;

 

--設置新的數據保護模式並重啓數據庫  

當保護模式更改順序:

maximize protection --->  maximize availability ----> maximize performance

當在把dataguard的保護級別按這上面的順序減低的時候, 不須要primary庫在mount狀態,不然primary 必須在mount 狀態。 

如:
SQL>  alter database set standby database to maximize availability;

 alter database set standby database to maximize availability

*

ERROR at line 1:

ORA-01126: database must be mounted in this instance and not open in any

instance

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> alter database open;

alter database open

*

ERROR at line 1:

ORA-03113: end-of-file on communication channel

報錯了,這是由於最大可用性須要先修改日誌傳送方式爲lgwr同步方式,不然,數據庫是沒法open.

SQL> alter system set log_archive_dest_2='service=orcl_st lgwr sync AFFIRM';

System altered.

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> startup mount;

ORACLE instance started.

Total System Global Area  167772160 bytes

Fixed Size                  1218316 bytes

Variable Size              79694068 bytes

Database Buffers           83886080 bytes

Redo Buffers                2973696 bytes

Database mounted.

SQL> alter database set standby database to maximize availability;

Database altered.

SQL> alter database open;

Database altered.

SQL> select protection_mode,protection_level from v$database;

PROTECTION_MODE      PROTECTION_LEVEL

--------------------          --------------------

MAXIMUM AVAILABILITY MAXIMUM AVAILABILITY

alter database set standby database to maximize performance;

提示:maximize後可跟{PROTECTION | AVAILABILITY | PERFORMANCE},分別對應最大保護,最高可用性及最高性能。

 

在最大保護模式下,直接關閉備庫是不行的,若是在備庫上關閉數據庫,會有以下提示:
SQL> shutdown immediate
ORA-01154: database busy. Open, close, mount, and dismount not allowed now
SQL>
在最大保護模式下,備庫是不容許關閉的,此時首先關閉主庫,而後備庫就能夠順利關閉了

注意: 主庫的保護模式修改以後,備庫的模式也會改變,和主庫保持一致。 

 

 

3. 查看日誌歸檔狀況

主庫進行日誌切換

SQL>Alter system switch logfile; 

select max(sequence#) from v$archived_log; 

select max(sequence#) from v$log_history; 

select group#,sequence#,archived,status from v$log; 

select name,sequence#,applied from v$archived_log; 

select sequence#,applied from v$archived_log; 

 

若不一樣步, 

1>log日誌, archive是否有丟失 

2>能夠在備庫坐以下操做: 

--中止redo apply

alter database recover managed standby database cancel; 

--開始redo apply

alter database recover managed standby database disconnect from session; 

相關文章
相關標籤/搜索