Linux Oracle 11g Dataguard配置詳細步驟

zhenghaishu發表於2015-04-17

一、tnsname.ora和listener.ora用法簡介
二、規劃
三、配置DataGuard
四、檢驗
五、參考文件

一、tnsname.oralistener.ora用法簡介

    tnsname.ora中的service name應該分為兩種,一種是網路服務名net service name,一種是例項服務名 instance service name,如下所示:

net_service_name =

  (DESCRIPTION =

     (ADDRESS_LIST =

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

     )

     (CONNECT_DATA =

        (SERVICE_NAME = instance_service_name)

     )

  )

 

    1

prime =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

這裡網路服務名是prime,例項服務名是pri

 

    tnsnames.ora中的地址(ADDRESS = (PROTOCOL = TCP)(HOST = dg1)(PORT = 1521))是監聽器監聽的地址。監聽器程式一直在這個地址上監聽,等待客戶端的連線。

    sqlplus客戶端或遠端客戶端(比如PL/SQL Developer)根據tnsname.ora中的SERVICE_NAME(例項服務名)和地址(ADDRESS = (PROTOCOL = TCP)(HOST =192.168.1.199)(PORT = 1521)),到這個地址去訪問監聽器。然後監聽器判斷lisnter.ora檔案中的GLOBAL_NAME是否和tnsname.ora檔案中的SERVICE_NAME(例項服務名)相等。如果相等,則建立客戶端到SID標識的服務端例項的連線。

    所以,tnsname.ora中的instance_service_name必須與listener.ora中的global_name必須完全一樣。

    2listener.ora應該包含下面的資訊

    (SID_DESC =

      (GLOBAL_DBNAME = pri)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

 

    username/passwd@service_name的形式訪問資料庫,此時service_nametnsname.ora中的網路服務名,而不是例項服務名。同理,遠端登入和tnsping都是用的網路服務名。簡而言之,網路服務名對外使用,例項服務名對內使用。

3$ sqlplus sys/oracle@prime as sysdba(正確)

      $ sqlplus sys/oracle@pri as sysdba(錯誤)

4$ tnsping prime(正確)

      $ tnsping pri(錯誤)

 


 

二、規劃

1 主庫安裝資料庫軟體並建立資料庫例項,備庫只安裝資料庫軟體。

不用安裝兩個虛擬機器,可等主庫裝完資料庫軟體後,克隆一個備庫虛擬機器。

 

2 資料庫基目錄$ORACLE_BASE=/u01/app/oracle/

  資料庫家目錄$ORACLE_HOME=/u01/app/oracle/product/11.2.0/db_1/

 

3 主備庫配置資訊

主庫

主機名:dg1

IP地址:192.168.1.199

oracle_siddb1

db_unique_name: pri

service_name: prime

global_name: pri

 

備庫

主機名:dg2

IP地址:192.168.1.200

oracle_siddb1

db_unique_name: std

service_name: stdby

global_name: std

 

注:service_nametnsname.ora中的網路服務名,global_nametnsname.ora中的例項服務名必須完全一樣。

 

4 在主庫和備庫中都執行

# vi /etc/hosts

192.168.1.199   dg1

192.168.1.200   dg2

 

在兩臺主機上分別執行

ping -c 5 dg1

ping -c 5 dg2

 

5 為方便操作,每臺主機各開兩個終端,一個執行SQL命令,一個執行系統命令。


 

三、配置DataGuard

1 在主機dg1中用dbca建立資料庫例項db1

建立過程中,EM不要選;選擇啟用歸檔日;快速閃回區不要選,但要在編輯日誌位置中填上路徑/u01/app/oracle/oradata/db1/archive

 

2 在主庫中用$ netmgr命令建立監聽和網路服務。

1

[oracle@dg1 ~]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin

[oracle@dg1 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = pri)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

  )

 

LISTENER =

  (DESCRIPTION =

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

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

[oracle@dg1 admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

PRIME =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

 

STDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = std)

    )

  )

 

