方法一、删除failed 主数据库,重新利用新主库搭建standby备库
1、dbca删除failed库(删除failed库前最好备份一下spfile文件,方便后续修改)
(或者使用drop database删除failed库)
2、清理归档日志
3、配置spfile
–从主库生成pfile文件(最好是删除failed库前备份一下spfile文件,这样修改比较简单,就不用从正常库复制了)
create pfile=’/home/oracle/pfile_20200220.ora’ from spfile=’+DATADG/testdbdg/spfiletestdbdg.ora’;
–修改pfile文件
–生成新备库的spfile文件
create spfile=’+DATADG/testdb/spfiletestdb.ora’ from pfile=’/home/oracle/pfile_20200114.ora’;
–修改ORACLEHOME/dbs目录下的pfile文件,指向spfile文件[oracle@primarydb1dbs]ORACLE_HOME/dbs目录下的pfile文件,指向spfile文件[oracle@primarydb1 dbs]ORACLEHOME/dbs目录下的pfile文件,指向spfile文件[oracle@primarydb1dbs] cat inittestdb1.ora
SPFILE=’+DATADG/testdb/spfiletestdb.ora’
[oracle@primarydb2 dbs]$ cat inittestdb2.ora
SPFILE=’+DATADG/testdb/spfiletestdb.ora’
4、配置密码文件
copy到备库1号机:
scp orapwtestdb2 oracle@10.xxx.xxx.221:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwtestdb1
copy到备库2号机:
scp orapwtestdb2 oracle@10.xxx.xxx.222:/u01/app/oracle/product/11.2.0/db_1/dbs/orapwtestdb2
5、在新备库中创建pfile文件中的相关目录
[oracle@standbydb1 ~]$ mkdir -p /u01/app/oracle/admin/testdb/adump
[oracle@standbydb2 ~]$ mkdir -p /u01/app/oracle/admin/testdb/adump
6、将数据库注册到asm中
在节点1的oracle用户下执行:
[oracle@primarydb1 ~]$ srvctl add database -d testdb -o /u01/app/oracle/product/11.2.0/db_1
[oracle@primarydb1 ~]$ srvctl add instance -d testdb -i testdb1 -n primarydb1
[oracle@primarydb1 ~]$ srvctl add instance -d testdb -i testdb2 -n primarydb2
7、将2台实例启动到nomount状态
SYS@testdb1> startup nomount
SYS@testdb2> startup nomount
8、rman连接
[oracle@primarydb1 ~]$ rman target sys/xxx@testdbdg auxiliary sys/xxx@testdb
Recovery Manager: Release 11.2.0.4.0 – Production on Thu Feb 20 14:16:08 2020
Copyright © 1982, 2011, Oracle and/or its affiliates. All rights reserved.
connected to target database: TESTDB (DBID=2812581150)
connected to auxiliary database: TESTDB (not mounted)
9、duplicate
RMAN> duplicate target database for standby from active database nofilenamecheck;
10、开库
SYS@testdb1> select open_mode from gv$database;
OPEN_MODE
MOUNTED
SYS@testdb1> alter database open;
11、启用实时日志应用
SYS@testdb1> alter database recover managed standby database using current logfile disconnect from session;
Database altered.
12、将2号实例打开
SYS@testdb2> startup
13、检查
备库:
SYS@testdb1> select name,database_role,open_mode,protection_mode from gv$database;
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
TESTDB PHYSICAL STANDBY READ ONLY WITH APPLY MAXIMUM PERFORMANCE
TESTDB PHYSICAL STANDBY READ ONLY WITH APPLY MAXIMUM PERFORMANCE
主库:
SYS@testdbdg1> select name,database_role,open_mode,protection_mode from gv$database;
NAME DATABASE_ROLE OPEN_MODE PROTECTION_MODE
TESTDB PRIMARY READ WRITE MAXIMUM PERFORMANCE
TESTDB PRIMARY READ WRITE MAXIMUM PERFORMANCE
——————————重建完成—————————————-
方法二、利用Flashback Database策略,将数据库恢复到failover之前的时间点。(前题:主库开启了闪回)
1、确定旧备用数据库成为主数据库的SCN。
在新的主数据库上,执行以下查询以确定旧备用数据库成为新主数据库的SCN:
SYS@testdbdg1> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
TO_CHAR(STANDBY_BECAME_PRIMARY_SCN)
7745387
2、闪回failed的主数据库
关闭旧的主数据库(如有必要),将其mount,并将其闪回到步骤1中查询出来的STANDBY_Become_primary_SCN值。
[oracle@primarydb1 ~]$ srvctl stop database -d testdb
SYS@testdb1> startup mount
SYS@testdb1> FLASHBACK DATABASE TO SCN 7745387;
3、将数据库转换为物理备用数据库
3.1在旧的主数据库执行以下语句
SYS@testdb1> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
(以上在将控制文件转换为备用控制文件成功后dismount数据库。)
3.2关库,并重新打开
SYS@testdb1> SHUTDOWN IMMEDIATE;
SYS@testdb1> STARTUP;
4、开始将redo日志重新传输到新的物理备用数据库。
(在新的主数据库执行以下sql)
4.1、查询归档日志路径状态
SELECT s.DEST_NAME,s.STATUS FROM V$ARCHIVE_DEST_STATUS s where s.DESTINATION is not null;
4.2、如果归档路径状态异常,则运行
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
4.3、执行日志切换以确保备用数据库开始从新的主数据库接收重做数据,并验证是否已成功发送该数据。在新的主数据库执行以下SQL语句:
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION,ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
5、在新的物理备用数据库上启用Redo Apply
SYS@testdb1> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
(当发生主备角色切换时,redo日志应用会自动停止,因此备库需要执行1次或者多次的日志应用,直到scn号大于旧备用数据库成为新主数据库的SCN号)
(实践:主库需要多次切换归档:ALTER SYSTEM SWITCH LOGFILE;)
6、确认状态
备库:
SYS@testdb1> select database_role,switchover_status from gv$database;
DATABASE_ROLE SWITCHOVER_STATUS
PHYSICAL STANDBY NOT ALLOWED
PHYSICAL STANDBY NOT ALLOWED
主库:
SYS@testdbdg1> select database_role,switchover_status from gv$database;
DATABASE_ROLE SWITCHOVER_STATUS
PRIMARY SESSIONS ACTIVE
PRIMARY SESSIONS ACTIVE
—————闪回修复完成———-
方法三、利用RMAN备份将Primary恢复到failover之前,重新进行日志弥补、角色切换
1、确定旧备用数据库成为主数据库的SCN。
在新的主数据库上,执行以下查询以确定旧备用数据库成为新主数据库的SCN:
SYS@testdbdg1> SELECT TO_CHAR(STANDBY_BECAME_PRIMARY_SCN) FROM V$DATABASE;
TO_CHAR(STANDBY_BECAME_PRIMARY_SCN)
7745387
2、Restore and recover 全库
RMAN> RUN {
SET UNTIL SCN <standby_became_primary_scn + 1>;
RESTORE DATABASE; RECOVER DATABASE;
}
SQL> RECOVER DATABASE USIING BACKUP CONTROLFILE UNTIL CHANGE -> <standby_became_primary_scn + 1>;
3、将数据库转换为物理备用数据库
3.1、转换
SQL> ALTER DATABASE CONVERT TO PHYSICAL STANDBY;
3.2、重启
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
4、开始将redo日志重新传输到新的物理备用数据库。
(在新的主数据库执行以下sql)
4.1、查询归档日志路径状态
SELECT s.DEST_NAME,s.STATUS FROM V$ARCHIVE_DEST_STATUS s where s.DESTINATION is not null;
4.2、如果归档路径状态异常,则运行
ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE;
4.3、执行日志切换以确保备用数据库开始从新的主数据库接收重做数据,并验证是否已成功发送该数据。在新的主数据库执行以下SQL语句:
SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> SELECT DEST_ID, DEST_NAME, STATUS, PROTECTION_MODE, DESTINATION,ERROR,SRL FROM V$ARCHIVE_DEST_STATUS;
5、在新的物理备用数据库上启用Redo Apply
SYS@testdb1> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
—————rman备份完成———-