DATAGUARD的單例項搭建、切換、檢查 文件
阿新 • • 發佈:2018-12-03
摘 要
搭建data guard環境,利用RMAN DUPLICATE命令建立physical standby。 建立備庫之前需要有備庫的引數檔案;同時連線主資料庫和備用資料庫,啟動備庫到nomount狀態。備庫必須工作在recover managed模式下才能應用主庫的redo資料。當dataguard建立成功後,在計劃需求下手工的switchover,或者在主庫故障發生的情況下手工的執行failover,以確保正常的生產工作。為了確保dataguard的正常工作,必須經常檢查dataguard的健康狀況來確保dataguard的安全穩定。
一:系統環境介紹
我們在進行DATAGUARD搭建的時候,需要首先確定要進行dataguard搭建的伺服器的記憶體,磁碟,作業系統等各方面的情況,以此來確定相應的實施方案。
1.1 伺服器硬體介紹
記憶體的大小
[[email protected] ]# free -g
total used free shared
23 23 0
磁碟的規劃
[[email protected] ]# df -h
Filesystem Size Used Avail Use% Mounted o
/dev/sda1 29G 6.7G 21G 25% /
/dev/sda2 1.0T 234G 738G 25% /u01
tmpfs 12G 0 12G 0% /dev/shm
CPU的個數
[[email protected] ~]# cat /proc/cpuinfo |grep physical |wc -l
48
伺服器的型號
[ [email protected] ~]# dmidecode |grep "Product Name"
Product Name: PowerEdge R710
1.2 伺服器軟體介紹
作業系統版本:
[[email protected] ~]# cat /etc/issue |grep Linux
Red Hat Enterprise Linux Server release 5.5 (Tikanga)
作業系統的核心資訊
[[email protected] ~]# uname -a
Linux nxqpri 2.6.18-194.el5 #1 SMP Tue Mar 16 21:52:39 EDT 2010 x86_64 x86_64 x86_64 GNU/Linux
資料庫的版本資訊
SQL> select * from v$version;
Oracle Database 10g Enterprise Edition Release 10.2.0.4.0 - 64bit
1.3 網路環境介紹
資料庫的伺服器只配置了內網網路
主庫的IP地址
[ [email protected] ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr D4:AE:52:63:94:53
inet addr:192.168.1.252 Bcast:192.168.1.255 Mask:255.255.255.0
備庫的IP的地址
[[email protected] ~]# ifconfig eth0
eth0 Link encap:Ethernet HWaddr D4:AE:52:64:16:83
inet addr:192.168.1.254 Bcast:192.168.1.255 Mask:255.255.255.0
二:DATAGUARD的搭建
2.1 primary database(主庫)的搭建
1.使用OUI安裝資料庫軟體
在primary(主庫)搭建資料庫軟體,建立lsnrctl監聽,採用dbca搭建例項,在standby(備庫)上搭建資料庫軟體,建立監聽,但是不需要採用dbca建立例項。
使用DBCA建立資料庫,全域性資料庫名:orcl 例項名:orcl
2.以oracle身份登入系統,連線主庫,啟動到 mount狀態,資料庫處於正常啟動狀態先停庫再啟動
SQL>Startup mount
3.修改資料庫強制記錄日誌
SQL>alter database force logging;
4. 確定資料庫是否處於歸檔模式庫,如果建立資料庫時沒有選擇歸檔,將資料庫改為歸檔模式
a.查詢資料庫是否處於歸檔
SQL> archive log list;
b.更改資料庫為歸檔模式(改模式不能在Startup啟動模式下)
SQL>alter database archivelog;
5.開啟閃回資料庫(不是必須的)
SQL> alter database flashback on;
Database altered.
6.根據spfile檔案建立pfile,關閉資料庫。
SQL>Create pfile from spfile
SQL>shutdown immediate
7.修改pfile 檔案
a.備份修改檔案
#cp $ORACLE_HOME/dbs/initorcl.ora $ORACLE_HOME/dbs/initorcl.ora.bak
#vim $ORACLE_HOME/dbs/initorcl.ora
b.在引數檔案檔案裡面新增如下內容
為每個資料庫指定唯一性名稱
db_unique_name='pdb'
允許資料庫傳送和接收日誌
log_archive_config='dg_config=(pdb,sdb)'
兩個引數連線的是網路字元名
fal_server=sdb
fal_client=pdb
表示的是本地歸檔日誌的儲存路徑
log_archive_dest_1='location=‘/u01/app/archivelog'
表示當資料庫處於什麼角色的時候,將什麼日誌,以什麼樣的方式傳輸到哪臺遠端伺服器
log_archive_dest_2='service=sdb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=sdb'
允許重做日誌傳輸到指定目的地
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
當設定成auto的時候,你對primary database的資料檔案的增加,resize等操作的時候,standbydatabase將會自動的進行同步而不需要DBA在standby進行人工的干預
standby_file_management=AUTO
***** /u01/app/archivelog主備伺服器上該目錄比較存在
8.採用pfile檔案啟動資料庫。(確定資料庫是否能正常啟動)
SQL>startup pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
9.為主資料庫建立監聽,在oracle使用者下
[[email protected] admin]$ cd /u01/app/oracle/product/11.2.0/db_1/network/admin
建立監聽後新增以下內容,連線服務名預設為orcl
[[email protected] admin]$ vi listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(SID_NAME = orcl)
)
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
(PROGRAM = extproc)
)
)
建立連線服務服務監聽
[[email protected] admin]$ vi tnsnames.ora
PDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.252)(PORT = 5530))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
SDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.254)(PORT = 5530))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
2.2 NFS的搭建(可以不用nfs)
通過合理的使用NFS,能夠簡化檔案的傳輸和降低磁碟的壓力。
1、在主庫上面(192.168.1.252)上修改檔案
[[email protected] ~]# vi /etc/exports
/u01/app/archivelog 192.168.1.0/24(rw,no_root_squash,async)
[[email protected] ~]# chkconfig --list|grep portmap
portmap 0:off 1:off 2:off 3:on 4:on 5:on 6:off
[[email protected] ~]# service portmap start
[[email protected] ~]# service nfs start
2.在備用資料庫上面(192.168.1.254)進行nfs掛載
檢視能否識別到主庫(192.168.1.252)上面的nfs磁碟:
[[email protected] ~]# showmount -e 192.168.1.190
Export list for 192.168.1.190:
/u01/e3data 192.168.1.0/24
如果能夠識別的到,那麼進行掛載
# mount -t nfs -o rw,bg,tcp,hard,nointr,wsize=32768,rsize=32768 192.168.1.252:/u01/app/archivelog /u01/app/archivelog
在生產環境操作的時候,如果網路頻寬的速度沒有磁碟的速度快,一般要加上相關的引數進行限制
mount -t nfs -o rw,bg,tcp,hard,nointr,wsize=32768,rsize=32768 192.168.1.5:/dgbackup /dgbackup
2.3:使用RMAN備份資料庫(主庫)
1.備份當前的控制檔案
RMAN > rman target sys/oracle
RMAN > backup format '/u01/app/archivelog/bk_%U' current controlfile for standby
此處的路徑為NFS掛載的路徑
2.備份資料和歸檔
RMAN > backup format '/u01/app/archivelog/dbk_arch_%U' database plus archivelog;
也可以選擇不備份歸檔日誌檔案
2.2 physical standby database(備庫)建立
1.安裝資料庫軟體,本實驗選擇安裝軟體的路徑與主庫相同
這個步驟只安裝軟體,不安裝資料庫,軟體的版本也應該和主庫的一樣
2.參考主庫建立備庫上相應的檔案目錄(注意目錄名及位置不能寫錯,否則建立過程會失敗)
需要新增的檔案目錄如下:
閃回區的相關目錄新增:
[[email protected] ~]$ cd $ORACLE_BASE
[[email protected] oracle]$ mkdir flash_recovery_area
[[email protected] flash_recovery_area]$ mkdir ORCL
[[email protected] ORCL]$ mkdir onlinelog
Dump檔案相關目錄的新增
[[email protected] ~]$ cd $ORACLE_BASE
[[email protected] oracle]$ mkdir admin
[[email protected] admin]$ mkdir orcl
[[email protected] orcl]$ mkdir {a,b,c,dp,u}dump
[[email protected] orcl]$ mkdir pfile
資料庫引數檔案放置位置目錄的新增
[[email protected] orcl]$ cd $ORACLE_BASE
[[email protected] oracle]$ mkdir oradata/
[[email protected] oracle]$ cd oradata/
[[email protected] oradata]$mkdir orcl
歸檔日誌目錄新增
$ mkdir /u01/app/archivelog
3.傳輸相關的檔案
將主庫上面的引數檔案,密碼檔案傳輸到備用資料庫上面去,在備用資料庫上面放在的位置應該和主庫該檔案放置的位置一樣。
引數檔案
[[email protected] ]$scp /u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
[email protected]:/u01/app/oracle/product/11.2.0/db_1/dbs/
密碼檔案
[[email protected] ]$scp /u01/app/oracle/product/11.2.0/db_1/dbs/orapworcl.ora
[email protected]:/u01/app/oracle/product/11.2.0/db_1/dbs/
注意:要是ssh的埠做了修改的話,我們需要在scp過程的時候,新增 –P [埠數] 引數來進行傳輸。
4、備用資料庫引數的修改
引數的含義同主庫的含義一樣
db_unique_name='sdb'
log_archive_config='dg_config=(pdb,sdb)'
fal_server=pdb
fal_client=sdb
log_archive_dest_1='location=/u01/app/archivelog'
log_archive_dest_2='service=pdb lgwr sync affirm valid_for=(online_logfiles,primary_role) db_unique_name=pdb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=ENABLE
standby_file_management=AUTO
5. 為備庫建立監聽(方法同主庫)
netca
6. 為備庫建立網路服務命名(方法同主庫)
[[email protected] u01]# vi /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
HPPRI =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.10.40.201)(PORT = 1521))
)
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = hppri)
)
)
7.此時啟動兩臺伺服器的監聽,並確認是否能夠正常的連線
lsnrctl start 啟動監聽
lsnrctl stop 停止監聽
lsnrctl status 檢視監控執行狀態
tnsping + 例項名 檢查是否能識別到其他例項
sqlplus sys/[email protected]gap as sysdba 檢查是否能登入資料庫
sqlplus sys/[email protected] as sysdba 檢查是否能登入資料庫
8.使用initsdb.ora啟動資料庫到nomount狀態。
SQL> startup nomount pfile=/u01/app/oracle/product/11.2.0/db_1/dbs/initorcl.ora
9. 啟動rman使用 rman duplicate 建立備用資料庫
[[email protected] ]$ rman target sys/[email protected] auxiliary sys/oracle
Recovery Manager: Release 10.2.0.1.0 - Production on Tue Nov 11 18:01:00 2008
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: DB (DBID=1434261387)
connected to auxiliary database: DB (not mounted)
RMAN> duplicate target database for standby nofilenamecheck;
在啟用恢復模式之前可以先用建好standbylog日誌檔案
10.修改資料庫為恢復管理模式,以使備庫能夠應用主庫的redo 資料,達到同步
SQL> alter database recover managed standby database disconnect from session;
11. 檢視備用資料庫的日誌應用情況
SQL> select sequence#,first_time,next_time,applied from v$archived_log order by sequence#;
SEQUENCE# FIRST_TIM NEXT_TIME APP
---------- --------- --------- ---
13 11-NOV-08 11-NOV-08 YES
14 11-NOV-08 12-NOV-08 YES
15 12-NOV-08 12-NOV-08 YES
16 12-NOV-08 12-NOV-08 YES
12.為兩資料庫分別建立standby日誌檔案
主庫
SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standbylog01.log' size 500m;
SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standbylog02.log' size 500m;
SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/orcl/standbylog03.log' size 500m;
SQL> alter database add standby logfile group 8 '/u01/app/oracle/oradata/orcl/standbylog04.log' size 500m;
備庫
停止redo應用
SQL> alter database recover managed standby database cancel;
Database altered.
SQL> alter database add standby logfile group 5 '/u01/app/oracle/oradata/orcl/standbylog01.log' size 500m;
Database altered.
SQL> alter database add standby logfile group 6 '/u01/app/oracle/oradata/orcl/standbylog02.log' size 500m;
Database altered.
SQL> alter database add standby logfile group 7 '/u01/app/oracle/oradata/orcl/standbylog03.log' size 500m;
Database altered.
再起動redo應用
SQL> alter database recover managed standby database disconnect from session;
Database altered
11.再次檢視備庫日誌應用情況
SQL> select sequence#,first_time,next_time,applied from v$archived_log order by sequence#;
SEQUENCE# FIRST_TIM NEXT_TIME APP
---------- --------- --------- ---
15 11-NOV-08 11-NOV-08 YES
16 11-NOV-08 12-NOV-08 YES
17 12-NOV-08 12-NOV-08 YES
18 12-NOV-08 12-NOV-08 YES
12 .確定相關教程都已經啟動
SQL> select process,status from v$managed_standby;
PROCESS STATUS
--------- ------------
ARCH CLOSING
ARCH CLOSING
MRP0 WAIT_FOR_LOG
RFS IDLE
RFS IDLE
查詢歸檔日誌序列和磁碟空間
select sequence#,applied,deleted from v$archived_log;
快速檢視DG的報錯資訊
select error from v$archive_dest where target='STANDBY'
至此物理standby已經搭建成功
三:手工的switchover與failover
3.1 手工的switchover
1.檢視主資料庫可轉換的狀態
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE
2.執行切換命令轉換primary 到 physical standby
SQL>alter database commit to switchover to physical standby with session shutdown
Database altered.
如果查詢到的可轉換狀態為to standby,則切換命令為
SQL>alter database commit to switchover to physical standby
3.關閉資料庫並啟動到mount狀態
SQL> shutdown immediate;
SQL> startup mount;
Database mounted.
4. 檢視備庫可轉換的狀態
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
5.將備庫 轉換為primary
SQL> alter database commit to switchover to primary;
Database altered.
6.將新的主庫開啟
SQL>shutdown immediate;
SQL> startup ;
Database opened.
注:在開啟新的主資料庫時,如果新的主資料庫在作為備用庫時曾以READ ONLY的方式開啟過,則應重啟資料庫,否則可直接執行如下操作
SQL> alter database open;
Database altered.
7.Sdb作為新備庫啟動,設定恢復管理模式
SQL> alter database recover managed standby database disconnect from session;
Database altered.
8.檢視新備庫pdb的日誌應用情況
3.2 手動的failover
1.對備用資料庫進行失敗轉移初始化
SQL> alter database recover managed standby database finish force;
Database altered.
SQL> select protection_mode,protection_level from v$database;
PROTECTION_MODE PROTECTION_LEVEL
-------------------- --------------------
MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE
當進行失敗轉移後,資料庫的保護模式將由最大可用模式變為最大效能模式
2.將備庫轉換為主庫並開啟新的主庫
SQL> alter database commit to switchover to primary;
Database altered.
SQL> alter database open;
Database altered.
4、DATAGUARD的日常檢查工作
1.確定主庫,並檢視當前的日誌號
SQL> select database_role from v$database;
DATABASE_ROLE
----------------
PRIMARY
SQL> archive log list
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/archivelog
Oldest online log sequence 417
Next log sequence to archive 420
Current log sequence 420
2:確定備用資料庫不存在日誌斷點:
SQL> select * from v$archive_gap;
no rows selected
3:確定備用資料庫,並檢視當前應用的日誌序號
SQL> select sequence#,applied from v$archived_log;
SEQUENCE# APP
---------- ---
414 YES
415 YES
416 YES
417 YES
418 YES
419 YES
4.在主庫檢視當前日誌傳輸是否正常
SQL> col status for a10
SQL> col destination for a10
SQL> col error a10
SQL> col error for a10
SQL> select dest_id,status,destination,error from v$archive_dest where dest_id <=2;
DEST_ID STATUS DESTINATIO ERROR
---------- ---------- ---------- ----------
1 VALID /u01/app/archivelog
2 VALID sdb
5.在備庫上面確認相關的程序已經啟動
SQL> select process,status,sequence# from v$managed_standby;
PROCESS STATUS SEQUENCE#
--------- ------------ ----------
ARCH CLOSING 419
ARCH CLOSING 418
MRP0 WAIT_FOR_LOG 420
RFS IDLE 0
RFS IDLE 420
RFS IDLE 0
通過以上的過程可以確認,DG是處於健康狀態的
6.已經被應用的日誌的刪除
因為相關的日誌已經在備用資料庫上面被引用,基於空間的考慮,我們可以刪除一些日誌,只保留部分日誌。
相關刪除指令碼如下:
6.1 建立相關的定時任務
[[email protected] ~]# crontab -l
0 03 * * * su - oracle -c "/home/oracle/rman_del.sh"
相關刪除的指令碼
[[email protected] ~]$ cat rman_del.sh
rman target sys/oracle msglog=/home/oracle/log/`date '+%Y%m%d'`.log cmdfile=/home/oracle/rman_del.rman
[[email protected] ~]$ cat rman_del.rman
run {
#allocate channel cha_full type disk;
#CONFIGURE CONTROLFILE AUTOBACKUP ON;
#crosscheck backup;
#crosscheck archivelog all;
delete noprompt archivelog until time "sysdate-10";
#release channel cha_full;
}
附Switchover_Status值的含義
NOT ALLOWED
當前的資料庫不是帶有備用資料庫的主資料庫
PREPARING DICTIONARY
該邏輯備用資料庫正在向一個主資料庫和其他備用資料庫傳送它的重做資料,以便為切換做準備
PREPARING SWITCHOVER
接受用於切換的重做資料時,邏輯備用配置會使用它
RECOVERY NEEDED
備用資料庫還沒有接收到切換請求
SESSIONS ACTIVE
在主資料庫中存在活動的SQL會話;在繼續執行之前必須斷開這些會話
SWITCHOVER PENDING
適用於那些已收到主資料庫切換請求但是還沒有處理該請求的備用資料庫
SWITCHOVER LATENT
切換沒有完成並返回到主資料庫
TO LOGICAL STANDBY
主資料庫已經收到了來自邏輯備用資料庫的完整的字典
TO PRIMARY
該備用資料庫可以轉換為主資料庫
TO STANDBY
該主資料庫可以轉換為備用資料庫