一步一步搭建 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、大体流程
主库流程
在主服务器上,建立主库(windows上安装oracle 11g r2的具体步骤:https://download.csdn.net/download/cctvckl/11852093);
修改主库配置,使得主库可以生成redo log,同时,配置备库的地址,目的是:redo log可以发给备库,备库重新应用redo log,即可和主库数据保持一致;
上面第二步说到要配置备库的地址,而这个是通过配置 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为我这边的数据库名) 即可。
- 创建日志输出文件相关目录。包括Oracle 内部进程的输出信息和用户进程输出信息等存储目录;
- 修改启动时的初始化配置文件
- 配置监听和网络服务名
- rman 同步主库的数据文件等(*.dbf)
- 启动备库
详细步骤
在主库所在服务器上,按照上面的文档,新建主库。
值得注意的是,因为是全局密码,所以sys账号的密码也是这个,这个账号后面用得比较多。
登录主库,用户即使用sys用户,口令为上一步创建时使用的,我这边为123456.
开启数据库的归档模式
3.1 查询当前数据库的模式是否为归档模式
archive log list
我这边查询的结果是:非归档模式

那要怎么修改为归档模式呢?因为修改为归档模式,需要在数据库mount状态下修改,所以必须先关闭数据库,再启动到mount状态。
3.2 关闭数据库
shutdown immediate
3.3 开启数据库到mount状态
startup mount
3.4 修改数据库的归档模式
alter database archivelog;
3.5 验证是否修改
archive log list