2

在備庫中用netmgr建立監聽服務和網路服務

[oracle@dg2 ~]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin

[oracle@dg2 admin]$ cat listener.ora

# listener.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

# Generated by Oracle configuration tools.

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = std)

      (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

      (SID_NAME = db1)

    )

  )

 

LISTENER =

  (DESCRIPTION =

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

  )

 

ADR_BASE_LISTENER = /u01/app/oracle

 

[oracle@dg2 admin]$ cat tnsnames.ora

# tnsnames.ora Network Configuration File: /u01/app/oracle/product/11.2.0/db_1/network/admin/tnsnames.ora

# Generated by Oracle configuration tools.

 

PRIME =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = pri)

    )

  )

 

STDBY =

  (DESCRIPTION =

    (ADDRESS_LIST =

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

    )

    (CONNECT_DATA =

      (SERVICE_NAME = std)

    )

  )

 

3)在主庫和備庫中分別執行tnsping primetnsping stdby命令

[oracle@dg1 ~] tnsping prime

[oracle@dg1 ~] tnsping stdby

[oracle@dg2 ~] tnsping prime

[oracle@dg2 ~] tnsping stdby

ping不通,重啟監聽服務試試

 

3 配置主庫為歸檔模式

[oracle@dg1 ~]$ sqlplus / as sysdba

SQL> archive log list

資料庫日誌模式            存檔模式

自動存檔             啟用

存檔終點            /u01/app/oracle/oradata/archive

最早的聯機日誌序列     2

下一個存檔日誌序列   4

當前日誌序列           4

 

4 更改主庫為強制寫日誌

SQL> col force_logging format a15;

 

SQL> select force_logging from v$database;

FORCE_LOGGING

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

NO

 

SQL> alter database force logging;

資料庫已更改。

 

SQL> select force_logging from v$database;

FORCE_LOGGING

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

YES

 

5 主庫中建立initdb1.ora檔案

[oracle@dg1 admin]$ cd /u01/app/oracle/product/11.2.0/db_1/dbs/

[oracle@dg1 dbs]$ ls

hc_db1.dat  hc_DBUA0.dat  init.ora  lkDB1  orapwdb1  spfiledb1.ora

 

SQL> create pfile from spfile;

檔案已建立。

 

[oracle@dg1 dbs]$ ls

hc_db1.dat  hc_DBUA0.dat  initdb1.ora  init.ora  lkDB1  orapwdb1  spfiledb1.ora

 

6 編輯initdb1.ora中的引數

[oracle@dg1 dbs] $ vi initdb1.ora

1initdb1.ora中已有log_archive_dest_1,這個引數格式將有所改變,先註釋起來,下面會重新新增

2)在initdb1.ora下方新增如下引數

*.DB_UNIQUE_NAME=pri

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(pri,std)'  #(啟動db接受或傳送redo data,包括所有庫的db_unique_name

*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=pri'  #(主庫歸檔目的地)

*.LOG_ARCHIVE_DEST_2='SERVICE=stdby LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=std'  #(當該庫充當主庫角色時,設定物理備庫redo data的傳輸目的地)

*.LOG_ARCHIVE_MAX_PROCESSES=5    #(最大ARCn程式數)

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE    #允許redo傳輸服務傳輸資料到目的地

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE  #允許redo傳輸服務傳輸資料到目的地

*.FAL_SERVER=stdby  #(配置網路服務名,假如轉換為備庫角色時,從這裡獲取丟失的歸檔檔案)

*.FAL_CLIENT=prime   #(配置網路服務名,fal_server複製丟失的歸檔檔案到這裡)

#*.DB_FILE_NAME_CONVERT='/路徑','路徑'    (前為切換後的主庫路徑,後為切換後的備庫路徑,這裡主備庫目錄結構完全一樣,則無需設定)

#*.LOG_FILE_NAME_CONVERT='/路徑','/路徑'     # (同上,這兩個名字轉換引數是主備庫的路徑對映關係,可能會是路徑全名,看情況而定)

