一步一步搭建 Oracle Data Guard

前言

为什么要写前言,因为我要吐槽一下。作为一个Java后端,搭建Oracle Data Guard真的是一件,嗯,既不专业也不擅长的事情,然而,为什么还是要我来弄?

因为DBA出差了,我们这边急着要,只能赶鸭子上架了,折腾了一天半,终于弄出来了。(趁着没忘,写点记录,不然下次可能要弄两天)
ps:这篇用markdown写的,排版不太熟悉,格式大家先忍忍。

基础知识

1、什么是data guard

Data Guard 提供管理、监视和自动化软件,用于创建和维护生产数据库的一个或多个同步副本,保护 Oracle 数据免受故障、灾难、人为错误和数据损坏的影响,同时为任务关键型应用提供高可用性。Data Guard 包括在 Oracle Database 企业版中。

----oracle 官方表述

在我们的系统中,oracle dg扮演了什么角色呢,是因为我们存在一个这样的场景。假设成都机房部署一套主数据库Primary,在北京机房部署数据库Primary的备份库Standby,Primary会实时同步修改到Standby,当成都机房出现自然灾害、重大故障时,应用程序可以马上切换到北京机房,可以不间断地给客户提供服务。

所以,核心需求就是,主备!而且在我们这里,是单向同步的,只会由成都机房同步到北京机房,因为,业务上,成都为区域中心,北京为国家级中心,我们的业务决定,只会由区域中心向国家中心同步,所以,可以省略北京机房同步到成都机房的配置。

2、大体流程

主库流程

  1. 在主服务器上,建立主库(windows上安装oracle 11g r2的具体步骤:https://download.csdn.net/download/cctvckl/11852093);

  2. 修改主库配置,使得主库可以生成redo log,同时,配置备库的地址,目的是:redo log可以发给备库,备库重新应用redo log,即可和主库数据保持一致;

  3. 上面第二步说到要配置备库的地址,而这个是通过配置 tnsnames.ora 文件实现的,这个文件可以简单理解为:可以通过服务名,获取到网络内其他数据库的配置。比如如下配置:

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)
    

    ​ 参考资料:https://www.cnblogs.com/xwdreamer/p/3793792.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:APPADMINISTRATORCAD

    alter database add standby logfile group 4 ('C:APPADMINISTRATORCADREDO04.LOG') size 50m;
    alter database add standby logfile group 5 ('C:APPADMINISTRATORCADREDO05.LOG') size 50m;
    alter database add standby logfile group 6 ('C:APPADMINISTRATORCADREDO06.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:appAdministratorfast_recovery_areaCADARCHIVELOG 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:appAdministratororadataCAD', 'C:appAdministratororadatacadbk' scope=spfile sid='*';

alter system set log_file_name_convert='C:appAdministratororadataCAD', 'C:appAdministratororadatacadbk' scope=spfile sid='*';

alter system set log_archive_format='%t_%s_%r.arch' scope=spfile sid='*';

​ 具体参数的意思如下:

9.创建控制文件

alter database create standby controlfile as 'C:appAdministrator89cadbk.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:appAdministrator89cadbk.ctl';

  4. 配置tnsnames.ora

    # tnsnames.ora Network Configuration File: C:appAdministratorproduct11.2.0dbhome_1
    etworkadmin	nsnames.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:appAdministratoradmin
    mkdir cadbk
    cd cadbk
    mkdir adump bdump cdump udump

    mkdir C:appAdministratorfast_recovery_areacadbk

    以下是书上的参考:

  9. 配置监听和网络服务名

    C:appAdministratorproduct11.2.0dbhome_1NETWORKADMINlistener.ora

    # listener.ora Network Configuration File: C:appAdministratorproduct11.2.0dbhome_1
    etworkadminlistener.ora
    # Generated by Oracle configuration tools.
    
    SID_LIST_LISTENER =
      (SID_LIST =
        (SID_DESC =
          (SID_NAME = CLRExtProc)
          (ORACLE_HOME = C:appAdministratorproduct11.2.0dbhome_1)
          (PROGRAM = extproc)
          (ENVS = "EXTPROC_DLLS=ONLY:C:appAdministratorproduct11.2.0dbhome_1inoraclr11.dll")
        )
      )
    
    LISTENER =
      (DESCRIPTION_LIST =
        (DESCRIPTION =
          (ADDRESS = (PROTOCOL = TCP)(HOST = WIN-6M3TPLP706G)(PORT = 1521))
        )
      )
    
    ADR_BASE_LISTENER = C:appAdministrator
    
    
    

    C:appAdministratorproduct11.2.0dbhome_1NETWORKADMIN nsnames.ora

    和上面主库的完全一致即可。

    然后执行 lsnrctl start 启动监听。

    然后可以执行 tnsping cad等测试下服务名是否配置正确。

  10. 从主库服务器拷贝 initCAD.ora到备库上,并改名为initcadbk.ora

    C:appAdministratorproduct11.2.0dbhome_1databaseINITcad.ORA 拷贝到

    C:appAdministratorproduct11.2.0dbhome_1databaseINITcadbk.ORA

    然后用notepad++打开进行修改:

    cadbk.__db_cache_size=4110417920
    cadbk.__java_pool_size=33554432
    cadbk.__large_pool_size=100663296
    cadbk.__oracle_base='C:appAdministrator'#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:appAdministratoradmincadbkadump'
    *.audit_trail='db'
    *.compatible='11.2.0.4.0'
    *.control_files='C:appAdministratorcadbkcontrol01.ctl','C:appAdministratorfast_recovery_areacadbkcontrol02.ctl'
    *.db_block_size=8192
    *.db_domain=''
    *.db_file_name_convert='C:appAdministratororadataCAD','C:appAdministratororadatacadbk','C:appAdministratorCAD','C:appAdministratorcadbk'
    *.db_name='CAD'
    *.service_names='cadbk'
    *.db_unique_name='cadbk'
    *.db_recovery_file_dest='C:appAdministratorfast_recovery_area'
    *.db_recovery_file_dest_size=4385144832
    *.diagnostic_dest='C:appAdministrator'
    *.dispatchers='(PROTOCOL=TCP) (SERVICE=CADXDB)'
    *.fal_server='CAD'
    *.fal_client='CADBK'
    *.log_archive_config='dg_config=(CAD,cadbk)'
    *.log_archive_dest_1='location=C:appAdministratorfast_recovery_areacadbkARCHIVELOG 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:appAdministratororadataCAD','C:appAdministratororadatacadbk','C:appAdministratorCAD','C:appAdministratorcadbk'
    *.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:appAdministratorproduct11.2.0dbhome_1databasePWDcad.ora到备库上的下述文件路径,注意文件名修改

    C:appAdministratorproduct11.2.0dbhome_1databasePWDcadbk.ora

  15. 复制主库上的控制文件到备库上

    主库上控制文件路径:

    *.control_files='C:appAdministratorCADcontrol01.ctl','C:appAdministratorfast_recovery_areaCADcontrol02.ctl'

    复制到备库的以下路径中(在C:appAdministratorproduct11.2.0dbhome_1databaseINITcadbk.ORA中定义,参见*.control_files),我这里配置的是:

    *.control_files='C:appAdministratorcadbkcontrol01.ctl','C:appAdministratorfast_recovery_areacadbkcontrol02.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:appAdministratorcadbk 会多出来很多.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

原文地址:https://www.cnblogs.com/grey-wolf/p/11696889.html