Oracle 11g DG搭建测试

DG(Data Guard)原理结构图

 

 

 0x00 环境规划说明

系统环境:Centos 7.9    3.10.0-1160.76.1.el7.x86_64
DG环境规划
主机名称 IP地址 SID db_unique_name 角色
master 10.20.140.9 test test 主库
standby 10.20.140.10

test_dg

test_dg 从库

 0x01  oracle 11g 安装

请查看博主之前的安装文档,这里不在赘述

传送门:https://www.cnblogs.com/DevilCisco/p/16446035.html

oracle主从库的环境变量

环境变量说明
名称
角色
ORACLE_BASE
ORACLE_HOME
ORACLE_SID
ORACLE_UNQNAME
PATH
LD_LIBRARY_PATH
LANG
NLS_LANG
master
主库
/home/data/oracle
$ORACLE_BASE/product/11.2.0/db_1
test
test
$ORACLE_HOME/bin:/usr/sbin:$PATH
$ORACLE_HOME/lib:/lib:/usr/lib
C
AMERICAN_AMERICA.AL32UTF8
standby
从库
/home/data/oracle
$ORACLE_BASE/product/11.2.0/db_1
test_dg
test_dg
$ORACLE_HOME/bin:/usr/sbin:$PATH
$ORACLE_HOME/bin:/usr/sbin:$PATH
C
AMERICAN_AMERICA.AL32UTF8
 

 注意:本次环境搭建采取的方法是主库安装oracle11g并创建监听及数据库,而从库只安装oracle11g 软件及创建监听,并无创建任何数据库

0x02  搭建主要步骤

0x03 搭建过程

oracle sqlplus优化,修改登录提示符。传送门:https://www.cnblogs.com/DevilCisco/p/16739646.html

开启主库强制日志模式

su - oracle
sqlplus / as sysdba
#开启主库强制日志模式
alter database force logging;
#查询当前
select open_mode,log_mode,force_logging from v$database;

 开启主库归档日志,并指定归档路径及归档文件格式

#查看当前是否开启归档
archive log list;
#如果未开启,请关闭数据库并启动至mount状态
shutdown immediate;
startup mount;
#系统内创建归档目录开启归档
mkdir -p /home/data/oracle/oradata/arch
sqlplus / as sysdba
#指定归档目录位置
alter system set log_archive_dest_1='location=/home/data/oracle/oradata/arch';
#设置归档文件格式
alter system set log_archive_format='arch_test_%t_%s_%r.arc' scope=spfile;
#开启归档
alter database archivelog;
#打开数据库
alter database open;
#查看归档设置
archive log list;
show parameter archive;

 主库添加standby redo log

查看当前日志组及文件

su - oracle
sqlplus / as sysdba
#查看当前日志组
select  * from v$logfile;

 添加standby redo log 日志组,创建目录并指定文件位置

#创建standby redo log日志目录
mkdir -p /home/data/oracle/oradata/standby_redo
#添加standby redo log
alter database add standby logfile group 4 ('/home/data/oracle/oradata/standby_redo/standby_redo01.log') size 100m;
alter database add standby logfile group 5 ('/home/data/oracle/oradata/standby_redo/standby_redo02.log') size 100m;
alter database add standby logfile group 6 ('/home/data/oracle/oradata/standby_redo/standby_redo03.log') size 100m;
alter database add standby logfile group 7 ('/home/data/oracle/oradata/standby_redo/standby_redo04.log') size 100m;
#查看当前设置的standby redo
select * from v$standby_log;

 修改主库配置,添加DG配置

su - oracle
sqlplus / as sysdba
#设置db_unique_name
alter system set  db_unique_name='test' scope=spfile;
#设置DG归档应用重做的主从库
alter system set log_archive_config='DG_CONFIG=(test,test_dg)';
#指定主库归档路径对应的db_unique_name及所属角色
alter system set log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test valid_for=(ALL_LOGFILES,ALL_ROLES)';
#指定从库的service name 同步方式为异步 db_unique_name及所属角色
alter system set log_archive_dest_2='SERVICE=test_dg ASYNC lgwr db_unique_name=test_dg valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)';
#启用主库及DG备库的归档路径设置
alter system set log_archive_dest_state_1=enable;
alter system set log_archive_dest_state_2=enable;
#设置归档最大进程数
alter system set log_archive_max_processes=4;
#设置远程登录密码模式为独占模式
alter system set remote_login_passwordfile='EXCLUSIVE' scope=spfile;
#设置主从同步文件时的目录
#这里须设置绝对路径,一般为主库的数据文件,控制文件等所在目录 ,主库无需设置,从库设置
alter system set db_file_name_convert='test','test_dg' scope=spfile;
alter system set log_file_name_convert='test','test_dg' scope=spfile;
#设置主从同步的管理方式为自动
alter system set standby_file_management='AUTO';
#指定FAL的server和client
alter system set fal_server='test_dg';
alter system set fal_client='test';

FAL server client说明:

FAL指获取归档日志(Fetch Archived Log)  

