Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >关于drop user的cascade选项解惑(52天)

关于drop user的cascade选项解惑(52天)

作者头像
jeanron100
发布于 2018-03-13 10:36:11
发布于 2018-03-13 10:36:11
1.8K0
举报

数据库中,有时候需要删除用户,大多数时候都需要使用cascade选项,有些时候却不需要,想知道在这个简单的命令之后数据库倒底在干什么, 这时候给一些指定的操作加上trace就跟把那层纱窗揭开一样,可以很清楚看到数据库倒底在干些什么。 10046,sql_trace等都是一些不错的选择。 首先来复现一下这个问题。‘ 创建一个新用户,然后马上删除。 SQL> create user jeanron identified by jeanron; User created. SQL> drop user jeanron; User dropped. ########################### 可以看到删除是不需要cascade选项的。如果想加cascade选项,会不会有问题呢。 SQL> create user jeanron identified by jeanron; User created. SQL> drop user jeanron cascade; User dropped. ########################### 可以看到是没有问题的,下面来复现ORA-01922这个错误。 SQL> create user jeanron identified by jeanron; User created. SQL> grant connect,resource to jeanron; Grant succeeded. SQL> conn jeanron/jeanron Connected. SQL> create table tt as select *from cat; Table created. SQL> conn / as sysdba Connected. SQL> drop user jeanron; drop user jeanron * ERROR at line 1: ORA-01922: CASCADE must be specified to drop 'JEANRON' ############################ 给这条命令做一个sql_trace,或者10046事件 如果在做sql_trace,10046事件的时候出现下面的情况。 SQL> alter session set sql_trace=true; ERROR: ORA-01031: insufficient privileges SQL> alter session set events '10046 trace name context forever,level 12'; ERROR: ORA-01031: insufficient privileges 只需要赋予alter session的权限就可以了。 SQL> grant alter session to jeanron; Grant succeeded. SQL> alter session set events '10046 trace name context forever,level 12'; Session altered. SQL> drop user jeanron; drop user jeanron * ERROR at line 1: ORA-01922: CASCADE must be specified to drop 'JEANRON' SQL> alter session set events '10046 trace name context off'; Session altered. 在trace目录下找到最新的trace日志,使用tkprof来格式化一下。 [ora11g@rac1 trace]$ tkprof TEST01_ora_5888.trc output = b.log TKPROF: Release 11.2.0.3.0 - Development on Wed Apr 23 07:42:26 2014 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. 可以看到格式化之后的日志文件内容就比较清晰了。可以在开头就看到如下的一段,命令开始了。 SQL ID: 6vu28ambaxjjh Plan Hash: 0 drop user jeanron call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 0 0.00 0.00 0 0 0 0 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 2 0.00 0.00 0 0 0 0 Misses in library cache during parse: 1 Optimizer mode: ALL_ROWS Parsing user id: SYS Elapsed times include waiting on following events: Event waited on Times Max. Wait Total Waited ---------------------------------------- Waited ---------- ------------ SQL*Net break/reset to client 2 0.00 0.00 SQL*Net message to client 1 0.00 0.00 SQL*Net message from client 1 13.27 13.27 ******************************************************************************** ..... 如下的部分就是一些相应的递归sql。 select user#,password,datats#,tempts#,type#,defrole,resource$, ptime, decode(defschclass,NULL,'DEFAULT_CONSUMER_GROUP',defschclass),spare1,spare4, ext_username,spare2 from user$ where name=:1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 2 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.00 0.00 0 2 0 1 Misses in library cache during parse: 0 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) Number of plan statistics captured: 1 Rows (1st) Rows (avg) Rows (max) Row Source Operation ---------- ---------- ---------- --------------------------------------------------- 1 1 1 TABLE ACCESS BY INDEX ROWID USER$ (cr=2 pr=0 pw=0 time=152 us cost=1 size=101 card=1) 1 1 1 INDEX UNIQUE SCAN I_USER1 (cr=1 pr=0 pw=0 time=98 us cost=0 size=0 card=1)(object id 46) ********************************************************************************

