Oracle Stream Replication簡介
作者/黃俊曉
前言
當一個系統上線之後,每日會接收到成千上萬筆的訊息,並且將某些訊息寫入資料庫中(如下單資訊)。該如何將這些資料備份就是一件很重要的事情,因為當主資料庫主機發生異常時,才可以迅速的啟用擁有相同資料的備援資料庫主機。
Oracle有以下兩種備份方式:Data Guard與Stream,其中Stream再分為Stream Replication與Advanced Replication。而本文主要介紹的是Stream Replication。
Stream Replication簡介與原理
Stream是Oracle中用來收集資料庫資訊,並透過Data mining技術解析在保存時間內的資料庫訊息,然後將這些事件發送給不同的資料庫中。是 Oracle Advanced Queue技術的一種擴展應用,並採用與topic相似的原理,將依據oracle制定關聯規則的方式讓互相連結的DB Server共同分享所擁有的訊息,進而達到資料同步的目的。
從DBA的觀點來說明,就是分析Oracle的log (Redo & Archive),然後把這些訊息透過網路傳給其他的資料庫,讓雙方的資料可以同步。
Redo:Online的log,Logminer scan完就會清除
Archive:redo不夠用時另外儲存的log
流程
負責傳送資料的資料庫稱為Source DB,接收的一方稱為Target DB,建立Stream時分別在Source & Target 上個別建立一個新的Queue,且Source 端的Queue (Sq)上會有一個Capture Process,這個Process運用Logminer從redo & archive獲得訊息,並轉換成LCR(Logic Change Record)格式,保存在Sq中,然後透過Propagation Process把這些記錄用網路的方式傳給Target 端的Queue(Tq),而在Target 端也有一個Apply Process用來處理Tq所接收到的LCR,然後應用在Target 端,實現資料同步。如下圖所示:

《圖一》
特性
‧可多方同步數據
‧可支援雙向傳遞
‧可支援Oracle與非Oracle之間的同步
‧可採用Db、Schema、Table三種類型的同步
建立步驟
一、建置 ssh trust tunnel
hostA# ssh-keygen -t rsa
hostA# cat ~/.ssh/id_rsa.pub >~/.ssh/authorized_keys
hostA# scp ~/.ssh/authorized_keys hostB:/root/.ssh/authorized_keys
hostB# ssh-keygen -t rsa
hostB# cat ~/.ssh/id_rsa.pub >>~/.ssh/authorized_keys
hostB# scp ~/.ssh/authorized_keys hostA:/root/.ssh/authorized_keys
二、設定SELinux為Permissve模式
hostA# setenforce 0
hostA# getenforce
Permissive
hostB# setenforce 0
hostB# getenforce
Permissive
三、配置工作目錄,備份目錄
hostA# mkdir -p /opt/Backup/Archive
hostA# mkdir -p /opt/Backup/FullBackup
hostA# chown -R enterprisedb:enterprisedb /opt/Backup
hostB# mkdir -p /opt/Backup/Archive
hostB# mkdir -p /opt/Backup/FullBackup
hostB# chown -R enterprisedb:enterprisedb /opt/Backup
四、設定 postgresql.conf 資料庫定義檔, 並設定Database 為Archive mode.
max_connections = 100
shared_buffers = 2048MB
work_mem = 32MB
shared_preload_libraries = '$libdir/dbms_pipe,$libdir/edb_gen,$libdir/plugins/plugin_debugger,$libdir/plugins/plugin_spl_debugger,$libdir/sql-profiler'
wal_level = hot_standby
synchronous_commit = on
archive_mode = on
archive_command = '/bin/bash /opt/Backup/archive.sh %p %f'
max_wal_senders = 2
synchronous_standby_names = '*'
hot_standby = on
五、重新啟動HostA及HostB服務即可
優缺點
一、Data Guard
Data guard在高可用及容災方面一般是dba的首選,畢竟data guard在這方面存在壓倒性的優勢,不管是物理備用資料庫(physical standby database)還是邏輯備用資料庫(logical standby database),它們都具有一些共同的特徵。
配置和管理方面的成本:data guard比stream replication簡單方便;安全與穩定方面的成本:data guard比stream replication穩定可靠。
對於一個24x7的系統來說,這些是非常重要的,系統當機時間的增加不僅影響著公司的形象,還會影響公司的效益;採用data guard,資料的安全性相當有保障,物理備用資料庫可以在最短的時間完成故障切換,邏輯備用資料庫在保障資料安全的同時, 也可以承擔大量的報表等業務;由於data guard的配置與管理比較簡單,同理也降低了dba的工作強度。
二、Stream Replication
Stream replication 適用於如下情況:
1、局部複製:stream可以只複製某些表或某些模式
2、異構環境:充分利用現有的設備與技術
3、遠端容災:stream對網路的要求較data guard低
Stream replication有靈活的複製策略,不僅可以配置只複製某些表,還可以配置僅複製某些表上的ddl或dml,相比data guard必須整個資料庫複製而言,可以節省相當的存儲投資,畢竟對於某些海量資料而言,有許多是不必要複製的。
如果在異構環境,即不同的作業系統,那data guard將會束手無策,非stream replication莫屬,這樣可以充分利用現有的環境,配置高用可方案,在異構環境,stream replication將會是advanced replication的強勁對手。
Stream replication傳播的是經過logminer挖掘並包裝的邏輯改變記錄(LCRs),相比data guard傳送archived redo log、advanced replication的mview log與mview刷新的方式,stream replication對網路的需求降低了很多,在遠端異地容災的過程中,租用網路帶寬是一筆較高的費用,stream replication可以適當地降低這筆費用。
三、Advanced Replication
advanced replication相對於data guard,缺點是:配置與管理較複雜、安全與穩定性不夠;優點:局部複製、異構環境等。advanced replication是一種相當成熟的技術,在許多關鍵系統中得到成功的運用,相對於9iR2推出的stream replication而言,雙方適用的環境雖然相當,比如都可以進行局部複製、異構複製、遠端容災等,advanced replication目前在穩定性與安全性方面更經得起考驗。
對比stream replication與advanced replication底層的實現技術,stream replication在即時性、穩定性、高效率、低消耗(較少的cpu/network資源)等方面更有優勢,但凡一些新推出的功能,都或多或少存在一些不確定的因素。
在10gR1中,oracle針對目前stream replication存在的弱點進行了增強,不僅提供了從advanced replication遷移到stream replication的腳本,還提供了stream replication的配置與監控工具,stream replication在配置與管理方面必將智慧化、簡單化,擔負起與shareplex爭奪企業資料複製市場的重任。
結論
Stream Replication可以使用較低的資源與網路流量將資料從主資料庫備份至備份資料庫而且兩個資料庫並不一定要都是oracle,還可以雙向傳遞資料,但操作上較為麻煩。而Data Guard相對起來較為容易,但僅只能用於oracle資料庫之間且只能單向傳送,各種方式都有其優缺點。
參考文獻
1.
http://docs.oracle.com/cd/B19306_01/server.102/b14228/gen_rep.htm
2.
http://www.test104.com/tw/tech/4717.html
3.
http://alexc168.blogspot.tw/2013/02/streaming-replication.html