DATAGUARD之一:12C环境下配ADG以及启用DB BROKER

一,系统环境

  Primary Standby
OS RHEL6.8 RHEL6.8
DB VERSION 12.2.0.1 12.2.0.1
DB_UNIQUE_NAME RYANPR RYANSTD
DB_NAME RYAN RYAN

二,Primary参数配置

1,开启归档和force logging,以及flashback database,并且修改DB_UNIQUE_NAME

查看下你的DB是否已经配置了:

select name,log_mode,force_logging,flashback_on from v$database;

开启force logging:

Force logging目的是为了强制写日志,为了防止某些操作的时候指定了nologging,并且可以传递给备库使用

alter database force logging;

开启归档:

shutdown immediate;
startup mount;
alter database archivelog;
alter database open;

开启flashback database:

一般在fail over之后,我们需要繁琐的步骤来重建primary db,但是启用flashback database可以快速把DB恢复到某个时间点,省去了很多步骤

alter database flashback on;

2,配置日志传输认证

Oracle使用Oracle Net来传输日志数据和控制信息,可以使用SSL或者remote password file,我们这里使用remote password file。

cd $ORACLE_HOME/dbs
orapwd file=orapwryanpr password=Test_123 force=y

FILE: 名字为orapw+$ORACLE_SID,PASSWORD: 指定SYS的密码,FORCE:是否覆盖文件

注意12c可以指定format,不指定情况下默认12.2

3,配置主库接收日志数据,即添加standby log

日志传输的过程中,需要用到standby redo log来接收日志数据,通过RFS进程接收日志数据并且写入到standby redo log group中。

当源数据库的日志组切换的时候,传入的日志数据会写入到下一个standby redo log group,然后上一个日志组则会被ARCn进程进行归档。

因此,

1,standby日志组的大小应该和redo log group的大小一致

2,每一个日志线程,standby日志组的数量至少要比日志组多一组

虽然主库角色不需要用到standby redo log,但是这是为以后switchover做准备,并且在主库做完这些配置后再进行拷贝,能够省去备库的操作

检查log size和count

select group#,BYTES/1024/1024 SIZE_MB from v$log;

创建standby redo log

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 SIZE 200M;

检查:

select group#,bytes/1024/1024 SIZE_MB from v$standby_log;

4,修改数据库参数

DB_NAME=ryan
DB_UNIQUE_NAME=ryanpr
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ryanpr,ryanstd)'
CONTROL_FILES='/oradata/datafile/RYAN/controlfile/ryanpr1.ctl','/oradata/fra/ryan/RYAN/controlfile/ryanpr2.ctl'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ryanpr'
LOG_ARCHIVE_DEST_2='SERVICE=ryanstd SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ryanstd'
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
--当主库切换为备库的时候,以下参数生效:
FAL_SERVER=ryanstd
DB_FILE_NAME_CONVERT='/RYANSTD/','/RYANPR/'
LOG_FILE_NAME_CONVERT='/RYANSTD/','/RYANPR/'
STANDBY_FILE_MANAGEMENT=AUTO

这里特意说一下:

控制文件名字,你可以修改完参数后,把数据库关闭,然后直接使用mv来修改控制文件的名字,再打开就好了

FILE_NAME covert,记得把所有的路径成对写上,还要注意大小写问题,因为LINUX文件系统名字是分大小写的

STANDBY_FILE_MANAGEMENT设置为AUTO,这样子当主库增加或者删除数据文件的时候,备库也会自动进行操作

注意:记得先备份spfile

设置完参数后记得重启

三,搭建备库

1,备份主库--主库操作

这里不使用duplicate,熟悉一下普通方式

backup as compressed backupset full database plus archivelog;

2,创建给备库使用的控制文件--主库操作

alter database create standby controlfile as '/tmp/ryanstd.ctl';

这个alter database表明该controlfile的角色是standby,你不可以用一个单一的controlfile文件给两边使用,两者应该是相互独立的

3,给备库创建参数文件--主库操作

create pfile='/tmp/initryanstd.ora' from spfile;

 

修改之前配置的参数

DB_UNIQUE_NAME=ryanstd
LOG_ARCHIVE_CONFIG='DG_CONFIG=(ryanstd,ryanpr)'
CONTROL_FILES='/oradata/datafile/RYAN/controlfile/ryanstd1.ctl','/oradata/fra/ryan/RYAN/controlfile/ryanstd2.ctl'
LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=ryanstd'
LOG_ARCHIVE_DEST_2='SERVICE=ryanpr SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=ryanpr'
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
--备库,以下参数生效:
FAL_SERVER=ryanpr
DB_FILE_NAME_CONVERT='/RYANPR/','/RYANSTD/','/RYAN/','/RYANSTD/'
LOG_FILE_NAME_CONVERT='/RYANPR/','/RYANSTD/','/RYAN/'.'/RYANSTD/'
STANDBY_FILE_MANAGEMENT=AUTO

