1. 程式人生 > >cent os6.5搭建oracle-dataguard

cent os6.5搭建oracle-dataguard


參考文章: 手把手教你安裝Data Guard 非常感謝此文作者,在我搭建DataGuard的過程中提供了很大幫助。

此文綜合了一些其他參考資料與上述文章,供初學者參考。

前言

此文適合於初步學習dataguard的同仁,本人也是剛接觸dataguard 在搭建過程中吃了不少苦頭,所以特地總結出來,希望能幫助到大家。

1 配置資訊

主庫安裝資料庫,備庫只裝資料庫軟體

主庫:

作業系統:CentOs6.5

資料庫版本:Oracle 11g R2

DB_UNIQUE_NAME:JCZH

GLOBAL_NAME:JCZH

SERVICE_NAME:JCZH

ORACLE_SID:JCZH

主機名 bm-db3

IP:192.168.1.105

 

備庫: (以下部分資訊是以主庫資訊生成的,之前不存在

作業系統:CentOs6.5

資料庫版本:Oracle 11g R2

DB_UNIQUE_NAME:JCZHSTANDBY

GLOBAL_NAME:JCZHSTANDBY

SERVICE_NAME:JCZHSTANDBY

ORACLE_SID:JCZH

主機名 bm-db2

IP:192.168.1.106


2修改Host檔案

主庫:

[email protected] ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db3
::1            localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db3
192.168.1.105 bm-db3
192.168.1.106 bm-db2

備庫:

[[email protected] ~]$ cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4 bm-db2
::1            localhost localhost.localdomain localhost6 localhost6.localdomain6 bm-db2
192.168.1.105 bm-db3
192.168.1.106 bm-db2

3 確定開啟監聽檔案(主庫)

[[email protected]
~]$ lsnrctl status LSNRCTL for Linux: Version 11.2.0.4.0 - Production on 19-JUN-2017 12:13:20 Copyright (c) 1991, 2013, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))) STATUS of the LISTENER ------------------------ **************** **************** Listener Parameter File /oracle/product/11.2.4/db_1/network/admin/listener.ora Listener Log File /oracle/diag/tnslsnr/bm-db3/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521))) (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=localhost)(PORT=1521))) Services Summary... Service "JCZH" has 2 instance(s). Instance "JCZH", status UNKNOWN, has 1 handler(s) for this service... Instance "JCZH", status READY, has 1 handler(s) for this service... Service "JCZHXDB" has 1 instance(s). Instance "JCZH", status READY, has 1 handler(s) for this service... The command completed successfully

4 開啟主庫歸檔模式並修改監聽,生成引數檔案

4.1 開啟主庫歸檔模式

[[email protected] ~]$ sqlplus "/as sysdba"
檢視:
SQL> archive log list;
Database log mode	       Archive Mode
Automatic archival	       Enabled
………
若未開啟 執行以下命令開啟:

alter database archivelog;


更改主庫為force logging
SQL> alter database force logging;
Database altered.

4.2建立主庫密碼檔案並修改監聽(主庫)

cd /$ORACLE_HOME/network/admin
orapwd file=$ORACLE_HOME/dbs/orapwJCZH password=oracle entries=30;

修改監聽檔案,加入靜態監聽

[[email protected] admin]$ cat listener.ora 
# listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = JCZH)
      (ORACLE_HOME = /mnt/disk1/oracle/product/11.2.4/db_1)
      (SID_NAME = JCZH)
    )
  )

ADR_BASE_LISTENER = /oracle
監聽檔案建議複製系統生成的格式進行修改 複製空格對不上也會導致不能正常啟動

修改 tnsname檔案

[[email protected] admin]$ cat tnsnames.ora 
# tnsnames.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

JCZH =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = bm-db3)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = JCZH)
    )
  )
JCZHSTANDBY =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = bm-db2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = JCZHSTANDBY)
    )
  )


4.3生成引數檔案並修改

主庫:進入sqlplus
sqlplus “/as sysdba”
SQL->create pfile from spfile;
cd  $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initJCZH.ora 
……..
*.db_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'
*.db_name='JCZH'
*.db_recovery_file_dest_size=10737418240
*.db_unique_name='JCZH'
*.fal_client='JCZH'
*.fal_server='JCZHSTANDBY'
*.log_archive_config='dg_config=(JCZH,JCZHSTANDBY)'
*.log_archive_dest_1='LOCATION=/arch/JCZH LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZH'
*.log_archive_dest_2='service=JCZHSTANDBY LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZHSTANDBY'
*.log_archive_dest_state_1='enable'
*.log_archive_dest_state_2='enable'
*.log_archive_format='%t_%s_%r.arc'
*.log_file_name_convert='/mnt/disk1/oracle/oradata/JCZH','/mnt/disk1/oracle/oradata/JCZH'
*.standby_file_management='AUTO'
修改檔案中以上值 沒有則新增,若有則保證路徑資訊等正確, db_recovery_file_dest_size 保證值不小於該值

