暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

一体机PDB处于受限模式(Restricted)应用账号无法连接故障处理

IT那活儿 2020-07-15
2866

心得整理:


现象描述:早上一个现场出现业务故障,经现场定位发现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>


文章转载自IT那活儿,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论