在一定的条件下,或者因为网络失败,或者因为资源紧张,会在primary和standby之间产生裂隙,也就是有些归档日志没有及时的传输并应用到standby库。
因为MRP(managed recovery process)/LSP(logical standby process)没有与primary直接通讯的能力来获取丢失的归档日志。因此这些gaps通过FAL客户和服务器来解决,由初始化参数定义FAL_CLIENT和FAL_SERVER。 FAL_SERVER指定一个Oracle Net service name,standby数据库使用这个参数连接到FAL server,这个参数适用于standby站点。比如,FAL_SERVER = PrimaryDB,此处PrimaryDB是一个TNS name,指向primary库。 FAL_CLIENT指定一个FAL客户端的名字,以便FAL Server可以引用standby库,这也是一个TNS name,primary库必须适当配置此TNS name指向stanby库。这个参数也是在standby库端设置。
比如,FAL_CLIENT
= StandbyDB,StandbyDB是standby库的TNS name。 FAL_CLIENT和FAL_SERVER应该成对设置或改变。 这两个参数只需在standby库设置,但也可以在primary库设置这两个参数,以方便switchover或failover时primary库转变为standby角色

DG是互相转换的,为了避免gaps,指定FAL会避免很多问题,一般FAL_CLIENT 为自身,FAL_SERVER指定对方

 将主库的pfile及密码文件传送至从库,并修改名称及相应配置

检查主库配置,创建pfile文件

sqlplus / as sysdba
create pfile from spfile
#此时会在$ORACLE_HOME/dbs 目录下生成一个名称为:init<SID>.ora的文件

检查配置文件后,将刚刚生成的文件以及密码文件orapw+<sid> 通过scp发送给从库,并在从库更改文件名称为从库的SID

这里从库的sid为:test_dg,那pfile以及密码文件的名称分别更改为:inittest_dg.ora   orapwtest_dg

修改inittest_dg.ora配置项

vi inittest_dg.ora
#注意修改sid
test_dg.__db_cache_size=3204448256
test_dg.__java_pool_size=16777216
test_dg.__large_pool_size=33554432
test_dg.__oracle_base='/home/data/oracle'#ORACLE_BASE set from environment
test_dg.__pga_aggregate_target=2701131776
test_dg.__sga_target=4043309056
test_dg.__shared_io_pool_size=0
test_dg.__shared_pool_size=738197504
test_dg.__streams_pool_size=0
#提前创建该目录,此目录地址无须刻意修改为从库sid目录,和主库保持一致也行,但是目录必须提前创建好
*.audit_file_dest='/home/data/oracle/admin/test/adump'
*.audit_trail='db'
*.compatible='11.2.0.4.0'
*.control_files='/home/data/oracle/oradata/test/control01.ctl','/home/data/oracle/oradata/test/control02.ctl'
*.db_block_size=8192
*.db_domain=''
#这里必须注意,需要填写的是主库的数据文件所在的目录,且后面从库的目录必须提前创建好,这里用的是和主库一样的路径。
*.db_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
#这里的db_name 必须是主库的,可以通过在主库中show parameter name 来查看db_name
*.db_name='test'
#这里设置的是从库的unique_name
*.db_unique_name='test_dg'
*.diagnostic_dest='/home/data/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=testXDB)'
#这里设置的是和主库相反的设置
*.fal_client='test_dg'
*.fal_server='test'
*.log_archive_config='DG_CONFIG=(test,test_dg)'
#注意修改,此时是从库的配置文件,dest_1是从库,dest_2是主库
*.log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test_dg valid_for=(ALL_LOGFILES,ALL_ROLES)'
#和主库的配置互相呼应
*.log_archive_dest_2='SERVICE=test ASYNC lgwr db_unique_name=test valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'
*.log_archive_dest_state_1='ENABLE'
*.log_archive_dest_state_2='ENABLE'
*.log_archive_format='arch_test_%t_%s_%r.arc'
*.log_archive_max_processes=4
#同样设置的必须是绝对路径,本次使用的是和主库一样的目录,已提前创建好
*.log_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
*.memory_target=6728712192
*.open_cursors=300
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.standby_file_management='AUTO'
*.undo_tablespace='UNDOTBS1'

下面是关键配置项,需要注意:

#这里必须注意,需要填写的是主库的数据文件所在的目录,且后面从库的目录必须提前创建好,这里用的是和主库一样的路径。
*.db_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
#这里的db_name 必须是主库的,可以通过在主库中show parameter name 来查看db_name
*.db_name='test'

#这里设置的是和主库相反的设置
*.fal_client='test_dg'
*.fal_server='test'
*.log_archive_config='DG_CONFIG=(test,test_dg)'
#注意修改,此时是从库的配置文件,dest_1是从库,dest_2是主库
*.log_archive_dest_1='LOCATION=/home/data/oracle/oradata/arch db_unique_name=test_dg valid_for=(ALL_LOGFILES,ALL_ROLES)'
#和主库的配置互相呼应
*.log_archive_dest_2='SERVICE=test ASYNC lgwr db_unique_name=test valid_for=(ONLINE_LOGFILES,PRIMARY_ROLE)'
#同样设置的必须是绝对路径,本次使用的是和主库一样的目录,已提前创建好
*.log_file_name_convert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test'
主库及从库配置静态监听

