前言

为什么要写前言,因为我要吐槽一下。作为一个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:\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

一步一步搭建 Oracle Data Guard的更多相关文章

  1. Oracle data guard 10g 搭建

    Oracle data guard 10g 搭建 1系统常规参数检查 硬盘 [root@localhost ~]# df -h 内核 [root@localhost ~]# uname -a [roo ...

  2. Oracle Data Guard

    DG 是 Oracle Data Guard 的简称.也就是Oracle11g的 数据卫士. 由于在工作中 Oracle和 SQL SERVER2008 同时都需要维护管理.给我的感觉这里的 DG 其 ...

  3. (转)Oracle Data Guard学习

    一.Data Guard提供如下三种数据保护模式: 1)最高保护模式(Maximum Protection) 这里的”最高保护“是指最大限度的保护数据不丢失,也就是至少有一个standby和prima ...

  4. Oracle Data Guard配置

    Oracle Data Guard 的配置在网上有很多资料,但是没有一个完整的,配置下来多少有些问题.在踩了各种坑之后,自己终于配置成功,就想把这过程记录下来. 1   测试环境 主数据库:windo ...

  5. Oracle Data Guard的配置

    概述 Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数 ...

  6. 【原】Configuring Oracle Data Guard In Physical Standby Database

    作者:david_zhang@sh [转载时请以超链接形式标明文章] http://www.cnblogs.com/david-zhang-index/p/5042640.html参照文档:https ...

  7. Oracle Data Guard 重要配置参数

    Oracle Data Guard主要是通过为生产数据库提供一个或多个备用数据库(是产生数据库的一个副本),以保证在主库不可用或异常时数据不丢失并通过备用数据库继续提供服务.对于Oracle DG的配 ...

  8. Oracle data guard学习

    Oracle data guard学习:三思笔记 Data guard 1data guard结构: data guard是一个集合,由一个primary数据库(生产数据库)和一个或多个standby ...

  9. Oracle Data Guard Protection Modes

    Maximum Availability This protection mode provides the highest level of data protection that is poss ...

随机推荐

  1. css圆,背景,img填满等样式

    background 属性 属性值 描述 background-color 单词颜色表示法.rgb.十六进制 设置元素的背景颜色 background-image url('http://www.aa ...

  2. RestSharp Simple REST and HTTP API Client for .NET

    var client = new RestClient("http://example.com"); // client.Authenticator = new HttpBasic ...

  3. 构建一个flink程序,从kafka读取然后写入MYSQL

    最近flink已经变得比较流行了,所以大家要了解flink并且使用flink.现在最流行的实时计算应该就是flink了,它具有了流计算和批处理功能.它可以处理有界数据和无界数据,也就是可以处理永远生产 ...

  4. 第二章 Unity Shader基础

    [TOC] 1. Unity Shader 的基础: ShaderLab 学习和编写着色器的过程一直是一个学习曲线很陡峭的过程,通常情况下为了自定义渲染效果往往要和很多文件和设置打交道,这些设置很容易 ...

  5. Maven项目多环境之间的配置文件的切换

    前言:对于一个项目,开发和生产环境之间会使用不同的配置文件,最简单的例子就是数据库连接池的配置了.当然,可以在打包上线前对配置文件进行替换,不过这也太low了吧. 简单的pom.xml中的配置内容 比 ...

  6. ThinkPHP5——模型(model)的使用

    在使用ThinkPHP5的过程中,我经常使用db进行数据库操作的,后来接触到了模型(model),刚使用时感觉跟db没啥区别,后来查官网知道模型基类中还提供了较多的其他的方法可以方便使用例如获取器.修 ...

  7. .Net core-邮件发送(同步,异步)底层代码(欢迎留言讨论)

    using MailKit.Net.Smtp;using MimeKit;using System;using System.Collections.Generic;using System.IO;u ...

  8. python笔记02

    day02笔记记录 一.今日摘要 循环.字符串格式化.运算符.编码.博客. 二.内容回顾 (一)计算机基础 计算机由硬件和软件组成.传统计算机的硬件一般有输入单元.输出单元,算数逻辑单元.控制单元及记 ...

  9. 数据库Oracle字符处理函数

    练习字符处理函数(数据库表都是从1开始),我们用到一张"伪表" dual: dual 表:dual 是一张只有一个字段,一行记录的表.dual 表也称之为'伪表',因为他不存储主题 ...

  10. POJ 1651 Mulitiplication Puzzle

    The multiplication puzzle is played with a row of cards, each containing a single positive integer. ...