我们拒绝平庸,拒绝随波逐流,拒绝墨守成规,让梦想不再流浪。

ORACLE 常用的解决办法3

上一篇 / 下一篇  2014-05-28 10:32:28 / 个人分类:甲骨文

1swP'l1]-J0第四部分、性能调整51Testing软件测试网 ^$Iy@a @ }

51Testing软件测试网2f-o2]B}2xR4M

menu

K5FQ4I7MD'R^8g051Testing软件测试网"M+W3e-v wcFN\8@d

[Q]如何设置自动跟踪
'Q3wJOA0[Q]如何跟踪自己的会话或者是别人的会话51Testing软件测试网X-j[6[f
[Q]怎么设置整个数据库系统跟踪
3a|+G#D2aQyJ4f C0[Q]怎么样分析表或索引51Testing软件测试网${du1Z'J)YQ_/R)PV @,f
[Q]怎么样快速重整索引
$||Z0G PO5a ~e0[Q]如何使用Hint提示51Testing软件测试网]&Vb-i@? [Q
[Q]怎么样快速复制表或者是插入数据51Testing软件测试网!Vn*GV {+Fic
[Q]怎么避免使用特定索引
$z A t'JQ,|0S+C0[Q]Oracle什么时候会使用跳跃式索引扫描51Testing软件测试网"yR dls4^
[Q]怎么样创建使用虚拟索引
LH4^;D5@0q0[Q]v$sysstat中的class分别代表什么
5@.sO*h3z]}p.h`0[Q]怎么杀掉特定的数据库会话51Testing软件测试网9e2H gG2w'| z
[Q] 如何有效的删除一个大表(extent数很多的表)51Testing软件测试网/N mo'L }([
[Q]如何收缩临时数据文件的大小51Testing软件测试网1v2?4^:X)}B
[Q]怎么清理临时段
U/VA3j#H6q)Crd)UX0[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构
2|U1eGw"?]0[Q]如何获得所有的事件代码
6NVu W!uB0[Q]怎么样快速重整索引
ScGFm"R8Z!@$K0[Q]怎么快速查找锁与锁等待
m/h![3X0A5nzw\$h$M051Testing软件测试网N-Am1sf
[Q]怎样监控无用的索引
)r;h)xzhm s0[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句
yS@%hg Hkd0[Q]怎么样能固定我的执行计划
;F*\)L5yQ;U#E5lx0[Q]如何获得所有的事件代码51Testing软件测试网 A})Hj W:zh S
[Q]什么是STATSPACK,我怎么使用它?
SB3S5^0M0第四部分、性能调整51Testing软件测试网5['L)hUZ.B
[Q]如何设置自动跟踪51Testing软件测试网wQL+MO4v:K*W
[A]用system登录51Testing软件测试网poL#Lj|e
执行$ORACLE_HOME/rdbms/admin/utlplan.sql创建计划表51Testing软件测试网%y9Z8Ea4H:fu*p Q_&Q
执行$ORACLE_HOME/rdbms/admin/plustrce.sql创建plustrace角色51Testing软件测试网b@!F/th6~
如果想计划表让每个用户都能使用,则
s9y/^3Lo0cx0SQL>create public synonym plan_table for plan_table;
]U7Y^c0K0SQL> grant all on plan_table to public;
;t Bg:q:I\0如果想让自动跟踪的角色让每个用户都能使用,则51Testing软件测试网V&eV?t5qvU
SQL> grant plustrace to public;
ZlKNh \+H.^^0通过如下语句开启/停止跟踪51Testing软件测试网'se&J4t.m
SET AUTOTRACE ON |OFF
)d9`)z0r o.q0| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN51Testing软件测试网}T-D&NyF,X-{2}