4,把文件拷贝到备库

  • backup file,我放在备库的路径的是:/oradata/fra/ryan/RYAN/backupset/2019_11_02
  • standby controlfile,记得要和备库的参数一致,拷贝到备库的相应路径,修改名字,同一个控制文件可以拷贝到两个位置
  • parameter file ,$ORACLE_HOME/dbs,名字改为init$DB_NAME.ora,这里是initryan.ora

5,设置备库环境

  • 如果是windows服务器,要先创建服务,这里都是LINUX,所以省略

  oradim –NEW –SID ryan –STARTMODE manual

  • 拷贝远程登录密码文件到备库,在12C版本,如果主库密码文件有所变动,比如说alter, 会自动同步到备库,但是对于far sync server来说,还是需要手动更新密码文件
  • 创建spfile
mv $ORACLE_HOME/dbs/initryanstd.ora $ORACLE_HOME/initryan.ora
create spfile from pfile='/u01/app/oracle/12.2.0/dbs/initryan.ora';

  • 如果使用了wallet,还需要把wallet拷贝到每个备库

5,配置监听服务

主库:

$ORACLE_HOME/network/admin/listener.ora

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

SID_LIST_LISTENER=
   (SID_LIST=
        (SID_DESC=
          (GLOBAL_DBNAME=ryanpr)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
        (SID_DESC=
          (GLOBAL_DBNAME=RYANPR_DGMGRL)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
        (SID_DESC=
          (GLOBAL_DBNAME=ryanpr_DGB)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
       )

$ORACLE_HOME/network/admin/tnsnames.ora

RYANPR =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ryan1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ryanpr)
    )
  )

RYANSTD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ryan2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ryanstd)
    )
  )

备库:

$ORACLE_HOME/network/admin/listener.ora

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

SID_LIST_LISTENER=
   (SID_LIST=
        (SID_DESC=
          (GLOBAL_DBNAME=ryanstd)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
        (SID_DESC=
          (GLOBAL_DBNAME=ryanstd_DGB)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
        (SID_DESC=
          (GLOBAL_DBNAME=ryanstd_DGMGRL)
          (SID_NAME=ryan)
          (ORACLE_HOME=/u01/app/oracle/12.2.0)
        )
       )

$ORACLE_HOME/network/admin/tnsnames.ora

RYANPR =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ryan1)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ryanpr)
    )
  )

RYANSTD =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ryan2)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ryanstd)
    )
  )

6,恢复备库

启动到mount状态

因为我的备份文件存放的位置和主库不一样,也就是说和控制文件中的不一样,所以要先注册备份文件到控制文件 

catalog start with '/oradata/fra/ryan/RYAN/backupset/2019_11_02';

恢复

rman target /
restore database;

7,开始应用redo log

检查两边的监听是否已经正常启动,然后再应用日志

alter database recover managed standby database disconnect from session;

8,检查应用状态

SELECT CLIENT_PROCESS, PROCESS, THREAD#, SEQUENCE#, STATUS FROM V$MANAGED_STANDBY WHERE CLIENT_PROCESS='LGWR' OR PROCESS='MRP0';

注意:这个时候检查alert的话,会报redo log没有创建,在启用日志应用的几分钟后它会自动创建

四,配置DG Broker

主备两边都要启动dg broker:

alter system set dg_broker_start=TRUE scope=both;

主库创建configuration:

create configuration ryan_dg as primary database is ryanpr connect identifier is ryanpr;

主库添加备库:

add database ryanstd as connect identifier is ryanstd maintained as PHYSICAL;

启用configuration:

enable configuration;

如何删除配置文件:

disable configuration;
remove configuration;

或者删除单个数据库,前提都是先disable:

remove database ryanstd;

在检查的过程中,如果出现了两边的protection_mode不一致,检查一下两个数据库的详细参数:

show database verbose ryanpr;
show database verbose ryanstd;

一般来说是日志同步参数没有配一致,一个是SYNC,一个是ASYNC,修改方式

edit database ryanstd set property LogXptMode='SYNC';
posted @ 2019-11-15 21:15  Ryan_Wo  阅读(734)  评论(0编辑  收藏  举报