*.STANDBY_FILE_MANAGEMENT=AUTO  #auto後當主庫的datafiles增刪時備庫也同樣自動操作,且會把日誌傳送到備庫standby_archive_dest引數指定的目錄下,確保該目錄存在,如果你的儲存採用檔案系統沒有問題,但是如果採用了裸裝置,你就必須將該引數設定為manual

 

7 上一步中pfile的內容改變了,相應地要改變spfile的內容。方法是新建一個spfile

SQL> shutdown immediate

SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora'

SQL> create spfile from pfile;

 

8 在主庫上建立備庫需要的控制檔案

SQL> shutdown immediate

SQL> startup mount 

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

SQL> shutdown immediate

 

9 備份生產資料庫

1)在備庫中建立oradata目錄和admin目錄

[oracle@dg2 ~] $

cd /u01/app/oracle

mkdir oradata

mkdir admin

 

2)將主庫資料庫檔案複製到備庫機器上

 [oracle@dg1 dbs] $

scp -rp /u01/app/oracle/oradata/db1 dg2:/u01/app/oracle/oradata

[oracle@dg1 dbs]$

scp -rp /u01/app/oracle/admin/db1 dg2:/u01/app/oracle/admin

 

3)將主庫的密碼檔案和pfile檔案複製到備庫

[oracle@dg1 dbs] $

scp -rp /u01/app/oracle/product/11.2.0/db_1/dbs/orapwdb1 dg2:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwdb1

[oracle@dg1 dbs] $

scp -rp /u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora dg2:/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora

 

10 替換備庫的控制檔案

1)在備庫上刪掉資料庫所有的控制檔案

[oracle@dg2 oracle] $ rm -rf /u01/app/oracle/oradata/db1/control*.ctl

 

2)將主庫備份的控制檔案複製到備份機器上,並複製一個(要與pfile中的*.control_files引數一致)

[oracle@dg1 dbs] $

scp -rp /tmp/standby.ctl  dg2:/u01/app/oracle/oradata/db1/control01.ctl

[oracle@dg2 db1] $

cd /u01/app/oracle/oradata/db1/

cp control01.ctl  control02.ctl

 

11 修改備庫pfile

[oracle@dg2 ~] $

cd /u01/app/oracle/product/11.2.0/db_1/dbs

vi initdb1.ora

 

*.DB_UNIQUE_NAME=std

*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(pri,std)'  #(啟動db接受或傳送redo data,包括所有庫的db_unique_name

*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/oradata/archive VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=std'  #(主庫歸檔目的地)

*.LOG_ARCHIVE_DEST_2='SERVICE=prime LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=pri'  #(當該庫充當主庫角色時,設定物理備庫redo data的傳輸目的地)

*.LOG_ARCHIVE_MAX_PROCESSES=5    #(最大ARCn程式數)

*.LOG_ARCHIVE_DEST_STATE_1=ENABLE    #允許redo傳輸服務傳輸資料到目的地

*.LOG_ARCHIVE_DEST_STATE_2=ENABLE  #允許redo傳輸服務傳輸資料到目的地

*.FAL_SERVER=prime  #(配置網路服務名,假如轉換為備庫角色時,從這裡獲取丟失的歸檔檔案)

*.FAL_CLIENT=stdby  #(配置網路服務名,fal_server複製丟失的歸檔檔案到這裡)

#*.DB_FILE_NAME_CONVERT='/路徑','路徑'    (前為切換後的主庫路徑,後為切換後的備庫路徑,這裡主備庫目錄結構完全一樣,則無需設定)

#*.LOG_FILE_NAME_CONVERT='/路徑','/路徑'      (同上,這兩個名字轉換引數是主備庫的路徑對映關係,可能會是路徑全名,看情況而定)

