介绍:
环境:redhat linux,Oracle 10.2.0.2,Max performance
模拟的场景是primary库损坏,redo log还存在(通常redo会做冗余,如果没有了redo log就更省事了,但是会丢数据)
1.创建测试数据
2.shutdown primary
3.copy primary上可用的redo到standby
4.recover standby
5.failover
1.创建测试数据
primary:
SQL> create table scott.failover as select * from scott.emp;
Table created.
2.shutdown primary
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
3.copy primary上可用的redo到standby
[oracle@node1 dgtest]$ scp ./redo0* 10.0.0.2:/u01/oradata/dgtest/
oracle@10.0.0.2's password:
redo01.log 100% 25MB 8.3MB/s 00:03
redo02.log 100% 25MB 5.0MB/s 00:05
redo03.log 100% 25MB 6.3MB/s 00:04
4.recover standby
Standby上:
4.1 stop redo apply
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
4.2 recover standby
-----
注:register redo log 是不可行的:
SQL> ALTER DATABASE REGISTER LOGFILE '/u01/oradata/dgtest/redo01.log';
ALTER DATABASE REGISTER LOGFILE '/u01/oradata/dgtest/redo01.log'
*
ERROR at line 1:
ORA-16088: archive log has not been completely archived
-----
下面的顺序可以从primary的v$logfile里查到,sequence(primary dwon了肯定查不到,但是可以试,下面只列出了正确的顺序)
SQL> recover standby database until cancel;
ORA-00279: change 562426 generated at 05/20/2008 17:28:10 needed for thread 1
ORA-00289: suggestion : /u01/oradata/dgarch/1_22_654889856.dbf
ORA-00280: change 562426 for thread 1 is in sequence #22
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dgtest/redo03.log
ORA-00279: change 563485 generated at 05/20/2008 18:24:18 needed for thread 1
ORA-00289: suggestion : /u01/oradata/dgarch/1_23_654889856.dbf
ORA-00280: change 563485 for thread 1 is in sequence #23
ORA-00278: log file '/u01/oradata/dgtest/redo03.log' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dgtest/redo01.log
ORA-00279: change 583521 generated at 05/21/2008 10:42:37 needed for thread 1
ORA-00289: suggestion : /u01/oradata/dgarch/1_24_654889856.dbf
ORA-00280: change 583521 for thread 1 is in sequence #24
ORA-00278: log file '/u01/oradata/dgtest/redo01.log' no longer needed for this
recovery
Specify log: {=suggested | filename | AUTO | CANCEL}
/u01/oradata/dgtest/redo02.log
Log applied.
Media recovery complete.
recovery 完成之后就要failover了。
5.failover
5.1 按照官方文档有问题:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE
*
ERROR at line 1:
ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-00354: corrupt redo log block header
ORA-00353: log corruption near block 2 change 583889 time 05/21/2008 10:45:34
ORA-00312: online log 4 thread 1: '/u01/oradata/dgarch/1_0_654889856.dbf'
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY
*
ERROR at line 1:
ORA-16139: media recovery required
有问题!明明已经recovery了,可以检查数据:
SQL> alter database open read only;
Database altered.
SQL> select count(*) from scott.failover;
COUNT(*)
----------
14
5.2 强制failover
重新shutdown 并startup mount;之后
SQL> alter database activate standby database;
Database altered.
SQL> alter database open;
Database altered.
SQL> select open_mode from v$database;
OPEN_MODE
----------
READ WRITE
下面是standby上failover时的alert log:
Database Characterset is UTF8
Threshold validation cannot be done before catproc is loaded.
replication_dependency_tracking turned off (no async multimaster replication found)
Starting background process QMNC
QMNC started with pid=22, OS id=4516
Wed May 21 11:43:42 2008
LOGSTDBY: Validating controlfile with logical metadata
Wed May 21 11:43:42 2008
LOGSTDBY: Validation complete
Completed: alter database open
6. 关于ALTER DATABASE ACTIVATE STANDBY DATABASE
Oracle recommends you use only the failover steps and commands described in the following sections
to perform. a failover. Do not use the ALTER DATABASE ACTIVATE STANDBY DATABASE to perform. a failover, because this statement may cause data loss.