查询数据库当前状态:
select name , open_mode, log_mode,force_logging from gv$database;
其中:name表示数据库名,open_mode是指当前数据库所处的状态,可参考下图,
log_mode,就是上面我们说的日志归档模式,force_logging的作用大概是:本来部分命令,如果加了nologging的话,可以不产生redo log,但是force_logging会强制大部分的操作,具体参考:
修改数据库为force logging
alter database force logging;
日志切换
alter system switch logfile;
创建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.1 查询db_name、db_unique_name参数
show parameter db_name
,注意,这个参数需要在主备库一致。主库上,我这边查询出来是 CADshow parameter db_unique_name
,这个参数需要保证唯一。主库上,我查询出来是CAD8.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';
创建pfile
为了避免上面配置的一堆参数,重启后丢失,因此将目前程序里动态修改了的参数(spfile)写入到pfile(可作为初始化启动参数)
create pfile from spfile
重启数据库
shutdown immediate
后续启动数据库,我们准备直接用startup命令,该命令会默认首先使用spfile来作为初始化参数文件,所以这里,我们用pfile来创建spfile。
create spfile from pfile
startup
再次执行创建控制文件(不知道这一步是否必要,看到一些资料是在这时候执行的,所以我这里保险起见,也执行以下)
alter database create standby controlfile as 'C:\app\Administrator\89cadbk.ctl';
配置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是针对备库上的服务名。
重启监听
lsnrctl stop
lsnrctl start
lsnrctl status
使用tnsping查看tnsnames.ora配置是否生效
tnsping CADBK
其中 CADBK 在tnsnames.ora中已经配置(每一段的等号左边的字符串)
接下来,进入到备库所在服务器(192.168.19.89)的操作
创建实例(注意,这里和主库的区别,主库是dbca方式创建的,而我们的备库,则直接用下面的命令即可。直接在cmd下执行,不需要登录sqlplus):
ORADIM -NEW -SID cadbk
创建日志输出文件相关目录。
cd C:\app\Administrator\admin
mkdir cadbk
cd cadbk
mkdir adump bdump cdump udump
mkdir C:\app\Administrator\fast_recovery_area\cadbk
以下是书上的参考:
配置监听和网络服务名
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\AdministratorC:\app\Administrator\product\11.2.0\dbhome_1\NETWORK\ADMIN\tnsnames.ora
和上面主库的完全一致即可。
然后执行 lsnrctl start 启动监听。
然后可以执行 tnsping cad等测试下服务名是否配置正确。
从主库服务器拷贝 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'登录sqlplus
根据pfile创建spfile,用于startup使用
create spfile from pfile;
启动数据库,但不挂载
startup nomount
复制主库上的密码文件到备库并改名
复制主库上C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcad.ora到备库上的下述文件路径,注意文件名修改
C:\app\Administrator\product\11.2.0\dbhome_1\database\PWDcadbk.ora
复制主库上的控制文件到备库上
主库上控制文件路径:
*.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'
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文件。
启动备库并执行以下命令,进行观察
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;
应用redo log实时应用
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
大致步骤如此。然后可以在主库里,比如scott用户下,随便找个表,修改试一下,看看能不能同步到备库。
参考资料
涂抹Oracle 三思笔记之一步一步学Oracle:https://download.csdn.net/download/govern9668/10416253
一步一步搭建 Oracle Data Guard的更多相关文章
- Oracle data guard 10g 搭建
Oracle data guard 10g 搭建 1系统常规参数检查 硬盘 [root@localhost ~]# df -h 内核 [root@localhost ~]# uname -a [roo ...
- Oracle Data Guard
DG 是 Oracle Data Guard 的简称.也就是Oracle11g的 数据卫士. 由于在工作中 Oracle和 SQL SERVER2008 同时都需要维护管理.给我的感觉这里的 DG 其 ...
- (转)Oracle Data Guard学习
一.Data Guard提供如下三种数据保护模式: 1)最高保护模式(Maximum Protection) 这里的”最高保护“是指最大限度的保护数据不丢失,也就是至少有一个standby和prima ...
- Oracle Data Guard配置
Oracle Data Guard 的配置在网上有很多资料,但是没有一个完整的,配置下来多少有些问题.在踩了各种坑之后,自己终于配置成功,就想把这过程记录下来. 1 测试环境 主数据库:windo ...
- Oracle Data Guard的配置
概述 Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数 ...
- 【原】Configuring Oracle Data Guard In Physical Standby Database
作者:david_zhang@sh [转载时请以超链接形式标明文章] http://www.cnblogs.com/david-zhang-index/p/5042640.html参照文档:https ...
- Oracle Data Guard 重要配置参数
Oracle Data Guard主要是通过为生产数据库提供一个或多个备用数据库(是产生数据库的一个副本),以保证在主库不可用或异常时数据不丢失并通过备用数据库继续提供服务.对于Oracle DG的配 ...
- Oracle data guard学习
Oracle data guard学习:三思笔记 Data guard 1data guard结构: data guard是一个集合,由一个primary数据库(生产数据库)和一个或多个standby ...
- Oracle Data Guard Protection Modes
Maximum Availability This protection mode provides the highest level of data protection that is poss ...
随机推荐
- python_编程面试题
使用递归方法对一个数组求最大值和最小值 """ 用递归算法求解一个数组的最大值和最小值 思路: 1.首先假设这个列表只有1个元素或两个元素 2.再考虑超过两个元素的情况, ...
- 阿里云安装mysql
1. ##数据库字符集SHOW VARIABLES LIKE 'character_set_%'; ##数据库校对股则SHOW VARIABLES LIKE 'collation_%'; 2.创建数据 ...
- shell 点命令和source指令
1 shell脚本执行方法 有两种方法执行shell scripts,一种是新产生一个shell,然后执行相应的shell scripts:一种是在当前shell下执行,不再启用其他shell.新产生 ...
- 在文件夹下所有文件中查找字符串(linux/windows)
在linux下可以用 grep "String" filename.txt#字符串 文件名grep -r "String" /home/#递归查找目录下所有文件 ...
- [Abp vNext 源码分析] - 13. 本地事件总线与分布式事件总线 (Rabbit MQ)
一.简要介绍 ABP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装 ...
- AUTH_USER_MODEL 添加报错(粗心)
HINT: Add or change a related_name argument to the definition for 'UserProfile.user_permissions' or ...
- “setTimeout、Promise、Async/Await 的区别”题目解析和扩展
解答这个题目之前,先回顾下JavaScript的事件循环(Event Loop). JavaScript的事件循环 事件循环(Event Loop):同步和异步任务分别进入不同的执行"场所& ...
- 利用python实现dll依赖关系导出
#说明:遍历rootdir目录下所有dll,导出每个dll依赖的dll信息到dstdir目录下 # 配合NotePad++打开所有txt,搜索,可快速定位到某dll被依赖的所有dll文件 import ...
- 09-Python-Socket编程
一.Python-Socket编程 1.1.弄懂HTTP.Socket.TCP这几个概念 什么是HTTP协议?浏览器的本质就是一个socket客户端遵循HTTP协议,HTTP协议的本质:通过\r\n分 ...
- luogu P1379 八数码难题
题目描述 在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字.棋盘中留有一个空格,空格用0来表示.空格周围的棋子可以移到空格中.要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了 ...