主库:

vi  $ORACLE_HOME/network/admin/listener.ora
#追加如下内容
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = test) #主库的db_unique_name
      (ORACLE_HOME = /home/data/oracle/product/11.2.0/db_1)
      (SID_NAME= test) #主库的sid
    )
    )
vi $ORACLE_HOME/network/admin/tnsnames.ora
#追加如下内容
test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.9)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test)
    )
  )

test_dg =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test_dg)
    )
  )

从库:

vi  $ORACLE_HOME/network/admin/listener.ora
#追加如下内容
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (GLOBAL_DBNAME = test_dg) #从库的db_unique_name
      (ORACLE_HOME = /home/data/oracle/product/11.2.0/db_1)
      (SID_NAME= test_dg) #从库的sid
    )
    )
vi $ORACLE_HOME/network/admin/tnsnames.ora
#追加如下内容
test =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.9)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test)
    )
  )

test_dg =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = 10.20.140.10)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = test_dg)
    )
  )

主库和从库重新启动监听

lsnrctl stop
lsnrctl start
lsnrctl status

正常情况下静态监听的状态为Unknown,动态监听的状态为Ready,如图

 

主库按照最新配置启动

#因为主库更改了配置,并生成了新的pfile,因此我们启动创建新的spfile
sqlplus / as sysdba
shutdown immediate;
startup nomount pfile='/home/data/oracle/product/11.2.0/db_1/dbs/inittest.ora';
create spfile from pfile;
shutdown immediate;
startup;

从库按照最新配置启动到nomount状态

sqlplus / as sysdba
startup nomount pfile='/home/data/oracle/product/11.2.0/db_1/dbs/inittest_dg.ora';
#创建spfile
create spfile from pfile;

在从库启动rman 测试主库及从库的辅助连接

rman target sys/主库sys密码@test  auxiliary sys/从库sys密码@test_dg

如果正常应当为如下图:

 在从库启动duplicate 复制主库文件至从库

Rman> duplicate target database for standby from active database nofilenamecheck;
#此时会启动复制数据库脚本复制数据文件

下面是博主在这一步遇到的错误,贴出来避免大家入坑

 ORA-17628错误:

这个错误就是没有将从库配置中db_file_name_convert和log_file_name_convert路径写成绝对路径,且从库没有提前创建好,导致无法复制数据文件到从库

解决方法:更改参数 重启数据库至nomount状态

sqlplus / as sysdba
alter system set db_file_name_conert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' scope=spfile;
alter system set log_file_name_conert='/home/data/oracle/oradata/test','/home/data/oracle/oradata/test' scope=spfile;
shutdown immediate;
startup nomount;

接着从新开始duplicate ,此时需要退出Rman 重新连接

rman target sys/主库sys密码@test  auxiliary sys/从库sys密码@test_dg

ORA-27040错误:

 该错误是由于从库没有提前创建standby_redo日志组对应的目录

解决方法:创建目录,重新启动duplicate

mkdir -p /home/data/oracle/oradata/standby_redo/

 上图代表duplicate 完成,成功复制数据库

启动从库

从库启动默认是只读的方式 read only

sqlplus / as sysdba
select status from v$intance;
#此时应显示的是mounted
#打开数据库
alter database open;
#查看数据库当前的open_mode
select open_mode from v$database;

 启动从库的MRP

alter database recover managed standby database disconnection from session;

查看MRP进程

select PROCESS,SEQUENCE#,STATUS,DELAY_MINS from v$managed_standby;

  查看主库的进程

select process,sequence#,status,delay_mins from v$managed_standby;

 验证同步

主库:创建表,插入新的数据,由于当前使用的异步同步,因此需要主库切归档才会触发同步

create table abc (id int);
insert into abc values (222);
insert into abc values(333);
commit
alter system switch logfile;

 

 查看当前DG使用的模式:

select dbid,name,current_scn,protection_mode,database_role,force_logging,open_mode,switchover_status from v$database;

 可以看到,使用的是默认的最大性能模式

0x04 DG的日常启停

停止: 

  1. 先停止备库的redo日志应用
  2. 关闭主库
  3. 关闭备库
alter database recover managed  standby database cancel;
#关闭主库
shutdown immediate;
#关闭备库
shutdown immediate;

启动

  1. 启动主库和备库的监听
  2. 启动备库至nomount
  3. 指定备库为standby database
  4. 以只读模式打开备库
  5. 启动主库
#启动监听
lsnrctl start
#启动备库
startup nomount
#更改备库为standby
alter database mount standby database
#以只读模式打开备库
alter database open read only
#启动同步进程
alter database recover managed standby database usingcurrent logfile disconnect from session;
#启动主库
startup

至此,DataGuard 初步测试完成。关于DG还会有其他模式的测试。 测试环境,文中如有纰漏,欢迎评论指正。

posted @ 2022-12-26 16:17  BlackData  阅读(290)  评论(0编辑  收藏  举报