物理Standby和邏輯Standby
1. 物理Standby
Redo Apply: 通過oracle的恢復機制,基於數據庫級別應用redo數據,要求數據庫在mount狀態,不能open。
Read Only: 可以以read only模式打開,以便在standby執行查詢等操作,此時雖然還可以接收redo,但無法應用,直到切換回redo apply狀態才可以再應用。
Read Write: 可臨時性的以read write模式打開,此時日志不傳輸也不應用,如果設置了flashback area,閃回恢復至read write前狀態后,又可以進行redo apply了。
優點:
1) 可保證standby和primary物理級別上的完全一致性。
2) 效率高,因為是使用最底層的塊級別上的復制。
缺點:
1) 在與primary同步時,standby不能open,無法分擔primary上的負載。
2. 邏輯Standby
SQL Apply: 從redo 日志中提取SQL語句應用,數據庫處於open(read write)模式下。
優點:
1) 在與primary同步時,standby處於open狀態,可分擔primary上部分的查詢和報表服務。
缺點:
1) standby和primary的物理結構不一致,且對某些數據和SQL語句有限制。
2) 效率較低,因為是執行SQL語句。
===========================
以上寫的都是10中的特性,在11g中,dataguard有了新特性:
物理standby在以read only模式打開的同時,還可以做redo apply,類似於邏輯standby的特點。
下面開始搭建過程:
Oracle Dataguard step by step
1、將DB服務器設置為歸檔模式,使用以下命令:
Shutdown immediate
Startup mount
Alter database archivelog;
Alter database open;
Archive log list;(查看歸檔狀態)
2、設置DB服務器為force logging模式,使用如下命令;
alter database force logging;
select force_logging from v$database;(查看設置狀態)
3、同步密碼文件;
Orapwd file=D:\oracle\1120\database\pwdorcl.ora password=orcl10g entries=10
並把新生產的密碼文件復制到備庫D:\oracle\1020\database\下
4、編輯DB服務器上的D:\oracle\admin\pfile\initorcl.ora文件,添加以下內容:
#Primary Database Primary role Parameters
db_unique_name=production
log_archive_dest_1 = 'location=d:\oracle\admin\archive valid_for=(all_logfiles,all_roles)
log_archive_dest_2='SERVICE=standby LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=standbydb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=enable
#log_archive_dest_state_2=defer
log_archive_format = %%ORACLE_SID%%T_%TS%S%R.ARC
remote_login_passwordfile=exclusive
#Primary Database Standby role Parameters
fal_server=standby
fal_client=production
#standby_archive_dest='D:\oracle\admin\archive\standby'
standby_file_management=auto
log_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
db_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
注意:歸檔日志文件(ARC文件)與數據文件(DBF文件)不能存放在同一物理設備上。
5、備份DB服務器上的D:\oracle\1020\network\admin\tnsnames.ora文件
6、編輯DB服務器上的D:\oracle\1020\network\admin\tnsnames.ora文件,添加以下內容:
standby =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = Standby服務器名或IP地址 )(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
7、在DB服務器上建立standby日志文件,使用以下命令;
ALTER DATABASE ADD STANDBY LOGFILE 'd\oracle\oradata\stby_redo1.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo2.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo3.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo4.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo5.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo6.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo7.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo8.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo9.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo10.rdo' SIZE 104857600;
ALTER DATABASE ADD STANDBY LOGFILE 'd:\oracle\oradata\stby_redo11.rdo' SIZE 104857600;
注意:Standby日志文件應建立11組。(要比主庫上的redo日志多一組)
以下命令為查看日志狀態及數據庫狀態:
Select member, group# from v$logfile;
Select controlfile_type,open_mode from v$database;
8、在DB服務器上建立standby服務器的控制文件,使用以下命令:
Alter database create standby controlfile as ‘d:\control01.ctl’;
9、在DB服務器及Standby服務器上停止Oracle Service;
shutdown immediate;
10、將DB服務器上的數據庫文件拷貝到Standby服務器上;
復制DB服務器數據文件 d:\oracle\oradata 到Standby d:\oracle\oradata
這里采用的是冷備的方式,也可以用rman的duplicate 在線復制
rman target sys/oracle@production auxiliary sys/oracle@standby nocatalog
duplicate target database for standby from active database nofilenamecheck;
11、復制第9步建立的控制文件到Standby服務器
Copy D:\control01.ctl to Standby Server d:\oracle\oradata\control01.ctl
Copy D:\control01.ctl to Standby Server d:\oracle\oradata\control02.ctl
12、在DB服務器上啟動oracle
13、備份Standby服務器上的D:\oracle\1020\database\initorcl.ora文件;
14、在Standby服務器編輯D:\oracle\1020\database\initorcl.ora文件,增加以下內容;
#Standby Database standby role parameters
db_unique_name=standby
fal_server=production
fal_client=standby
log_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
db_file_name_convert=('d:\oracle\oradata\','d:\oracle\oradata\')
standby_archive_dest='D:\ORACLE\admin\archive\standby' ------該參數在11g中棄用,
standby_file_management=AUTO
# Standby database primary role parameters
log_archive_dest_1 = 'location=d:\oracle\admin\archive valid_for=(all_logfiles,all_roles)
log_archive_dest_2='SERVICE=production LGWR ASYNC valid_for=(online_logfiles, primary_role) db_unique_name=prodb'
log_archive_dest_state_1=ENABLE
log_archive_dest_state_2=defer
#log_archive_dest_state_2=ENABLE
log_archive_format = %%ORACLE_SID%%T_%TS%S%R.ARC
remote_login_passwordfile=exclusive
15、備份Standby服務器上的D:\oracle\1020\network\admin\tnsnames.ora文件
16、在Standby服務器編輯D:\oracle\1020\network\admin\tnsnames.ora文件,增加以下內容:
production =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ‘DB服務器名或IP地址’)(PORT = 1521))
)
(CONNECT_DATA =
(SID = orcl)
)
)
17、將Standby服務器上的Oracle用NOMOUNT狀態啟動;
Shutdown immediate;
Startup nomount;
18、激活Managed recovery Process (MRP),用以下命令: 取消mrp: alter database recover managed standby database cancel;
Alter database mount standby database;
Alter database recover managed standby database disconnect from session;
19、驗證tnsname
Tnsping production (在Standby服務器上執行)
Tnsping standby(在DB服務器上執行)
20、在DB服務器和Standby服務器上驗證角色狀態
Select controlfile_type,open_mode from v$database;
DB 服務器顯示如下內容:
Standby顯示如下內容:
21、檢查日志的傳輸及應用
在DB服務器上執行如下命令:
Alter system switch logfile;
Archive log list;(注意歸檔日志序列號)
在Standby服務器上執行如下命令;
Select sequence#,name,applied from v$archived_log;(注意歸檔日志是否全部應用,歸檔日志序列是否最后一個)
dataguard --swithover 和failover的說明:
SWITCHOVER
Switchover是有計划的將primary切換為standby,standby切換為primary.在主庫結束生產后,備庫應用完所有主庫archivelog或者redo log后進行切換,不丟失數據。
常用場景:
(1) 有計划的災備切換演練,如測試災備站點的可用性,客戶端連接等,確保主庫發生重大意外時,可以切換至備庫正常運轉。
(2) 主庫長時間的維護升級,如OS升級,DB滾動升級,更換存儲,更換OS硬件設備等。
(3) 切換有風險,一般不做切換。
FAILOVER
Failover通常在主庫突發故障,短時間無法解決,考慮到備庫的可用性,數據丟失的容忍度,迫切需要向外提供數據庫服務時進行Failover.
Failover前,如果數據庫沒有操作在最大保護模式,可能發生數據丟失。
Failover前,需要將准備Failover的備庫置於最大性能模式。
Failover前,盡量應用所有的主庫重做數據,減少數據丟失。
Failover后,原主庫將從DG配置中刪除,如果原主庫啟用了Flashback,則在修復故障后,故障的數據庫可恢復為新的standby數據庫。
Oracle11.2之前,可以拷貝primary的online redo log到standby做recover,從Oracle11.2開始,Oracle提供了flush redo到standby的功能,當primary不能OPEN時,啟動到mount狀態,standby redo apply處於激活狀態,執行以下語句flush redo到standby,以此來減少數據丟失:
SQL> alter system flush redo to target_db_name;
具體切換過程
①switchover-----無損轉換
1、檢查primary數據庫是否支持切換成standby
SQL>Select switchover_status from v$database;
如果支持則status狀態為 To standby 或session active(當前有用戶連接)
2、啟動switchover
SQL>alter database commit to switchover to standby/physical standby with session shutdown;
3、SQL>shutdown immediate
SQL>startup mount
4、檢查standby庫是否支持切換
SQL>Select switchover_status from v$database;
如果支持則status狀態為 To primary或session active(當前有用戶連接)或switchover pending (standby庫沒有啟用redo應用)
如果為switchover pending狀態則需要執行啟用redo日志應用:
SQL>alter database recover managed standby database disconnect from session;
5、轉換角色到primary
SQL>alter database commit to switchover to primary with session shutdown;
SQL>alter database open;
②failover-----會丟失數據
執行failover后原primary庫將不再是dataguard中的一部分,所以在執行failover之前,盡可能將原primary庫中的redo文件(含聯機重做日志文件和歸檔日志文件)都復制到standby庫
1、如果待轉換的standby庫處於maximum protection模式,需要切換到maximum performence模式
SQL>alter database set standby database to maximum performence;
2、檢查歸檔日志是否連續
查詢待轉換standby庫(原primary)的v$archive_gap,確認歸檔文件是否連續
SQL>select thread#,low_sequence#,high_sequence# from v$archive_gap;
如果有返回記錄,則按照列出的記錄號復制對應的歸檔日志到待轉換的standby服務器
文件復制過去后在待轉換的standby服務器上執行:
SQL>alter database register physical logfile ‘filespec1’;
3、檢查歸檔文件是否完整
分別在兩台服務器上執行:
SQL>select distinct thread#,max(sequence#) over(partition by thread#) a from v$archive_log;
4、啟動failover
SQL>alter database recover managed standby database finish force;
5、切換物理standby為primary
SQL>alter database commit to switchover to primary;
6、啟動新的primary
如果當前庫為mount則直接open,如果為read only,則要先shutdown再open
完!
================================================================================
Standby Redo Log就是在Standby端應用傳遞Redo Log過程中,逐步執行的online redo log。Standby端雖然也有online redo log,但是在redo apply應用的過程中,是不使用online redo log的。即使是11g Active Data Guard支持apply中讀取standby數據,這個操作也是read-only的,並不涉及當前實例redo log的生成(注意是生成)。所以,如果一直是在Standby角色,online redo log是不需要的。
Primary傳遞過來的redo log信息,是存放在standby redo log組內進行apply的。並且隨着主庫Primary日志的切換動作而切換。這也就是為什么推薦standby redo log的大小和Primary online redo log的大小保持一致的原因。
Oracle Dataguard提供了三種數據保護模式,上述采用的最大性能模式。
1.最大保護模式
1)這種模式提供了最高級別的數據保護能力;
2)要求至少一個物理備庫收到重做日志后,主庫的事務才能夠提交;
3)主庫找不到合適的備庫寫入時,主庫會自動關閉,防止未受保護的數據出現;
優點:該模式可以保證備庫沒有數據丟失;
缺點:主庫的自動關閉會影響到主庫的可用性,同時需要備庫恢復后才能提交,對網絡等客觀條件要求非常的高,主庫的性能會因此受到非常大的沖擊。
2.最大可用性模式
1)該模式提供了僅次於“最大保護模式”的數據保護能力;
2)要求至少一個物理備庫收到重做日志后,主庫的事務才能夠提交;
3)主庫找不到合適的備庫寫入時,主庫不會關閉,而是臨時降低到“最大性能模式”模式,直到問題得到處理;
優點:該模式可以在沒有問題出現的情況下,保證備庫沒有數據丟失,是一種折中的方法;
缺點:在正常運行的過程中缺點是主庫的性能受到諸多因素的影響。
3.最大性能模式
1)該模式是默認模式,可以保證主數據庫的最高可用性;
2)保證主庫運行過程中不受備庫的影響,主庫事務正常提交,不因備庫的任何問題影響到主庫的運行;
優點:避免了備庫對主數據庫的性能和可用性影響;
缺點:如果與主庫提交的事務相關的恢復數據沒有發送到備庫,這些事務數據將被丟失,不能保證數據無損失;
最大保護 | 最大可用 | 最大性能 | |
對主數據庫性能影響 | 較高 | 較高 | 低 |
對網絡鏈路要求 | 極高 | 高 | 低 |
備份數據庫發生故障 | 主數據庫不可用 | 無影響 | 無影響 |
數據保護 | 無數據丟失 | 基本無數據丟失 | 少量數據丟失 |
修改數據保護模式步驟
1)關閉數據庫,重啟到Mount 狀態,如果是RAC,需要關閉所有實例,然后只啟動一個實例到mount狀態。
2)修改模式:
語法:ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE {PROTECTION | AVAILABILITY | PERFORMANCE};
如:SQL>ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
3) 打開數據庫: alter database open;
4) 確認修改數據保護模式:
SQL>select protection_mode,protection_level from v$database;