zoukankan      html  css  js  c++  java
  • 一步一步搭建 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

  • 相关阅读:
    RPC简介
    RabbitMQ从入门到精通
    flask 源码解析:响应
    flask 源码解析:请求
    flask 源码解析:上下文
    flask 源码解析:应用启动流程
    flask 源码解析:路由
    flask源码分析—简介
    11-Docker网络扩展
    10-Docker之Docker-Compose
  • 原文地址:https://www.cnblogs.com/grey-wolf/p/11696889.html
Copyright © 2011-2022 走看看