环境:
主机ip |
dg角色 |
db_name |
db_unique_name |
192.168.56.110 |
primary |
SHPD |
SHPD |
192.168.56.111 |
standby |
SHPD |
SHST |
主机必要条件check
-
SHPD和SHST都已安装好oracle软件,配置好环境变量,listener.ora,tnsnames.ora
-
SHPD数据库已创建好,启动到open,SHST启动到nomount
-
目录结构同clone db
-
init.ora也使用clonedb的,db_unique_name需要修改,其余的下面在具体配置
tnsname.ora内容:
shpd =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.110)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SHPD)
)
)
shst =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.56.111)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = SHST)
)
)

配置主库参数
--参数check
col name format a30;
col value format a200;
set linesize 1000;
set pagesize 1000;
select name,value from v$parameter
where name in('fal_server',
'fal_client',
'standby_file_management',
'db_file_name_convert',
'log_file_name_convert',
'db_name',
'db_unique_name',
'log_archive_dest_1',
'log_archive_dest_2',
'log_archive_config')
order by name;
--主备db和log路径转换
select 'datafile',name from v$datafile
union all
select 'tempfile',name from v$tempfile
union all
select 'logifle',member from V$LOGFILE where TYPE='ONLINE';
ALTER SYSTEM SET db_unique_name='SHPD' SCOPE=SPFILE;
ALTER SYSTEM SET db_file_name_convert='/u01/oradata/SHST/datafile','/u01/oradata/SHPD/datafile','/u01/oradata/SHST/tempfile','/u01/oradata/SHPD/tempfile' scope=spfile;
ALTER SYSTEM SET log_file_name_convert='/u01/oradata/SHST/onlinefile','/u01/oradata/SHPD/onlinefile' scope=spfile;
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(SHPD,SHST)' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SHPD/arch valid_for=(all_logfiles,all_roles) db_unique_name=SHPD' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2='SERVICE=SHST LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=SHST' SCOPE=BOTH;
alter system set LOG_ARCHIVE_DEST_STATE_1=enable scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=enable scope=both;
ALTER SYSTEM SET fal_server='SHST' SCOPE=BOTH;
ALTER SYSTEM SET fal_client='SHPD' SCOPE=BOTH;
ALTER SYSTEM SET standby_file_management=AUTO SCOPE=BOTH;
配置从库参数
ALTER SYSTEM SET db_unique_name='SHST' scope=spfile;
ALTER SYSTEM SET db_name='SHPD' scope=spfile;
ALTER SYSTEM SET db_file_name_convert='/u01/oradata/SHPD/datafile','/u01/oradata/SHST/datafile','/u01/oradata/SHPD/tempfile','/u01/oradata/SHST/tempfile' scope=spfile;
ALTER SYSTEM SET log_file_name_convert='/u01/oradata/SHPD/onlinefile','/u01/oradata/SHST/onlinefile' scope=spfile;
ALTER SYSTEM SET log_archive_config='DG_CONFIG=(SHPD,SHST)' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_1='location=/u01/oradata/SHST/arch valid_for=(all_logfiles,all_roles) db_unique_name=SHST' SCOPE=BOTH;
ALTER SYSTEM SET log_archive_dest_2='SERVICE=SHPD LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=SHPD' SCOPE=BOTH;
alter system set LOG_ARCHIVE_DEST_STATE_1=enable scope=both;
alter system set LOG_ARCHIVE_DEST_STATE_2=enable scope=both;
ALTER SYSTEM SET fal_server='SHPD' SCOPE=BOTH;
ALTER SYSTEM SET fal_client='SHST' SCOPE=BOTH;
ALTER SYSTEM SET standby_file_management=AUTO SCOPE=BOTH;