可以看到在最后面有这样一条sql的信息。 SQL ID: 8mj6vafkkhyr4 Plan Hash: 310931108 select null from obj$ where owner#=:1 and type#!=10 union all select null from link$ where owner#=:1 union all select null from streams$_capture_process where capture_userid=:1 union all select null from streams$_apply_process where apply_userid=:1 union all select null from wri$_sqlset_definitions s,user$ u where s.owner = u.name and u.user#=:1 union all select null from wri$_adv_tasks where owner#=:1 call count cpu elapsed disk query current rows ------- ------ -------- ---------- ---------- ---------- ---------- ---------- Parse 1 0.00 0.00 0 0 0 0 Execute 1 0.00 0.00 0 0 0 0 Fetch 1 0.00 0.00 0 41 0 1 ------- ------ -------- ---------- ---------- ---------- ---------- ---------- total 3 0.00 0.00 0 41 0 1 Misses in library cache during parse: 0 Optimizer mode: CHOOSE Parsing user id: SYS (recursive depth: 1) Number of plan statistics captured: 1 Rows (1st) Rows (avg) Rows (max) Row Source Operation ---------- ---------- ---------- --------------------------------------------------- 1 1 1 UNION-ALL (cr=41 pr=0 pw=0 time=2554 us) 1 1 1 INDEX FAST FULL SCAN I_OBJ1 (cr=41 pr=0 pw=0 time=2510 us cost=12 size=10367 card=1481)(object id 36) 0 0 0 INDEX RANGE SCAN I_LINK1 (cr=0 pr=0 pw=0 time=0 us cost=0 size=13 card=1)(object id 138) 0 0 0 TABLE ACCESS FULL STREAMS$_CAPTURE_PROCESS (cr=0 pr=0 pw=0 time=0 us cost=2 size=13 card=1) 0 0 0 TABLE ACCESS FULL STREAMS$_APPLY_PROCESS (cr=0 pr=0 pw=0 time=0 us cost=2 size=13 card=1) 0 0 0 NESTED LOOPS (cr=0 pr=0 pw=0 time=0 us) 0 0 0 NESTED LOOPS (cr=0 pr=0 pw=0 time=0 us cost=0 size=34 card=1) 0 0 0 INDEX FULL SCAN WRI$_SQLSET_DEFINITIONS_IDX_01 (cr=0 pr=0 pw=0 time=0 us cost=0 size=17 card=1)(object id 6242) 0 0 0 INDEX UNIQUE SCAN I_USER1 (cr=0 pr=0 pw=0 time=0 us cost=0 size=0 card=1)(object id 46) 0 0 0 TABLE ACCESS BY INDEX ROWID USER$ (cr=0 pr=0 pw=0 time=0 us cost=0 size=17 card=1) 0 0 0 INDEX RANGE SCAN WRI$_ADV_TASKS_IDX_02 (cr=0 pr=0 pw=0 time=0 us cost=1 size=38 card=19)(object id 5811) 自己好好琢磨了下,这里面还这有些文章。它会从回收站,各数据字典基表中查询是否有相应的Object和db link,stream对象。 为了方便查看起见,我把sql整理了一下,可以用如下的方式。如果有返回结果,说明需要cascade选项。 column userid new_value userid format 999999; select user# userid from user$ where name='A'; select 'drop user need cascade option' from obj$ where owner#=&userid and type#!=10 union all select 'drop user need cascade option' from link$ where owner#=&userid union all select 'drop user need cascade option' from streams$_capture_process where capture_userid=&userid union all select 'drop user need cascade option' from streams$_apply_process where apply_userid=&userid union all select 'drop user need cascade option' from wri$_sqlset_definitions s,user$ u where s.owner = u.name and u.user#=&userid union all select 'drop user need cascade option' from wri$_adv_tasks where owner#=&userid / N - 如果返回now rows selected 就表明不需要cascade. SQL> select 'drop user need cascade option' 2 from 3 obj$ where owner#=&userid and type#!=10 4 union all 5 select 'drop user need cascade option' from link$ where 6 owner#=&userid 7 union all 8 select 'drop user need cascade option' from streams$_capture_process where 9 capture_userid=&userid 10 union all 11 select 'drop user need cascade option' from streams$_apply_process where 12 apply_userid=&userid 13 union all 14 select 'drop user need cascade option' from wri$_sqlset_definitions s,user$ 15 u where s.owner = u.name and u.user#=&userid 16 union all 17 select 'drop user need cascade option' from 18 wri$_adv_tasks where owner#=&userid 19 / old 3: obj$ where owner#=&userid and type#!=10 new 3: obj$ where owner#= 53 and type#!=10 old 6: owner#=&userid new 6: owner#= 53 old 9: capture_userid=&userid new 9: capture_userid= 53 old 12: apply_userid=&userid new 12: apply_userid= 53 old 15: u where s.owner = u.name and u.user#=&userid new 15: u where s.owner = u.name and u.user#= 53 old 18: wri$_adv_tasks where owner#=&userid new 18: wri$_adv_tasks where owner#= 53 no rows selected

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2014-04-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 杨建荣的学习笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
实战经验:Oracle recyclebin过大导致的Insert逻辑读暴增问题的解决
墨墨导读:某客户的数据库一条insert某段时间突然变慢,平均单次执行逻辑读暴增至20万,本文分享整个处理过程。
数据和云
2021/04/20
5340
案例精解:insert逻辑读暴增至20万,只因Oracle Recyclebin过大
墨墨导读:某客户的数据库一条insert某段时间突然变慢,平均单次执行逻辑读暴增至20万,最终定位为insert时因可用空间不充足递归清理recyclebin中的对象导致。
数据和云
2021/02/08
4310
SQL调优和诊断工具之SQL Trace (10046 Event)介绍
为了诊断SQL性能或者其他方面的问题,有时我们需要跟踪SQL语句和的执行过程,这时我们可以启用SQL Trace (10046 Event)来收集语句的执行过程和各种相关信息。
SQLplusDB
2022/08/19
8840
【怎么办001】DROP USER ... CASCADE特别慢怎么办?
使用DROP USER ... CASCADE删除用户时,如果目标用户有太多表等对象的话,执行可能会非常慢。作为临时处理方法可以先删除目标用户Schema中的所有对象,然后删除用户。 例:
SQLplusDB
2020/04/27
1.5K0
alter table新增字段操作究竟有何影响?(上篇)
很久以前就有个疑问,见过一些表设计时会留出几个reverse的字段,目的是为了以后扩展,但此时设计的字段类型、长度等都是预计的,未来是否可用,不好说,那为什么会这么做呢?可能的原因是:“我现在设定好字段,需要的时候直接用就行了,不需要新增字段的操作”。
bisal
2019/01/29
1.3K0
Oracle CBO选错执行计划的一种场景
测试人员做应用性能测试,反馈有一条SQL语句,之前执行非常快,现在执行时间,明显慢了。
bisal
2019/01/30
5330
TRUNCATE TABLE原理解析
众所周知,TRUNCATE TABLE是一种快速清空表内数据的一种方式,与delete方式不同,truncate只产生非常少的redo和undo,就实现了清空表数据并降低表HWM的功能。本文主要围绕TRUNCATE TABLE的实现原理和TRUNCATE TABLE的恢复来展开。
数据和云
2021/11/29
1.4K0
Oracle获取执行计划的方法(六脉神剑)
优点:可以通过STRATS得出表被访问次数;可以通过E-Rows和A-Rows来判断预测行数和实际行数是否一致;可以通过Buffers来获取逻辑读数值。
Lucifer三思而后行
2021/08/17
6590
Oracle获取执行计划的方法(六脉神剑)
Oracle优化04-Optimizer优化器
Oracle数据库中的优化器是SQL分析和执行的优化工具,它负责制定SQL的执行计划,也就是它负责保证SQL执行效率最高.
小小工匠
2021/08/16
1.3K0
记录一则完整的SPA(10g->11g)测试过程
生产端:Windows 2008 + Oracle 10.2.0.5 测试端:RHEL 6.5 + Oracle 11.2.0.4 需求:因为Oracle跨越大版本,优化器、新特性变动较多,需要进行SPA测试比对前后期性能差异。 说明:本文是根据DBA Travel的SPA参考规范文档(在此致谢Travel同学),结合实际某客户需求整理的整个测试过程。为了更真实的反映整个过程,在生产端使用swingbench压力测试软件持续运行了一段时间,模拟真实的业务压力。
Alfred Zhao
2019/05/24
1.6K0
Oracle诊断案例-Sql_trace之二
http://www.eygle.com/case/sql_trace_2.htm
数据和云01
2018/09/05
6960
MySQL和Oracle中的半连接测试总结(一)(r10笔记第31天)
SQL中的半连接在MySQL和Oracle还是存在一些差距,从测试的情况来看,Oracle的处理要更加全面。 首先我们来看看在MySQL中怎么测试,对于MySQL方面的测试也参考了不少海翔兄的博客文章,自己也完整的按照他的测试思路练习了一遍。 首先创建下面的表: create table users( userid int(11) unsigned not null, user_name varchar(64) default null, primary key(userid) )engine=innodb
jeanron100
2018/03/19
7060
MySQL和Oracle中的半连接测试总结(一)(r10笔记第31天)
Oracle SQL性能分析之10053事件
优化器生成正确执行计划的前提条件是要有正确的统计信息,不准确的统计信息往往会导致错误的执行计划。当通过SQL和基数推断出的执行计划和实际执行计划不同时,就可以借助10053事件。10053事件是用来诊断优化器如何估算成本和选择执行计划的,用它产生的trace文件提供了Oracle如何选择执行计划,为什么会得到这样的执行计划信息。和10046事件类似,它主要用于特殊情况下的分析和诊断。
星哥玩云
2022/08/17
7170
使用OGG 21c迁移Oracle 12c到MySQL 8.0并配置实时同步
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。相关文章可以参考:
AiDBA宝典
2023/04/26
1.4K0
使用OGG 21c迁移Oracle 12c到MySQL 8.0并配置实时同步
使用OGG 21.3远程实时互相同步Oracle 11.2.0.4(双主)
OGG有传统的经典架构,也有最新的微服务,2个都可以远程捕获和应用数据,对数据库服务器是0侵入,而传统的经典架构是纯命令行模式,最新的微服务架构是图形化界面操作,几乎所有操作都可以在界面进行。相关文章可以参考:
AiDBA宝典
2022/11/07
2.1K1
使用OGG 21.3远程实时互相同步Oracle 11.2.0.4(双主)
使用impdp不当导致的数据丢失问题(r5笔记第1天)
今天有个朋友问我们一个问题,说他在使用了impdp导入数据的时候,使用了TABLE_EXISTS_ACTION=REPLACE这个选项,结果现在数据都给覆盖了。现在没有备份,想问问能不能做相应的恢复操作。 对于这个选项,自己看着熟悉,不过很少用到,碰到了这个问题,首先想到的就是闪回。 不过也不能敷衍,自己在本地做了一个测试,想看看闪回的效果怎么样。首先简单模拟了一下这个问题。 conn n1/n1 SQL> create directory oradmp as '/home/ora11g/oradmp';
jeanron100
2018/03/15
1.2K0
Oracle优化12-10053事件
我们在查看一条SQL语句的执行计划时,只看到了CBO最终告诉我们的执行计划结果,但是我们并不知道CBO为何要这样做。
小小工匠
2021/08/16
4990
Oracle优化10-SQL_TRACE
当我们想了解一条SQL或者是PL/SQL包的运行情况时,特别是当他们的性能非常差时,比如有的时候看起来就好好像卡在什么地方一样,该如何入手呢?
小小工匠
2021/08/16
9430
Oracle 12.2 报错:ORA-12012: error on auto execute of job “SYS"."ORA$AT_OS_OPT_SY_7458”
2019-01-12T10:10:11.499130+08:00 Errors in file /u01/app/Oracle/diag/rdbms/rac1/rac112/trace/rac112_j000_119621.trc: ORA-12012: error on auto execute of job "SYS"."ORA$AT_OS_OPT_SY_7458" ORA-20001: Statistics Advisor: Invalid task name for the current user ORA-06512: at "SYS.DBMS_STATS", line 47207 ORA-06512: at "SYS.DBMS_STATS_ADVISOR", line 882 ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 20059 ORA-06512: at "SYS.DBMS_STATS_INTERNAL", line 22201 ORA-06512: at "SYS.DBMS_STATS", line 47197 查看trc文件
星哥玩云
2022/08/17
4240
Oracle之SQL优化专题01-查看SQL执行计划的方法3.1 dbms_xplan.display_cursor(null,null,'allstats last')3.2 dbms_xplan.
在我2014年总结的“SQL Tuning 基础概述”中,其实已经介绍了一些查看SQL执行计划的方法,但是不够系统和全面,所以本次SQL优化专题,就首先要系统的介绍一下查看SQL执行计划的方法。 本文示例SQL为: --set lines 1000 pages 1000 select a.empno, a.ename, b.dname, a.job, a.sal from emp a, dept b where a.deptno = b.deptno and empno = 7788; 1.explain
Alfred Zhao
2018/05/11
1.7K0
推荐阅读
相关推荐
实战经验:Oracle recyclebin过大导致的Insert逻辑读暴增问题的解决
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档