-x0g)E9f4]Jpz o0[Q]如何跟踪自己的会话或者是别人的会话
wA;BT.rtCa9xv0[A]跟踪自己的会话很简单
p;jf ZX z(vC0Alter session set sql_trace true|false
4jwb&{\f+?:F-H0or51Testing软件测试网Jg&^l ^-@
exec dbms_session.set_sql_trace(TRUE);
@5k;G}zg0如果跟踪别人的会话,需要调用一个包
/h!X2]1Zg%^#DM"I0exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)
[a@2a \.A Xz'B z0跟踪的信息在user_dump_dest 目录下可以找到51Testing软件测试网 n2{)?L2Ip Y M
可以通过Tkprof来解析跟踪文件,如51Testing软件测试网q-v;~vD
Tkprof 原文件 目标文件 sys=n
^:hV?3b6qY|:W0
OTC/??P*Z~0[Q]怎么设置整个数据库系统跟踪
Q9CN;vKs8kCc0[A]其实文档上的alter system set sql_trace=true是不成功的51Testing软件测试网^.[$|9M0{ZR
但是可以通过设置事件来完成这个工作,作用相等
/v1y.t;W%S1g0alter system set events
@ S_YG0y%s?0'10046 trace name context forever,level 1';51Testing软件测试网0f!R"c/o*X%Y
如果关闭跟踪,可以用如下语句
_5B(|g S+@"{(uM0alter system set events51Testing软件测试网&V:tLas
'10046 trace name context off';
.j%c*b8Ol v:K0其中的level 1与上面的8都是跟踪级别
x@e)xd7xr0level 1:跟踪SQL语句,等于sql_trace=true
v.y/S'DY(zWX+z0level 4:包括变量的详细信息51Testing软件测试网#^$D7p:q"P0^s
level 8:包括等待事件
a'of r&h0G9pl1_Z0level 12:包括绑定变量与等待事件
"Q'[,xwn}3G0
kYc(M4FEt0[Q]怎么样分析表或索引
*U"n.| VjoH/a)S0[A]命令行方式可以采用analyze命令
1_k.] }0[AtI0如Analyze table tablename compute statistics;51Testing软件测试网?Q5P6S1Z8Tz6\
Analyze index indexname estimate statistics;51Testing软件测试网$H`NR&W3at
ANALYZE TABLE tablename COMPUTE STATISTICS51Testing软件测试网(il"H} |T n&`:d-x:D
FOR TABLE
$Zf-V^-e4K1u#^0FOR ALL INDEXES
w+k~~P,U3bkv0FOR ALL INDEXED COLUMNS;51Testing软件测试网T v#@na-i/@QAG
等等。
D-p h"C'eK%d;cPS0如果想分析整个用户或数据库,还可以采用
Z5f)O`j,\C$q0Dbms_utility(8i以前的工具包)51Testing软件测试网1m8U%e@D U
Dbms_stats(8i以后提供的工具包)
5X/QlF.Z(Y1_8vX051Testing软件测试网-ii6C#nV6V;`
[Q]怎么样快速重整索引
'_ ]-}D-R9hs"`"g;p8}9i0[A]通过rebuild语句,可以快速重整或移动索引到别的表空间51Testing软件测试网+tKx4k1k1Ud,D
rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数
#qK8^ L2Ld.x?l0语法为
Rq$tOh7x0alter index index_name rebuild tablespace ts_name
8AP\V:b0storage(……);51Testing软件测试网 ziWwl0l*u
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改51Testing软件测试网-Gp}5V#zo.\
SQL> set heading off51Testing软件测试网&rGJ VW!J1c9M1b
SQL> set feedback off
+w4W*e9G1Et0SQL> spool d:\index.sql51Testing软件测试网R4Rg:T+a]e
SQL> SELECT 'alter index ' || index_name || ' rebuild '
'u:K%}9t q0||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'51Testing软件测试网i X3F_ O9c T:z
FROM all_indexes51Testing软件测试网 AL7e+dS\bP
WHERE ( tablespace_name != 'INDEXES'51Testing软件测试网Zsw2WJ1rk
OR next_extent != ( 256 * 1024 )
S-F$d7k+II9~y0)51Testing软件测试网 ~MqLL!~,n L
AND wner = USER
/P Ez+U7^[(Zo0SQL>spool off51Testing软件测试网&{)[+B%~1f8bzrm
另外一个合并索引的语句是51Testing软件测试网0m S9~9_8q4\p
alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block51Testing软件测试网4t/mCT+D(vD0AsX E
消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。51Testing软件测试网P`X$G vb

!K:\5n:x5xh)M1FN*C0[Q]如何使用Hint提示
,h6S0QR'o:Z#QY%Y&cm2Z0[A] 在select/delete/update后写/*+ hint */
)? a S)i!B0如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...51Testing软件测试网(C1g${C'JT
注意/*和+之间不能有空格
0q!R"^3f5g1e5@W0如用hint指定使用某个索引51Testing软件测试网 lO5H#@0ax&t

6[o3n8quC6J"K:f6H0select /*+ index(cbotab) */ col1 from cbotab;
3D.}P3U+L$_Z0select /*+ index(cbotab cbotab1) */ col1 from cbotab;51Testing软件测试网+w)F1F0F~1ak0G$_qo
select /*+ index(a cbotab1) */ col1 from cbotab a;51Testing软件测试网Q}[dVrj9kGo
其中
5^R4?Y3n0TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;51Testing软件测试网wb!Gx+B:H.eXvp
INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;51Testing软件测试网*OX1efG(G3[4G0[)T
如果索引名或表名写错了,那这个hint就会被忽略;51Testing软件测试网J }0JKs.S

R5K]o:S,B%b d2@0[Q]怎么样快速复制表或者是插入数据
r!aO$wt0y:ELh%M r9V3m0[A]快速复制表可以指定Nologging选项51Testing软件测试网G5{Av;Q8U P&f
如:Create table t1 nologging51Testing软件测试网h A.Bw*~ w2?&E
as select * from t2;
!W[ U&z;S`+w0快速插入数据可以指定append提示,但是需要注意
7M1LZZ3\jM{-|y0noarchivelog模式下,默认用了append就是nologging模式的。51Testing软件测试网"B!hf nk#g4p
在archivelog下,需要把表设置程Nologging模式。51Testing软件测试网0Sw&{/C c#J+`
如insert /*+ append */ into t151Testing软件测试网"Z;OY$B*m1h
select * from t2
?y I{Y|0注意:如果在9i环境中并设置了FORCE LOGGING,则以上操作是无效的,并不会加快,当然,可以通过如下语句设置为NO FORCE LOGGING。51Testing软件测试网;_5wU m2R|%K5x+e
Alter database no force logging;
2WYg D-E^2G%}3yt0是否开启了FORCE LOGGING,可以用如下语句查看
TA*D0qU0SQL> select force_logging from v$database;
)i7y"Jh!@&vn&xGW9g!Sa0
0d#WK+|*H.K0[Q]怎么避免使用特定索引
.L7\lD\,n0O`0[A]在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:51Testing软件测试网F?.q)nMD,KQ+G
test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。51Testing软件测试网"Br,E7~ N4Hb
在正常情况下,where a=? and b=? and c=?会用到索引inx_a,
kJ W1yO+i&o0where b=?会用到索引inx_b
;vi$B0{KYC SM0c.q0但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。
L ^eB*|.{:v0当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。51Testing软件测试网 i^,z+^c#Bj&G&]U
where a=? and b=? and c=? group by b||'' --如果b是字符51Testing软件测试网1Q}zHma`
where a=? and b=? and c=? group by b+0 --如果b是数字
RhLbJl0通过这样简单的改变,往往可以是查询时间提交很多倍
3u/EYr{b@4_U0当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:
t p,pO)b9v~K0select /*+ no_index(t,inx_b) */ * from test t51Testing软件测试网"S-Y e;Y2EV
where a=? and b=? and c=? group by b
~9hp s8v]e0
U)]\RJ_0[Q]Oracle什么时候会使用跳跃式索引扫描51Testing软件测试网!Oj6r~2P
[A]这是9i的一个新特性跳跃式索引扫描(Index Skip Scan).
'o:vu M._p0例如表有索引index(a,b,c),当查询条件为
'A4v~6x2~Dh0where b=?的时候,可能会使用到索引index(a,b,c)51Testing软件测试网1Nj i$wTnX
如,执行计划中出现如下计划:51Testing软件测试网5U_/N$F4Qb1R
INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)51Testing软件测试网E1xWN jb2xP|9X
Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:
1T4r+l!n/P7eG}_y01 优化器认为是合适的。51Testing软件测试网RrbS[ Y5r1q m
2 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。
`Z7b ^ Q4q03 优化器要知道前导列的值分布(通过分析/统计表得到)。51Testing软件测试网H QB$m t w4sEZ5t
4 合适的SQL语句51Testing软件测试网|Ro6S$B9ok1C7R
等。
i*Fe/K,i_ F \&n051Testing软件测试网vg T5@fO
[Q]怎么样创建使用虚拟索引51Testing软件测试网S`4\9]\8d*st
[A]可以使用nosegment选项,如
Fw?\:[)@rfy0create index virtual_index_name on table_name(col_name) nosegment;
~.T7At5U8E0如果在哪个session需要测试虚拟索引,可以利用隐含参数来处理
q VKlh.d0alter session set "_use_nosegment_indexes" = true;
H8`1D9kwk.C`0最后,根据需要,我们可以删除虚拟索引,如普通索引一样
E~Yx8I;sc0drop index virtual_index_name;
3P(Dv \&g]0注意:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引
:}2K d-T yj0在一些小的表的测试上,虚拟索引不一定能提交查询速度。51Testing软件测试网y7nI~D+d1A

s |v/r!O0[Q]v$sysstat中的class分别代表什么51Testing软件测试网 Z,cm#_fJ8V
[A]统计类别51Testing软件测试网z6Gi+m8V)C3?E5ZC3g
1 代表事例活动51Testing软件测试网m0tN~I7SQ6R6A,B2KK
2 代表Redo buffer活动
"w'aa jH&`04 代表锁51Testing软件测试网'ZN$ct?1U(^ qF&[
8 代表数据缓冲活动
^H:F_%m016 代表OS活动
7@:[$r@zPR$Uk032 代表并行活动51Testing软件测试网+D K~{TpK9C?
64 代表表访问
D ][hHhBK0128 代表调试信息51Testing软件测试网%R i;J3E8^

q$N$HRO0[Q]怎么杀掉特定的数据库会话51Testing软件测试网8RP:u"Z7X.tUmU[
[A] Alter system kill session 'sid,serial#';
1F2} KO.T^7_e0或者
8X}G;X p&Wo-Snu0alter system disconnect session 'sid,serial#' immediate;
KD;G^.J;OA/t0在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)
4lr K wm TP @jAd0在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程

p Ac7ODLj6Y051Testing软件测试网D F_5s+_xp1F

