Oracle Data Guard 的配置在網上有很多資料,但是沒有一個完整的,配置下來多少有些問題。在踩了各種坑之后,自己終於配置成功,就想把這過程記錄下來。
1 測試環境
主數據庫:windows7;版本Oracle11g(11.2.0);IP地址10.0.1.165;實例SID:PRIMARY
備用數據庫:windows7;版本Oracle11g(11.2.0);IP地址10.0.2.116;實例SID:STANDBY
2 運行Data Guard的條件
1、在主數據庫和備用數據庫的所有機器上必須安裝同一個版本的Oracle企業版。:SELECT * FROM V$VERSION;
2、主數據庫必須運行在歸檔模式下,推薦主和備用數據庫都是force Logging模式,這樣方便雙向自由切換:ALTER DATABASE FORCE LOGGING;
3、主數據庫和備用數據庫的操作系統必須一樣(允許版本不同),備用數據庫可以使用與主數據庫不同的目錄結構,ORACLE推薦使用相同的目錄結構。
4、主備用數據庫硬件系統的體系結構必須相同,但允許主備數據庫硬件的配置可以不同如:CPU數量、內存大小、存儲配置等。
5、主備數據庫可以是單實例的數據庫,也可以是多實例的RAC數據庫。
6、每個主備數據庫必須有它自己的控制文件,ORACLE NET不同,必須分別修改。
3 Data Guard配置步驟
1、 本例中主數據庫Oracle安裝在: E:\app\Administrator,備用安裝在:E:\app\Administrator,建議使用相同的安裝路徑。安裝時先不要安裝數據庫,即在安裝過程中“數據庫配置”一項下面選擇“只安裝軟件”;
2、 在主數據庫上使用DBCA(Database Configuration Assistant)命令建一個數據庫,SID設為PRIMARY;
3、 用Oracle Net Configuration Assistang配置監聽程序
配置完成后在windows服務中,可以看到監聽服務
4、 打開cmd,輸入sqlplus "/as sysdba" ,連接到Oracle.
5、 設置主數據庫的歸檔路徑為:
E:\app\Administrator\database\Archive
SQL>alter system set log_archive_dest_1
='LOCATION=D:\app\Administrator\database\Archive MANDATORY' scope=both;
6、 將主數據庫實例、數據庫關閉,然后啟動實例,但不打開數據庫,只啟動到數據庫掛載模式:
SQL>shutdown immediate;
SQL>startup mount;
7、 將主數據庫設置成歸檔狀態和自動歸檔模式:
SQL>alter database archivelog;
SQL>alter system set log_archive_start=true scope=spfile;
8、 在主數據庫上面創建備用數據庫的控制文件standby.ctl:
SQL>alter database create standby controlfile as 'E:\app\zengjiyang\oradata\standby.ctl';
9、 在主數據庫上面創建備用數據庫的初始化參數文件standby.ora(將其拷貝回備用數據庫后轉換成備用數據庫的spfile)
SQL>create pfile='E:\app\zengjiyang\oradata\standby.ora' from spfile;
10、查看主數據庫的數據文件及其的位置:SQL>select name from v$datafile;記下查詢結果中的數據文件的位置。
11、關閉實例:SQL>shutdown immediate;
12、將第8步中的standby.ctl、第9步中的standby.ora和第10步驟中的數據文件、還有E:\app\Administrator\oradata\PRIMARY路徑下面的聯機日志文件(REDO.LOG)、E:\app\Administrator\product\11.2.0\dbhome_1\database里面的口令文件PWDPRIMARY.ora備份出來,拷貝到備用數據庫中;在備用數據庫中創建路徑E:\app\Administrator\oradata\PRIMARY,存放standby.ctl、數據文件、聯機日志文件;
創建路徑E:\app\Administrator\admin\PRIMARY,在里面創建空文件夾bdump、cdump、udump、create、pfile;
將standby.ora放到E盤根目錄下面;
將口令文件PWDPRIMARY.ora更名為PWDSTANDBY.ora,放到備用數據庫的E:\app\Administrator\product\11.2.0\dbhome_1\database下面。
13、回到主數據庫,啟動主數據庫實例和數據庫:SQL>startup
14、轉回到備用數據庫,手動創建服務OracleServiceSTANDBY:oradim -new -sid STANDBY -startmode manual,
設置環境變量:在環境變量的“Administrator的用戶變量”一欄里面新建一個值,變量名為ORACLE_SID,變量值為STANDBY(服務名)。
15、創建備用數據庫監聽器OracleOraHome92TNSListener:進入Net Configuration Assistant,使用“監聽程序配置”來創建備用數據庫的監聽器,同時會在E:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN下面生成listener.ora文件,並修改如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = e:\app\Administrator\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:e:\app\Administrator\product\11.2.0\dbhome_1\bin\orapls11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.2.116)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
主數據庫listener.ora修改如下:
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(SID_NAME = PLSExtProc)
(ORACLE_HOME = E:\app\zengjiyang\product\11.2.0\dbhome_1)
(PROGRAM = extproc)
(ENVS = "EXTPROC_DLLS=ONLY:E:\app\zengjiyang\product\11.2.0\dbhome_1\bin\orapls11.dll")
)
)
LISTENER =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.165)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0))
)
)
16、配置本地NET服務名:進入Net Configuration Assistant,使用“本地NET服務名配置”來配置,同時會在E:\app\Administrator\product\11.2.0\dbhome_1
\NETWORK\ADMIN下面生成tnsnames.ora文件。(同第3步,這步如果已經生成了tnsnames.ora文件就可以不用了)
17、配置主和備用數據庫的tnsnames.ora,都將里面的內容設置成如下內容:
主數據庫tnsnames.ora
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.2.116)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PRIMARY)
)
)
PRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.165)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PRIMARY)
)
)
備用數據庫:
STANDBY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.2.116)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PRIMARY)
)
)
PRIMARY =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 10.0.1.165)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PRIMARY)
)
)
18、修改E根目錄下面的初始化參數文件standby.ora,里面的全部內容如下(刪除了原來的control_files參數,將instance_name改成了STANDBY,添加的內容):
*.aq_tm_processes=1
*.background_dump_dest='E:\app\Administrator\admin\PRIMARY\bdump'
*.compatible='11.2.0.0.0'
*.core_dump_dest='E:\app\Administrator\admin\PRIMARY\cdump'
*.db_block_size=8192
*.db_cache_size=728760320
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='PRIMARY'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=PRIMARYXDB)','(PROTOCOL=TCP)'
*.fast_start_mttr_target=300
*.instance_name='STANDBY'
*.java_pool_size=20971520
*.job_queue_processes=10
*.large_pool_size=143654912
*.log_archive_dest_1='LOCATION=E:\app\Administrator\database\Archive'
*.log_archive_start=TRUE
*.open_cursors=300
*.pga_aggregate_target=324009984
*.processes=150
*.query_rewrite_enabled='FALSE'
*.remote_login_passwordfile='EXCLUSIVE'
*.shared_pool_size=242221056
*.sort_area_size=52428800
*.star_transformation_enabled='FALSE'
*.timed_statistics=TRUE
*.undo_management='AUTO'
*.undo_retention=10800
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='E:\app\Administrator\admin\PRIMARY\udump'
*.standby_file_management=AUTO
*.lock_name_space='standby'
*.fal_server='primary'
*.fal_client='standby'
*.standby_archive_dest='E:\app\Administrator\database\Archive'
*.control_files='E:\app\Administrator\oradata\STANDBY.CTL'
19、進入SQLplus將standby.ora創建成備用數據庫的spfile:
SQL>create spfile from pfile='e:\standby.ora';
20、啟動備用數據庫的實例,並且將備用數據庫設置成standby模式:
SQL>startup nomount;
SQL>alter database mount standby database;
21、在備用數據庫啟動日志應用服務:SQL>alter database recover managed standby database disconnect from session;
22、轉到主數據庫,啟動到物理備用數據庫的歸檔:
SQL: alter system set log_archive_dest_2='service=standby mandatory reopen=60'
4 Data Guard檢驗
主庫,歸檔當前日志: SQL> ALTER SYSTEM ARCHIVE LOG CURRENT;
從庫,校驗歸檔日志是否正常接收: SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
從庫,查看新的歸檔日志是否正常用於恢復:
SQL> SELECT SEQUENCE#,APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;
如果都是YES的話就表示成功了。
5 備用庫數據恢復
前面的運作從庫只是將日志文件拿過來存放起來,但並沒有執行日志文件,所以在主庫上所做的操作無法在從庫上得到結果,即無法在從庫上查詢數據。要在從庫上查詢數據,要執行以下語句:在從庫上用sysdba 用戶連接
Sql>alter database recover managed standby database disconnect from session ;
Sql>alter database recover managed standby database cancel ;
Sql>alter database open read only ;
查詢數據即可。查詢完成以后,需要恢復從庫為恢復模式
Sql>alter database recover managed standby database disconnect from session ; 這個功能的可以用來查詢前一天(或者前若干時間)以前的數據,比如報表之類的,因為今天只能查詢昨天以前的報表,對數據的同步性的要求不是那么嚴格。查詢完后一定要將從庫設回恢復模式。
6 Data Guard與OGG的對比
Oracle DataGuard |
Oracle GoldenGate |
|
原理 |
復制歸檔日志或在線日志 |
抽取在線日志中的數據變化,轉換為GGS自定義的數據格式存放在本地隊列或遠端隊列中 |
穩定性 |
作為災備的穩定性極高 |
穩定性不如DataGuard |
維護 |
維護簡單,極少出現問題 |
命令行方式,維護較復雜 |
對象支持 |
完全支持 |
部分對象需手工創建於維護 |
備份端可用性 |
備份端處於恢復或只讀狀態,在只讀狀態下不能同時進行恢復。 |
兩端數據庫是活動的,備份端可以提供實時的數據查詢及報表業務等,從而提高系統整體的業務處理能力,充分利用備份端的計算能力,提升系統整體業務處理性能。可以實現兩端數據的同時寫入 |
接管時間 |
數據庫工作在mount狀態下,接管業務時,數據庫要open |
可實現立即接管 |
復制方式 |
通過恢復機制實現的,無法實現同步復制 |
GoldenGate可以提供秒一級的大量數據實時捕捉和投遞,異步復制方式,無法實現同步復制 |
資源占用 |
復制通過數據庫的LGWR進程或ARCN進程完成,占用數據庫少量資源 |
業務高峰時在數據抽取轉換時消耗系統資源較多,低峰時占用較小 |
異構數據庫支持 |
單一數據庫解決方案,僅運行在Oracle數據庫上,源端和目標端操作系統必須相同,版本號可以不同 |
可以在不同類型和版本的數據庫之間進行數據復制。如ORACLE,DB2,SYBASE,SQL SERVER,INFORMIX、Teradata等。 |
帶寬占用 |
使用Oracle Net傳輸日志,可通過高級壓縮選項進行壓縮,壓縮比在2-3倍 |
利用TCP/IP傳輸數據變化,集成數據壓縮,提供理論可達到9:1壓縮比的數據壓縮特性 |
拓撲結構 |
可以實現一對多模式 |
可以實現一對一、一對多、多對一、雙向復制等多種拓撲結構 |
7 總結
Data Guard的基本原理是將日志文件從原數據庫傳輸到目標數據庫,然后在目標數據庫上應用這些日志文件,從而使目標數據庫與源數據庫保持同步,是一種數據庫級別的高可用性方案。Data Guard不能同步特定的表空間或特定的表,它的作用更像是給主庫建立一個備份庫,如果主庫掛了,可以實時的切換到備庫。所以其意義更多的是數據同步而非數據采集。