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';