一、问题的提出51Testing软件测试网;ZEh;ZD%\ Lt
很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:51Testing软件测试网1Sb H)d5zD0R$v{
51Testing软件测试网*i*\]SC6p-r/c%IG
1、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。51Testing软件测试网@H;B$W!t
51Testing软件测试网.a^l3W-b
2、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。
1z7M1_ [+n5V/L&lR051Testing软件测试网V@1s0Jm%Z
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
,H8uGD0Hz'p1lG0
G,[x:U$gZH#K0二、处理方法
;Yr8w z {!hr0其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。51Testing软件测试网[D!X%e*~T^D-N

R!K0@zw5^7c01、 以一个session做以示例,
*DBH,l#}0Z051Testing软件测试网$zW_0T1l T1z`
a、 找到你要杀掉的那个session, 并记下paddr51Testing软件测试网A(dboz

'\@!y QXTU.y0select sid, username, paddr, status from v$session
"aO_.\,t-J+Up#V0P0where username = '用户名' and
)w#P,vTV!_0status = 'INACTIVE';51Testing软件测试网 I7gLw&^o-r*y

r/Sj^A&tiK0b、 找到这个session所对应的spid
m1j!S0j9w051Testing软件测试网,y_$h)r?F
select * from v$process where addr = '上面查寻的paddr';
,M?.Rp Vu0c、 杀掉spid所标识的那个进程51Testing软件测试网G2Udk?K5wN

(qcB/kF p4n0如果你的Oracle是在Unix平台上的,可以用kill。
/m%}6M hd u0_T(A#g051Testing软件测试网(He_@mSZ$w.m9z6}
$kill spid51Testing软件测试网6uI.|vx\?%|[2?x

MmaSl6wC0如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为rakill sid spid51Testing软件测试网}4T%mKJ B8h
51Testing软件测试网ko&ia8~z M
C:\>orakill sid  spid
MuM8y k7AL3Zs1~5\051Testing软件测试网&^V*r'B1hh;v4w/f'w6E[
d、 再查一下v$session,看会话在不在了。51Testing软件测试网 B-_rh FPr
51Testing软件测试网dNh_r\X(qP8h
2、 如何谋杀掉所有的Oracle的用户的进程呢?
h7]+j l&UO-Y051Testing软件测试网:Cjo9{c$OV@K
a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat, 执行一下kill.bat就可以了。51Testing软件测试网U}c3^&d#x/a%_tbt/z
51Testing软件测试网%y OJP5Rj3_
select 'orakill '||sid||' '||spid as thread from51Testing软件测试网 rL QPqD
sys.v_$process p, sys.v_$session s51Testing软件测试网6t$?,b0I*LFjj }7r
where sid > 6 and
(CM Y@M6b-u ^0p.addr = s.paddr ;51Testing软件测试网(e B(spUt2j A
51Testing软件测试网nTNnF^

8nl0xU[:\3Jp0b、 Unix的环境相对来说就简单多了,执行如下的命令就可以了51Testing软件测试网I[xBYOH,hOA3t

w5U`wn~0$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill
g']y-{t t)xB.G,j3y0
p5ZHy!Ww Z1dMY0然后你再shutdown immediate就很快的了。
F|+J'Q*j0
IU^8_5jhorZ1sH,c0
O._ Q? M.r1QI V0有一些死锁进程,异常退出后用51Testing软件测试网 XH9@?Ij:u G
alter system kill session 'sid, serial#';无法释放会话
.L1JY.r$Y N~b5d$fR0可从操作系统直接处理。51Testing软件测试网QP&C4t/C{j
51Testing软件测试网E3I9Q Z+O1b9}3I
51Testing软件测试网2PN7r#@,C-x2Y[;~T
[Q] 如何有效的删除一个大表(extent数很多的表)
;FK2P?o?/k0[A] 一个有很多(100k)extent的表,如果只是简单地用drop table的话,会很大量消耗CPU(Oracle要对fet$、uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗:51Testing软件测试网)cs3|._C@Bxl
1. truncate table big-table reuse storage;
0M M8R&cm)N02. alter table big-table deallocate unused keep 2000m ( 原来大小的n-1/n);
k2GzI~W/J5qZ{03. alter table big-table deallocate unused keep 1500m ;51Testing软件测试网]EBA u O$jP
....51Testing软件测试网&FM+mRQ)l SM
4. drop table big-table;51Testing软件测试网 n3DY M!nR8b

+qR Z X _\0[Q]如何收缩临时数据文件的大小
D1Xa o N0YL7n0[A]9i以下版本采用
O+_T wh;@1t0ALTER DATABASE DATAFILE 'file name' RESIZE 100M类似的语句51Testing软件测试网 y)x)[g)n7X/}0G
9i以上版本采用51Testing软件测试网yq&jV N(a"oY
ALTER DATABASE TEMPFILE 'file name' RESIZE 100M
"G~f\Q7~3e6\a4a"O0注意,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。51Testing软件测试网mq.tvy5pz
51Testing软件测试网$i!s3?(tM
[Q]怎么清理临时段51Testing软件测试网K7e.[-~@8]
[A]可以使用如下办法51Testing软件测试网j[[!z7U [7Ds%L1W-m
1、 使用如下语句查看一下认谁在用临时段51Testing软件测试网7]b*^CR-PFJ6sm
SELECT username,sid,serial#,sql_address,machine,program,51Testing软件测试网pI?4N8}i4|Q\nVo
tablespace,segtype, contents51Testing软件测试网|vzU3s~f
FROM v$session se,v$sort_usage su
%v.cAfR.AH0WHERE se.saddr=su.session_addr
Jz/b%h3|&W02、 那些正在使用临时段的进程
cWX q^e d9zf0SQL>Alter system kill session 'sid,serial#';51Testing软件测试网+Xy?L&c3@_4H
3、把TEMP表空间回缩一下
J9}s1j)Lte&K*u0SQL>Alter tablespace TEMP coalesce;51Testing软件测试网oY4q$hYOh0h \n
还可以使用诊断事件51Testing软件测试网6e5Xf-li"r
1、 确定TEMP表空间的ts#51Testing软件测试网f3HG MDTp3xB
SQL> select ts#, name FROM v$tablespace;51Testing软件测试网Zp{/QT?
TS# NAME51Testing软件测试网?w$]R$ee!_ NY
-----------------------51Testing软件测试网"eZ`+t O#i"`_\
0 SYSYEM51Testing软件测试网/g.Iv/d$i-G
1 RBS
-kMF8rz:F02 USERS
^#b*z S"P.dlDw03* TEMP51Testing软件测试网-x+z ?V'Dd2}p3g
……
?.|'d;l*y'V/@U02、 执行清理操作
D H p \-TX2isl9F/v0alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'
I-N({ X0x0\E"{;l$C AJ0说明:
@)Y!V!?r,}4i0temp表空间的TS# 为 3*, So TS#+ 1= 4
'{/BN4X:zB0如果想清除所有表空间的临时段,则
N| }]9W1nW0TS# = 2147483647
X n(N)i8fI#v e^051Testing软件测试网:_"wL X k
[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构
6n!{+G0z&`0[A]常见的有
Zh6OL2e0OH;r!u01、分析数据文件块,转储数据文件n的块m51Testing软件测试网(UG|4|-xW0[ nZ
alter system dump datafile n block m
J8U;_Q~Z U,d02、分析日志文件
)`0K/yX?0alter system dump logfile logfilename;
@&S!iO^ y)J4^'m0`03、分析控制文件的内容
DQtJ8I)?+I&V0alter session set events 'immediate trace name CONTROLF level 10'
`z~B5kz04、分析所有数据文件头51Testing软件测试网;X;w I[B/X6A`
alter session set events 'immediate trace name FILE_HDRS level 10'
wyo~HVx4f05、分析日志文件头51Testing软件测试网 P*cR*mUn/ymJ"wb
alter session set events 'immediate trace name REDOHDR level 10'51Testing软件测试网uX/f0f/OD
6、分析系统状态,最好每10分钟一次,做三次对比
V w t5u#c'y0alter session set events 'immediate trace name SYSTEMSTATE level 10'51Testing软件测试网/D?&SncvYY-\R
7、分析进程状态
6pazFd0alter session set events 'immediate trace name PROCESSSTATE level 10'
0T*m?&uT5@f08、分析Library Cache的详细情况
a~~ I'N^ R0alter session set events 'immediate trace name library_cache level 10'
/s g`X-Gq051Testing软件测试网,\5e b,Xz
[Q]如何获得所有的事件代码
_Xo v/F0[A] 事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息
pJ8~^}6E0SET SERVEROUTPUT ON
e5PC2BSA0DECLARE51Testing软件测试网pub|(Ngs
err_msg VARCHAR2(120);51Testing软件测试网"q7wn$P+}S@j7C
BEGIN
*\/hN @t:]y(D0dbms_output.enable (1000000);51Testing软件测试网mGdqn
FOR err_num IN 10000..10999
IB]%GNG0LOOP51Testing软件测试网JJn*Nd;g6z0Y
err_msg := SQLERRM (-err_num);
9D7a C3i$Wo R0IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN51Testing软件测试网/Yk;b[0] v ]8R
dbms_output.put_line (err_msg);
$v$wa4Q)[A t4`U0END IF;
:NG;Oh%m/euik0END LOOP;
-M |%Y s(Q Y"Bk0END;51Testing软件测试网 s"b3wF7qy
/51Testing软件测试网 F }z`ijQ
在Unix系统上,事件信息放在一个文本文件里
wn%C[P D0$ORACLE_HOME/rdbms/mesg/oraus.msg
'v;K*m`"p%v{2}*r0可以用如下脚本查看事件信息
dz(c!_!j0event=1000051Testing软件测试网0C$y\ Ht.ewk(Mw0F1y
while [ $event -ne 10999 ]
(f$DB.Q:Rh5s0do
9Y7I`{ N`0event=`expr $event + 1`51Testing软件测试网,}_,m j!Tn/}
oerr ora $event
-]gm8tvc hK0done
xIGz[9H:OQ0对于已经确保的/正在跟踪的事件,可以用如下脚本获得51Testing软件测试网3t cov:g
SET SERVEROUTPUT ON
1N]n Dpy7S|0DECLARE51Testing软件测试网 } K#]HU.U TZ @8Da
l_level NUMBER;51Testing软件测试网3my']k#Du(S%[
BEGIN
-_%Q9S6^&eZ.{M/z0FOR l_event IN 10000..10999
g%UWT~ ?:A0LOOP51Testing软件测试网_d]#\fn\R j
dbms_system.read_ev (l_event,l_level);
M Ye&M&Dd,n k0IF l_level > 0 THEN
zu Ud0Y%qT'{x6rv(k0dbms_output.put_line ('Event '||TO_CHAR (l_event)||51Testing软件测试网"?va}H5xm ?
' is set at level '||TO_CHAR (l_level));51Testing软件测试网0NIl#UQgN(U
END IF;
6eo^s*E@5xA0END LOOP;
1A^6eM3YJ+v0END;
w4?Jy#u`K0/
51Testing软件测试网p]$l}*}%D]9Ic

tt T*v4w0[Q]怎么样快速重整索引51Testing软件测试网/WQ@X t!^&P
[A]通过rebuild语句,可以快速重整或移动索引到别的表空间
9z*K6wLM0rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数
f!Vqn {4lj"A0语法为
(]H#OlX%g;EAK;@0alter index index_name rebuild tablespace ts_name51Testing软件测试网4O4r;`*|;q-c0[
storage(……);51Testing软件测试网 { C(LwE
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改
^E TM0J,n"G/|j0SQL> set heading off
T8l-F ~6k6ia0SQL> set feedback off
(h+K2MBm(mk N0SQL> spool d:\index.sql51Testing软件测试网zlFo3C g&R ASLE
SQL> SELECT 'alter index ' || index_name || ' rebuild '51Testing软件测试网XGnR-X
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'
&a E4KFfE@4Da0FROM all_indexes
o(D5{B%i qn0WHERE ( tablespace_name != 'INDEXES'51Testing软件测试网*f)T5w/aK ]bB({ lt!M
OR next_extent != ( 256 * 1024 )51Testing软件测试网O+bwQ#w F)r
)51Testing软件测试网,K m@i%M$@
AND wner = USER
j|e*tFl!}+z0SQL>spool off51Testing软件测试网 FD`c\/y!\%v+g
另外一个合并索引的语句是51Testing软件测试网 L k2ikA-j(LDR
alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block
*L;A1f d+| w I0消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。
H5Bx#xY5m0 

:z"P Fc,A051Testing软件测试网O3}1S-L]s%\P

[Q]怎么快速查找锁与锁等待51Testing软件测试网8Z;US9R_-E
[A]数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。
AaLM hW!e0这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。51Testing软件测试网kn ^5FC0C J9q9n4{
可以通过alter system kill session ‘sid,serial#’来杀掉会话51Testing软件测试网7i9`\Rxl&| @
SELECT /*+ rule */ s.username,
|;aq;Z3p+v1?5Qf0decode(l.type,'TM','TABLE LOCK',
Qur7]&v/y0'TX','ROW LOCK',51Testing软件测试网 a#VY7T1c)K
NULL) LOCK_LEVEL,51Testing软件测试网S&m3} `7\k.EV
o.owner,o.object_name,o.object_type,
!q9Kn ]b?0s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
5ob9`b M,^_O0FROM v$session s,v$lock l,dba_objects o
?|H,c o0WHERE l.sid = s.sid
WD qgY j0AND l.id1 = o.object_id(+)51Testing软件测试网&BH.{7b3O
AND s.username is NOT NULL
\ Fl6@A:\ D0如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待51Testing软件测试网:@ OM q!oH&J
以下的语句可以查询到谁锁了表,而谁在等待。51Testing软件测试网(FP ZZ9z w1^&t
SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,51Testing软件测试网x^3^/NZbSbH
o.owner,o.object_name,o.object_type,s.sid,s.serial#
0cG| qp4p0FROM v$locked_object l,dba_objects o,v$session s
pz9A)u(~4f0WHERE l.object_id=o.object_id51Testing软件测试网%oSkkv
AND l.session_id=s.sid51Testing软件测试网r*paGuF K4m9Q*F
ORDER BY o.object_id,xidusn DESC
ej7x(X"Z*e*z0以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN51Testing软件测试网#TwFU5X:@mJ
 

{`9p1]+t1c{gk i V0

l1kQ+D!F[$y0[Q]怎样监控无用的索引51Testing软件测试网c'm l ?Ch8J
[A]Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引
^K4H,NP8p+k0语法为:
sT q^fW)~.y H8g9I0开始监控:alter index index_name monitoring usage;51Testing软件测试网,dhtZmI+A
检查使用状态:select * from v$object_usage;
RpS*[y0停止监控:alter index index_name nomonitoring usage;
4\G9?hNe#e}y `0当然,如果想监控整个用户下的索引,可以采用如下的脚本:
h H!X'p B^?0set heading off51Testing软件测试网5AJYA5m[/n8x vn
set echo off
*J1t;tS2dq6f!`'LE9n0set feedback off51Testing软件测试网 c K+[byX"HP]Hg l"Y
set pages 1000051Testing软件测试网]']9miO%O bc3cK
spool start_index_monitor.sql
!ob@o^(b.i&WS0SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'
@m Q m_0FROM dba_indexes
8S0`whEx Je3r;j&\0WHERE wner = USER;51Testing软件测试网Yy;~*i%qV!xN6U
spool off
.Jk9]Ex0set heading on
hj|`5X$dC7J0set echo on51Testing软件测试网&@0@+|#b!a ` m
set feedback on51Testing软件测试网z2Q0TY!t1sPW
------------------------------------------------
S q]Q7Z8B~0set heading off
Y8Pa$mR MAL!Q0set echo off
Y!j)R)T*K#V0set feedback off
ezP3E9} g&i0set pages 1000051Testing软件测试网o_ EmWOj]
spool stop_index_monitor.sql
sT};M7@2Uj0SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'
9z)NX%X/GOqsn0FROM dba_indexes51Testing软件测试网,?g#r9KdB Do#U \
WHERE wner = USER;
#oY n}!w9r+ZY5l0spool off
iK;P\ p"f kC2k0set heading on
6F'BV2z?dA)`0set echo on
%C*L+TT7kP0set feedback on
51Testing软件测试网z1m6a.b[%wFNZ0h

G D7Pg6HW _!M0[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句51Testing软件测试网 U$d:sH^9e*T w$B f@U
[A]有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢?
H;P'n4Fc V1Pm p7D^0我们可以编写如下脚本:51Testing软件测试网`/ztY:qV!j`
$more whoit.sh
veJ.~z]Dz0#!/bin/sh51Testing软件测试网@Z!W] ?+s.N
sqlplus /nolog <<EOF
6^N Lmo'a0connect / as sysdba
6cZ%n F0@ @0col machine format a30
;J4O|X0llfGLL0col program format a40
P8oZq9P[0set line 20051Testing软件测试网E7KWw Tn'Ob
select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss')51Testing软件测试网 vd(j%TX.cdY
from v\$session where paddr in51Testing软件测试网+IN/\Q;_W,Vh!h
( select addr from v\$process where spid in($1));51Testing软件测试网X3Fc*o oF'k

sn8L3w6U-P*^0select sql_text from v\$sqltext_with_newlines51Testing软件测试网8Px atd!U
where hash_value in51Testing软件测试网 xw7y^%iF }
(select SQL_HASH_VALUE from v\$session where
"[%`f6p Nb3b6t"r8D0paddr in (select addr from v\$process where spid=$1)51Testing软件测试网Q\ wl0]"tY
)51Testing软件测试网5|:rk`m#zM({
order by piece;
CJ*d!RQ"|9[$Iye051Testing软件测试网 q.Y3[A3x Bk mP
exit;
+V.~hx-s1gB&}0EOF51Testing软件测试网O Z4c b[2P"O,y
然后,我们只要在OS环境下如下执行即可51Testing软件测试网$]`&FDt|
$./whoit.sh Spid

!fF` IG D,t$Y _(J7s0

"K8t.TPV ?wf0[Q]怎么样能固定我的执行计划51Testing软件测试网J'|-},t#A(e5e
[A]可以使用OUTLINE来固定SQL语句的执行计划
;{n]*e)`,Dn*Jgh i"X?0用如下语句可以创建一个OUTLINE
W[ ?2l9e/j0Create oe replace outline OutLn_Name on51Testing软件测试网by-POr pa9E
Select Col1,Col2 from Table51Testing软件测试网a?-v{]
where ……51Testing软件测试网|0q5W*|M Gu$?(u:w
如果要删除Outline,可以采用51Testing软件测试网 S8HX} _`M _
Drop Outline OutLn_Name;51Testing软件测试网#e5S!}:eT
对于已经创建了的OutLine,存放在OUTLN用户的OL$HINTS表下面
s8_2L)] F9m8b0对于有些语句,你可以使用update outln.ol$hints来更新outline
WK&j u gu0如update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)
0Mx\6P0wl0where ol_name in ('TEST1','TEST2');
SP9[5}^2V rHA0这样,你就把Test1 OUTLINE与Test2 OUTLINE互换了51Testing软件测试网{(qr'W-o9@
如果想利用已经存在的OUTLINE,需要设置以下参数
,b4@EN a`.b5e0Alter system/session set Query_rewrite_enabled = true51Testing软件测试网 ku_$a?9@8TT/T Np
Alter system/session set use_stored_outlines = true51Testing软件测试网Y2^f2Z%}i6i+M
 

&DM;@Ue%K0

Z/gw,p3Fa0[Q]如何获得所有的事件代码51Testing软件测试网 ~ T[Wo_v]%aZ
[A] 事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息
LD @"Kz)c[i5G\0SET SERVEROUTPUT ON
/Vt"p4yT e0Ss'u`0DECLARE
6]e@Ai R M @J m0err_msg VARCHAR2(120);
hwg3?|e!U0BEGIN51Testing软件测试网%t1|3i7YFf
dbms_output.enable (1000000);51Testing软件测试网hp)y`K
FOR err_num IN 10000..1099951Testing软件测试网 b)p?HO:M*M1K V
LOOP
?0gF`|0err_msg := SQLERRM (-err_num);
3v"Aw9w k9J!`w:CN0IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
,hRL"x#B1H0dbms_output.put_line (err_msg);
xi8wv^b'HT,G{0END IF;
-d ?/i*z2@4Q[k3U0END LOOP;
T`L"a;C2hA0END;
%g q@;@3Ni0/
~!SZ"{HSW0在Unix系统上,事件信息放在一个文本文件里51Testing软件测试网+{vecV%UU
$ORACLE_HOME/rdbms/mesg/oraus.msg
:r.fB-z7Z `0可以用如下脚本查看事件信息51Testing软件测试网O'y!U+AC @
event=1000051Testing软件测试网pk.Z3WSh!Gg2Y
while [ $event -ne 10999 ]51Testing软件测试网|u9N{9~8m4x*H"hmk l
do
L,M Q"k!L0event=`expr $event + 1`
E4]6W dh0oerr ora $event51Testing软件测试网e^Wl-bhR7A#n
done
0?/~5Z'G&y)Ov0EB.q[,La0对于已经确保的/正在跟踪的事件,可以用如下脚本获得
.gMUqyJU0SET SERVEROUTPUT ON51Testing软件测试网#Z]-I(S CD1Q
DECLARE51Testing软件测试网c/at5] Qg1VY.T
l_level NUMBER;
%M8N!GCjl d0BEGIN51Testing软件测试网]-^Cxy2c A
FOR l_event IN 10000..1099951Testing软件测试网)H8} nRbzd/N(u(Q~
LOOP
.~ PpE?,V0dbms_system.read_ev (l_event,l_level);51Testing软件测试网 YY*QBT~| U't
IF l_level > 0 THEN51Testing软件测试网0@%S\mD)d*QR
dbms_output.put_line ('Event '||TO_CHAR (l_event)||51Testing软件测试网rT&K;a ^!c?
' is set at level '||TO_CHAR (l_level));51Testing软件测试网Qe:D'vo0q
END IF;51Testing软件测试网-I4RC/}O+E;P
END LOOP;51Testing软件测试网6Ld'e&H,Vs
END;51Testing软件测试网 ~!t+N B-tDOQ?
/51Testing软件测试网4Iy]%\2FX tQ

