一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第3天,点击查看活动详情。
📢📢📢📣📣📣
哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10年DBA工作经验
中国DBA联盟(ACDU)成员,目前从事DBA及程序编程😜😜😜
擅长Oracle、MySQL、PG 运维开发,备份恢复,安装迁移,性能优化、故障应急处理等。
❤️❤️❤️感谢各位大可爱小可爱!❤️❤️❤️
摘要:DG时候Oracle高可用的产品,深受用户喜爱
Oracle的一个高可用机制,用于做数据冗余,
DataGuard可以提供Oracle数据库的冗灾、数据保护、故障恢复等,实现数据库快速切换与灾难性恢复。
RAC ---实例级的冗余方案
Data guard ---数据级的冗余方案
1.主备确认
1.1 主库确认
SYS@PROD> set line 999
SYS@PROD> select name, LOG_MODE,
OPEN_MODE, database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
1.2 备库确认
SYS@PRODDG> alter database recover managed standby
database using current logfile
disconnect from session;
SYS@PRODDG> set line 999
SYS@PRODDG> select name, LOG_MODE, OPEN_MODE,
database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
##备库应用日志同步取消
alter database recover managed standby database cancel;
2.意外宕机
2.1 主库模拟
SYS@PROD> select name, LOG_MODE,
OPEN_MODE, database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
SYS@PROD> alter system switch logfile;
SYS@PROD> set time on
19:08:09 SYS@PROD> set timing on
19:08:13 SYS@PROD> create table test
as select * from dba_objects;
19:08:34 SYS@PROD> insert into test select * from test;
--连续执行4次,再提交
2.2 备库查询
SYS@PRODDG> select count(1) from test;
SYS@PRODDG> select thread#, low_sequence#,
high_sequence# from v$archive_gap;
如果没有发现明显的gap现象,
说明此次的failover不会有数据损失情况。
在standby端,要进行关闭apply和结束应用动作。
3.备库直接切换
SYS@PRODDG> alter database recover managed
standby database cancel;
SYS@PRODDG> alter database recover managed
standby database finish;
SYS@PRODDG> select name, LOG_MODE,
OPEN_MODE, database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
SYS@PRODDG> alter database commit to switchover
to primary with session shutdown;
SYS@PRODDG> select name, LOG_MODE, OPEN_MODE,
database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
SYS@PRODDG> alter database open;
SYS@PRODDG> select name, LOG_MODE, OPEN_MODE,
database_role, SWITCHOVER_STATUS,
db_unique_name from v$database;
切换成功。切换之后,我们观察这个过程的日志情况
[oracle@source ~]$ cd /u01/app/oracle/diag/rdbms/11g_st/PRODDG/trace
[oracle@source trace]$ tail -1000f alert_PRODDG.log
4.切换后的测试
SYS@PRODDG> alter system switch logfile;
SYS@PRODDG> delete from test where rownum<=10000;
SYS@PRODDG> commit;
SYS@PRODDG> set line 999
SYS@PRODDG> select name, LOG_MODE,
OPEN_MODE, database_role,
SWITCHOVER_STATUS, db_unique_name
from v$database;
SYS@PRODDG> set line 9999
SYS@PRODDG> col DEST_NAME format a20
SYS@PRODDG> col DESTINATION format a20
SYS@PRODDG> col GAP_STATUS format a10
SYS@PRODDG> col DB_UNIQUE_NAME format a10
SYS@PRODDG> col error format a10
SYS@PRODDG>
SELECT al.thread#,
ads.dest_id,
ads.DEST_NAME,
(SELECT ad.TARGET
FROM v$archive_dest AD
WHERE AD.DEST_ID = ADS.DEST_ID) TARGET,
ADS.DATABASE_MODE,
ads.STATUS,
ads.error,
ads.TYPE,
ads.RECOVERY_MODE,
ads.DB_UNIQUE_NAME,
ads.DESTINATION,
ads.GAP_STATUS,
(SELECT MAX(sequence#) FROM v$log na WHERE na.thread# = al.thread#) "Current Sequence",
MAX(sequence#) "Last Archived",
MAX(decode(al.APPLIED, 'YES', sequence#)) APPLIED_SEQ#
FROM (SELECT *
FROM v$archived_log V
WHERE V.resetlogs_change# =
(SELECT d.RESETLOGS_CHANGE# FROM v$database d)) al,
v$archive_dest_status ads
WHERE al.dest_id(+) = ads.dest_id
AND ads.STATUS != 'INACTIVE'
GROUP BY al.thread#,
ads.dest_id,
ads.DEST_NAME,
ads.STATUS,
ads.error,
ads.TYPE,
ADS.DATABASE_MODE,
ads.RECOVERY_MODE,
ads.DB_UNIQUE_NAME,
ads.DESTINATION,
ads.GAP_STATUS
ORDER BY al.thread#,
ads.dest_id;
此时,failover过程成功。