对于19c在pdb情况下三种常见故障进行了模拟测试:
模拟19c数据库redo异常恢复
模拟19c数据库pdb undo异常恢复
模拟19c数据库root pdb undo异常恢复
模拟oracle 19c cdb模式下root pdb中undo丢失故障恢复
会话1,pdb中插入大量数据,未提交
SQL> alter session set container=pdb;
Session altered.
SQL> alter database open;
Database altered.
SQL> create user xff identified by oracle default tablespace users;
grant dba to xff;
conn xff/oracle@127.0.0.1/pdb
create table t_xifenfei as select * from dba_objects;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
User created.
SQL>
Grant succeeded.
SQL> Connected.
SQL>
Table created.
SQL>
72351 rows created.
SQL>
144702 rows created.
SQL>
289404 rows created.
SQL>
578808 rows created.
SQL>
1157616 rows created.
SQL> SQL> SQL>
会话2中root pdb模拟事务
[oracle@localhost ~]$ ss
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 16 16:56:01 2020
Version 19.5.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
SQL>
SQL>
SQL> conn system/oracle
Connected.
SQL> create table t_xifenfei tablespace users as select * from dba_objects;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
insert into t_xifenfei select * from t_xifenfei;
Table created.
SQL>
72380 rows created.
SQL>
144760 rows created.
SQL>
289520 rows created.
SQL>
579040 rows created.
SQL>
1158080 rows created.
SQL> SQL>
会话3 abort库并删除root pdb中undo文件
[oracle@localhost ~]$ ss
SQL*Plus: Release 19.0.0.0.0 - Production on Mon Nov 16 16:56:55 2020
Version 19.5.0.0.0
Copyright (c) 1982, 2019, Oracle. All rights reserved.
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
SQL> shutdown abort;
ORACLE instance shut down.
SQL>
[oracle@localhost oradata]$ cd ORA19C
[oracle@localhost ORA19C]$ ls
control01.ctl control02.ctl pdb pdbseed redo01.log redo02.log redo03.log sysaux01.dbf
system01.dbf temp01.dbf undotbs01.dbf users01.dbf
[oracle@localhost ORA19C]$ rm -rf undotbs01.dbf
启动数据库报ORA-01157 ORA-01110错误
SQL> alter database datafile 4 offline drop;
Database altered.
SQL> alter database open;
Database altered.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB MOUNTED
SQL> alter session set container=pdb;
Session altered.
SQL> alter database open;
Database altered.
SQL> conn / as sysdba
Connected.
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PDB READ WRITE NO
SQL> SQL> select tablespace_name,segment_name,status from dba_rollback_segs;
TABLESPACE_NAME SEGMENT_NAME STATUS
------------------------------ ------------------------------ --------------------------------
SYSTEM SYSTEM ONLINE
UNDOTBS1 _SYSSMU1_1261223759$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU2_27624015$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU3_2421748942$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU4_625702278$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU5_2101348960$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU6_813816332$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU7_2329891355$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU8_399776867$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU9_1692468413$ NEEDS RECOVERY
UNDOTBS1 _SYSSMU10_930580995$ NEEDS RECOVERY
本次测试比较幸运,虽然undo段状态为NEEDS RECOVERY,但是数据库直接open成功.实际生产情况,可能比这个要复杂很多