.EH${3L-s+@4E,u0[Q]什么是STATSPACK,我怎么使用它?51Testing软件测试网(E3J5\v PV ~-T
[A]Statspack是Oracle 8i以上提供的一个非常好的性能监控与诊断工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息51Testing软件测试网!_a#N)^XoI3zFi
可以参考附带文档$ORACLE_HOME/rdbms/admin/spdoc.txt。51Testing软件测试网3]&C*h @7Q'P
安装Statspack:
yK*B k)W.o0cd $ORACLE_HOME/rdbms/admin
p"s/NN-} E f7ns0sqlplus "/ as sysdba" @spdrop.sql -- 卸载,第一次可以不需要51Testing软件测试网P {Q0L+u-B9N0k;Q0`
sqlplus "/ as sysdba" @spcreate.sql -- 需要根据提示输入表空间名51Testing软件测试网Xm~CRK9r
使用Statspack:51Testing软件测试网9Ci(u;Q@p
sqlplus perfstat/perfstat51Testing软件测试网NdVE4R e `
exec statspack.snap; -- 进行信息收集统计,每次运行都将产生一个快照号
ow/aT+@'Z0\sO_0-- 获得快照号,必须要有两个以上的快照,才能生成报表
n^)L VF9d!x/g.x0select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;51Testing软件测试网'y_z-R"kl
@spreport.sql -- 输入需要查看的开始快照号与结束快照号51Testing软件测试网C u"B%^w;M?
其他相关脚本s:51Testing软件测试网-R8z3Qo'^ fXncp*r
spauto.sql - 利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统计
D4ge'n#{+Bq8DP}+vl0sppurge.sql - 清除一段范围内的统计信息,需要提供开始快照与结束快照号
6y8gj:r_-MEu3i0sptrunc.sql - 清除(truncate)所有统计信息
pfSJ2[o+~051Testing软件测试网k i%nZ:m
51Testing软件测试网+z6Q-m9ZbO:V

51Testing软件测试网"o7fQHG(m!Xu

第五部分、ORACLE网络

}ai`4g k4X:}051Testing软件测试网7uzZ i+Xr6r;[

menu

)kQ LK&SC^ThL0

