Oracle data guard學習
Oracle data guard學習:三思筆記
Data guard
1data guard結構:
data guard是一個集合,由一個primary資料庫(生產資料庫)和一個或多個standby資料庫(最多9個組成),組成data guard之間的資料庫由oracle的net service來連線,
1主庫:單例項,rac
2standby:物理standby:物理結構相同,接收到redo後,以介質恢復的形式到standby庫
邏輯
1.1 data guard服務:
1 Redo傳輸服務:RTS:從主庫傳送redo到其他的的standby,
2 LOG應用服務:LAS:保證primary與standby的事務一致
物理standby:data guard使用redo apply技術,通過recover的方式應用redo資料
邏輯standby:使用sql apply,先將接收到的redo資料轉換成sql,以執行該sql來應用redo資料
3 角色轉換:一套dg只有2中角色:primary,standby
角色轉換也就是切換,切換分2中:switchover跟failover
Switchover:將primary跟standby(一個)進行切換,不會丟失資料
Failover:primary出現故障並不能及時恢復,通過failover將一個standby轉換為新的primary,在最大保護模式跟高可用模式下,不會丟失資料,(高效能可能會?)
1.2 3種保護模式:
最大保護:maximum protection,這種模式確保無資料丟失,要求事務在提前前,
最高效能(預設):maximum performance,這種模式在不影響primary下,提供最高級別的資料保護策略,事務可以隨時提交,當前primary的redo資料至少寫入到一個standby中,可以是同步與非同步
最高可用:maximum availability,在不影響primary的前提下,提供最大模式的保護資料的策略,要求本地事務在提交前把redo寫入到一個standby中,如果standby出現故障,primary並不會shutdown,而是自動轉換為最高效能模式,等standby恢復正常,會自動轉換為最高可能
3種模式都需要指定log_archive_dest_n引數
1.3 data guard特定總結:
容災恢復及高可用特性,全面的保護資料,有效利用系統資源,故障自動檢測及解決方案,集中的易用管理模式,自動化切換角色,
2.1 standby資料庫型別
1物理standby:
物理standby跟primary一模一樣,通過redo來應用standby,在物理standby沒有執行redo應用時,可以以read only模式開啟,如果資料庫中指定了flashback area,可以設定成read write,操作完成後可以flashback database恢復到read write前的狀態,然後開啟接收primary的redo並應用
Redo應用:物理standby用過redo 應用來保持跟primary 的一致,(通過oracle的恢復機制,利用歸檔跟redo來恢復對應的塊的操作),如果正在執行redo的應用,db不能被open,redo應用時物理standby 的核心,
Read only模式開啟:開啟後,可以在standby執行查詢跟備份操作,此時standby任然會接收redo,只不過不會進行redo 應用,知道standby恢復應用(oracle11g,改進了物理standby,可以在standby開啟是應用redo,這樣可以實現讀寫分離)
Read write開啟db:此時不能接收primary傳送的redo資料,失去了保護資料的策略,此時已該模式開啟資料庫,可以進行一些資料除錯(不方便在生產上做的),操作完成在閃回,
物理standby 的特點:災難恢復及高可用,資料保護,分擔primary的壓力,提升效能
2 邏輯standby:
邏輯standby也是通過primary的複製建立的,不過由於邏輯的使用sql應用來改變資料,所以可能資料結構不一樣,
邏輯standby正常情況下是read write開啟,使用者可以在任何時候訪問db,由於sql自身的特點,邏輯standby對有些資料型別及一些dml/ddl操作的不支援,
邏輯standby資料庫可以額外的建立index,物化檢視等提高查詢效能並滿足業務需要,如建立新的schema(primary不存在的),分擔主庫壓力,可以將查詢報表分離出來,平滑升級(實現跨版本的升級,為資料庫打補丁,)
Data guard的操作介面
Oem,sqlplus,dgmgrl(data guard broker命令方式)
3 Data guard的軟體要求:
同一個data guard的環境所有的oracle必須執行在相同的系統構架上,不同的伺服器上可以配置不同,
Primary資料庫跟standby資料庫必須執行在相同的系統平臺上,
Data guard是oracle 企業版的特性
同一個data guard配置中的所有初始化引數:compatible值必須相同
Primary資料庫必須處於歸檔模式,並且force logging模式
Primary,standby均可以用於單例項和rac結構,並且可以在多個standby中,可以有邏輯standby跟物理standby
PrimaRy跟standby可以放在同一臺伺服器上,但是控制檔案,引數檔案,日誌檔案,資料檔案,歸檔檔案的目錄不同,以免被覆蓋
Primary和standby資料庫必須有sysdba許可權
建議採用相同的資料儲存結構,伺服器的時間設定,
3物理standby
3.1物理standby建立前的準備
1啟用force logging模式
SQL> conn /as sysdba
Connected.
SQL> select force_logging from v$database;
FOR
---
NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES
alter database no force logging
2建立金鑰檔案(不存在的話)
在所有的dg資料庫配置中,都必須有自己獨立的金鑰檔案,並且保證,同dg中,sys的密碼必須一樣,以保證redo順利的傳輸(通過tns,會驗證sys密碼)
使用dbca建立資料庫,會自動建立金鑰檔案
[[email protected] ~]$ cd /u01/app/oracle/product/10.2.0/db_1/dbs/
[[email protected] dbs]$ ll
-rw-r----- 1 oracle oinstall 1536 03-24 15:55 orapwgrs
不存在就建立
$ orapwd file=orapwgrs password="987064" entries=10 force=y;
3配置standby redologs,用於儲存接收主庫的redo log
對應最大保護和最高可用模式,建議為standby 建立redologs(不配置可以,oracle將在standby端自動建立歸檔檔案,並虛擬為一組standby redologs,並使用lgwr sync模式傳輸redo
關於standby redologs建議:1 standby redologs跟primar的redo檔案大小相同,2 建立適當的日誌數目,一般而言,standby的redolog要比primary的redo檔案多一個,(每執行緒的日誌組數+1)*執行緒數,防止主庫的lgwr程序鎖住,備庫的RFS程序接收到primary的redo,儲存在本地(就是standby log)
ARCH模式的話不寫standby log,直接讀取歸檔檔案
管理standby redologs:standby redologs的大小最好跟redo log的一樣
v$log v$logfile
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 100m;
Database altered.
--刪除該日誌組
SQL> alter database drop standby logfile group 4;
Database altered.
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m;
alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m
*
ERROR at line 1:
ORA-00301: error in adding log file '/u01/app/oracle/oradata/grs/redo04.log' -
file cannot be created
ORA-27038: created file already exists
Additional information: 1
--需要物理刪除
----保證主庫與備庫的日誌大小一樣,
SQL> alter database add standby logfile group 4 ('/u01/app/oracle/oradata/grs/redo04.log') size 50m;
Database altered.
SQL> select group#, thread#, sequence#, archived, status from v$standby_log;
GROUP# THREAD# SEQUENCE# ARC STATUS
---------- ---------- ---------- --- ----------
4 0 0 YES UNASSIGNED
SQL> select group#,type,member from v$logfile;
GROUP# TYPE
---------- -------
MEMBER
--------------------------------------------------------------------------------
3 ONLINE
/u01/app/oracle/oradata/grs/redo03.log
2 ONLINE
/u01/app/oracle/oradata/grs/redo02.log
1 ONLINE
/u01/app/oracle/oradata/grs/redo01.log
GROUP# TYPE
---------- -------
MEMBER
--------------------------------------------------------------------------------
4 STANDBY
/u01/app/oracle/oradata/grs/redo04.log
4設定初始化引數
SQL> create pfile ='/u01/oracle/backup/pfile' from spfile;
File created.
[[email protected] backup]$ vi pfile
grs.__db_cache_size=180355072
grs.__java_pool_size=4194304
grs.__large_pool_size=4194304
grs.__shared_pool_size=88080384
grs.__streams_pool_size=4194304
*.audit_file_dest='/u01/app/oracle/admin/grs/adump'
*.background_dump_dest='/u01/app/oracle/admin/grs/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/grs/control01.ctl','/u01/app/oracle/oradata/grs/control02.ctl','/u01/app/oracle/oradata/grs/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/grs/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='grs'
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.dispatchers='(PROTOCOL=TCP) (SERVICE=grsXDB)'
*.job_queue_processes=10
#*.log_archive_dest_1='location=/u01/app/oracle/archivelog/archivelog/'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/grs/udump'
# DB_NAME=grs
*.DB_UNIQUE_NAME=grs
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grs2)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
*.LOG_ARCHIVE_DEST_2='SERVICE=grs2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs2'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
# *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
*.LOG_ARCHIVE_MAX_PROCESSES=30
# 以下部分為主機切換為備庫使用
*.FAL_SERVER=grs_192.168.2.185
*.FAL_CLIENT=grs2_192.168.2.185
*.DB_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'
*.LOG_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'
*.STANDBY_FILE_MANAGEMENT=AUTO
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create spfile from pfile='/u01/oracle/backup/pfile';
File created.
SQL> startup;
5將主庫設定為歸檔模式
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination /u01/app/oracle/archivelog/archivelog/
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5
如果是disable,需要啟動到mount,然後SQL> alter database archivelog;
3物理standby建立的實際過程演示
源資料庫primary
Ip:192.168.2.185
Oracle sid=grs
Db_unique_name=grs
安裝路徑:/u01/app/oracle/product/10.2.0/db_1/dbs
資料檔案:/u01/app/oracle/oradata/grs
歸檔路徑:/u01/oracle/backup
目標資料庫standby
Ip:192.168.2.188
Oracle sid=grs2
Db_unique_name=grs2
安裝路徑:/u02/app/oracle/product/10.2.0/db_1/dbs
資料檔案:/u02/app/oracle/oradata/grs2
歸檔路徑:/u02/oracle/backup
1 primary主庫的配置及相關
1 檢查主庫的歸檔
[email protected] backup]$ export ORACLE_SID=grs
SQL> archive log list;
如果不是歸檔狀態,重新啟動到mount,alter database archivelog
2 將主庫設定為force loggin狀態
SQL> conn /as sysdba
Connected.
SQL> select force_logging from v$database;
FOR
---
NO
SQL> alter database force logging;
Database altered.
SQL> select force_logging from v$database;
FOR
---
YES
alter database no force logging
3 配置主庫的初始化引數
SQL> create pfile ='/u01/oracle/backup/pfile' from spfile;
File created.
[[email protected] backup]$ vi pfile
# DB_NAME=grs
*.DB_UNIQUE_NAME=grs
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grs2)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
*.LOG_ARCHIVE_DEST_2='SERVICE=grs2 LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs2'
*.LOG_ARCHIVE_DEST_STATE_1=ENABLE
*.LOG_ARCHIVE_DEST_STATE_2=ENABLE
# *.REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
*.LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
*.LOG_ARCHIVE_MAX_PROCESSES=30
# 以下部分為主機切換為備庫使用
*.FAL_SERVER=grs_192.168.2.185
*.FAL_CLIENT=grs2_192.168.2.188
*.DB_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'
*.LOG_FILE_NAME_CONVERT='/u01/app/oradata/grs','/u02/app/oradata/grs2'
*.STANDBY_FILE_MANAGEMENT=AUTO
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
SQL> create spfile from pfile='/u01/oracle/backup/pfile';
File created.
SQL> startup;
4 建立standby庫的控制檔案
SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '/u01/oracle/backup/control01.ctl';
5 複製相關檔案到standby資料庫
可以採用rman,expdp,cp等命令,複製相關資料檔案到standby
6 配置監聽跟網路服務名
[[email protected] admin]$ cp -p /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora /u02/app/oracle/product/10.2.0/db_1/network/admin/
[[email protected] admin]$ cp -p /u01/app/oracle/product/10.2.0/db_1/network/admin/tnsnames.ora /u02/app/oracle/product/10.2.0/db_1/network/admin/
修改監聽檔案
[[email protected] admin]$ vi listener.ora
# listener.ora Network Configuration File: /u01/app/oracle/product/10.2.0/db_1/network/admin/listener.ora
# Generated by Oracle configuration tools.
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = /u02/app/oracle/product/10.2.0/db_1)
(PROGRAM = extproc)
)
(SID_DESC =
(GLOBAL_DBNAME = Oracle8)
(ORACLE_HOME = /u02/app/oracle/product/10.2.0/db_1)
(SID_NAME = grs2)
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.185)(PORT = 1521))
)
(DESCRIPTION =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
[[email protected] admin]$ vi 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.
GRS2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.2.185)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = grs2)
)
)
EXTPROC_CONNECTION_DATA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
(CONNECT_DATA =
(SID = PLSExtProc)
(PRESENTATION = RO)
)
)
7 建立金鑰檔案(並複製到standby對應路徑)
[[email protected] ~]# cd /u01/app/oracle/product/10.2.0/db_1/dbs/
[[email protected] dbs]# ll
-rw-r----- 1 oracle oinstall 1536 03-24 15:55 orapwgrs
不存在就建立
$ orapwd file=orapwgrs password="987064" entries=10 force=y;
2物理standby端的配置
[[email protected] backup]$ export ORACLE_SID=grs2
1 建立日誌檔案,後臺程序的相關目錄
[[email protected] oracle]$ mkdir -p archivelog/archivelog
[[email protected] oracle]$ mkdir -p /u02/app/oracle/flash_recovery_area/grs/onlinelog
[[email protected] oracle]$
[[email protected] oracle]$ pwd
/u02/app/oracle
[[email protected] oracle]$ mkdir admin
[[email protected] oracle]$ cd admin/
[[email protected] admin]$ mkdir grs2
[[email protected] admin]$ cd grs2/
[[email protected] grs2]$ mkdir adump bdump cdump udump
2配置監聽跟網路服務名
配置好後,可以tnsping
3修改standby的引數檔案
[[email protected] dbs]$ vi initgrs2.ora
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
grs.__db_cache_size=192937984
grs.__java_pool_size=4194304
grs.__large_pool_size=4194304
grs.__shared_pool_size=75497472
grs.__streams_pool_size=4194304
*.audit_file_dest='/u02/app/oracle/admin/grs/adump'
*.background_dump_dest='/u02/app/oracle/admin/grs/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u02/app/oracle/oradata/grs/control01.ctl','/u02/app/oracle/oradata/grs/control02.ctl','/u02/app/oracle/oradata/grs/control03.ctl'
*.core_dump_dest='/u02/app/oracle/admin/grs/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.DB_FILE_NAME_CONVERT='/u02/app/oradata/grs2','/u01/app/oradata/grs'
*.db_name='grs'
*.db_recovery_file_dest='/u02/app/oracle/flash_recovery_area'
*.db_recovery_file_dest_size=2147483648
*.DB_UNIQUE_NAME='grs2'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=grsXDB)'
*.FAL_CLIENT='grs_192.168.2.185'
*.FAL_SERVER='grs2_192.168.2.185'
*.job_queue_processes=10
*.LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs2,grs)'
*.LOG_ARCHIVE_DEST_1='LOCATION=/u02/app/oracle/archivelog/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs2'
*.LOG_ARCHIVE_DEST_2='SERVICE=grs LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grs'
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.LOG_ARCHIVE_DEST_STATE_2='ENABLE'
*.LOG_ARCHIVE_FORMAT='%t_%s_%r.arc'
*.LOG_ARCHIVE_MAX_PROCESSES=30
*.LOG_FILE_NAME_CONVERT='/u02/app/oradata/grs2','/u01/app/oradata/grs'
*.open_cursors=300
*.pga_aggregate_target=94371840
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.sga_target=285212672
*.STANDBY_FILE_MANAGEMENT='AUTO'
*.undo_management='AUTO'
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u02/app/oracle/admin/grs2/udump'
4啟動物理standby到mount狀態
5接收歸檔檔案
物理standby啟動到mount狀態後,就能夠接收來自primary端的redo日誌,需要切換到主庫
Primary sql>alter system set log_arhive_dest_state_2=ENABLE;
然後primary庫就會發送redo到standby,檢視接收到的歸檔檔案,V$ARCHIVED_Log
Primary修改的資料能否在standby看到,受幾個方面的影響
1同步模式:預設情況下primary傳送歸檔日誌通過ARCH方式,只有當日志切換時,才會把產生的歸檔日誌傳送到standby,如果standby端配置了standby redologs,就支援lgwr傳輸redo到standby,這樣產生的redo就能及時傳送到standby端
2 是否啟動了應用:將redo傳送到了standby端,並不意味著standby就有資料,必須手動執行應用命令,才能將修改的應用到standby,在預設的情況下,物理standby資料庫是執行的恢復過程,只有當主庫產生日誌切換時才會應用歸檔到standby,
3是否實時應用:在standby端配置了standby redologs,並且在傳輸redo資料時採用lgwr同步傳輸的方式,在這種情況下,redo是實時的,
Oracle10g,物理的standby是不能實時看到資料的(邏輯standby或者11g物理standby才可以)
6啟動redo應用:即使當前standby處於open狀態,也不需要重啟,直接執行後,Oracle會切換到mount狀態
SQL> alter database recover managed standby database disconnect from session;
暫停redo應用(並不是停止,standby任然會接收,但不會應用)
SQL> alter database recover managed standby database cancel;
停止redo傳輸應用,standby資料庫
主庫:SQL> ALTER SYSTEM SET log_archive_dest_state_2='DEFER';
System altered.
備庫:SQL> alter database recover managed standby database cancel;
alter database recover managed standby database cancel
*
ERROR at line 1:
ORA-16136: Managed Standby Recovery not active
4 物理standby的角色切換
Switchover跟failover
Switchover:切換不會丟失資料,手動觸發或者定時計劃觸發,
Failover:不可預知的原因導致不能恢復或者恢復時間較長,這就需要failover,
1 物理的switchover切換
1轉換前的準備工作
檢查各資料庫的初始化引數,確認轉換的primary跟standby,以及確認是否正確的初始化引數的配置
檢查即將成為primary庫是否為歸檔
檢查物理standby的臨時檔案是否存在
確保standby資料庫的rac例項只有一個例項在啟動,
選擇一個最適合轉換的轉換成primary
2物理執行standbyswitchover
1檢查初始化引數
2檢查是否支援switchover(主庫)
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
--------------------
SESSIONS ACTIVE:當前任然有人連線primary資料庫,(通過as sysdba連線,就會產生這樣的狀態)
primary>select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
standby >select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
NOT ALLOWED
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
TO STANDBY
如果該值為to standby,表示支援切換
SQL> select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
RECOVERY NEEDED
3啟動switchover
首先將primary庫切換到standby狀態
Primary SQL> alter database commit to switchover to physical standby;(with session shutdown)
並將該primary重新啟動到mount狀態
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.
SQL> alter database mount standby database;
4 在standby上檢查是否支援switchover
SQL> select name,open_mode,protection_mode,database_role from v$database;
standby >select switchover_status from v$database;
SWITCHOVER_STATUS
----------------------------------------
NOT ALLOWED
顯示的狀態:SWITCHOVER_STATUS,TO PRIMARY,SWITCHOVER PENDING(當前standby資料沒有啟動redo應用,重新執行alter database recover managed standby database disconnect from session;
5轉換角色到primary
SQL> alter database commit to switchover to primary;
待轉換的standby可以是mount或者open read only狀態, 不能是read write
6重新開啟primary(新)
SQL> shutdown immediate
ORA-01507: database not mounted
ORACLE instance shut down.
SQL> startup
2物理的failover切換
Note:
1 failover後,原primary不再是dg的一部分
2 在多數情況下,其他物理/邏輯standby不直接參與failover過程,不需要做操作
3 某些情況下,新的primary資料庫配置後,需要重新建立dg配置中其他的所有的standby
4 在執行failover之前,儘量把primary的redo跟歸檔都複製到standby
如果待轉換的模式是最大保護模式,需要切換到最高可用模式
alter database set standby database to maximize performance;
1 檢查歸檔日誌是否連續
查詢待轉換的standby,
select thread#,low_sequence#,high_sequence# from v$archive_gap
如果有返回的記錄,按照列出的記錄號複製對應的歸檔到standby的伺服器,檔案複製過來,通過加入資料字典
alter database register physical logfile 'filespec1';
2 檢查歸檔檔案是否完整
主庫跟備庫分別執行
select distinct thread#,max(sequence#)over(partition by thread#) from v$archived_Log
必須保證2個max相同,不然就需要拷貝歸檔到standby
3啟動failover
alter database recover managed standby database finish force;
force會停止當前活動的rfs程序
4 切換物理standby為primary
alter database commit to switchover to primary;
5啟動新的primary資料庫
處於mount,則直接open,open read only,則shutdown 然後重啟,
5 read only模式開啟物理standby
1物理standby直接從shutdown狀態啟動到read only
直接startup,就是read only狀態
2 物理standby從redo應用到read only狀態
首先需要取消redo應用
alter database recover managed standby database cancel;
然後在開啟db
Alter database open
3從read only切換到redo應用
alter database recover managed standby database disconnect from session;
備庫,read only模式開啟後,可進行查詢,備份等操作
Ready wirte模式開啟資料庫,standby將暫停redo應用。此時可以在備庫上進行恢復,除錯資料,操作完成之後,將資料庫閃回到操作前的狀態(閃回之後,dg會自動同步standby)
6 管理影響物理standby的事件
1 建立表空間或資料檔案
初始化引數standby_file_management用來控制是否自動將primary資料庫增加表空間或資料檔案的改動,傳播到standby伺服器AUTO/MANUAL
AUTO:自動傳播到standby
MANUAL:需要手動複製檔案到standby,並更新控制檔案
1 將standby_file_management 設定為auto(主庫)
SQL> set sqlprompt "primary>"
primary>show parameter standby_file
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
standby_file_management string AUTO
SQL> create tablespace new_dg datafile'/u01/app/oracle/oradata/grs/new_dg.dbf' size 10m;
Tablespace created.
SQL> col tsname for a20
SQL> col dfname for a50
SQL> select ts.name tsname,df.name dfname from v$tablespace ts,v$datafile df
2 where ts.ts#=df.ts#;
TSNAME DFNAME
-------------------- --------------------------------------------------
SYSTEM /u01/app/oracle/oradata/grs/system01.dbf
UNDOTBS1 /u01/app/oracle/oradata/grs/undotbs01.dbf
SYSAUX /u01/app/oracle/oradata/grs/sysaux01.dbf
21 rows selected.
備庫檢視
SQL> col tsname for a20
SQL> col dfname for a50
SQL> select ts.name tsname,df.name dfname from v$tablespace ts,v$datafile df
2 where ts.ts#=df.ts#;
TSNAME DFNAME
-------------------- --------------------------------------------------
SYSTEM /u01/app/oracle/oradata/grs/system01.dbf
UNDOTBS1 /u01/app/oracle/oradata/grs/undotbs01.dbf
SYSAUX /u01/app/oracle/oradata/grs/sysaux01.dbf
USERS /u01/app/oracle/oradata/grs/users01.dbf
20 rows selected.
報錯日誌:
Errors in file /u01/app/oracle/admin/grsdg/bdump/grsdg_dbw0_10650.trc:
ORA-01157: cannot identify/lock data file 20 - see DBWR trace file
ORA-01110: data file 20: '/u01/app/oracle/oradata/grs/SPICEI2I02.dbf'
ORA-27037: unable to obtain file status
Linux Error: 2: No such file or directory
Additional information: 3
Mon May 5 10:41:18 2014
RFS[5]: Archived Log: '/u01/app/oracle/archivelog/1_258_827453919.arc'
Primary database is in MAXIMUM PERFORMANCE mode
RFS[5]: No standby redo logfiles created
待解決::::???
12c dg
SQL> show parameter standby_file
NAME TYPE
------------------------------------ ----------------------
VALUE
------------------------------
standby_file_management string
auto
SQL> create tablespace new_dg2 datafile'/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf' size 10m;
Tablespace created.
2 將standby_file_management 設定為manual(主庫)
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=MANUAL;
在重複上述操作
記錄多了一條,需要重新命名
ALTER DATABASE CREATE DATAFILE ‘/u01/app/oracle/oradata/grs/XXXX’AS
/u01/app/oracle/oradata/grs/new_dg.dbf
然後重新啟動redo應用
alter database recover managed standby database disconnect from session;
disconnect from session---啟動應用,自動退到命令操作符
2 刪除表空間
--對於表空間和資料檔案的操作,STANDBY_FILE_MANAGEMENT=AUTO,無須手工干預,
3 重新命名資料檔案
--需要手工干預,STANDBY_FILE_MANAGEMENT=AUTO/MANUAL
在主庫rename datafile檔案,從庫需要手動操作
備庫:cancel redo log,shutdown,重新命名資料檔案,在startup mount,重啟redo 應用
alter tablespace new_dg2 offline;
mv /u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf /u01/app/oracle/oradata/hongquan/hongquantest/new_dg2_test.dbf
alter tablespace new_dg2 rename datafile
'/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2.dbf' to
'/u01/app/oracle/oradata/hongquan/hongquantest/new_dg2_test.dbf';
alter tablespace new_dg2 online;
alter system switch logfile;
select name from v$datafile;
alter database recover managed standby database cancel;
mv /u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf /u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf
----12c,備庫ready only模式,不能改
alter tablespace new_dg2 rename datafile
'/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf' to
'/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf';
alter database recover managed standby database disconnect from session;
select name from v$datafile;
---12c 線上重新命名資料檔案
ALTER DATABASE MOVE DATAFILE '/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2.dbf'
to
'/u02/app/oracle/oradata/hongquan1/hongquantest/new_dg2_test.dbf';
4 新增或刪除redologs檔案
--需要手工干預改檔案的刪除和建立
無論主庫端對日誌組或日誌檔案的操作是否傳播到了standby端,也不會影響到standby的執行。
在主庫增加或刪除redo logs時,一定記得手工同步相關物理standby中的相關設定,保證standby log比primary redolog多一組操作要將STANDBY_FILE_MANAGEMENT=MANUAL
5垮open_resetlogs的應用
1 監控primary和standby庫的事件
2 動態效能檢視
1v$managed_standby 顯示物理standby資料庫相關程序的當前狀態
standby>select process,client_process,sequence#,status from v$managed_standby;
ARCH ARCH 0 CONNECTED
MRP0 N/A 37 APPLYING_LOG
RFS ARCH 0 IDLE
2 v$archive_dest_status 顯示歸檔檔案路徑配置資訊及redo的應用情況
standby>select dest_name,archived_thread#,archived_seq#,applied_thread#,applied_seq#,db_unique_name from v$archive_dest_status where status='VALID';
3v$archived_log 檢查歸檔檔案路徑和建立資訊
standby>select name,creator,sequence#,applied,completion_time from v$archived_log;
4 v$log_history 查詢歸檔歷史
select first_time,first_change#,next_change#,sequence# from v$log_history;
standby>select thread#,max(sequence#) as "last_applied_log" from v$log_history group by thread#;
5 檢視物理standby未接受的日誌檔案
standby>select local.thread#,local.sequence# from
2 (select thread#,sequence# from v$archived_log where dest_id=1) local
3 where local.sequence# not in
4 (select sequence# from v$archived_log where dest_id=2 and thread#=local.thread#);
3 管理歸檔中斷gap
4 standby的選擇資料保護模式
Primary的修改能否在standby端看到,受幾個方面的影響:
1:同步模式:預設情況primary端傳送歸檔日誌通過ARCH的方式,只有當primary切換日誌時,產生的歸檔日誌才會傳送到standby端。如果standby端配置了standby redologs檔案,dg支援以lgwr方式傳輸redo資料,這樣primary產生的redo就能及時傳送到standby端。
2:是否啟動了應用:將redo傳送到standby端,並不代表standby端應用了改redo,必須手動執行命令。預設情況下,物理standby的應用執行是恢復過程,只有當主庫primary庫執行切換操作後,才會對切換產生的歸檔檔案進行應用,在時效上比primary有延後
3:是否實時應用:standby端配置了standby redologs,並且prim傳輸redo日誌時採用了lgwr同步傳輸的方式,這是redo傳輸實時(async,sync)
1 Dataguard 服務
1 redo傳輸服務rts
1 認識LOG_ARCHIVE_DEST_N引數
LOG_ARCHIVE_DEST_N(1-10)定義redo 傳送的目的地,通過location或者service 來指定本地還是遠端service,LOG_ARCHIVE_DEST_N都有對應的LOG_ARCHIVE_DEST_STATE_N用來指定LOG_ARCHIVE_DEST_N的屬性是否生效,有4種屬性
Enable:預設,表示允許傳輸
Defer:屬性有效,但暫不使用該歸檔路徑
Alternate:禁止傳輸,其他的失敗,會自動enable
Reset:與defer相似,
LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
LOG_ARCHIVE_DEST_STATE_1='ENABLE'
用過service關鍵字指定redo的傳輸
LOG_ARCHIVE_DEST_2='SERVICE=‘’
log_archive_dest_state_2='DEFER'
可以通過alter system set來修改2個引數,修改會在下次日誌切換時生效
Alter system set LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
SQL> col name for a15
SQL> col value for a20
SQL> set pageline 1000
SP2-0158: unknown SET option "pageline"
SQL> set pagesize 1000
SQL> set linesize 1000
SQL> show parameter log_archive_dest
NAME TYPE VALUE
------------------------------------ ---------------------- ------------------------------
log_archive_dest string
log_archive_dest_1 string LOCATION=/u01/app/oracle/archi
velog/ VALID_FOR=(ALL_LOGFILES
,ALL_ROLES) DB_UNIQUE_NAME=grs
log_archive_dest_10 string
log_archive_dest_2 string SERVICE=grsdg LGWR ASYNC VALID
_FOR=(ONLINE_LOGFILES,PRIMARY_
ROLE) DB_UNIQUE_NAME=grsdg
2 使用ARCn程序傳送redo資料
預設情況下,使用ARCn程序傳送redo資料,(只支援最高效能保護模式),在其他模式下需要lgwr傳輸,可以增加arcn程序
Alter system set log_archive_max_process=n;(0-30)
ARCHn歸檔過程,
Primary發生日誌切換時,就會產生歸檔,:分別在primary跟standby
一旦arc0完成線上日誌的歸檔,arc1就開始傳輸歸檔中的redo到standby(假設有2個程序)
本地歸檔與遠端歸檔並無聯絡,
3 lgwr程序傳輸redo
Lgwr程序不需要等日誌完成切換或歸檔才傳輸,standby資料庫的lgwr程序會選擇一個standby redologs檔案對映primary資料庫當前活動的聯機重做日誌檔案,一旦primary有redo產生,根據引數中的sync或async來確定同步或非同步方式傳送redo
1 lgwr同步redo流程
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
*.LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR SYNC new_timeout=30
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.log_archive_dest_state_2='DEFER'
---- new_timeout 連線超時,會返回錯誤
2 lgwr不同步歸檔流程
*.LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=grs'
*.LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC
*.LOG_ARCHIVE_DEST_STATE_1='ENABLE'
*.log_archive_dest_state_2='DEFER'
4安全傳輸redo
Redo傳輸的過程中使用密碼驗證的方式,保證primary跟standby的sys密碼一樣
什麼時候傳送
1 VALID_FOR屬性指定傳輸及接受物件
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
2 通過db_unique_name指定資料庫
DB_UNIQUE_NAME='grs'
LOG_ARCHIVE_CONFIG='DG_CONFIG=(grs,grsdg)'
3 出錯了怎麼辦
LOG_ARCHIVE_DEST_1有幾個屬性來控制出現錯誤時採取的措施
1 reopen 指定時間後再次嘗試歸檔
Reopen=seconds(300)預設
LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grsdg reopen=100'
2 alternate指定替補歸檔路徑
LOG_ARCHIVE_DEST_1='LOCATION=/u01/app/oracle/archivelog/ alternate=LOG_ARCHIVE_DEST_2'
LOG_ARCHIVE_DEST_STATE_1='ENABLE'
LOG_ARCHIVE_DEST_2='LOCATION=/u01/app/oracle/archivelog2/'
LOG_ARCHIVE_DEST_STATE_2='ALTERNATE'
3 max_failure控制最大失敗次數
LOG_ARCHIVE_DEST_2='SERVICE=grsdg LGWR ASYNC reopen=100 max_failure=3'
4 管理日誌檔案
預設情況下,本地的歸檔都是放在LOG_ARCHIVE_DEST_2='location的路徑下
設定是否可以被重用
設定控制檔案中記錄重用及增長規則
多個standby間共享檔案路徑
Dependency屬性
2 log應用服務(log apply service)
Data guard用過redo來維持primary跟standby之間的一致性
Redo:物理standby專用,通過介質恢復的方式保持一致
Sql:邏輯standby專用,通過logminer分析sql語句,在standby端執行
因此物理的standby必須是mount狀態(10g),邏輯可以是read only
1 redo實時應用
Redo不需要等歸檔完成了,接收到即可應用,standby端配置了standby redologs,物理實時啟動,
alter database recover managed standby database using current logfile
2 redo延遲應用
LOG_ARCHIVE_DEST_2='SERVICE=grsdg ARCH VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=grsdg DELAY=15'
DELAY 預設30分鐘
alter database recover managed standby database nodelay disconnect;
3應用redo到standby資料庫
啟動redo應用
alter database recover managed standby database disconnect;
停止redo應用
alter database recover managed standby database cancel;
4選擇資料庫保護模式
1 檢視當前資料庫的保護模式
select db_unique_name,open_mode,database_role,switchover_status,
dataguard_broker,protection_mode,remote_archive,guard_status from
v$database;
2 修改初始化引數
Alter system set
3設定新的保護模式,並重啟db
alter database set standby database to maximize availability