前言

为什么要写前言,因为我要吐槽一下。作为一个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. Linux权限基础

    Linux权限基础 四种权限大类 基本权限 特殊权限 隐藏权限 file ACL权限 三种基本权限 r(read) 读是基本权限,没有读权限其他的一切操作都会被限制 读 4 w(write) 写 2 ...

  2. [TimLinux] Python 再谈元类 metaclass

    本博文通过对以下链接进行理解后,编写. https://stackoverflow.com/questions/100003/what-are-metaclasses-in-python 1. 类 类 ...

  3. [TimLinux] CSS 计数功能实现递归目录

    内容引用自<css世界>: count-reset 与 counter 为父子关系,兄弟关系会导致序号混乱 调用一次 count-increment 将给序号进行一次报数,调用 count ...

  4. UVA-11995

    There is a bag-like data structure, supporting two operations:1 x Throw an element x into the bag.2 ...

  5. BZOJ 3065 带插入区间K小值(sag套线段树)

    3065: 带插入区间K小值 Time Limit: 60 Sec  Memory Limit: 512 MBSubmit: 4696  Solved: 1527[Submit][Status][Di ...

  6. 小程序 - 简单实现mixin功能

    前言 在业务中有没有一个场景:多个页面需要用到一样的 data 和 method,或者生命周期都需要执行同样的操作.我们在每个页面都写上重复的代码,一但功能修改就要更新多个页面,在后期维护起来会很麻烦 ...

  7. 最简单易懂的linux系统基础优化

    第10章 linux的系统优化 10.1 系统的版本,内核查看 10.1.1 系统版本的查看 [root@oldboy6666 ~]# cat /etc/redhat-release CentOS L ...

  8. 【Flutter】372- Flutter移动端实战手册

    ☝点击上方蓝字,关注我们! 本文字数:3705字 预计阅读时间:28分钟 导 读 Flutter又双叒叕来了!本周推送是我们Flutter系列文章的最终篇!<Flutter移动端实战手册> ...

  9. eclipse新建maven项目报错Could not resolve arachetype org.apache.maven.archetypes:mmaven-archetype-quickstart:1.1 from any of the configured repositories

    使用eclipse新建maven项目,按下图所示选择后,报错 报错截图 报错详细信息 Could not resolve archetype org.apache.maven.archetypes:m ...

  10. Vue ---- 项目与环境搭建 初始项目结构 Vue生命周期

    目录 1. vue环境搭建 2. Vue项目搭建 pycharm配置并启动vue项目 3 . 认识项目 1. vue项目目录结构 2. 配置文件:vue.config.js 3. main.js 4. ...