ttW5Xr-^3]0[Q]如何限定特定IP访问数据库
^1C#aS*k/F"f0[Q]如何穿过防火墙连接数据库
(A:zk*~ H n9g0[Q]如何利用hostname方式连接数据库
6zY c Tm%Ci:T0[Q]dbms_repcat_admin能带来什么安全隐患51Testing软件测试网"T,`S&R,[ US
[Q]在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?
}-C` }-y)z3l m0[Q]如何加固你的数据库
\%}4m"CyzV0[Q]如何检查用户是否用了默认密码51Testing软件测试网"Y V Y.O5xt#s ~H
[Q]如何修改默认的XDB监听端口51Testing软件测试网qW5bn}#y:P&In
[Q]怎么捕获用户登录信息,如SID,IP地址等51Testing软件测试网 wv*hj#\'a ]8{3e
[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改
!{:n8c ba w0[Q]怎么捕获表上的DML语句(不包括select)语句)51Testing软件测试网*fj l2G/ad1i4x1N

7p,e0au FD DF/HR8ry}051Testing软件测试网;b:A Pv1k{

第五部分、ORACLE网络51Testing软件测试网S3x#z qiCJb
[Q]如何限定特定IP访问数据库
;\ PV_m M0[A]可以利用登录触发器或者是修改sqlnet.ora(9i以上):
f3XrW5nQ0il$R0增加如下内容:51Testing软件测试网u$X2sK+O a9d
tcp.validnode_checking=yes
/?R gW&ni)mB+R0#允许访问的ip51Testing软件测试网H2y4C&rA q&sP\
tcp.inited_nodes=(ip1,ip2,……)
1S,hFgQ8Ly:z{Q&H0#不允许访问的ip
&c9?:w2J1r7@p Dq1b0tcp.excluded_nodes=(ip1,ip2,……)51Testing软件测试网Ng4Ct'f
51Testing软件测试网 Ul+`^WhNT/_5b
[Q]如何穿过防火墙连接数据库
"[s(`%j2mB_;At G0[A]这个问题只会在WIN平台出现,UNIX平台会自动解决。
6k Z-}[F&D ^L y0解决方法:
NRZ:Fk0在服务器端的SQLNET.ORA应类似
n5{,`3A9H.x@0SQLNET.AUTHENTICATION_SERVICES= (NTS)51Testing软件测试网|s)W k7j]
NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)51Testing软件测试网M!vs{fM
TRACE_LEVEL_CLIENT = 16
rj8T p9vxf0注册表的HOME0加[HKEY_LOCAL_MACHINE]51Testing软件测试网4]t?4E,oG
USE_SHARED_SOCKET=TRUE
.[(P.u_!@jBc8dn051Testing软件测试网+h0s3M#};DTLf s
[Q]如何利用hostname方式连接数据库51Testing软件测试网b,W&V3T k(V
host name方式只支持tcp/ip协议的小局域网
7?i0iWv^2L!W0修改listener.ora中的如下信息51Testing软件测试网)_:A+{7O T'u#wNU"@
(SID_DESC =
b;K"BtK;S3JP2K0(GLOBAL_DBNAME = ur_hostname) --你的机器名
Z u_(w*I hm8c0(ORACLE_HOME = E:\oracle\ora92) --oracle home
^O'X/YT(@T)\0H0(SID_NAME = orcl) --sid name
NP7^@U n]0)51Testing软件测试网 T;Z-yJF UD;D
然后在客户端
7i/t+aOg6A0的sqlnet.ora中,确保有
v'fc rw4OKT0NAMES.DIRECTORY_PATH= (HOSTNAME)51Testing软件测试网Ub@+T&P0s+u'|
你就可以利用数据库服务器的名称访问数据库了

$J@4O8NBS0

8h;JgmL-@(gVd0[Q]dbms_repcat_admin能带来什么安全隐患
2DG#bxt|0[A]如果一个用户能执行dbms_repcat_admin包,将获得极大的系统权限。51Testing软件测试网 [Z3r(r/\?6g f
以下情况可能获得该包的执行权限:
p*kg%dP dcGN01、在sys下grant execute on dbms_repcat_admin to public[|user_name]
8B+DJ ?$n5{)S#b02、用户拥有execute any procedure特权(仅限于9i以下,9i必须显示授权)
f7L7|N|(uF9V1d?j0如果用户通过执行如下语句:51Testing软件测试网 LJ)C8b:XN,i}-G-Z,t
exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name');
rB-v!Z Qt0C(PI0该用户将获得极大的系统特权51Testing软件测试网{ t9i#l2sV*G{ Ff
可以从user_sys_privs中获得详细信息
51Testing软件测试网0t,ltS5k6r$O1X_ Q

51Testing软件测试网BmJ\-f4o(rdf

[Q]在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?51Testing软件测试网!s#an5}d
[A]我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用
p j`7^!y3}t-Z9r0需要Alter user权限或DBA权限:
K3d't_ w(Dp'x~K0SQL> select password from dba_users where username='SCOTT';
X*DU9mg0PASSWORD
Z.k#Ot7Me0-----------------------------
cAE _0n/iAp0F894844C34402B6751Testing软件测试网C1NPo U,?k Rda
SQL> alter user scott identified by lion;
?;R9n{3?k;f$I0User altered.51Testing软件测试网8_uHJ b
SQL> connect scott/lion51Testing软件测试网#Bi$kuX6yt] G
Connected.51Testing软件测试网*P0k I+]n
REM Do whatever you like...51Testing软件测试网aat#MfE3_
SQL> connect system/manager51Testing软件测试网jm;t+KZao.Q
Connected.
3f:y&ws tqe0SQL> alter user scott identified by values 'F894844C34402B67';51Testing软件测试网W`|G$[Jj^6l
User altered.
9Q?3C;}j o0SQL> connect scott/tiger
%Vu3?(JBd'O0Connected.51Testing软件测试网R t w1Ul+t ~

)u:N$_(LZ| mU&|0[Q]如何加固你的数据库51Testing软件测试网"Xh vw3|lMR
[A]要注意以下方面51Testing软件测试网[x J+jU5R+TD
1. 修改sys, system的口令。
.R}5R,l9y7dYX02. Lock,修改,删除默认用户: dbsnmp,ctxsys等。
p @;dfr3d3{h+\ n bh03. 把REMOTE_OS_AUTHENT改成False,防止远程机器直接登陆。
*t SLr4xD04. 把O7_DICTIONARY_ACCESSIBILITY改成False。51Testing软件测试网)l$E pWI$Pj
5. 把一些权限从PUBLIC Role取消掉。
2{ k(z.M|06. 检查数据库的数据文件的安全性。不要设置成666之类的。检查其他dba 用户。
)E }Y;[q0s07. 把一些不需要的服务(比如ftp, nfs等关闭掉)
V)t_{6~J08. 限制数据库主机上面的用户数量。51Testing软件测试网 b e1d1_(~z1[-j7rAB
9. 定期检查Metalink/OTN上面的security Alert。比如:http://otn.oracle.com/deploy/security/alerts.htm
_a.XV8ic9d010. 把你的数据库与应用放在一个单独的子网中,要不然你的用户密码很容易被sniffer去。或者采用advance security,对用户登录加密。
DV"O grw011. 限止只有某些ip才能访问你的数据库。
2g_zc*L,A h*u E012. lsnrctl 要加密码,要不然别人很容易从外面关掉你的listener。51Testing软件测试网IL:mSYP"m
13. 如果可能,不要使用默认1521端口
? M2V h&f_Efn| B051Testing软件测试网Z}T;@1[N8f
[Q]如何检查用户是否用了默认密码51Testing软件测试网;?#kG,vE3\b0v
[A]如果使用默认密码,很可能就对你的数据库造成一定的安全隐患,那么可以使用如下的查询获得那些用户使用默认密码51Testing软件测试网+{`;yae-cJ3RW/PcJ
select username "User(s) with Default Password!"51Testing软件测试网SDq Rr~
from dba_users51Testing软件测试网\`{ K+m8jV3p
where password in
K8k;D\xkm0('E066D214D5421CCC', -- dbsnmp51Testing软件测试网,sa |4l#d-}~
'24ABAB8B06281B4C', -- ctxsys
MW[aqn{ ev2D0'72979A94BAD2AF80', -- mdsys51Testing软件测试网P|n q'^@4hH
'C252E8FA117AF049', -- odm51Testing软件测试网{XDI$X2G&p"WZ
'A7A32CD03D3CE8D5', -- odm_mtr
'Za"GID?0'88A2B2C183431F00', -- ordplugins
es#{ ~`.Yrs0'7EFA02EC7EA6B86F', -- ordsys
Wh!u}S\ [?lP0'4A3BA55E08595C81', -- outln51Testing软件测试网8? @2ik?@
'F894844C34402B67', -- scott
4A7I-]'_m\7s.t0'3F9FBD883D787341', -- wk_proxy
p8~V S-~0'79DF7A1BD138CF11', -- wk_sys51Testing软件测试网;N2D F"zop
'7C9BA362F8314299', -- wmsys
y-M.M)y+|7t0'88D8364765FCE6AF', -- xdb
J&Vh W8T"h5Y3g0'F9DA8977092B7B81', -- tracesvr51Testing软件测试网 c5km3r2u4?}x)e
'9300C0977D7DC75E', -- oas_public51Testing软件测试网Q#d4FzwZv4t-` Q
'A97282CE3D94E29E', -- websys
,j#MQ5NPi)C0'AC9700FD3F1410EB', -- lbacsys51Testing软件测试网0C9dY,M8A%{
'E7B5D92911C831E1', -- rman51Testing软件测试网@(tS*pa5BV(c G
'AC98877DE1297365', -- perfstat
XdlS&r&H!f/? Yo0'66F4EF5650C20355', -- exfsys
[CT p!v H7HdN0'84B8CBCA4D477FA3', -- si_informtn_schema51Testing软件测试网2nf Z[ P
'D4C5016086B2DC6A', -- sys51Testing软件测试网1CHHi"QCl:C
'D4DF7931AB130E37') -- system
B D]4?d9H$pcT6Z0/
6` Z\'o2v:e051Testing软件测试网+^y2L4sn5g m!y
[Q]如何修改默认的XDB监听端口51Testing软件测试网%{^#wx+e3t??7f v6f
[A] Oracle9i默认的XML DB把HTTP的默认端口设为8080,这是一个太常用的端口了,很多别的WebServer都会使用这个端口,51Testing软件测试网 mU8mv t
如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好不要安装51Testing软件测试网[G G~O7j:Qn
提供三种修改的方法
%n%M9Wf p[01.dbca,选择你的数据库,然后Standard Database Features->Customize->Oracle XML DB option,进入这个画面你应该就知道怎么改了。51Testing软件测试网't)Qe r0cH]
2.OEM console,在XML Database 的配置里面修改51Testing软件测试网 X2X_e(UhFw
3.用oracle提供的包:
`/XpU}*Pm6d0-- 把HTTP/WEBDAV端口从8080改到808151Testing软件测试网 b{*Tb`;M*a:X#r
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),51Testing软件测试网3a)zR9h8E,tT
'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))
Cw cC,f1M0/51Testing软件测试网/`Le)Y5mz
-- 把FTP端口从2100改到2111
I tG`!\En0SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),51Testing软件测试网n'\4@!AZ(`C
'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))51Testing软件测试网j8? A6S#P#laK.f&?
/
u3m;k*j(C/w0SQL> commit;
Z0JVc.MlS1Z TT W H0SQL> exec dbms_xdb.cfg_refresh;
A)GY+r#^z:a0-- 检查修改是否已经成功
W2kbP~ s%c*s |r0SQL> select dbms_xdb.cfg_get from dual;
mj:i&X3fR8N051Testing软件测试网2A)^t&d;i
[Q]怎么捕获用户登录信息,如SID,IP地址等51Testing软件测试网:e*c2| i$~#`:pd
[A]可以利用登录触发器,如51Testing软件测试网C LStw `?sa#l
CREATE OR REPLACE TRIGGER tr_login_record
Q3R9H1u$Un/Hw`0AFTER logon ON DATABASE
%IuP*kc8gqJ0DECLARE51Testing软件测试网 Kk$L e&z u&u:u0b
miUserSid NUMBER;51Testing软件测试网$[1[ ip \
mtSession v$session%ROWTYPE;51Testing软件测试网Ci hfz&E7x3s
CURSOR cSession(iiUserSid IN NUMBER) IS51Testing软件测试网:`lKM m9QQ~,CJ
SELECT * FROM v$session51Testing软件测试网Y eIR2W
WHERE sid=iiUserSid;
D-N9|kp'xX0BEGIN51Testing软件测试网-YD"dkJ i
SELECT sid INTO miUserSid FROM v$mystat WHERE rownum<=1;51Testing软件测试网)p#]|!J:J`$mR;K
OPEN cSession(miUserSid);51Testing软件测试网&U-i$W eCu;mo,^
FETCH cSession INTO mtSession;51Testing软件测试网 p+qWCN8xvf9d
--if user exists then insert data
C9YHGgG#yu0IF cSession%FOUND THEN51Testing软件测试网 P!zt ? @ `K.`Q
INSERT INTO log$information(login_user,login_time,ip_adress,ausid,terminal,
'ZyQ0D;j?0p4^0osuser,machine,program,sid,serial#)
-yh6@~3R0VALUES(ora_login_user,SYSDATE,SYS_CONTEXT ('USERENV','IP_ADDRESS'),
|7Qsp _^O _-On!G0userenv('SESSIONID'),
;G rV*gI:`0mtSession.Terminal,mtSession.Osuser,
L*g+w}.z,{b0mtSession.Machine,mtSession.Program,51Testing软件测试网t_C.t%^}I k
mtSession.Sid,mtSession.Serial#);
7^6u,L-s1p'I(bG1o0ELSE51Testing软件测试网Tk%ZIxtU E
--if user don't exists then return error51Testing软件测试网 n+]| ^0{W
sp_write_log('Session Information Error:'||SQLERRM);51Testing软件测试网8`S(V)~t2i&mj
CLOSE cSession;51Testing软件测试网#k W+IUzt)W9kX
raise_application_error(-20099,'Login Exception',FALSE);51Testing软件测试网4`7L_ZW~:B k
END IF;51Testing软件测试网dt"M$@"q$^0r
CLOSE cSession;51Testing软件测试网9J'P$})FS8pm"X:X
EXCEPTION51Testing软件测试网J\-RmI7L;@
WHEN OTHERS THEN
~1lZOJ y2jf0sp_write_log('Login Trigger Error:'||SQLERRM);51Testing软件测试网 ]If!X:dL'B"D
END tr_login_record;51Testing软件测试网"W.WU'GG o v)sk4W"j
在以上触发器中需要注意以下几点51Testing软件测试网LjQX-uP:X
1、该用户有v_$session与v_$mystat的对象查询权限,可以在sys下对该拥护显式授权。51Testing软件测试网t)s(W| PU3\
2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。
:u*}`LD m J3ML @8S03、必须在创建该触发器之前创建一个log$information的表记录登录信息。51Testing软件测试网m x^'^]W

.L7JY(@L-nq!L-z0[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改51Testing软件测试网z T*^]#MF4c
[A]可以采用DDL触发器,如51Testing软件测试网0r2g#|9| ?-d6F9Y
CREATE OR REPLACE TRIGGER tr_trace_ddl
5o?E] M;b A q*h0AFTER DDL ON DATABASE51Testing软件测试网+C'r'_6h.y o4M1|
DECLARE
:Mf U o:f R-G0sql_text ora_name_list_t;
8n"l]#fQ0state_sql ddl$trace.ddl_sql%TYPE;51Testing软件测试网l,_&J#}o aeS!m
BEGIN51Testing软件测试网O7LXZ#q3O
FOR i IN 1..ora_sql_txt(sql_text) LOOP51Testing软件测试网!Xw`+L2` x`
state_sql := state_sql||sql_text(i);51Testing软件测试网_7K7|`P4C U&h
END LOOP;
1q3r ha#?'Qa/G*s1}.C0INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,
J;{LF P*c e`%V!k1u0schema_user,schema_object,ddl_sql)
rY)W(yfS4|!{q r0VALUES(ora_login_user,SYSDATE,userenv('SESSIONID'),
;YRB/Q"Wm w0sys_context('USERENV','IP_ADDRESS'),
I-xDt BNZ0ora_dict_obj_owner,ora_dict_obj_name,state_sql);
&j$J^ de'l8L0EXCEPTION
9G*H tJ0U8h/y0WHEN OTHERS THEN51Testing软件测试网,Bq/b$Y.K]\
sp_write_log('Capture DDL Excption:'||SQLERRM);51Testing软件测试网$Y9u0[U,Jp[I
END tr_trace_ddl;
;{i)q@i"t+KaK0在创建以上触发器时要注意几点
uD6ug#L-u1C"p01、必须创建一个ddl$trace的表,用来记录ddl的记录
u5]~+U M02、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。51Testing软件测试网_#hqx9v0c5J B:tex3W"J

#b5T7abx0[Q]怎么捕获表上的DML语句(不包括select)语句)51Testing软件测试网(k2IGUB&r S
[A]可以采用dml触发器,如
OD%`e A{0CREATE OR REPLACE TRIGGER tr_capt_sql
S;l/\^!}h;qI0BEFORE DELETE OR INSERT OR UPDATE51Testing软件测试网p'F kq/W7UrFeQ
ON manager.test51Testing软件测试网S*L)x-Xyi"I8n9v
DECLARE51Testing软件测试网!|'dXG-?
sql_text ora_name_list_t;
6u1F:@6Y,t{l7IV0state_sql capt$sql.sql_text%TYPE;51Testing软件测试网PWwkU2F `^)c
BEGIN51Testing软件测试网7p3N(?$oT&x5RFMY
FOR i IN 1..ora_sql_txt(sql_text) LOOP
'`fvZ8` NF0state_sql := state_sql || sql_text(i);51Testing软件测试网+Uq'R&_ z'v0v
END LOOP;51Testing软件测试网5DB+G7P0@ Gw6\
INSERT INTO capt$sql(login_user,capt_time,ip_address,audsid,owner,table_name,sql_text)
?-J2U5AY3w0VALUES(ora_login_user,sysdate,sys_context('USERENV','IP_ADDRESS'),51Testing软件测试网&H9p"M$Fo|:~W;a
userenv('SESSIONID'),'MANAGER','TEST',state_sql);51Testing软件测试网R2z m3z&jK*~R o
EXCEPTION
r D#FU^sM3^-w0WHEN OTHERS THEN51Testing软件测试网 ~`K9LPg(w5y
sp_write_log('Capture DML Exception:'||SQLERRM);
Ro-W8{.XS8n"zT,Z+b\0END tr_capt_sql;51Testing软件测试网&pk^ Xs ?
在创建以上触发器时要注意几点51Testing软件测试网fC$TK g?n#C
1、必须创建一个capt$sql的表,用来记录ddl的记录
2?I8NtYPE3t0G6b02、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。
9I)@QCeNT0
@~0a"Q_bG0
51Testing软件测试网"\{R_ b+b

51Testing软件测试网LH&O Yh,Q/Ux_

第六部分、OS相关51Testing软件测试网b7^@F\ `*NA

51Testing软件测试网V Q5_%?Po({R)~

menu51Testing软件测试网JG5x(S|,BX

:sD!Kc7w] S`0[Q]怎么样生成日期格式的文件51Testing软件测试网7Sb"HP`J5{8^
[Q]测试磁盘与阵列性能
O.{-lL!mF'bfy+\0[Q]怎么配置SSH密匙
6r0tA x/{ Iu7r(z0[Q]sqlplus怎么与shell结合51Testing软件测试网i0{ @H\8M M
[Q]FTP怎么在脚本中自动上传/下载
X/qA?4~y`0
51Testing软件测试网(zG1?\w {E

51Testing软件测试网p.GQ3W8pCq j

51Testing软件测试网 IG$M_%`;]!w9\
第六部分、OS相关51Testing软件测试网:o8{%N|{Eb
[Q]怎么样生成日期格式的文件51Testing软件测试网 ]cs_tR
[A]在LINUX/UNIX上,使用`date +%y%m%d` (`这个是键盘上~所在的那个键) 或$(date +%y%m%d),如:51Testing软件测试网|2f.yD7i@xC
touch exp_table_name_`date +%y%m%d`.dmp51Testing软件测试网cU$o p:\7gk
DATE=$(date +%y%m%d)
3x1~#Z[%r3ur"@#Hy? Y0或者51Testing软件测试网m3]4[{%Oh3Ln.a
DATE=$(date +%Y%m%d --date '1 days ago') #获取昨天或多天前的日期51Testing软件测试网BR-fa.ZE [
Windows上,使用%date:~4,10%,其中4是开始字符,10是提取长度,表示从date生成的日期中,提取从4开始长度是10的串。你可以改成其它你需要的数字,如:
rq T7T\gsWm0Echo %date:~4,10%
bYQy(_L*W o0如果想得到更精确的时间,win上面还可以使用time51Testing软件测试网 R*M+?s"t4DZ(Li:Z@

'iG/[*nEv5mc%ky5D0[Q]测试磁盘与阵列性能
3AgQHhKd/mn0[A]用类似如下的方法测试写能力
B0f3S yU'j0time dd if=/dev/zero f=/oradata/biddb/testind/testfile.dbf bs=1024000 count=1000
}]1q_PN!c0期间系统IO 使用可以用(unix):
E+sVp9I&k2jU"[0iostat -xnp 2 显示Busy程度
Ce\)~HIA051Testing软件测试网.u}O a |
[Q]怎么配置SSH密匙
%}d@)BQ0[A]可以防止"中间人"的进攻方式
V^]0[S01、ssh-keygen 或ssh-keygen -d(ssh 2.x)生成钥匙
lYw}Y2i$bM)Cn02、然后拷贝公匙到你想登录的服务器,改名为authorized_keys,如果是3.0以下版本,需要改为authorized_keys251Testing软件测试网0@^0n,jf re
3、还可以利用config文件进一步简化操作51Testing软件测试网D#s)GYuL1g(d
51Testing软件测试网7@$Rd-OZ)w
Host *bj
t9t*l1JK3s0HostName 机器名或IP
]d| d-v(i0User 用户名
e5b } N4d0nIyb+}9c9F0有了这个配置文件,你就可以利用ssh bj来访问指定的机器了,也就可以利用scp与sftp来传送文件了。
j!\RQ5bR6\e0
1Xl/y|vEtp fG0[Q]sqlplus怎么与shell结合51Testing软件测试网1W/i2EpQSuXy+f
[A]可以用如下的写法51Testing软件测试网 p^`QJ@ht1i
sqlplus /nolog << EOF51Testing软件测试网(_3V&K p5m3{4j$K2J
connect user/pass51Testing软件测试网dTL H M~ ma
spool test51Testing软件测试网Jg6cS4r$[:Wz-j*t
select * from tab;
J;wS'Gd.B p C4hd@0spool off
%nO!MJ!d~2uH0exit
P,h y8sNQ0EOF51Testing软件测试网8grY"]ns
当然,RMAN也支持这样的写法。
q `-A/Nsi0
L9M[[)N:C0[Q]FTP怎么在脚本中自动上传/下载
|q:i@1c1zsy0[A]可以把FTP写到shell脚本中,如
0piZ5u+F(] o4E E]0ftp -n -i 主机IP <<EOF
*AbL2Pt9U0user username pass51Testing软件测试网 M%O0L fM0rK
cd 目标目录
VMP \wy U0put file
7Z2K6T"m6`1cr0get file
6[#u9i[0IFZ4W`&A0#查询文件
e#Q PFGUs0ls51Testing软件测试网s mo1Dn~6|@K
#退出
l#s:f%D!v{$]?0bye
"oMiK-c1B4?0EOF
51Testing软件测试网 {/rryJ(`


TAG:

 

评分:0

我来说两句

日历

« 2024-03-28  
     12
3456789
10111213141516
17181920212223
24252627282930
31      

数据统计

  • 访问量: 108585
  • 日志数: 89
  • 图片数: 1
  • 文件数: 15
  • 建立时间: 2013-03-01
  • 更新时间: 2018-08-23

RSS订阅

Open Toolbar