首页 » ORACLE » trace create user command, who is _next_user?

trace create user command, who is _next_user?

接着上一篇的问题,再来分析一下用户表,用10046跟踪一下create user

SQL> select user#,name,type#,astatus from user$ order by 1;

USER# NAME TYPE# ASTATUS
———- —————————— ———- ———-
0 SYS 1 0
1 PUBLIC 0 0
2 CONNECT 0 0
3 RESOURCE 0 0
4 DBA 0 0
5 SYSTEM 1 0
6 SELECT_CATALOG_ROLE 0 0
7 EXECUTE_CATALOG_ROLE 0 0
8 DELETE_CATALOG_ROLE 0 0
9 EXP_FULL_DATABASE 0 0
10 IMP_FULL_DATABASE 0 0
11 OUTLN 1 0
12 RECOVERY_CATALOG_OWNER 0 0
13 GATHER_SYSTEM_STATISTICS 0 0
14 LOGSTDBY_ADMINISTRATOR 0 0
15 AQ_ADMINISTRATOR_ROLE 0 0
16 AQ_USER_ROLE 0 0
17 GLOBAL_AQ_USER_ROLE 0 0
18 SCHEDULER_ADMIN 0 0
19 DIP 1 9
20 HS_ADMIN_ROLE 0 0
21 TSMSYS 1 9
22 OEM_ADVISOR 0 0
23 OEM_MONITOR 0 0
24 DBSNMP 1 9
29 OPER 0 0
30 CME 1 0
40 S_NQ_SCHED 1 0
42 SSE_ROLE 0 0
69 PERFSTAT 1 0
91 EXAM_ALL 1 0
92 OLEM 1 0
103 SQPX 1 0
114 PLUSTRACE 0 0
115 HYSH 1 0
120 ICME 1 0
123 HEN_ZDXK 1 0
124 SYSMAN 1 0
125 MGMT_USER 0 0
126 MGMT_VIEW 1 0
129 JSXY 1 0
136 QKPX_XJ 1 0
137 OLEM_HUNAN 1 0
141 SEP 1 0
142 QKZGGL_HUN 1 0
143 ZYYSGL_SEP_SH 1 0
145 ZYYSGL_ZYY_SH 1 0
152 QKZGPX 1 0
156 QINWEN 1 0
159 DOCTOR 1 0
162 HR_ADMIN 1 0
163 SJ_EJB_STUDY 1 0
164 SJ_SEP 1 0
165 SJ_EXAM 1 0
166 SJ_OLEM 1 0
167 JSPX_DB 1 0
168 JSPX_STUDY 1 0
169 JSPX_PRIV 1 0
170 JSPX_EXAM 1 0
171 GJXMSB 1 0
172 TT 1 0
176 QQ 1 0
177 _NEXT_USER 0 0

63 rows selected.

发现有条记录_NEXT_USER TYPE#=0 ,(1 USER,0 ROLE)

下面分析一下create user 时后台在做什么操作,用10046 events跟踪 level 4级以上,再执行了create user qq identified by qq;

查看trace文件如下

PARSING IN CURSOR #3 len=31 dep=0 uid=0 oct=51 lid=0 tim=1289262748406860 hv=0 ad=’59d6fc08′
create user qq identified
END OF STMT
PARSE #3:c=0,e=213,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=1289262748406858
BINDS #3:
=====================
PARSING IN CURSOR #1 len=39 dep=1 uid=0 oct=6 lid=0 tim=1289262748407548 hv=1815424926 ad=’bde00c0′
update user$ set user#=:2 where name=:1
END OF STMT
PARSE #1:c=1000,e=414,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1289262748407546
BINDS #1:
kkscoacd
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
kxsbbbfp=2ac059e7d868 bln=24 avl=03 flg=05
value=177
Bind#1
oacdty=01 mxl=32(10) mxlc=00 mal=00 scl=00 pre=00
oacflg=18 fl2=0001 frm=01 csi=852 siz=32 off=0
kxsbbbfp=20af5f63a bln=32 avl=10 flg=09
value=”_NEXT_USER”
。。。。

=====================
PARSING IN CURSOR #4 len=322 dep=1 uid=0 oct=2 lid=0 tim=1289262748425334 hv=2821988241 ad=’af52cb8′
insert into user$(user#,name,password,ctime,ptime,datats#,tempts#,type#,defrole,resource$,ltime,astatus,lcount,defschclass,spare1)values (:1,:2,:3,SYSDATE,DECODE(to_char(:4, ‘YYYY-
MM-DD’), ‘0000-00-00’, to_date(NULL), :4),:5,:6,:7,:8,:9,DECODE(to_char(:10, ‘YYYY-MM-DD’), ‘0000-00-00’, to_date(NULL), :10),:11,:12,:13,:14)
END OF STMT
PARSE #4:c=1000,e=499,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=1289262748425332
BINDS #4:
kkscoacd
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
kxsbbbfp=2ac059e7d450 bln=22 avl=03 flg=05
value=176
Bind#1
oacdty=01 mxl=32(02) mxlc=00 mal=00 scl=00 pre=00
oacflg=18 fl2=0001 frm=01 csi=852 siz=32 off=0
kxsbbbfp=20bde2a36 bln=32 avl=02 flg=09
value=”QQ”
Bind#2
oacdty=01 mxl=32(16) mxlc=00 mal=00 scl=00 pre=00
oacflg=18 fl2=0001 frm=01 csi=852 siz=32 off=0
kxsbbbfp=20bde2a56 bln=32 avl=16 flg=09
value=”E26311AB047A48A6″
。。。。

其实不难发现create user,是先把user$表_NEXT_USER的USER#+1,然后再找一些默认临时表空间,默认表空间,undo,profile..绑定变量后再insert into 新用户到seg$表中,完成新增加的用户;

由这联想到了我上一篇中删除表空间出错,发现有很多数据对象所对应的user#已不存在,那能不能新增加个用户修改user$表的user#为那些不存在用户的对象指定个用户呢?

然后从seg$ 找到那些对象user# 是85,然后把新增加的用户 update user$ set user#=85 where user#=176,用新加的用户登录,发现查看user_tables那些对象已都存在,select * from xx,desc xxx都可以,但是如果有表中数据还是无法select,空表可以drop table xxx,有数据的表,drop table xx purge,因数据段已不存在,还会报ora-600的错误,所以生产库要小心不能修改基表。最后那几张有记录的表还是从基表删除,补充上篇中说的把seg$修改为临时段要注意,只是数据库会回收seg$中的信息,但是obj$和tab$还会存在那条记录。

打赏

对不起,这篇文章暂时关闭评论。