*.STANDBY_FILE_MANAGEMENT=AUTO  #auto後當主庫的datafiles增刪時備庫也同樣自動操作,且會把日誌傳送到備庫standby_archive_dest引數指定的目錄下,確保該目錄存在,如果你的儲存採用檔案系統沒有問題,但是如果採用了裸裝置,你就必須將該引數設定為manual

 

12在備庫上建立spfile  

[oracle@dg2 dbs] $ sqlplus / as sysdba

建立備庫spfile

SQL> startup pfile='/u01/app/oracle/product/11.2.0/db_1/dbs/initdb1.ora'

SQL> create spfile from pfile;

 

13 配置standby redolog

(最佳效能模式可以忽略,如果要轉為其它兩種模式則要建立)

 

分別在dg1dg2上建立standby資料夾,用於standby Redo log

[oracle@dg1 dbs] $ mkdir /u01/app/oracle/oradata/db1/standby

[oracle@dg2 dbs] $ mkdir /u01/app/oracle/oradata/db1/standby

 

在主庫檢視日誌組的數量和每個日誌檔案的大小

SQL> SELECT GROUP#, BYTES FROM V$LOG;

在備庫檢視日誌組的數量和每個日誌檔案的大小

SQL> SELECT GROUP#, BYTES FROM V$STANDBY_LOG;

 

在主庫和備庫中建立日誌組和redo log檔案

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 4 ('/u01/app/oracle/oradata/db1/standby/slog1.rdo') SIZE 50M;

 SQL> ALTER DATABASE ADD STANDBY LOGFILE group 5 ('/u01/app/oracle/oradata/db1/standby/slog2.rdo') SIZE 50M;

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 6 ('/u01/app/oracle/oradata/db1/standby/slog3.rdo') SIZE 50M;

SQL> ALTER DATABASE ADD STANDBY LOGFILE group 7 ('/u01/app/oracle/oradata/db1/standby/slog4.rdo') SIZE 50M;

 

注:standby redolog的組數參考公式:(online redolog組數 + 1) * 資料庫執行緒數;單機執行緒數為1RAC一般為2

standby redolog的組成員數和大小也儘量和online redolog一樣。

 

14 在備庫上執行備庫恢復模式

SQL> select instance_name,status from v$instance;

INSTANCE_NAME    STATUS

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

db1               OPEN

 

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

資料庫已更改

 

結束這個恢復程式:

SQL> alter database recover managed standby database cancel;

 

15 將備庫啟動到open read only的狀態

SQL> shutdown immediate

SQL> startup mount

SQL> alter database open read only;

 

16 檢視主庫和備庫的日誌同步情況,確保已經同步

主庫:

SQL> archive log list

資料庫日誌模式            存檔模式

自動存檔             啟用

存檔終點            /u01/app/oracle/oradata/archive

最早的聯機日誌序列     14

下一個存檔日誌序列   16

當前日誌序列           16

 

備庫:

SQL> archive log list

資料庫日誌模式            存檔模式

自動存檔             啟用

存檔終點            /u01/app/oracle/oradata/archive

最早的聯機日誌序列     14

下一個存檔日誌序列   0

當前日誌序列           16

 


 

四、檢驗

檢驗方法:在主庫中建立一張表,看在備庫中是否可以查到。

 

1 在主庫中建立一張表

SQL> create table test_table(id number);

表已建立

 

看備庫上是否可以查到

SQL> desc test_table;

ERROR:

ORA-04043: 物件 test_table 不存在

 

2備庫上接收資料,並自動同步:

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

資料庫已更改

 

SQL> desc test_table;

 名稱                                      是否為空? 型別

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

 ID                                                 NUMBER

 

3 再次驗證資料是否同步。

主庫:

SQL> insert into test_table values(1);

已建立 1 行。

SQL> commit;

提交完成。

 

備庫:

SQL> select * from test_table;

        ID

----------

         1

 

這裡資料實現了同步,說明dataguard配置成功了。

五、參考文件

 

http://blog.itpub.net/29107230/viewspace-1063628/

 

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

相關文章