升级Oracle 19c 环境时,执行datapatch 脚本前启动数据库报错。
因为之前升级时OS 磁盘空间不足,所以在物理上删除了闪回目录下的文件。
在执行startup 时报错如下:
ORA-38760: This database instance failed to turn on flashback database
[dave@www.cndba.cn u01]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Feb 9 17:48:40 2022
Version 19.14.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to an idle instance.
SQL> startup
ORACLE instance started.
Total System Global Area 1543500824 bytes
Fixed Size 9135128 bytes
Variable Size 1207959552 bytes
Database Buffers 318767104 bytes
Redo Buffers 7639040 bytes
Database mounted.
ORA-38760: This database instance failed to turn on flashback database
SQL> alter pluggable database all open;
alter pluggable database all open
*
ERROR at line 1:
ORA-01109: database not open
SQL> !oerr ora 38760
38760, 00000, "This database instance failed to turn on flashback database"
// *Cause: Database flashback is on but this instance failed to
// start generating flashback data. Look in alert log for more
// specific errors.
// *Action: Correct the error or turn off database flashback.
这个错误如果是非CDB 环境解决其实非常简单,直接关闭闪回数据库即可,但我们这里是19C 的CDB 环境,关闭依旧报错,如下:
SQL> alter database flashback off;
Database altered.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-38760: This database instance failed to turn on flashback database
这里实际上还是因为之前的还原点导致的问题:
SQL> select flashback_on from v$database;
FLASHBACK_ON
------------------------------------------------------
RESTORE POINT ONLY
SQL> select * from v$restore_point;
select * from v$restore_point
*
ERROR at line 1:
ORA-38701: Flashback database log 1 seq 1 thread 1:
"/u01/app/oracle/fast_recovery_area/CNDBA/flashback/o1_mf_jm600lwy_.flb"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
SQL> col name for a30
SQL> select NAME,SCN,GUARANTEE_FLASHBACK_DATABASE,DATABASE_INCARNATION# from v$restore_point;
NAME SCN GUARANTEE DATABASE_INCARNATION#
------------------------------ ---------- --------- ---------------------
BEFORE_UPGRADE 6155158 YES 2
MYPDB_GRP_BEFORE_UPGRADE 6157542 YES 2
FS_UPDATE 6061562 NO 2
CDB_BEFORE_UPGRADE 6137797 NO 2
BEFORE_PATCHING1 6156151 NO 2
MYPDB_BEFORE_PATCHING 6157517 NO 2
6 rows selected.
通过查询我们这里有2个受保护的还原点,只要删除这2个还原点,就可以解决问题:
SQL> drop restore point BEFORE_UPGRADE;
drop restore point BEFORE_UPGRADE
*
ERROR at line 1:
ORA-38780: Restore point 'BEFORE_UPGRADE' does not exist.
但是删除的时候,报还原点不存在,实际上这2个还原点是存在的。
SQL> desc v$restore_point;
Name Null? Type
----------------------------------------- -------- ----------------------------
SCN NUMBER
DATABASE_INCARNATION# NUMBER
GUARANTEE_FLASHBACK_DATABASE VARCHAR2(3)
STORAGE_SIZE NUMBER
TIME TIMESTAMP(9)
RESTORE_POINT_TIME TIMESTAMP(9)
PRESERVED VARCHAR2(3)
NAME VARCHAR2(128)
PDB_RESTORE_POINT VARCHAR2(3)
CLEAN_PDB_RESTORE_POINT VARCHAR2(3)
PDB_INCARNATION# NUMBER
REPLICATED VARCHAR2(3)
CON_ID NUMBER
继续查询,我们发现这2个还原点是PDB的:
SQL> set lines 150
SQL> select NAME,SCN,GUARANTEE_FLASHBACK_DATABASE,DATABASE_INCARNATION# ,pdb_restore_point,con_id from v$restore_point;
NAME SCN GUARANTEE DATABASE_INCARNATION# PDB_RESTO CON_ID
------------------------------ ---------- --------- --------------------- --------- ----------
BEFORE_UPGRADE 6155158 YES 2 YES 3
MYPDB_GRP_BEFORE_UPGRADE 6157542 YES 2 YES 3
FS_UPDATE 6061562 NO 2 YES 3
CDB_BEFORE_UPGRADE 6137797 NO 2 NO 0
BEFORE_PATCHING1 6156151 NO 2 NO 0
MYPDB_BEFORE_PATCHING 6157517 NO 2 YES 3
6 rows selected.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED MOUNTED
3 DAVE MOUNTED
4 USTC MOUNTED
SQL>
切换PDB 后,继续删除:
SQL> alter session set container=DAVE;
Session altered.
SQL> drop restore point BEFORE_UPGRADE;
drop restore point BEFORE_UPGRADE
*
ERROR at line 1:
ORA-38701: Flashback database log 1 seq 1 thread 1: "/u01/app/oracle/fast_recovery_area/CNDBA/flashback/o1_mf_jm600lwy_.flb"
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 7
这里报了ORA-38701的错误,但是实际上,这里是删除成功了的:
SQL> drop restore point BEFORE_UPGRADE;
drop restore point BEFORE_UPGRADE
*
ERROR at line 1:
ORA-38780: Restore point 'BEFORE_UPGRADE' does not exist.
SQL> select NAME,SCN,GUARANTEE_FLASHBACK_DATABASE,DATABASE_INCARNATION# ,pdb_restore_point,con_id from v$restore_point;
NAME SCN GUARANTEE DATABASE_INCARNATION# PDB_RESTO CON_ID
------------------------------ ---------- --------- --------------------- --------- ----------
MYPDB_GRP_BEFORE_UPGRADE 6157542 YES 2 YES 3
FS_UPDATE 6061562 NO 2 YES 3
CDB_BEFORE_UPGRADE 6137797 NO 2 NO 0
BEFORE_PATCHING1 6156151 NO 2 NO 0
MYPDB_BEFORE_PATCHING 6157517 NO 2 YES 3
删除另外一个还原点:
SQL> drop restore point MYPDB_GRP_BEFORE_UPGRADE;
Restore point dropped.
SQL> select NAME,SCN,GUARANTEE_FLASHBACK_DATABASE,DATABASE_INCARNATION# ,pdb_restore_point,con_id from v$restore_point;
NAME SCN GUARANTEE DATABASE_INCARNATION# PDB_RESTO CON_ID
------------------------------ ---------- --------- --------------------- --------- ----------
FS_UPDATE 6061562 NO 2 YES 3
CDB_BEFORE_UPGRADE 6137797 NO 2 NO 0
BEFORE_PATCHING1 6156151 NO 2 NO 0
MYPDB_BEFORE_PATCHING 6157517 NO 2 YES 3
SQL>
重启启动数据库成功:
[dave@www.cndba.cn 33515361]$ sqlplus / as sysdba
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Feb 9 18:42:01 2022
Version 19.14.0.0.0
Copyright (c) 1982, 2021, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.14.0.0.0
SQL> alter database flashback off;
Database altered.
SQL> alter database open;
Database altered.
SQL> alter pluggable database all open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DAVE READ WRITE NO
4 USTC READ WRITE NO
SQL>
实际上,这个问题还有另外一种方法,因为还原点的信息是记录在控制文件里的,也可以尝试直接重建控制文件来解决。 这里不再测试。
版权声明:本文为博主原创文章,未经博主允许不得转载。