前言
为什么要写前言,因为我要吐槽一下。作为一个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
我这边查询的结果是:非归档模式
![](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)
-
查询数据库当前状态:
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: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.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: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';
-
创建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:appAdministrator89cadbk.ctl';
-
配置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是针对备库上的服务名。
-
重启监听
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:appAdministratoradmin
mkdir cadbk
cd cadbk
mkdir adump bdump cdump udump
mkdir C:appAdministratorfast_recovery_areacadbk
以下是书上的参考:
-
配置监听和网络服务名
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等测试下服务名是否配置正确。
-
从主库服务器拷贝 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'
-
登录sqlplus
-
根据pfile创建spfile,用于startup使用
create spfile from pfile;
-
启动数据库,但不挂载
startup nomount
-
复制主库上的密码文件到备库并改名
复制主库上C:appAdministratorproduct11.2.0dbhome_1databasePWDcad.ora到备库上的下述文件路径,注意文件名修改
C:appAdministratorproduct11.2.0dbhome_1databasePWDcadbk.ora
-
复制主库上的控制文件到备库上
主库上控制文件路径:
*.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'
-
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文件。
-
启动备库并执行以下命令,进行观察
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