注意:
1.log_archive_dest_2='SERVICE=STANDBY這個引數就是tnsnames的別名,就是這個檔案開頭的那個大寫的名字。

log_archive_dest_1 為本地日誌的存放資訊

注意DB_UNIQUE_NAME的不同。

配置此引數的意義為開啟遠端歸檔日誌的傳輸。
2: *.fal_server=JCZHSTANDBY
    *.fal_client=JCZH

這兩個引數是各自的service_name。 主備庫相反

3. db_file_name_convert log_file_name_convert分別是資料和日誌存放地址,引數中第一個為備庫的,第二個是主庫的。注意。

修改完成後進入sqlplus 

執行create spfile from pfile;
若出現提示資料庫已開啟則 
shutdown immediate
create spfile from pfile;
startup

5.傳輸檔案

注意!以下所有執行都要下防火牆關閉模式下進行

主備庫都執行以下命令

service iptables stop
chkconfig iptables off
service iptables status

主庫:

傳輸主庫的引數檔案、密碼檔案以及tnsname檔案到備庫上:

cd  $ORACLE_HOME/dbs
scp initJCZH.ora orapwJCZH bm-db2:$ORACLE_HOME/dbs
cd /$ORACLE_HOME/network/admin/
scp tnsnames.ora bm-db2:$ORACLE_HOME/network/admin/


修改備庫引數檔案備庫上操作

cd $ORACLE_HOME/dbs
[[email protected] dbs]$ cat initJCZH.ora 
*.audit_file_dest='/oracle/admin/JCZHSTANDBY/adump'
*.control_files='/oracle/oradata/JCZH/control01.ctl','/oracle/fast_recovery_area/JCZH/control02.ctl'
*.db_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主備庫相反 資料庫檔案存放地址
*.db_name='JCZH'
*.db_recovery_file_dest='/oracle/fast_recovery_area'
*.db_recovery_file_dest_size=10737418240
*.db_unique_name='JCZHSTANDBY' #修改 一定要與主庫不同 作者沒有配置過相同的
*.diagnostic_dest='/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=JCZHXDB)'
*.fal_client='JCZHSTANDBY' #修改與主庫相反
*.fal_server='JCZH' #同上
*.log_archive_config='dg_config=(JCZHSTANDBY,JCZH)'
*.log_archive_dest_1='LOCATION=/arch/JCZHSTANDBY LGWR VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=JCZHSTANDBY' 
#注意修改 為本地歸檔目錄地址,錄影在下文中建立
*.log_archive_dest_2='service=JCZH LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=JCZH' #注意修改
*.log_file_name_convert='/oracle/oradata/JCZH','/oracle/oradata/JCZH' #主備庫相反 日誌檔案存放地址
將模板中的紅色值修改為你自己的 注意 部分引數主備庫是相反的。

6建立目錄

在備庫上建立相應的目錄,因為備庫開始沒有建立資料庫,有些目錄是引數檔案中沒有的。

以下建立的目錄一定要確定是Oracle使用者 oinstall組的

在oracle使用者下建立 如oracle使用者沒有許可權則在root使用者下建立

建立完成後執行

chown -R oracle:oinstall 對應目錄

建立相關目錄

mkdir -p  /mnt/disk1/oracle/admin/JCZH/adump/
mkdir -p /oracle/fast_recovery_area
mkdir -p /mnt/disk1/oracle/oradata/JCZH
mkdir  /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup /oracle/fast_recovery_area
chmod 777 /mnt/disk1/backup /oracle/fast_recovery_area
mkdir -p  /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
chown -R oracle:oinstall  /mnt/disk1/arch/JCZH
chmod 777  /mnt/disk1/arch/JCZH

主庫上操作

在主庫上用rman做一個全備,也需要建立備份的目錄:

mkdir  /mnt/disk1/backup
chown -R oracle:oinstall /mnt/disk1/backup
chmod 777 /mnt/disk1 /backup
mkdir -p  /mnt/disk1/arch/JCZH
chown -R oracle:oinstall /mnt/disk1/arch
 chown -R oracle:oinstall  /mnt/disk1/arch/JCZH
chmod 777  /mnt/disk1/arch/JCZH

主庫上進行資料備份

rman
connect target /
backup device type disk format '/mnt/disk1/backup/%U' database plus archivelog;

退出rman,將主庫的備份檔案傳輸到備庫

此處再此強調,一定要關閉防火牆,並且使建立的所有目錄都在oracle使用者下,且具有相應的許可權

cd /mnt/disk1/backup/
scp * bm-db2: /mnt/disk1/backup

