爲何要寫前言,由於我要吐槽一下。做爲一個Java後端,搭建Oracle Data Guard真的是一件,嗯,既不專業也不擅長的事情,然而,爲何仍是要我來弄?html
由於DBA出差了,咱們這邊急着要,只能趕鴨子上架了,折騰了一天半,終於弄出來了。(趁着沒忘,寫點記錄,否則下次可能要弄兩天)
ps:這篇用markdown寫的,排版不太熟悉,格式你們先忍忍。java
Data Guard 提供管理、監視和自動化軟件,用於建立和維護生產數據庫的一個或多個同步副本,保護 Oracle 數據免受故障、災難、人爲錯誤和數據損壞的影響,同時爲任務關鍵型應用提供高可用性。Data Guard 包括在 Oracle Database 企業版中。sql
----oracle 官方表述數據庫
在咱們的系統中,oracle dg扮演了什麼角色呢,是由於咱們存在一個這樣的場景。假設成都機房部署一套主數據庫Primary,在北京機房部署數據庫Primary的備份庫Standby,Primary會實時同步修改到Standby,當成都機房出現天然災害、重大故障時,應用程序能夠立刻切換到北京機房,能夠不間斷地給客戶提供服務。windows
因此,核心需求就是,主備!並且在咱們這裏,是單向同步的,只會由成都機房同步到北京機房,由於,業務上,成都爲區域中心,北京爲國家級中心,咱們的業務決定,只會由區域中心向國家中心同步,因此,能夠省略北京機房同步到成都機房的配置。後端
主庫流程服務器
在主服務器上,創建主庫(windows上安裝oracle 11g r2的具體步驟:https://download.csdn.net/download/cctvckl/11852093);markdown
修改主庫配置,使得主庫能夠生成redo log,同時,配置備庫的地址,目的是:redo log能夠發給備庫,備庫從新應用redo log,便可和主庫數據保持一致;網絡
上面第二步說到要配置備庫的地址,而這個是經過配置 tnsnames.ora 文件實現的,這個文件能夠簡單理解爲:能夠經過服務名,獲取到網絡內其餘數據庫的配置。好比以下配置:session
cad_192.168.19.97 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.97)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cad) (UR=A) ) )
正常狀況下,鏈接一個數據庫,須要指定:協議(通常默認指定了tcp,不用咱們指定)、ip、端口、serviceName,略顯繁瑣,因此tnsnames.ora提供了一個簡單的方式,以上面爲例,咱們直接用一個字符串 cad_192.168.19.97 來指代咱們要鏈接的數據庫服務。
備庫流程
注意,備庫不須要像主庫那樣的方式去創建數據庫(創建方式請參考上面的連接),而是直接用命令: ORADIM -NEW -SID cadbk(cadbk爲我這邊的數據庫名) 便可。
在主庫所在服務器上,按照上面的文檔,新建主庫。
值得注意的是,由於是全局密碼,因此sys帳號的密碼也是這個,這個帳號後面用得比較多。
登陸主庫,用戶即便用sys用戶,口令爲上一步建立時使用的,我這邊爲123456.
開啓數據庫的歸檔模式
3.1 查詢當前數據庫的模式是否爲歸檔模式
archive log list
我這邊查詢的結果是:非歸檔模式
![](https://img2018.cnblogs.com/blog/519126/201910/519126-20191018132423330-835162661.png)
那要怎麼修改成歸檔模式呢?由於修改成歸檔模式,須要在數據庫mount狀態下修改,因此必須先關閉數據庫,再啓動到mount狀態。
3.2 關閉數據庫
shutdown immediate
3.3 開啓數據庫到mount狀態
startup mount
3.4 修改數據庫的歸檔模式
alter database archivelog;
3.5 驗證是否修改
archive log list
![](https://img2018.cnblogs.com/blog/519126/201910/519126-20191018133212159-778731060.png)
查詢數據庫當前狀態:
select name , open_mode, log_mode,force_logging from gv$database;
其中:name表示數據庫名,open_mode是指當前數據庫所處的狀態,可參考下圖,
log_mode,就是上面咱們說的日誌歸檔模式,force_logging的做用大概是:原本部分命令,若是加了nologging的話,能夠不產生redo log,可是force_logging會強制大部分的操做,具體參考:
修改數據庫爲force logging
alter database force logging;
日誌切換
alter system switch logfile;
建立standby 日誌組
首先查詢當前online redo log的位置,而後咱們再在相同位置建立standby redo log:
select group#,type,member from v$logfile;
從上圖能夠看到,redo log的路徑爲:C:\APP\ADMINISTRATOR\CAD
alter database add standby logfile group 4 ('C:\APP\ADMINISTRATOR\CAD\REDO04.LOG') size 50m;
alter database add standby logfile group 5 ('C:\APP\ADMINISTRATOR\CAD\REDO05.LOG') size 50m;
alter database add standby logfile group 6 ('C:\APP\ADMINISTRATOR\CAD\REDO06.LOG') size 50m;
執行上述命令後,再執行上面的select語句,應該能夠看到,standby 重作日誌已經建立成功了。
修改主庫初始化參數
相關參數的解釋以下:
8.1 查詢db_name、db_unique_name參數
show parameter db_name
,注意,這個參數須要在主備庫一致。主庫上,我這邊查詢出來是 CAD
show parameter db_unique_name
,這個參數須要保證惟一。主庫上,我查詢出來是CAD
8.2 修改 log_archive_log
alter system set log_archive_config='dg_config=(CAD,cadbk)' scope=spfile sid='*';
該參數可參考上述截圖,dg_config中須要羅列該data guard環境中全部db_unique_name。
由於我這裏的打算是,主庫的db_unique_name爲 CAD,備庫的db_unique_name爲cadbk,因此配置爲(CAD,cadbk)
8.3 修改歸檔文件的路徑,這裏能夠指定多個路徑
alter system set log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\CAD\ARCHIVELOG valid_for=(all_logfiles,all_roles) db_unique_name=CAD' scope=spfile sid='*';
本路徑,是指定本機上的歸檔文件路徑。
alter system set log_archive_dest_2='service=CADBK valid_for=(online_logfiles,primary_role) db_unique_name=cadbk' scope=spfile sid='*';
本路徑是設定歸檔文件的第二個目的地,路徑爲service=CADBK,CADBK表示的是tnsnames.ora中的網絡服務名,後續咱們將配置tnsnames.ora,其中CADBK爲:
CADBK = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.89)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cadbk) (UR=A) ) )
設置是否容許redo 傳輸服務傳入redo 數據到指定的路徑:
alter system set log_archive_dest_state_1=enable scope=spfile sid='*';
alter system set log_archive_dest_state_2=enable scope=spfile sid='*';
8.4 建議配置的參數,主要用於數據庫發生主備切換的狀況,即主庫切換爲備庫後,依然能夠和新的主庫
保持一致等。
alter system set standby_file_management='auto' scope=spfile sid='*';
alter system set fal_server='CADBK' scope=spfile sid='*';
alter system set fal_client='CAD' scope=spfile sid='*';
alter system set db_file_name_convert='C:\app\Administrator\oradata\CAD', 'C:\app\Administrator\oradata\cadbk' scope=spfile sid='*';
alter system set log_file_name_convert='C:\app\Administrator\oradata\CAD', 'C:\app\Administrator\oradata\cadbk' scope=spfile sid='*';
alter system set log_archive_format='%t_%s_%r.arch' scope=spfile sid='*';
具體參數的意思以下:
9.建立控制文件
alter database create standby controlfile as 'C:\app\Administrator\89cadbk.ctl';
建立pfile
爲了不上面配置的一堆參數,重啓後丟失,所以將目前程序裏動態修改了的參數(spfile)寫入到pfile(可做爲初始化啓動參數)
create pfile from spfile
重啓數據庫
shutdown immediate
後續啓動數據庫,咱們準備直接用startup命令,該命令會默認首先使用spfile來做爲初始化參數文件,因此這裏,咱們用pfile來建立spfile。
create spfile from pfile
startup
再次執行建立控制文件(不知道這一步是否必要,看到一些資料是在這時候執行的,因此我這裏保險起見,也執行如下)
alter database create standby controlfile as 'C:\app\Administrator\89cadbk.ctl';
配置tnsnames.ora
# tnsnames.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\tnsnames.ora # Generated by Oracle configuration tools. ORACLR_CONNECTION_DATA = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) ) (CONNECT_DATA = (SID = CLRExtProc) (PRESENTATION = RO) ) ) LISTENER_BOL = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521)) CADBK = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.89)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cadbk) (UR=A) ) ) CAD = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.90)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = CAD) (UR=A) ) ) cadbk_192.168.19.89 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.89)(PORT = 1521)) ) (CONNECT_DATA = (SERVICE_NAME = cadbk) (UR=A) ) ) cad_192.168.19.90 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.19.90)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = cad) (UR=A) ) )
裏面主要配置了CAD和CADBK,CAD是針對本主庫上的網絡服務名,CADBK是針對備庫上的服務名。
重啓監聽
lsnrctl stop
lsnrctl start
lsnrctl status
使用tnsping查看tnsnames.ora配置是否生效
tnsping CADBK
其中 CADBK 在tnsnames.ora中已經配置(每一段的等號左邊的字符串)
接下來,進入到備庫所在服務器(192.168.19.89)的操做
建立實例(注意,這裏和主庫的區別,主庫是dbca方式建立的,而咱們的備庫,則直接用下面的命令便可。直接在cmd下執行,不須要登陸sqlplus):
ORADIM -NEW -SID cadbk
建立日誌輸出文件相關目錄。
cd C:\app\Administrator\admin
mkdir cadbk
cd cadbk
mkdir adump bdump cdump udump
mkdir C:\app\Administrator\fast_recovery_area\cadbk
如下是書上的參考:
配置監聽和網絡服務名
C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\listener.ora
# listener.ora Network Configuration File: C:\app\Administrator\product\11.2.0\dbhome_1\network\admin\listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = CLRExtProc) (ORACLE_HOME = C:\app\Administrator\product\11.2.0\dbhome_1) (PROGRAM = extproc) (ENVS = "EXTPROC_DLLS=ONLY:C:\app\Administrator\product\11.2.0\dbhome_1\bin\oraclr11.dll") ) ) LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = WIN-6M3TPLP706G)(PORT = 1521)) ) ) ADR_BASE_LISTENER = C:\app\Administrator
C:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
和上面主庫的徹底一致便可。
而後執行 lsnrctl start 啓動監聽。
而後能夠執行 tnsping cad等測試下服務名是否配置正確。
從主庫服務器拷貝 initCAD.ora到備庫上,並更名爲initcadbk.ora
C:\app\Administrator\product\11.2.0\dbhome_1\database\INITcad.ORA 拷貝到
C:\app\Administrator\product\11.2.0\dbhome_1\database\INITcadbk.ORA
而後用notepad++打開進行修改:
cadbk.__db_cache_size=4110417920 cadbk.__java_pool_size=33554432 cadbk.__large_pool_size=100663296 cadbk.__oracle_base='C:\app\Administrator'#ORACLE_BASE set from environment cadbk.__pga_aggregate_target=1728053248 cadbk.__sga_target=5167382528 cadbk.__shared_io_pool_size=0 cadbk.__shared_pool_size=889192448 cadbk.__streams_pool_size=0 *.audit_file_dest='C:\app\Administrator\admin\cadbk\adump' *.audit_trail='db' *.compatible='11.2.0.4.0' *.control_files='C:\app\Administrator\cadbk\control01.ctl','C:\app\Administrator\fast_recovery_area\cadbk\control02.ctl' *.db_block_size=8192 *.db_domain='' *.db_file_name_convert='C:\app\Administrator\oradata\CAD','C:\app\Administrator\oradata\cadbk','C:\app\Administrator\CAD','C:\app\Administrator\cadbk' *.db_name='CAD' *.service_names='cadbk' *.db_unique_name='cadbk' *.db_recovery_file_dest='C:\app\Administrator\fast_recovery_area' *.db_recovery_file_dest_size=4385144832 *.diagnostic_dest='C:\app\Administrator' *.dispatchers='(PROTOCOL=TCP) (SERVICE=CADXDB)' *.fal_server='CAD' *.fal_client='CADBK' *.log_archive_config='dg_config=(CAD,cadbk)' *.log_archive_dest_1='location=C:\app\Administrator\fast_recovery_area\cadbk\ARCHIVELOG valid_for=(all_logfiles,all_roles) db_unique_name=cadbk' *.log_archive_dest_2='service=CAD valid_for=(online_logfiles,primary_role) db_unique_name=CAD' *.log_archive_dest_state_1='ENABLE' *.log_archive_dest_state_2='ENABLE' *.log_archive_format='%t_%s_%r.arch' *.log_file_name_convert='C:\app\Administrator\oradata\CAD','C:\app\Administrator\oradata\cadbk','C:\app\Administrator\CAD','C:\app\Administrator\cadbk' *.standby_file_management='auto' *.nls_language='SIMPLIFIED CHINESE' *.nls_territory='CHINA' *.open_cursors=300 *.pga_aggregate_target=1717567488 *.processes=150 *.remote_login_passwordfile='EXCLUSIVE' *.sessions=170 *.sga_target=5152702464 *.undo_tablespace='UNDOTBS1'
登陸sqlplus
根據pfile建立spfile,用於startup使用
create spfile from pfile;
啓動數據庫,但不掛載
startup nomount
複製主庫上的密碼文件到備庫並更名
複製主庫上C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcad.ora到備庫上的下述文件路徑,注意文件名修改
C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcadbk.ora
複製主庫上的控制文件到備庫上
主庫上控制文件路徑:
*.control_files='C:\app\Administrator\CAD\control01.ctl','C:\app\Administrator\fast_recovery_area\CAD\control02.ctl'
複製到備庫的如下路徑中(在C:\app\Administrator\product\11.2.0\dbhome_1\database\INITcadbk.ORA中定義,參見*.control_files),我這裏配置的是:
*.control_files='C:\app\Administrator\cadbk\control01.ctl','C:\app\Administrator\fast_recovery_area\cadbk\control02.ctl'
rman 從主庫同步數據文件和redo log
rman target sys/123456@cad_192.168.19.90 auxiliary sys/123456@cadbk_192.168.19.89 nocatalog
進入rman界面後:
RMAN> duplicate target database for standby from active database;
能夠觀察到:
C:\app\Administrator\cadbk 會多出來不少.dbf的數據文件和redo log文件。
啓動備庫並執行如下命令,進行觀察
SQL> select DBID,NAME,OPEN_MODE,DATABASE_ROLE from v$database; SQL> select process,status,sequence#,delay_mins from v$managed_standby; SQL> show parameter convert; SQL> alter database open; select max(sequence#) from v$archived_log; SQL> show parameter db_unique select sequence#,standby_dest,archived,applied,status from v$archived_log;
應用redo log實時應用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
大體步驟如此。而後能夠在主庫裏,好比scott用戶下,隨便找個表,修改試一下,看看能不能同步到備庫。
塗抹Oracle 三思筆記之一步一步學Oracle:https://download.csdn.net/download/govern9668/10416253