【Oracle】12C RAC系列之02 ADG冗余部署(Linux)

目录

ADG服务器创建前的准备

说明与注意事项

  • 使用2+1(RAC+DataGuard)架构,非2+2(RAC+RAC)MMA架构
  • RAC必须成功安装
  • ADG备库安装同样版本的oracle软件,数据库无需创建;配置参数一致便于后期节点切换后可以正常使用
  • 容器数据库分为CDB与PDB,不能基于PDB进行DG(TB级别的数据不建议用CDB)
  • 参考资料https://blog.csdn.net/qq877507054/article/details/81209967
  • ADG可以使用单机文件系统,或者ASM文件系统(可以是RAC节点)
  • CDB:安装时候询问你是否选择容器数据库,勾选就为CDB(需要安照CDB方式部署DG服务器),不勾选就不安装(非CDB)。
  • 常见架构
    主库:非CDB---备库:非CDB
    主库:CDB---备库:CDB
  • 查看CDB属性
    select cdb from v$database;

    图 166

    主库RAC归档配置-1

  • N1,N2开启归档

    查看归档文件命令规则

  • 与数据文件冲突
    show parameter log_archive_format

    图 167

    修改归档命名规则

  • 在任意一节点登录数据库
  • 复制执行时注意字符集是否被更改,修改xshell与oracle统一字符集
    shutdown immediate
    startup mount
    alter system set log_archive_format=\'%t_%s_%r.arc\' scope=spfile sid=\'*\';


    图 168

    创建RAC归档保存目录

  • 在任意一个节点,此为node2上
    asmcmd
    cd data
    ls
    mkdir arch

    图 169

    修改两个实例的归档日志保存路径

  • 单机环境此参数为log_archive_dest,RAC为log_archive_dest_1,DG归档传输参数是log_archive_dest_2
    alter system set log_archive_dest_1=\'LOCATION=+data/arch\' scope=spfile sid=\'*\';

    图 170
  • 关闭所有节点的数据库
    shutdown immediate
  • 只启动一个节点node1
    startup mount

    图 171
    alter database archivelog;
    archive log list;

    图 172
  • 打开node1数据库
    alter database open;
  • 在node2上启动数据库
    startup

    图 173
  • 查看归档日志参数
    show parameter log

    图 174

    图 175
  • 开启归档设置完成后所有节点都生效

    主库启用force logging

  • 只在一个节点上配置
    select force_logging from v$database;

    图 176
    alter database force logging;

    图 177

    主库初始化参数配置

  • 在node1上配置主库初始化参数
  • 修改后重启数据库

    设置db_unique_name

  • 不加‘’,mrzhu为大写
    alter sysytem set db_unique_name=’mrzhu’ scope=spfile;
    alter sysytem set db_unique_name=’mrzhu’ scope=spfile;

    设置log_archive_config

  • 两实例的归档文件的link配置,mrzhu主库全局名,sbdb备库全局名,也是实例名
    alter system set log_archive_config=\'DG_CONFIG=(mrzhu,sbdb)\' scope=both sid=\'*\';


    图 178

    设置log_archive_dest_1

  • 本地归档保存路径,为ASM存储中
    alter system set log_archive_dest_1=\'LOCATION=+data/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=mrzhu\' scope=both sid=\'*\';


    图 179

    设置log_archive_dest_2

  • RAC传输备库日志文件参数
    alter system set log_archive_dest_2=\'SERVICE=tnssbdb LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=sbdb\' scope=both sid=\'*\';


    图 180

    设置standby_file_management

  • 开启主备库日志自动同步更新
    alter system set standby_file_management=auto scope=both sid=\'*\';


    图 181

    设置fal_sever/client

    DG向RAC主库拉取通道设置

    alter system set fal_client=\'tnsmrzhu\' scope=both sid=\'*\';
    alter system set fal_server=\'tnssbdb\' scope=both sid=\'*\';


    图 182

    检查参数

    show parameter log
    show parameter fal

    配置N1与N2的tnsnames.ora

  • oracle用户
  • 在n1 n2下配置tns监听文件
    N1:
    su – oracle
    cd /u01/app/oracle/product/12.2.0/db_1/network/admin
    或者cd $ORACLE_HOME/ network/admin
    vim tnsnames.ora
    ########添加以下内容#########

    tnsmrzhu =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu01)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )
    tnssbdb =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu03)(PORT = 1522))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )


    图 183

    图 184
    N2:
    su – oracle
    cd /u01/app/oracle/product/12.2.0/db_1/network/admin
    或者cd $ORACLE_HOME/ network/admin
    vim tnsnames.ora
    ########ora配置为#######

    tnsmrzhu =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu02)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )
    tnssbdb =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu03)(PORT = 1522))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )


    图 185

  • 在N1、N2上添加DG的hosts解析
    192.168.230.201 mrzhu03

    配置ADG数据库服务器

  • ADG与DG区别(real-time Apply)
    https://blog.csdn.net/weixin_42130786/article/details/116345739?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242
  • 提前安装好DG单库主机数据库软件(无需创建数据库实例)
  • 本文使用节点1未安装GRID软件之前的快照直接创建
  • 实际环境中,参数配置必须与RAC节点一致
  • 可使用以下txt文件参数配置单机oracle服务器

    密码文件配置

  • 从主库拷贝密码文件到备库保证主备密码文件一致
  • 11g及以前版本RAC密码文件存放在$ORACLE_HOME/dbs下,文件格式为orapwSID
  • 12C RAC存放在asm中

    查看主库密码文件

  • 查询密码文件位置,在n1上grid账户下
    srvctl config database -d mrzhu

    图 186

    拷贝密码文件到临时目录

  • 在N1上grid账户下
  • asmcmd
    pwcopy +DATA/MRZHU/PASSWORD/pwdmrzhu.283.1077455723 /tmp/mypwd
    图 187

    清除多余文件

  • 在DG上删除dbs目录下的多余文件,只保留init.ora文件(确保未创建数据库之前的文件布局)
    su - oracle
    cd $ORACLE_HOME/dbs

    图 188

    修改密码文件格式

  • 在N1上先把tmp目录下的密码文件远程复制到DG的dbs目录下
    scp mypwd mrzhu03:/u01/app/oracle/product/12.2.0/db_1/dbs
  • 在DG上修改为系统标准格式密码名
    su - oracle
    cd $ORACLE_HOME/dbs
    mv mypwd orapwsbdb
  • 修改所属用户与组
    chown oracle:oinstall orapwsbdb

    参数文件配置

  • 在DG上创建参数文件使数据库启动到nomount状态
  • 注意启动状态顺序与文件需求的关系
    nomount --pfile
    mount ---控制文件
    open—数据文件

    创建init参数文件

  • 在oracle账户下
    cd $ORACLE_HOME/dbs
    touch initsbdb.ora
  • 文件内容为

    db_name=\'mrzhu\' #主库数据库名,非实例名,非实例名前缀
    db_unique_name=\'sbdb\' #备库数据库名
    sga_target=2G
    pga_aggregate_target=800M #手动指定sga+pga=物理内存*80%
    audit_file_dest=\'/u01/app/oracle/admin/sbdb/adump\' #手动创建目录
    compatible=\'12.2.0\'
    remote_login_passwordfile=\'EXCLUSIVE\'
    control_files=\'/u01/app/oracle/oradata/sbdb/control01.ctl\',\'/u01/app/oracle/oradata/sbdb/control02.ctl\' #手动创建目录
    log_archive_config=\'DG_CONFIG=(mrzhu,sbdb)\'
    log_archive_dest_1=\'LOCATION=/u01/arch VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=sbdb\' #备库归档路径手动创建/u01/arch
    log_archive_dest_2=\'SERVICE=tnsmrzhu LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=mrzhu\' ##主备切换必选设置
    log_archive_format=\'%t_%s_%r.arc\' #归档格式
    db_file_name_convert=\'+DATA/MRZHU/DATAFILE\',\'/u01/app/oracle/oradata/sbdb\',\'+DATA/MRZHU/TEMPFILE\',\'/u01/app/oracle/oradata/sbdb\' #设置主库文件与备库文件传输目录(两对),主库的数据文件与临时文件可以通过select * from v$dbfile/v$tempfile;查看
    log_file_name_convert=\'+DATA/MRZHU/ONLINELOG\',\'/u01/app/oracle/oradata/sbdb\'
    fal_client=\'tnsmrzhu\'
    fal_server=\'tnssbdb\'
    standby_file_management=\'AUTO\'
  • 在oralce账户下创建对应目录
    mkdir -p /u01/app/oracle/admin/sbdb/adump
    mkdir -p /u01/app/oracle/oradata/sbdb/
    mkdir -p /u01/arch

    使用参数文件启动实例到nomount状态

  • 在DG上生成二进制启动参数文件spfile,注意oracle用户的环境变量sid为sbdb
    create spfile from pfile;

    图 189

    图 190
  • 启动到nomount状态
    startup nomount

    图 191

    检查启动参数文件

  • 检查是否是由对应参数文件启动的数据库实例
    show parameter spfile;

    图 192

    P19节

    静态监听listener.ora配置

  • 使用1522端口
  • 数据库在nomount状态下启动时只能使用静态监听,实现sqlplus远程登录操作数据库

    创建静态监听配置文件

  • DG的oracle用户下
    su - oracle
    cd /u01/app/oracle/product/12.2.0/db_1/network/admin (或者cd$ORACLE_HOME/network/admin)
    vim listener.ora
    内容如下:

    默认监听

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL= TCP)(HOST = mrzhu03)(PORT = 1521))
    (ADDRESS = (PROTOCOL= IPC)(KEY = EXTPROC1521))
    )
    )

    新增备库监听LISTENER1

    LISTENER1 =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS_LIST =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu03)(PORT = 1522))
    )
    )
    )
    SID_LIST_LISTENER1 =
    (SID_LIST =
    (SID_DESC =
    (GLOBAL_DBNAME = mrzhu)
    (SID_NAME = sbdb)
    (ORACLE_HOME = /u01/app/oracle/product/12.2.0/db_1)
    )
    )


    图 193

    启动DG备库监听

  • DG的oracle账户下启动监听listener1
    lsnrctl start listener1

    图 194

    链接文件tnsname.ora配置

  • 使用N1与DG做数据通信

    创建tnsname文件

  • DG的oracle用户下
    su - oracle
    cd /u01/app/oracle/product/12.2.0/db_1/network/admin (或者cd$ORACLE_HOME/network/admin)
    vim tnsnames.ora

    配置tnsnames.ora

    tnsmrzhu =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu01)(PORT = 1521))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )
    tnssbdb =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = mrzhu03)(PORT = 1522))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = mrzhu)
    )
    )

    主库测试与备库TNS通信

  • N1_oracle账户下测试与备库通信
    tnsping tnsmrzhu
    tnsping tnssbdb

    图 195

    图 196
  • 使用数据库之间的sqlplus远程登录测试
    sqlplus sys/root123@tnsmrzhu as sysdba
    sqlplus sys/root123@tnssbdb as sysdba
    select instance_name,status from v$instance;


    图 197

    图 198

  • N2上测试
    tnsping tnsmrzhu
    tnsping tnssbdb
    sqlplus sys/root123@tnsmrzhu as sysdba #tnsmrzhu与mrzhu02绑定所以显示sid为mrzhu02
    sqlplus sys/root123@tnssbdb as sysdba
    select instance_name,status from v$instance;

    图 199

    备库测试与主库TNS通信

  • 在DG上使用oracle账户测试
    tnsping tnsmrzhu
    tnsping tnssbdb
    sqlplus sys/root123@tnsmrzhu as sysdba #####监听name文件中配置tnsmrzhu与mrzhu01绑定所以显示sid为mrzhu01
    sqlplus sys/root123@tnssbdb as sysdba
    select instance_name,status from v$instance;

    图 200
  • listener与tnsname配置文件的区别
    https://blog.csdn.net/m0_37373806/article/details/64159846
    #########P20节

    创建DG的STANDBY副本

  • 保证DG实例监听启动、实例为nomount状态
  • 创建副本的方法使用duplicate复制(本文使用方法)或者使用rman离线复制

    使用RMAN远程链接DG

  • 在N1的oracle账户下
    rman target / #基于操作系统验证,后续可能会报错
    或基于密码验证
    rman target sys/root123@tnsmrzhu #使用此方法较好
  • 链接备备库实例
    RMAN> connect auxiliary sys/root123@tnssbdb

    图 201
  • 或者也可以用一条命令直接链接备库通道
    rman target sys/root123@tnsmrzhu auxiliary sys/root123@tnssbdb

    在N1复制数据库副本到备库

    RMAN>duplicate target database for standby from active database nofilenamecheck;

    图 202

  • temp文件不会拷贝过去,由数据库自动生成

    图 203

    查看备库状态

  • DG库相关参数已由pfile设置
  • 做完在线复制后DG数据库为mount状态了

    图 204

    配置STANDBY日志组

  • redolog
  • 添加standby日志组、开启同步
  • standby日志组=redo日志组+1共2+1
  • 查看RAC主库日志组
    select * from v$logfile;
  • 主库,DG日志成员为2个,如下
    N1:
    2个日志组goup1、2
    N2:
    2个日志组 group3、4
    member1 ------(g1 、g2)
    member2-------(g13、g4)
    那么DG日志组配置2+1,thread为线程
    thread1 ----(g11 g12 g13)
    thread2 ----(g14 g15 g16)

    图 205

    创建备库日志组

  • 备库日志文件大小为200M必须与rac一致
  • 在dg上查看成员与日志组
    select * from v$standby_log;

    图 206
  • 在DG上添加日志组 2group+1group
    ####
    alter database add standby logfile thread 1 group 11 (\'/u01/app/oracle/oradata/sbdb/stredo11.log\') size 200M;
    alter database add standby logfile thread 1 group 12 (\'/u01/app/oracle/oradata/sbdb/stredo12.log\') size 200M; ####对应节点1同步
    alter database add standby logfile thread 1 group 13 (\'/u01/app/oracle/oradata/sbdb/stredo13.log\') size 200M;
    ###
    alter database add standby logfile thread 2 group 14 (\'/u01/app/oracle/oradata/sbdb/stredo14.log\') size 200M;
    alter database add standby logfile thread 2 group 15 (\'/u01/app/oracle/oradata/sbdb/stredo15.log\') size 200M; #####对应节点2同步
    alter database add standby logfile thread 2 group 16 (\'/u01/app/oracle/oradata/sbdb/stredo16.log\') size 200M;
    #####

    打开Redo实时应用同步(ADG)功能

  • 12c切换归档才能同步
    alter database recover managed standby database using archived logfile disconnect;
    alter system switch logfile;
  • 取消redo同步
  • alter database recover managed standby database cancel;
  • ADG
  • 切换DG数据库到open状态
    alter database open;

    图 207
  • 在DG上开启redo实时同步
    alter database recover managed standby database disconnect;
  • 设置完成后DG的open模式为read only with apply

    修改保护模式为性能

  • 最大性能,不会实时同步,如果主库采用非此模式且备库不可用会强制转化为此模式
    alter database set standby database to maximize performance;
  • 最大可用,主库commit后备库实时修改,一般使用此模式
    alter database set standby database to maximize availability;
  • 最大保护,如果主库和备库同步不了,主库就会shutdown
    alter database set standby database to maximize protection;

    查看主备库模式

  • 查看主库状态
    setline 100
    select name,open_mode,database_role,protection_mode, protection_level from v$database;


    图 208

  • 查看DG状态
    select name,open_mode,database_role,protection_mode, protection_level from v$database;

    图 209

    更改保护模式

  • 在主库其一节点以及DG上设置即可
    alter database set standby database to maximize availability;

    图 210

    测试主备库数据同步功能

    主库创建测试表

  • 在主库插入表
    create table zhu(id int);
    insert into zhu values(1000);
    commit;
    /
    /
    /


    图 211

    在DG上查看表同步情况


    图 212

    查看备库redo日志状态

    select * from v$standby_log;

    图 213

    查看后台同步进程状态

    select * from v$managed_standby;

    图 214

    DG数据同步优化(必配置)

  • 之前的tnsname-hostname映射配置,DG的tnsmrzhu参数绑定的是mrzhu01,那么节点1 宕机后DG不会拉取节点2的日志进行同步
  • 修改DG的tnsname的tnsmrzhu参数为rac-scan后无论N1或者N2宕机,DG都可以拉取归档

    修改DG的tnsname.ora

  • 在DG上oracle账户下
    cd /u01/app/oracle/product/12.2.0/db_1/network/admin
    vim tnsnames.ora

    图 215
  • 确认hosts解析已经添加

    图 216

    重启监听进程

  • 关闭备库监听listener1
    lsnrctl stop listener1

    图 217
  • 关闭DG数据库
    sqlplus / as sysdba
    shutdown immediate
    exit

    图 218
  • 启动备库监听
  • lsnrctl start listener1

  • 图 219
  • 启动DG实例
    sqlplus / as sysdba
    startup

    打开DG实时同步应用

  • 数据库每次重启后都要重新开启实时同步
    alter database recover managed standby database disconnect;

    图 220
  • 查看归档
    1开头是N1,2开头是N2

    图 221
  • 在N1上查看最新归档号并与DG作对比,确认是否一致

    图 222

    图 223

    图 224

    优化后同步测试

    DG虚拟机断网

  • 关闭虚拟机网卡

    图 225

    N1插入数据到表zhu

  • 测试DG断网拉取日志,在N1上插入zhu表数据
    insert into zhu values(999);
    commit;


    图 226

  • 在N1和N2做几次日志切换
    alter system switch logfile;

    图 227
  • 确认N2已经有此表的新增数据

    查看主库节点归档

    archive log list;

    图 228

    图 229

    确定rac-scan资源在主库哪个节点

    grid账户下
    crsctl stat res -t

    图 230

  • 在N1上查看scan监听
    lsnrctl status listener_scan1

    图 231

    关闭节点1电源

  • 关闭节点1(虚拟机电源-关机),直接关机相当于scan断电,此时scan飘逸到N2上

    图 232
    crsctl stat res -t

    图 233

    打开DG主机网卡


    图 234

    图 235

    确认DG是否接收到N2传输的归档日志

  • 查看DG归档日志
    cd /u01/arch/

    图 236

    查看N2归档日志

  • 建议使用视图化工具查看此参数,网速较慢可能会显示超时error
  • 传输进程排错需要查看的参数
    select from v$archive_dest;
    select
    from v$archive_dest_status;

    图 237

    对比DG与N2的归档日志

  • 如果一样则说明,业务scan资源切换到N2上后,归档也能正常被同步到DG上

    检查数据表同步情况

  • 在DG上检查在N1上插入的数据有没被同步到DG上
  • 打开日志实时同步应用
    alter database recover managed standby database disconnect; #同步从N2上的归档到当前数据库中
  • 在DG上查看表,确认是否有999值
    select * from zhu;

    图 238

    RAC与DG的启停顺序与同步常见问题

    启停顺序

  • 启动:
    先备库,后主库
  • 关闭:
    先主库,后备库
  • 前提:
  • 干净的关闭,关闭实例,关闭资源,init 0 关机

    常见问题

    机房断电

  • 注意如果DG服务器直接关机会报错
  • 如果机房意外断电导致日志不连续需要DG恢复

    图 239

    断电后的同步问题排查_1

  • 排查思路
    先执行sql界面优化

    SQL> COL NAME FOR A13
    SQL> COL VALUE FOR A20
    SQL> COL UNIT FOR A30
    SQL> SET LINES 122
  • 在DG上查看同步时间差
    SELECT NAME,VALUE,UNIT,TIME_COMPUTED FROM V$DATAGUARD_STATS WHERE NAME IN (\'transport lag\',\'apply lag\');
  • 查看主库log seq
    select thread#, max(sequence#) from v$archived_log group by thread#;
  • 查看备库log seq
    select thread#, max(sequence#) from v$archived_log where applied=\'YES\' group by thread#;
  • 本文中问题出在没有开启DG的监听,导致rac-scan数据传输有问题。
    开启监听后

    图 240
  • 由于主库日志没有同步过来,这时候有2个办法
    1、等待日志同步到备库后在执行alter databse open;
    2、手动在N1和 N2上执行日志切换,强制同步日志。

    图 241
  • 查看同步时间差恢复正常为0

    图 242
  • 查看log

    图 243

    图 244
  • 最后别忘了在DG上打开log日志同步到数据库数据应用,否则N1上插入数据DG上不会同步到数据表
    alter database recover managed standby database disconnect;
  • 查看应用log seq
  • select thread#, max(sequence#) from v$archived_log group by thread#;

    图 245
  • 为什么thread2是57而不是最新的应用log seq,因为DG上的tnsname是rac-scan,此时scan节点为N1,所以和节点1是实时同步,要想2节点的实时同步日志号与N2上一致,在N2上发生commit或者日志切换即可。
    如下:

    图 246

    图 247
  • 总结:如果没有按照规定关闭开启关数据库集群时,发生断电异步重启,会导致日志不同步而产生的各种问题

    排错思路

  • 软件层:网络数据同步传输通道正常,如tnsname配置、监听是否打开,解决通讯问题如果还有问题可以考虑日志切换后,手动执行DG恢复。

    DG恢复参考:

    http://blog.itpub.net/22996654/viewspace-2149347/
    https://blog.csdn.net/ctypyb2002/article/details/86699877

    排查思路

  • 查下主库节点,备库的配置
  • 检查TNS相关配置
  • 检查fal_client,fal_server参数
  • 查下备库是否在实时应用模式
  • 查询相关视图
    备库:
    v$managed_standby
    注意RFS传输进程和MRP0日志应用进程
    主库:
    v$archive_dest
    v$archive_dest_status
转载请注明-MrZ-个人博客
THE END
分享
二维码
海报
【Oracle】12C RAC系列之02 ADG冗余部署(Linux)
目录1 ADG服务器创建前的准备1.1 说明与注意事项1.2 主库RAC归档配置-11.2.1 查看归档文件命令规则1.2.2 修改归档命名规则1.2.3 创建RAC归档保存目录1.2.4 修改两个实例的归档日志保存路径1.3 主库启用force loggi……
<<上一篇
下一篇>>