发表于: 2008.10.04 23:49
分类: ORACLE
出处: http://yangtingkun.itpub.net/post/468/471686
---------------------------------------------------------------
物理STANDBY的FAILOVER一般发生在主库出现故障,且短时间内无法恢复的情况。这是STANDBY数据库真正发挥作用的时候。
切换后物理STANDBY切换为PRIMARY数据库,原来的PRIMARY数据库即使恢复之后也和新的PRIMARY数据库没有关系。
这篇描述RAC环境数据库FAILOVER切换到一个单实例数据库。
DATA GUARD物理STANDBY的 FAILOVER切换:http://yangtingkun.itpub.net/post/468/423789
这个RAC环境到单实例的STANDBY配置已经运行了一段时间了。但是今天由于RAC环境添加了新的表空间,而单实例STANDBY数据库所在服务器上已经没有足够的空间来存放新的数据文件了,导致应用归档的日志时出现了错误信息为1111的错误。
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes数据库装载完毕。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
数据库已更改。
SQL> SELECT ERROR_CODE, MESSAGE FROM V$DATAGUARD_STATUS
2 ORDER BY TIMESTAMP;
ERROR_CODE MESSAGE
---------- ----------------------------------------------------------------------
0 ARC0: Archival started
0 ARC1: Archival started
0 ARC0: Becoming the 'no FAL' ARCH
0 ARC0: Becoming the 'no SRL' ARCH
0 ARC1: Becoming the heartbeat ARCH
0 Attempt to start background Managed Standby Recovery process
0 MRP0: Background Managed Standby Recovery process started
0 Managed Standby Recovery not using Real Time Apply
1111 MRP0: Background Media Recovery terminated with error 1111
0 MRP0: Background Media Recovery process shutdown
已选择10行。
检查alert文件可以看到下面的错误:
Attempt to start background Managed Standby Recovery process (testrac_standby)
MRP0 started with pid=18, OS id=27195
Fri Sep 26 14:47:54 2008
MRP0: Background Managed Standby Recovery process started (testrac_standby)
Managed Standby Recovery not using Real Time Apply
MRP0: Background Media Recovery terminated with error 1111
Fri Sep 26 14:47:59 2008
Errors in file /data/oracle/admin/testrac/bdump/testrac_standby_mrp0_27195.trc:
ORA-01111: name for data file 16 is unknown - rename to correct file
ORA-01110: data file 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
ORA-01157: cannot identify/lock data file 16 - see DBWR trace file
ORA-01111: name for data file 16 is unknown - rename to correct file
ORA-01110: data file 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
Fri Sep 26 14:47:59 2008
Errors in file /data/oracle/admin/testrac/bdump/testrac_standby_mrp0_27195.trc:
ORA-01111: name for data file 16 is unknown - rename to correct file
ORA-01110: data file 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
ORA-01157: cannot identify/lock data file 16 - see DBWR trace file
ORA-01111: name for data file 16 is unknown - rename to correct file
ORA-01110: data file 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
Fri Sep 26 14:47:59 2008
MRP0: Background Media Recovery process shutdown (testrac_standby)
虽然当前的问题很容易解决,但是随后添加的大量数据文件,在当前服务器上是无法存放的,因此直接将STANDBY数据库执行FAILOVER操作。使得当前的数据库脱离PRIMARY数据库成为独立的数据库。
一般进行FAILOVER的时候应该尽可能的应用日志,不过当前不需要这个操作,可以直接对数据库进行FAILOVER切换:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01111: 数据文件 16 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
ORA-01157: 无法标识/锁定数据文件 16 - 请参阅 DBWR 跟踪文件
ORA-01111: 数据文件 16 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 16: '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
看来alert文件中出现的错误还是要解决的:
SQL> SELECT TABLESPACE_NAME, FILE_NAME FROM DBA_DATA_FILES
2 WHERE FILE_ID = 16;
TABLESPACE_NAME FILE_NAME
------------------------------ ------------------------------------------------------------
CENTER +DISK/testrac/datafile/center01.dbf
在PRIMARY数据库查询FILE_ID为16的数据文件名称。
在本地找到对应的数据文件名称后:
SQL> SHOW PARAMETER STANDBY_FILE
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
standby_file_management string AUTO
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT = 'MANUAL';
系统已更改。
SQL> ALTER DATABASE RENAME FILE '/data/oracle/product/10.2/database/dbs/UNNAMED00016'
2 TO '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf';
数据库已更改。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 16: '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf'
ORA-01122: 数据库文件 16 验证失败
ORA-01110: 数据文件 16: '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf'
ORA-01205: 不是数据文件 - 头部的类型编号是 0
看来虽然操作系统中包含了这个文件,但是文件创建的还是有问题,需要通过CREATE DATAFILE的方式重建一下:
SQL> ALTER DATABASE CREATE DATAFILE '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf';
数据库已更改。
下面再次执行FINISH命令:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01274: 无法添加数据文件 '+DISK/testrac/datafile/center02.dbf' - 无法创建文件
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01111: 数据文件 18 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 18: '/data/oracle/product/10.2/database/dbs/UNNAMED00018'
ORA-01157: 无法标识/锁定数据文件 18 - 请参阅 DBWR 跟踪文件
ORA-01111: 数据文件 18 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 18: '/data/oracle/product/10.2/database/dbs/UNNAMED00018'
由于开始没有指定NOWAIT,导致STANDBY应用日志的时候又创建出一个数据文件。
而且针对这个数据文件,在本地上还没有创建出对应的操作系统文件,所以无论是RENAME还是CREATE DATAFILE都会报错:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01274: 无法添加数据文件 '+DISK/testrac/datafile/center02.dbf' - 无法创建文件
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01111: 数据文件 18 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 18: '/data/oracle/product/10.2/database/dbs/UNNAMED00018'
ORA-01157: 无法标识/锁定数据文件 18 - 请参阅 DBWR 跟踪文件
ORA-01111: 数据文件 18 名称未知 - 请重命名以更正文件
ORA-01110: 数据文件 18: '/data/oracle/product/10.2/database/dbs/UNNAMED00018'
在操作系统执行拷贝操作,创建出一个合适大小的文件:
bash-2.03$ cp o1_mf_center_4fq77tnx_.dbf /data1/oradata/testrac/center02.dbf
下面再次进行RENAME的操作:
SQL> ALTER DATABASE RENAME FILE '/data/oracle/product/10.2/database/dbs/UNNAMED00018'
2 TO '/data1/oradata/testrac/center02.dbf';
数据库已更改。
SQL> ALTER DATABASE CREATE DATAFILE '/data1/oradata/testrac/center02.dbf';
数据库已更改。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-16171: 由于线程 1, 序列 721-721 的间隔, 因此不允许使用 RECOVER...FINISH
这个错误是由于怕Oracle继续在STANDBY上添加表空间,而将所有日志转移到其他位置,下面将所需日志拷贝到所需位置。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-16173: 活动的归档网络连接不兼容
这个错误是由于主库到本地的归档仍然在继续,在主库取消LOG_ARCHIVE_DEST的设置:
SQL> alter system set log_archive_dest_2 = '';
系统已更改。
再次出现该死的添加数据文件的错误:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01274: 无法添加数据文件 '+DISK/testrac/datafile/center03.dbf' - 无法创建文件
由于空间实在不足,只好拷贝一个控制文件作为假的数据文件,然后RENAME FILE,删除这个新增文件:
SQL> ALTER DATABASE RENAME FILE '/data/oracle/product/10.2/database/dbs/UNNAMED00019'
2* TO '/data1/oradata/testrac/center03.dbf';
数据库已更改。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH NOWAIT
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-01110: 数据文件 19: '/data1/oradata/testrac/center03.dbf'
ORA-01122: 数据库文件 19 验证失败
ORA-01110: 数据文件 19: '/data1/oradata/testrac/center03.dbf'
ORA-01251: 读取了文件号 19 的未知文件头部版本
SQL> alter database datafile '/data1/oradata/testrac/center03.dbf' offline;
alter database datafile '/data1/oradata/testrac/center03.dbf' offline
*第 1 行出现错误:
ORA-01668: 对于数据文件的脱机, 备用数据库要求使用 DROP 选项
SQL> alter database datafile '/data1/oradata/testrac/center03.dbf' offline drop;
数据库已更改。
依次处理后续所有的新增数据文件。
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH FORCE
*第 1 行出现错误:
ORA-00283: 恢复会话因错误而取消
ORA-16171: 由于线程 1, 序列 724-724 的间隔, 因此不允许使用 RECOVER...FINISH
查询了METALINK,没有发现关于ORA-16171错误的有价值的描述。
如果FAILOVER应为存在GAP就无法执行切换,那么FAILOVER的价值何在呢,假如主库数据库出现了损毁,STANDBY数据库难道就没有办法直接打开吗。Oracle在这里的实现看来有还一定的问题。
看来常规办法是不能解决了,下面尝试通过重建控制文件的方式,将当前数据库直接做为PRIMARY数据库打开。
SQL> SELECT DATABASE_ROLE FROM V$DATABASE;
DATABASE_ROLE
----------------
PHYSICAL STANDBY
备份控制文件到trace:
SQL> ALTER DATABASE BACKUP CONTROLFILE TO TRACE;
数据库已更改。
通过备份的控制文件脚本重建控制文件:
SQL> SHUTDOWN IMMEDIATE
ORA-01109: 数据库未打开
已经卸载数据库。
ORACLE 例程已经关闭。
SQL> STARTUP NOMOUNT
ORACLE 例程已经启动。
Total System Global Area 2147483648 bytes
Fixed Size 2031480 bytes
Variable Size 520093832 bytes
Database Buffers 1610612736 bytes
Redo Buffers 14745600 bytes
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTRAC" RESETLOGS FORCE LOGGING ARCHIVELOG
2 MAXLOGFILES 192
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 1024
5 MAXINSTANCES 32
6 MAXLOGHISTORY 2920
7 LOGFILE
8 GROUP 1 '/export/home/oracle/oradata/testrac/group_1.258.618591139' SIZE 512M,
9 GROUP 2 '/export/home/oracle/oradata/testrac/group_2.260.618591151' SIZE 512M
10 -- STANDBY LOGFILE
11 DATAFILE
12 '/data1/oradata/testrac/system.262.618591167',
13 '/data1/oradata/testrac/undotbs1.263.618591197',
14 '/data1/oradata/testrac/sysaux.264.618591225',
15 '/data1/oradata/testrac/undotbs2.266.618591249',
16 '/data1/oradata/testrac/users.267.618591279',
17 '/export/home/oracle/oradata/testrac/zhejiang01.dbf',
18 '/export/home/oracle/oradata/testrac/zhejiang02.dbf',
19 '/data1/oradata/testrac/ndmain01.dbf',
20 '/export/home/oracle/oradata/testrac/zhejiang03.dbf',
21 '/data1/oradata/testrac/ndindex01.dbf',
22 '/export/home/oracle/oradata/testrac/zhejiang04.dbf',
23 '/data1/oradata/testrac/zhejiang05.dbf',
24 '/data/oradata/testrac/lt_index_ts01.dbf',
25 '/opt/oracle/oradata/testrac/zhejiang06.dbf',
26 '/data1/oradata/testrac/gpo.367.624623443',
27 '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf',
28 '/data1/oradata/testrac/center02.dbf',
29 '/data1/oradata/testrac/center03.dbf',
30 '/data1/oradata/testrac/center04.dbf',
31 '/data1/oradata/testrac/center05.dbf',
32 '/data1/oradata/testrac/center06.dbf',
33 '/data1/oradata/testrac/center07.dbf',
34 '/data1/oradata/testrac/center08.dbf',
35 '/data1/oradata/testrac/center09.dbf',
36 '/data1/oradata/testrac/center10.dbf',
37 '/data1/oradata/testrac/center11.dbf'
38 CHARACTER SET ZHS16GBK
39 ;
CREATE CONTROLFILE REUSE DATABASE "TESTRAC" RESETLOGS FORCE LOGGING ARCHIVELOG
*第 1 行出现错误:
ORA-01503: CREATE CONTROLFILE ??
ORA-01160: ???? data file
ORA-01110: ???? : '/data1/oradata/testrac/center03.dbf'
SQL> CREATE CONTROLFILE REUSE DATABASE "TESTRAC" RESETLOGS FORCE LOGGING ARCHIVELOG
2 MAXLOGFILES 192
3 MAXLOGMEMBERS 3
4 MAXDATAFILES 1024
5 MAXINSTANCES 32
6 MAXLOGHISTORY 2920
7 LOGFILE
8 GROUP 1 '/export/home/oracle/oradata/testrac/group_1.258.618591139' SIZE 512M,
9 GROUP 2 '/export/home/oracle/oradata/testrac/group_2.260.618591151' SIZE 512M
10 -- STANDBY LOGFILE
11 DATAFILE
12 '/data1/oradata/testrac/system.262.618591167',
13 '/data1/oradata/testrac/undotbs1.263.618591197',
14 '/data1/oradata/testrac/sysaux.264.618591225',
15 '/data1/oradata/testrac/undotbs2.266.618591249',
16 '/data1/oradata/testrac/users.267.618591279',
17 '/export/home/oracle/oradata/testrac/zhejiang01.dbf',
18 '/export/home/oracle/oradata/testrac/zhejiang02.dbf',
19 '/data1/oradata/testrac/ndmain01.dbf',
20 '/export/home/oracle/oradata/testrac/zhejiang03.dbf',
21 '/data1/oradata/testrac/ndindex01.dbf',
22 '/export/home/oracle/oradata/testrac/zhejiang04.dbf',
23 '/data1/oradata/testrac/zhejiang05.dbf',
24 '/data/oradata/testrac/lt_index_ts01.dbf',
25 '/opt/oracle/oradata/testrac/zhejiang06.dbf',
26 '/data1/oradata/testrac/gpo.367.624623443',
27 '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_center_4fq77tnx_.dbf',
28 '/data1/oradata/testrac/center02.dbf'
29 CHARACTER SET ZHS16GBK
30 ;
控制文件已创建。
SQL> RECOVER DATABASE USING BACKUP CONTROLFILE UNTIL CANCEL
ORA-00279: ?? 7947644359 (? 07/27/2008 06:23:00 ??) ???? 1 ????
ORA-00289: ??: /data1/archivelog1_724_626291662.dbf
ORA-00280: ?? 7947644359 (???? 1) ??? #724 ?
指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
CANCEL介质恢复已取消。
SQL> ALTER DATABASE ADD LOGFILE THREAD 2
2 GROUP 3 '/export/home/oracle/oradata/testrac/group_3.268.618595573' SIZE 512M REUSE,
3 GROUP 4 '/export/home/oracle/oradata/testrac/group_4.270.618595587' SIZE 512M REUSE;
数据库已更改。
SQL> ALTER DATABASE OPEN RESETLOGS;
数据库已更改。
SQL> ALTER TABLESPACE TEMP ADD TEMPFILE '/data1/oradata/testrac/TESTRAC_STANDBY/datafile/o1_mf_temp_3mtmrs33_.tmp' REUSE;
表空间已更改。
SQL> SELECT NAME, DATABASE_ROLE FROM V$DATABASE;
NAME DATABASE_ROLE
--------- ----------------
TESTRAC PRIMARY
既然center03.dbf开始的数据文件都有问题,导致控制文件无法创建,干脆直接从控制文件中去掉,反正这些文件也是被OFFLINE DROP的。
执行RECOVER后,OPEN RESETLOGS打开,这样STANDBY数据库就人为的被切换为PRIMARY模式了。