備庫上操作 啟動oracle到nomount狀態

su – oracle
sqlplus / as sysdba
startup nomount;

修改備庫的監聽檔案。

cd $ORACLE_HOME/networdk/admin
[[email protected] admin]$ cat listener.ora 
# listener.ora Network Configuration File: /oracle/product/11.2.4/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
  )
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = JCZHSTANDBY)
      (ORACLE_HOME = /oracle/product/11.2.4/db_1)
      (SID_NAME = JCZH)
    )
  )
ADR_BASE_LISTENER = /oracle

啟動監聽確保服務註冊無誤

 lsnrctl start 
若監聽已啟動,執行

lsnrctl reload;

此處配置完成後主備庫都應進行連線測試

tnsping JCZH
tnsping JCZHSTANDBY

顯示Ok則配置完成,若有問題則檢查防火牆與tns檔案是否有誤!

7應用備份檔案

主庫資料庫啟動到Mount狀態

進入sqlplus 
shutdown immediate;
startup mount;
主庫應用備份檔案到備庫上,使用duplicate方式(在主庫上執行)

Oralce使用者下執行 rman指令

rman

connect target /

connect auxiliary sys/[email protected]   

duplicate target database for standby;

如果主備庫日誌存放路徑與資料庫存放路徑相同 standby後面加入 nofilenamecheck命令

duplicate target database for standby nofilenamecheck;

執行中 等待命令完成 


執行備庫恢復模式。(在備庫上執行

SQL> select instance_name,status from v$instance;
INSTANCE_NAME    STATUS
---------------- ------------
JCZH 			MOUNTED

將主庫切換為Open狀態。

主庫進入 sqlplus模式

alter database open;


備庫上執行日誌同步

SQL> alter database recover managed standbydatabase disconnect from session;
Database altered.


檢視日誌同步情況,確保日誌都應用了。

select name,sequence#,APPLIED from v$archived_log order by sequence#;

沒有資料或日誌出現No都有問題 檢查檔案許可權以及防火牆問題,還不能解決

檢視日誌資訊

沒有資料或日誌出現No都有問題 檢查檔案許可權以及防火牆問題,還不能解決
檢視日誌資訊
[email protected] admin]$ cd $Oracle_Base/diag/rdbms/jczhstandby/JCZH/trace/
[[email protected] trace]$ tail -100f alert_JCZH.log

建立 standby logfile 。主庫和備庫都要新增。

主庫:
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M; 


備庫:
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo01.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo02.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo03.log' size 512M; 
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/mnt/disk1/oracle/oradata/JCZH/sredo04.log' size 512M; 
注意路徑修改



8 實現日誌同步

備庫上執行

alter database recover managed standby database disconnect from session;

若提示已有恢復程序在進行中,則應用以下命令取消:

SQL> alter database recover managed standby database cancel;


同步完成後 取消這個恢復程序

SQL> alter database recover managed standby database cancel;

將備庫啟動到openread only的狀態
SQL> alter database open read only;

9檢視日誌是否同步

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

主庫:

SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /arch/JCZH
Oldest online log sequence     21
Next log sequence to archive   23
Current log sequence           23


備庫:
SQL> archive log list
Database log mode              Archive Mode
Automatic archival             Enabled
Archive destination            /arch/JCZHSTANDBY
Oldest online log sequence     21
Next log sequence to archive   0
Current log sequence           23


備庫執行:

select name,sequence#,APPLIED from v$archived_log order bysequence#;

若未出現日誌應用資訊 則檢查主庫是否處於Open狀態

若日誌應用狀態出現No 則執行

SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
若日誌已應用 但序號不統一 (Next不用管)

在主庫上執行

alter system switch logfile;

執行完成後再使用 archive log list;進行對比


若仍然無法同步,檢視日誌資訊 進行實時監控

10.確認資料同步 

在主庫上建立一張表,看備庫上是否可以檢視到。

SQL> create table test (id number);
備庫:
SQL> desc test
ERROR:
ORA-04043: object test does not exist
注意:
發現數據沒有同步,請執行下面語句,接收資料。

SQL> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
SQL> desc test
 Name                                     Null?   Type
 ----------------------------------------- ------------------------------------
 ID                                               NUMBER

再次驗證資料是否同步。
主庫:
SQL> insert into test values(1);
1 row created.


SQL> commit;
Commit complete.
備庫:
SQL> select * from test;
        ID
----------
         1


至此DataGuard已經搭建完成,接下來就是主備切換了。


總結:

dataguard 從0開始學習到搭建成功,期間遇到過好多困難,與很多無法解決的錯誤(事實上是因為粗心問題導致,例如相應的目錄沒有許可權)。 要學會檢視日誌資訊。如此文有不當之處還望各位指出。 祝大家學習進步,工作順利!