一步一步搭建 Oracle Data Guard

前言

爲何要寫前言,由於我要吐槽一下。做爲一個Java後端,搭建Oracle Data Guard真的是一件,嗯,既不專業也不擅長的事情,然而,爲何仍是要我來弄?html

由於DBA出差了,咱們這邊急着要,只能趕鴨子上架了,折騰了一天半,終於弄出來了。(趁着沒忘,寫點記錄,否則下次可能要弄兩天)
ps:這篇用markdown寫的,排版不太熟悉,格式你們先忍忍。java

基礎知識

一、什麼是data guard

Data Guard 提供管理、監視和自動化軟件,用於建立和維護生產數據庫的一個或多個同步副本,保護 Oracle 數據免受故障、災難、人爲錯誤和數據損壞的影響,同時爲任務關鍵型應用提供高可用性。Data Guard 包括在 Oracle Database 企業版中。sql

----oracle 官方表述數據庫

在咱們的系統中,oracle dg扮演了什麼角色呢,是由於咱們存在一個這樣的場景。假設成都機房部署一套主數據庫Primary,在北京機房部署數據庫Primary的備份庫Standby,Primary會實時同步修改到Standby,當成都機房出現天然災害、重大故障時,應用程序能夠立刻切換到北京機房,能夠不間斷地給客戶提供服務。windows

因此,核心需求就是,主備!並且在咱們這裏,是單向同步的,只會由成都機房同步到北京機房,由於,業務上,成都爲區域中心,北京爲國家級中心,咱們的業務決定,只會由區域中心向國家中心同步,因此,能夠省略北京機房同步到成都機房的配置。後端

二、大致流程

主庫流程服務器

  1. 在主服務器上,創建主庫(windows上安裝oracle 11g r2的具體步驟:https://download.csdn.net/download/cctvckl/11852093);markdown

  2. 修改主庫配置,使得主庫能夠生成redo log,同時,配置備庫的地址,目的是:redo log能夠發給備庫,備庫從新應用redo log,便可和主庫數據保持一致;網絡

  3. 上面第二步說到要配置備庫的地址,而這個是經過配置 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爲我這邊的數據庫名) 便可。

  1. 建立日誌輸出文件相關目錄。包括Oracle 內部進程的輸出信息和用戶進程輸出信息等存儲目錄;
  2. 修改啓動時的初始化配置文件
  3. 配置監聽和網絡服務名
  4. rman 同步主庫的數據文件等(*.dbf)
  5. 啓動備庫

詳細步驟

  1. 在主庫所在服務器上,按照上面的文檔,新建主庫。

    值得注意的是,由於是全局密碼,因此sys帳號的密碼也是這個,這個帳號後面用得比較多。

  2. 登陸主庫,用戶即便用sys用戶,口令爲上一步建立時使用的,我這邊爲123456.

  3. 開啓數據庫的歸檔模式

    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)

    ​ 參考資料:http://www.javashuo.com/article/p-vhoczgcx-ex.html

  4. 查詢數據庫當前狀態:

    select name , open_mode, log_mode,force_logging from gv$database;

    其中:name表示數據庫名,open_mode是指當前數據庫所處的狀態,可參考下圖,

    log_mode,就是上面咱們說的日誌歸檔模式,force_logging的做用大概是:原本部分命令,若是加了nologging的話,能夠不產生redo log,可是force_logging會強制大部分的操做,具體參考:

    https://blog.csdn.net/leshami/article/details/6130866

  5. 修改數據庫爲force logging

    alter database force logging;

  6. 日誌切換

    alter system switch logfile;

  7. 建立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. 修改主庫初始化參數

    相關參數的解釋以下:

    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';

  1. 建立pfile

    爲了不上面配置的一堆參數,重啓後丟失,所以將目前程序裏動態修改了的參數(spfile)寫入到pfile(可做爲初始化啓動參數)

    create pfile from spfile

  2. 重啓數據庫

    shutdown immediate

    後續啓動數據庫,咱們準備直接用startup命令,該命令會默認首先使用spfile來做爲初始化參數文件,因此這裏,咱們用pfile來建立spfile。

    create spfile from pfile

    startup

  3. 再次執行建立控制文件(不知道這一步是否必要,看到一些資料是在這時候執行的,因此我這裏保險起見,也執行如下)

    alter database create standby controlfile as 'C:\app\Administrator\89cadbk.ctl';

  4. 配置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是針對備庫上的服務名。

  5. 重啓監聽

    lsnrctl stop
    lsnrctl start
    lsnrctl status

  6. 使用tnsping查看tnsnames.ora配置是否生效

    tnsping CADBK

    其中 CADBK 在tnsnames.ora中已經配置(每一段的等號左邊的字符串)

  7. 接下來,進入到備庫所在服務器(192.168.19.89)的操做

    建立實例(注意,這裏和主庫的區別,主庫是dbca方式建立的,而咱們的備庫,則直接用下面的命令便可。直接在cmd下執行,不須要登陸sqlplus):

    ORADIM -NEW -SID cadbk

  8. 建立日誌輸出文件相關目錄。

    cd C:\app\Administrator\admin
    mkdir cadbk
    cd cadbk
    mkdir adump bdump cdump udump

    mkdir C:\app\Administrator\fast_recovery_area\cadbk

    如下是書上的參考:

  9. 配置監聽和網絡服務名

    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等測試下服務名是否配置正確。

  10. 從主庫服務器拷貝 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'
  11. 登陸sqlplus

  12. 根據pfile建立spfile,用於startup使用

    create spfile from pfile;

  13. 啓動數據庫,但不掛載

    startup nomount

  14. 複製主庫上的密碼文件到備庫並更名

    複製主庫上C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcad.ora到備庫上的下述文件路徑,注意文件名修改

    C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcadbk.ora

  15. 複製主庫上的控制文件到備庫上

    主庫上控制文件路徑:

    *.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'

  16. 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文件。

  17. 啓動備庫並執行如下命令,進行觀察

    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;
  18. 應用redo log實時應用

    SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
  19. 大體步驟如此。而後能夠在主庫裏,好比scott用戶下,隨便找個表,修改試一下,看看能不能同步到備庫。

參考資料

塗抹Oracle 三思筆記之一步一步學Oracle:https://download.csdn.net/download/govern9668/10416253

相關文章
相關標籤/搜索