一步一步搭建 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

相关文章
相关标签/搜索