添加日志文件
根据primary的online redo log大小和组数,按规则添加Standby online log,添加的group的编号最好有预留,方便扩展
select * from V$LOGFILE;
select * from v$log;
select * from V$STANDBY_LOG;
/*主库添加Standby online log*/
alter database add standby logfile
group 11 '/u01/oradata/SHPD/onlinefile/standbyredo04.log' size 50M,
group 12 '/u01/oradata/SHPD/onlinefile/standbyredo05.log' size 50M,
group 13 '/u01/oradata/SHPD/onlinefile/standbyredo06.log' size 50M,
group 14 '/u01/oradata/SHPD/onlinefile/standbyredo07.log' size 50M;
/*备库添加Standby online log*/
alter database add standby logfile group 10('/u01/app/oracle/oradata/intedb/standby_redo10.log') size 50M;
alter database add standby logfile group 11('/u01/app/oracle/oradata/intedb/standby_redo11.log') size 50M;
alter database add standby logfile group 12('/u01/app/oracle/oradata/intedb/standby_redo12.log') size 50M;
alter database add standby logfile group 13('/u01/app/oracle/oradata/intedb/standby_redo13.log') size 50M;
alter database add standby logfile group 14('/u01/app/oracle/oradata/intedb/standby_redo14.log') size 50M;
备库同步主库数据
生成standby controlfile,并复制到standby目录(忽略)
Standby数据恢复,Standby上执行
##Method1 在线还原数据,需要配置配置静态监听,STANDBY上执行
rman target sys@SHPD auxiliary sys@SHST
duplicate database for standby from active database nofilenamecheck;
##Method2利用备份集,有target连接
先备份,duplicate复制库
rman target sys@SHPD auxiliary /
duplicate target database for standby;
##Method3利用备份集,无target连接
先备份,duplicate复制库
rman auxiliary /
duplicate database for standby backup location '/data/backup' nofilenamecheck;
--打开Standby数据库
alter database open read only;
--开启实时日志应用,启用Real-Time Apply;开启MRP进程,停止redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
--关闭MRP进程(停止应用日志),开启redo应用
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
--使用arch同步模式
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Monitoring DG
DG状态监控
--查看DB状态
select instance_name,status from v$instance;
--验证测试data guard
ALTER SYSTEM ARCHIVE LOG CURRENT;
select name,controlfile_type,open_mode,protection_mode,
protection_level,database_role,SWITCHOVER_STATUS,db_unique_name,
guard_status,PRIMARY_DB_UNIQUE_NAME
from v$database;
SELECT * FROM v$dataguard_stats;
SELECT NAME,applied FROM v$archived_log order by COMPLETION_TIME desc;
select * from V$ARCHIVE_DEST;
select * from v$archive_dest_status;
select * from v$archive_gap;
select * from v$archived_log;
SELECT * FROM v$standby_log;
select * from v$managed_standby;
select * from V$LOG;
select * from v$logfile;
select * from V$LOG_HISTORY;
监控redo传输服务
Step 1-查看主库最新的归档日志,如果dest2的最新归档日志和dest1的相同,表示已传输到dest2
SELECT dest_id,MAX(SEQUENCE#), THREAD#
FROM V$ARCHIVED_LOG
WHERE RESETLOGS_CHANGE# = (SELECT MAX(RESETLOGS_CHANGE#) FROM V$ARCHIVED_LOG)
GROUP BY dest_id,THREAD#;
Step 2-查看备库最新的归档日志,如果dest1的最新归档日志和主库上的相同,表示接受成功
SELECT dest_id,dest_name,DESTINATION, STATUS, ARCHIVED_THREAD#, ARCHIVED_SEQ#
FROM V$ARCHIVE_DEST_STATUS
WHERE STATUS <> 'DEFERRED'
AND STATUS <> 'INACTIVE';
Step 3-确认已在目标上接收到归档重做日志文件
SELECT LOCAL.THREAD#, LOCAL.SEQUENCE#
FROM (SELECT THREAD#, SEQUENCE#
FROM V$ARCHIVED_LOG WHERE DEST_ID=1)LOCAL
WHERE LOCAL.SEQUENCE# NOT IN(SELECT SEQUENCE# FROM V$ARCHIVED_LOG WHERE DEST_ID=2
AND THREAD# = LOCAL.THREAD#);
Step 4-Trace the progression of redo transmitted to a redo transport destination.LOG_ARCHIVE_TRACE
switchover步骤
switchover包含两个步骤,首先主库被转换成STANDBY,然后STANDBY被转换成主库,确认没有用户连接到数据库
/*check1-主库确认没有日志缺口,应该返回VALID和NO GAP*/
select STATUS, GAP_STATUS from V$ARCHIVE_DEST_STATUS;
/*check2-确认备库的临时文件和主库一样*/
SELECT * FROM v$tempfile;
/*check3-确认所有重做日志都已在备库应用,查询备库*/
select NAME, VALUE, DATUM_TIME from V$DATAGUARD_STATS;
/*check4-主数据库的状态检查,分别确认主库和备库都可以进行角色切换,查询主库-返回TO STANDBY,SESSIONS ACTIVE,那么主库就可以进行切换;备库返回TO PRIMARY,SESSIONS ACTIVE,NOT ALLOWED,就可以切换,备库如果返回SWITCHOVER LATENT或SWITCHOVER PENDING,就要去检查告警日志,看有什么问题,一般是需要应用一些日志,如果是需要应用日志的话,在备库执行如下命令:*/
select name,open_mode,database_role,protection_mode,SWITCHOVER_STATUS From v$database;
--recover standby database using backup controlfile;
/*先将primary切换为standby
如果SWITCHOVER_STATUS为TO STANDBY,直接switchover;
如果SWITCHOVER_STATUS为SESSIONS ACTIVE,,需要加with session shutdown,
实例会关闭
说明:PRIMARY进行转换完毕后,查看状态会变成RECOVERY NEEDED
*/
alter database commit to switchover to physical standby;
alter database commit to switchover to physical standby with session shutdown;
startup mount;
/*备库切为主库
如果SWITCHOVER_STATUS为TO_PRIMARY,直接switchover;
如果SWITCHOVER_STATUS为SESSIONS ACTIVE,先停MRP,switchover加上with session shutdown*/
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
alter database commit to switchover to primary;
alter database commit to switchover to primary with session shutdown;
alter database open;
/*在切换后的standby上开启实时日志应用*/
alter database open read only;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
failover步骤
一般情况下failover都是表示primary数据库瘫痪,最起码也是起不来了,因此这种类型的切换基本上不需要primary数据库做什么操作
/*standby上先查看有没有日志间隙*/
SELECT * FROM v$archive_gap;
/*如果存在间隙(online redolog),还能将主库启动到挂载(mount)状态,可以试着将刷新未传输的online日志到备库,如能刷新,故障转移可能不会丢失任何数据*/
alter system flush redo to 'JED';
/*如果存在间隙,为了尽可能少的丢失数据,应该尝试将所有归档日志应用,应该将主库上的所有归档日志复制到备库,可能有一些归档日志已经在备库存在,但这样能有尽可能多的归档日志,然后要解决备库中的任何日志缺口,首先,复制所有主库的归档到备库,并在数据库中注册它们*/
alter database register physical logfile '&logfile_path_name';
/*在备库停止日志应用*/
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
/*结束应用任何日志,一旦执行了这个命令,备库就必须转换为主库,要不就得重建*/
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
/*转换备库为主库*/
alter database commit to switchover to primary with session shutdown;
alter database open;
/*检查*/
select SWITCHOVER_STATUS from V$DATABASE;
/*获得原备库转换为主库时的SCN*/
SELECT to_char(STANDBY_BECAME_PRIMARY_SCN) from V$DATABASE;
切换为快照standby
步骤:
- 停止Redo Apply
- 数据库处于mount,不是open
- Ensure that a fast recovery area has been configured. It is not necessary for flashback database to be enabled.
- 执行sql,完成转换:
-
-
ALTER DATABASE CONVERT TO SNAPSHOT STANDBY;
--查看当前备用数据库的角色,设置FRA,停止mrp
select open_mode,database_role,flashback_on from v$database;
alter database recover managed standby database cancel;
alter system set db_recovery_file_dest_size=500m scope=both;
alter system set db_recovery_file_dest='/u01/oradata/SHPD/fra' scope=both;
--关闭并启动到mount
shutdown immediate;
startup mount;
--转换物理standby到快照standby
alter database convert to snapshot standby;
select status from v$instance;
alter database open;
select open_mode,database_role from v$database;
--oracle创建了还原点
select name,storage_size from v$restore_point;
切换回物理standby
--查看当前备用数据库的角色
select open_mode,database_role from v$database;
--关闭并启动到mount
shutdown immediate;
startup mount;
--转换快照standby到物理standby
alter database convert to physical standby;
shutdown immediate;
startup;
保护模式切换
/*主备保护模式切换,要注意的是log_archive_dest参数的切换,由于最大保护模式与最大可用模式的重做归档进程、网络传输与磁盘写选项是一样的--所以可以直接更改模式就可以了,不需要先修改参数信息*/
--物理standby先停用mrp
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
--主库启动到mount
shutdown immediate;
startup mount;
--切换到高可用或高保护
ALTER SYSTEM SET log_archive_dest_2='SERVICE=SHPD SYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=SHPD' SCOPE=BOTH;
alter database set standby database to maximize protection;
alter database set standby database to maximize availability;
alter database open;
--切换到高性能模式
ALTER SYSTEM SET log_archive_dest_2='SERVICE=SHPD ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=SHPD' SCOPE=BOTH;
alter database set standby database to maximize performance;