【什么是数据库受限】
版本里面,涉及到数据库现有对象变更,如表、视图等,以及包头的变更,会采用限制模式;它们的重编译会引发关联对象失效,重新编译经常会遇到锁。仅有包体下发,则一般不用限制模式。受限是根据一个受限用户清单,把清单里面的用户进程kill掉,并限制它重新登录;不用重启DB。
【进入DB受限模式】
exec prc_enb_restrict;
1 取消除DBA用户外所有用户的RESTRICTEDSESSION权限,再根据一个用户清单(restrict_allow_user)授予RESTRICTED SESSION权限
2 如当前系统未受限,则altersystemenablerestrictedsession,进入限制模式,无RESTRICTED SESSION权限用户将不被允许登录
3 kill除'SYS','SYSTEM','DBMGR','DEPLOYOP'和用户清单之外用户的session,记录日志到killuser_log中
【取消DB受限模式】
exec prc_dis_restrict;
如当前系统受限,则取消限制模式,无RESTRICTED SESSION权限的用户可以正常使用
【指定用户进入限制模式】
exec prc_grn_rvk_restrict
取消或授予某用户的RESTRICTEDSESSION权限
【关于RESTRICTEDSESSION】(源于YANGTK的博客)
当数据库以RESTRICT状态启动,或者进入到RESTRICT状态,则Oracle禁止普通用户连接数据库。
而拥有DBA角色的用户,或者拥有RESTRICTEDSESSION权限的用户可以登陆数据库。
虽然数据库处于RESTRICTEDSESSION状态,但是数据库中已经登陆的会话可以继续执行任何操作,直到会话断开连接。
是否拥有RESTRICTED SESSION权限可在dba_sys_privs中查看。
如果希望数据库处于RESTRICTED SESSION状态,且此时不希望普通用户登陆数据库,可以用STARTUP RESTRICT的方式来启动数据库,这样可以确保没有普通用户登陆。而ALTERSYSTEM ENABLE RESTRICTED SESSION的方式虽然可以使得数据库进入RESTRICT状态,但是不能保证现有的连接用户都是具有RESTRICTED SESSION权限的。即使是在STARTUP之后,马上发出ENABLE RESTRICTED SESSION命令也是不可靠的,因为这个时间差可能使得后台JOB运行了。
但我们是不希望部署版本时总是重启数据库的,因此使用ENABLE RESTRINCTED SESSION方式,还需要通过ALTER SYSTEM KILL SESSION的方式清除掉所有的普通用户连接。
【部署平台基于sqlplus】
平安的部署平台是基于oracle自带的sqlplus,意味着部署平台仅保证通过sqlplus测试的脚本成功运行。我们移交的脚本可能通过了plsql developer,toad等工具测试,但sql plus报错,部署无法在测试,生产环境执行,就会产生BUG和发布异常。常见的是编码格式的兼容问题。因此,新增脚本一定要在sqlplus下测试通过,最好是复制之前的脚本在里面修改。