Oracle DataGuard是Oracle自帶的數據同步功能,基本原理是將日志文件從原數據庫傳輸到目標數據庫,然后在目標數據庫上應用這些日志文件,從而使目標數據庫與源數據庫保持同步,是一種數據庫級別的高可用性方案。
DataGuard可以提供Oracle數據庫的冗災、數據保護、故障恢復等,實現數據庫快速切換與災難性恢復。在生產數據庫的保證"事務一致性"時,使用生產庫的物理全備份創建備庫,備庫會通過生產庫傳輸過來的歸檔日志或重做條目自動維護備用數據庫。
DataGuard數據同步技術有以下優勢:
1) Oracle數據庫自身內置的功能,與每個Oracle新版本的新特性都完全兼容,且不需要另外付費。
2) 配置管理較簡單,不需要熟悉其他第三方的軟件產品。
3) 物理Standby數據庫支持任何類型的數據對象和數據類型;
4) 邏輯Standby數據庫處於打開狀態,可以在保持數據同步的同時執行查詢等操作。
5) 在最大保護模式下,可確保數據的零丟失。
一、架構
Oracle DataGuard由一個primary數據庫(生產數據庫)及一個或多個standby數據庫(最多9個)組成。組成Data Guard的數據庫通過Oracle Net連接,並且有可以分布於不同地域。只要各庫之間可以相互通信,它們的物理位置並沒有什么限制,不受操作系統的限制。
1.Primary 數據庫
DataGuard包含一個primary數據庫即被大部分應用訪問的生產數據庫,該庫既可以是 單實例數據庫,也可以是RAC。
2.Standby 數據庫
Standby數據庫是primary數據庫的復制(事務上一致)。在同一個Data Guard中可以最多創建9個standby數據庫。一旦創建完成,Data Guard通過應用primary數據庫的redo自動維護每一個standby數據庫。Standby數據庫同樣即可以是單實例數據庫,也可以是RAC結構。
二、服務
重做傳輸服務(Redo Transport Services)
控制redo數據的傳輸到一個或多個歸檔目的地。 日志應用服務(Log Apply Services)
應用redo數據到standby數據庫,以保持與primary數據庫的事務一致。redo數據即可以從standby數據庫的歸檔文件讀取,也可直接應用備用日志文件讀取。 角色轉換服務(Role Transitions)
DataGuard中有兩種角色:primary和standby。角色轉換就是讓數據庫在這兩個角色中切換, 切換分兩種:switchover和failover
1)switchover:轉換primary數據庫與standby數據庫。switchover可以確保不會丟失數據。
2)failover:當primary數據庫出現故障並且不能被及時恢復時,會調用failover將一個standby數據庫轉換為新的primary數據庫。在最大保護模式或最高可用性模式下,failover可以保證不會丟失數據。
三、保護模式
1.最大保護
2.最大可用性
3.最大性能
這部分還未研究。
四、部署安裝步驟
1.主庫准備
a. Ensure that the database is in archivelog mode .
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;
SQL> select log_mode from v$database;
LOG_MODE
------------
ARCHIVELOG
b. Enable force logging
SQL> ALTER DATABASE FORCE LOGGING;
c. Create standby redologs
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo01.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo02.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo03.log' size 200m reuse;
alter database add standby logfile thread 1 '/u01/app/oracle/oradata/oradb/stdredo04.log' size 200m reuse;
d. Modify the primary initialization parameter for dataguard on primary,
alter system set log_archive_config='dg_config=(oradb,oradb_stby)' scope=both;
alter system set log_archive_dest_2='service=oradb_stby async valid_for=(online_logfile,primary_role) db_unique_name=oradb_stby';
alter system set standby_file_management=auto;
alter system set LOG_ARCHIVE_DEST_STATE_1=ENABLE;
alter system set FAL_SERVER=oradb;
alter system set FAL_CLIENT=oradb_stby;
alter system set DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/oradb','/u01/app/oracle/oradata/oradb' scope=spfile;
alter system set LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/oradb','/u01/app/oracle/oradata/oradb' scope=spfile;
e.
編輯listener.ora文件
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = oradb)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(SID_NAME = oradb)
)
(SID_DESC =
(GLOBAL_DBNAME = oradb_stby)
(ORACLE_HOME = /u01/app/oracle/product/19.3.0/db)
(SID_NAME = oradb)
(UR=A)
)
)
f.
編輯tnsnames.ora
$ vi tnsnames.ora
ORADB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.135.245.202)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb)
)
)
ORADB_STBY =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.135.245.203)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = oradb)
(UR=A)
)
)
2.備庫准備
g.將主庫中的網絡文件和口令文件傳輸到備庫;
scp listener.ora tnsnames.ora oracle@10.135.245.203:$ORACLE_HOME/network/admin/
scp orapworadb oracle@10.135.245.203:$ORACLE_HOME/dbs
h.創建備庫參數文件
cd /u01/app/oracle/product/19.3.0/dbhome_1/dbs/
echo
DB_NAME=oradb
DB_UNIQUE_NAME=oradb_stby
db_block_size=8192' >>initoradb.ora
i.直接復制主庫的密碼文件到備庫相應目錄。
scp orapworadb oracle@10.135.245.203:$ORACLE_HOME/dbs/
j.啟動輔助實例
startup nomount pfile=$ORACLE_HOME/dbs/initoradb.ora
k.在線創建備庫
這里直接使用duplicate方式在線創建備庫,在rman中運行下面的腳本:
主機:
[oracle@db01 ~]$ rman target / auxiliary sys/****@oradb_stby
run {
allocate channel prmy1 type disk;
allocate channel prmy2 type disk;
allocate channel prmy3 type disk;
allocate channel prmy4 type disk;
allocate auxiliary channel stby type disk;
duplicate target database for standby from active database nofilenamecheck
spfile
set db_unique_name='oradb_stby'
set fal_client='oradb_stby'
set fal_server='oradb'
set standby_file_management='AUTO'
set log_file_name_convert='/oradb/','/oradb_stby/'
set db_file_name_convert='/oradb/','/oradb_stby/'
set log_archive_config='dg_config=(oradb,oradb_stby)'
set log_archive_dest_2='service=oradb ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) db_unique_name=oradb';
}
l.必要時啟動和停止redo
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
停止redo應用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
開啟redo應用
m.驗證
SQL> select database_role from v$database;
DATABASE_ROLE
---------------- ------- -------
PHYSICAL STANDBY
n.在備庫啟動recover 過程,應用主庫傳過來的日志(默認已經是real-time apply模式,因此省略using current logfile);
SQL> recover managed standby database disconnect from session;
o.查詢v$dataguard_process 視圖,驗證來自主庫傳輸過來的日志過程和備庫應用日志的情況(v$dataguard_process視圖在12.2版本出現,取代了v$managed_standby);
SQL> select role,thread#,sequence#,action from v$dataguard_process;
p.查詢 v$archived_log 視圖,驗證來自主庫傳輸過來的日志變化情況,下面輸出可以看到主庫傳輸過來的日志在增加;
select sequence#,applied from v$archived_log;
主庫;alter system switch logfile;
select sequence#,applied from v$archived_log;
日志增加。
q.建表插入數據驗證。
r. 主備切換
主備庫先查看switchover_status狀態
select switchover_status from v$database;
主庫先操作:
alter database commit to switchover to physical standby with session shutdown; --切換數據庫成物理備庫並且關閉會話,11g數據庫這時候已經關閉了,10g的話,需要進行
select switchover_status from v$database; --查看switchover_status 狀態
shutdown immediate;
startup nomount;
alter database mount standby database;
alter database open read only;
recover managed standby database using current logfile disconnect from session; --開啟實時應用mrp進程
備庫后操作:
alter database commit to switchover to primary; --修改數據庫切換為主庫
shutdown immediate; --關庫
startup --開庫