心得整理:
现象描述:早上一个现场出现业务故障,经现场定位发现DB主机hang,然后就没有然后了。后来项目经理按照既定的应急预案,紧急重启主机,切应急,5分钟业务恢复,因为9:30业务高峰期前,业务无感知。
问题思考:如果早上项目经理没在现场,或者项目经理请假,等到9:30之后,业务高峰期来临,影响面扩大,最后就是鸡飞狗跳,各种总结会,分析会。。。。。。这里面根本的问题是日常的应急演练不充分,基本没有练,更谈不上“演”,当故障真的来临的时候,即便有各种预案,也仅仅是预案罢了。
改进措施:需要把预案变成行为规范,通过演练及演练总结印在每个人的脑子里,当遇到问题,就像下雨本能打伞一样的根据预案来进行故障性能处理。
后续延伸:将应急预案的场景全部工具化,出现问题,根据场景平台点击对应预案处理自动完成,减少人工介入处理的琐碎时间浪费。

下面是另一个故障分享,上下无关联,请勿想入非非
技术总结:
环境:LINUX 6.9 ORACLE一体机
数据库版本:12.2.0.1
是否RAC:是
节点数:7
一体机型号:X7
现象:
所有节点实例全停全启之后,发现数据库所有PDB均处于RESTRICTED模式,所有应用用户无法连接,除了SYS/SYSTEM。
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY YES
3 SHOWDBPDB READ WRITE YES
4 GISPDB READ WRITE YES
分析:
一、当发现所有PDB处于受限模式下,我们尝试将其open成正常模式,但是open之后还是受限模式
alter pluggable database SHOWDBPDB close immediate instance=all;
alter pluggable database SHOWDBPDB open read write instance=all;
二、根据以往经验,受限模式一般是打完patch,更新数据字典失败或者未更新,重新打开PDB才会出现的模式。
尝试重新更新数据字典报ORA-01918: user 'DVSYS' does not exist
SQL> show pdbs;
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY YES
3 SHOWDBPDB READ WRITE YES
4 GISPDB READ WRITE YES
cd $ORACLE_HOME/OPatch
./datapatch -verbose
.......................
ORA-01918: user 'DVSYS' does not exist
.......................
三、对比其他库发现这个库CDB及所有PDB都没有DVSYS用户
select USERNAME,CREATED from dba_users where username='DVSYS';
四、在CDB依次运行如下命令创建DVSYS用户
1、如果OLS元数据未安装,先enable OLS
sqlplus as sysdba
@?/rdbms/admin/catols.sql
exec lbacsys.configure_ols
exec lbacsys.ols_enforcement.enable_ols
2、运行catmac.sql脚本创建DVSYS及相关对象
sqlplus as sysdba
@?/rdbms/admin/catmac.sql system temp <syspasswd>
注:system是DVSYS的默认表空间,temp是临时表空间
3、如果失效对象较多,运行如下脚本重编译
sqlplus as sysdba
@?\rdbms\admin\utlrp.sql
较少的话单个编译就行
五、在所有PDB(包括模板库)运行步骤四
sqlplus as sysdba
alter session set container=SHOWDBPDB;
继续运行步骤四命令。
**************遇到的问题***************
提前运行catmac.sql,忘记enable OLS了,发现DVSYS用户没创建成果
后面enable之前重新运行catmac.sql发现报DV开头的对象已存在。
解决方法:
select role from dba_roles where role like 'DV%';
select USERNAME,CREATED from dba_users where username like 'DVSYS';
删除查询出来的DV开头的角色
例如:
alter session set "_oracle_script"=true;
drop role DV_SECANALYST;
六、重新更新数据字典,脚本显示运行成功了,但是PDB还是处于受限模式
cd $ORACLE_HOME/OPatch
./datapatch -verbose
七、查询registry$sqlpatch发现存在之前运行数据字典更新的记录,但是状态是WITH ERRORS的
SQL> select ACTION,ACTION_TIME,DESCRIPTION,status from registry$sqlpatch_org;
ACTION ACTION_TIME DESCRIPTION STATUS
--------------- --------------------------------- ----------------------------------------------------------------------------------------- -------------------------
APPLY 09-MAR-18 01.43.22.087140 PM OJVM RELEASE UPDATE: 12.2.0.1.180116 (27001739) SUCCESS
APPLY 09-MAR-18 01.43.23.054917 PM DATABASE RELEASE UPDATE 12.2.0.1.180116 SUCCESS
APPLY 14-SEP-18 11.57.04.980461 PM DATABASE JUL 2018 RELEASE UPDATE 12.2.0.1.180717 WITH ERRORS
八、继续解决这个PDB受限模式问题,运行如下命令
1、连接至CDB
sqlplus as sysdba
show con_name;
2、备份registry$sqlpatch
create table registry$sqlpatch_org as select * from registry$sqlpatch;
3、删除表registry$sqlpatch
exec dbms_pdb.exec_as_oracle_script('drop table registry$sqlpatch');
4、运行如下脚本重建registry$sqlpatch表
@$ORACLE_HOME/rdbms/admin/catsqlreg.sql
5、连到PDB
alter session set container=<PDB> ;
show con_name;
6、备份PDB的registry$sqlpatch表
create table registry$sqlpatch_PDB as select * from registry$sqlpatch;
7、删除PDB下的registry$sqlpatch表
exec dbms_pdb.exec_as_oracle_script('drop table registry$sqlpatch');
8、重建PDB下的registry$sqlpatch表
@$ORACLE_HOME/rdbms/admin/catsqlreg.sql
9、当所有PDB都重建完registry$sqlpatch表之后,运行脚本
sqlplus / as sysdba
alter pluggable database all close immediate;
alter pluggable database all open upgrade;
exit
cd $ORACLE_HOME/OPatch
./datapatch -verbose;
或者指定PDB进行字典更新
./datapatch -verbose -pdbs PDB1,PDB2
sqlplus / as sysdba
alter pluggable database all close immediate;
alter pluggable database all open;
注:模板库有点特殊,使用如下命令更新
alter pluggable database PDB$SEED close immediate;
alter pluggable database PDB$SEED open read write upgrade;
alter session set container=PDB$SEED;
./datapatch -verbose -pdbs PDB$SEED
alter pluggable database PDB$SEED open read only;
10、当前运行脚本的实例在PDB重启之后,会发现已经变成正常状态了,但其他节点实例还是受限模式,
重启其他节点实例即可,至此故障恢复完成。
srvctl stop instance -d db_unique_name -i <inst_name>
srvctl start instance -d db_unique_name -i <inst_name>




