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

ORACLE 常用的解决办法3

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

Hi8`s E0第四部分、性能调整51Testing软件测试网7lV;segR@\"a

9t!zIA,`-U&C9jE0menu

XZ A.ra!Ne r051Testing软件测试网~QKl8FY4O(d{Z

[Q]如何设置自动跟踪
\DsR8H6Z8o+}9h0[Q]如何跟踪自己的会话或者是别人的会话
9o }cGH BY\ @0[Q]怎么设置整个数据库系统跟踪51Testing软件测试网;[(k6]!RPd0{5QH
[Q]怎么样分析表或索引
SK)w v ?!fk)^y0[Q]怎么样快速重整索引
"UkD:rYi0[Q]如何使用Hint提示
9l aZ9m M7a(z0[Q]怎么样快速复制表或者是插入数据51Testing软件测试网0CwB.| vce.K6h
[Q]怎么避免使用特定索引
d`^:nN*[zZ+m\R0[Q]Oracle什么时候会使用跳跃式索引扫描51Testing软件测试网9V!F a$Mim/c4i
[Q]怎么样创建使用虚拟索引51Testing软件测试网PS @'f.t ~c
[Q]v$sysstat中的class分别代表什么
}vOop~-O/Y@&S0[Q]怎么杀掉特定的数据库会话
c ] Q.w$O$W1{h0[Q] 如何有效的删除一个大表(extent数很多的表)
5@9is)tfv"`0[Q]如何收缩临时数据文件的大小
;c,@(a"h~?U0[Q]怎么清理临时段
6E\4m%{w,?[ J_0[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构51Testing软件测试网v X ?9b!o&Y\
[Q]如何获得所有的事件代码51Testing软件测试网g*~6}6J9hO ? K
[Q]怎么样快速重整索引51Testing软件测试网Q0U8OD_F
[Q]怎么快速查找锁与锁等待
;xa0Wm*x6hF5o1^k0
gh1k+r q*A0[Q]怎样监控无用的索引51Testing软件测试网],c ci Ay7y,S
[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句
fz4]2F0S,Z d0[Q]怎么样能固定我的执行计划
;Na,CucRn9ap0[Q]如何获得所有的事件代码51Testing软件测试网:mn~r1{[v
[Q]什么是STATSPACK,我怎么使用它?51Testing软件测试网9V C_mi}K
第四部分、性能调整51Testing软件测试网\qC#z9_7I
[Q]如何设置自动跟踪51Testing软件测试网 kWs"J7t!q ST rX ~
[A]用system登录51Testing软件测试网o@0]8^i$s4^E&W;q
执行$ORACLE_HOME/rdbms/admin/utlplan.sql创建计划表
@0Zft AUr\0执行$ORACLE_HOME/rdbms/admin/plustrce.sql创建plustrace角色51Testing软件测试网"kXHr ?3ho
如果想计划表让每个用户都能使用,则
m4b@:jN5m/r4s0SQL>create public synonym plan_table for plan_table;51Testing软件测试网Mi5hT.OA
SQL> grant all on plan_table to public;51Testing软件测试网pM"|Bn|H7_
如果想让自动跟踪的角色让每个用户都能使用,则51Testing软件测试网9JA`Ga
SQL> grant plustrace to public;
f]:nY)p%] i"_0通过如下语句开启/停止跟踪51Testing软件测试网Y&?%Sf`a:N
SET AUTOTRACE ON |OFF
P1P8mS rd gk0| ON EXPLAIN | ON STATISTICS | TRACEONLY | TRACEONLY EXPLAIN
5[6o+G3Y1Rk2U051Testing软件测试网7oEOv2~2N
[Q]如何跟踪自己的会话或者是别人的会话51Testing软件测试网&w7FMPyj
[A]跟踪自己的会话很简单
1EzB\+zGv8I0Alter session set sql_trace true|false
/Dw6]9p1G5d0or51Testing软件测试网v6} |Z6z v@,E
exec dbms_session.set_sql_trace(TRUE);51Testing软件测试网`n%l e"`az [
如果跟踪别人的会话,需要调用一个包51Testing软件测试网0Wd E+f-k Je] og&p
exec dbms_system.set_sql_trace_in_session(sid,serial#,true|false)51Testing软件测试网MqR.V{(t_W\w
跟踪的信息在user_dump_dest 目录下可以找到
4l A+])Pcas P7E0可以通过Tkprof来解析跟踪文件,如51Testing软件测试网"K5a!KH6o&fE
Tkprof 原文件 目标文件 sys=n
*z D.wB+D0s\ H0@*m051Testing软件测试网.KS9\A1eU]
[Q]怎么设置整个数据库系统跟踪51Testing软件测试网#O(ky;s/{W*e
[A]其实文档上的alter system set sql_trace=true是不成功的51Testing软件测试网5j%w$S }d h0|.P&muPL
但是可以通过设置事件来完成这个工作,作用相等
}8T9e0P?SP2ua0alter system set events51Testing软件测试网a6RK/v3C7vS
'10046 trace name context forever,level 1';
*]rp3DN ty+VcKr0如果关闭跟踪,可以用如下语句
5R2[ hY1o+^ P u0alter system set events51Testing软件测试网x1kK(~?0r+U$@?:M@:l
'10046 trace name context off';
*t X`[Bx0其中的level 1与上面的8都是跟踪级别51Testing软件测试网{,cM]x5P;m
level 1:跟踪SQL语句,等于sql_trace=true51Testing软件测试网7N*BFS%S a z
level 4:包括变量的详细信息
bV rl;l&LVfWl0level 8:包括等待事件51Testing软件测试网'z-f%]7_uA9e,N
level 12:包括绑定变量与等待事件51Testing软件测试网cOz5F*@B N?7TH
51Testing软件测试网:o$f4p!Oj o\
[Q]怎么样分析表或索引51Testing软件测试网'YFOX5K ^f
[A]命令行方式可以采用analyze命令
$x9J5n#h'T-rT\0如Analyze table tablename compute statistics;51Testing软件测试网X|1c&g?lcf%Na
Analyze index indexname estimate statistics;51Testing软件测试网!eDB:h eWVvC
ANALYZE TABLE tablename COMPUTE STATISTICS
V V2SMAT4D0FOR TABLE
x1H Fu+N&GE0FOR ALL INDEXES
x.t'[%^jc1QVg0FOR ALL INDEXED COLUMNS;
]et kXn^0等等。51Testing软件测试网f%F~~ar+P w-U
如果想分析整个用户或数据库,还可以采用51Testing软件测试网$p*]FN$x*{/Za
Dbms_utility(8i以前的工具包)51Testing软件测试网.f9D D.V'[cQ hF
Dbms_stats(8i以后提供的工具包)
:X%etv vl0
kiVp$w8u%e I0[Q]怎么样快速重整索引51Testing软件测试网#Q X#g-{HM&lo9D9\ T
[A]通过rebuild语句,可以快速重整或移动索引到别的表空间51Testing软件测试网 [*h/|$Ar'NLb
rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数
k4~/c*Hk ZJ0语法为
w;ck:](g.f0alter index index_name rebuild tablespace ts_name
sM"mE*zp U:e0storage(……);
4PTfa/X8}YQ0如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改
#z+W,z4L BZa~iJP0SQL> set heading off51Testing软件测试网i+_V c vV"a
SQL> set feedback off
0l(e|foS [q G0SQL> spool d:\index.sql51Testing软件测试网!a&Yli1} {/f^7D
SQL> SELECT 'alter index ' || index_name || ' rebuild '51Testing软件测试网-}VwW/JU)A
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'51Testing软件测试网} M5j/?|pU
FROM all_indexes51Testing软件测试网 j'~%P!x2["SzfI
WHERE ( tablespace_name != 'INDEXES'
1}p\'Nd Kl0OR next_extent != ( 256 * 1024 )
e*Z%W[c'GPx1{0)51Testing软件测试网dc8Ak:H3c?8X\8y
AND wner = USER51Testing软件测试网1V _D-k"{``&Pl
SQL>spool off51Testing软件测试网A)Q KmM0w,}5v @$p+@
另外一个合并索引的语句是
%ER/e0l%@;xv0alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block
[,vZv c"R&z0消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。51Testing软件测试网.bX4B1X(t.I9IE:P

6e O0i.`3_M0[Q]如何使用Hint提示51Testing软件测试网l|Mb8\](g
[A] 在select/delete/update后写/*+ hint */
S?[ y"\` y*s0如 select /*+ index(TABLE_NAME INDEX_NAME) */ col1...
t9P E5_#o/n2i$e0注意/*和+之间不能有空格51Testing软件测试网zF#VT4o Cc6oE
如用hint指定使用某个索引51Testing软件测试网.|o$KV{6L

"Ck"\ST8Z0select /*+ index(cbotab) */ col1 from cbotab;51Testing软件测试网@T:o POg4B;Yo
select /*+ index(cbotab cbotab1) */ col1 from cbotab;
+V*xU*G^1G'q5G X0select /*+ index(a cbotab1) */ col1 from cbotab a;51Testing软件测试网I M;]h/Py#eo6j
其中
+n+p5A](q7H9j%_ r;^%}0TABLE_NAME是必须要写的,且如果在查询中使用了表的别名,在hint也要用表的别名来代替表名;51Testing软件测试网u6T4e0o5]K%o
INDEX_NAME可以不必写,Oracle会根据统计值选一个索引;
pw} _)L|k0如果索引名或表名写错了,那这个hint就会被忽略;51Testing软件测试网:`4e5Gq\T ?:K
51Testing软件测试网 ]$uCOr$SB0J/^z
[Q]怎么样快速复制表或者是插入数据51Testing软件测试网"F3Tr"yjODr
[A]快速复制表可以指定Nologging选项
V{_lL0RzB v vg0如:Create table t1 nologging
!GXEY8E T0as select * from t2;
I@V B1XmO0快速插入数据可以指定append提示,但是需要注意
)V&Tx!?m,~|wU0noarchivelog模式下,默认用了append就是nologging模式的。
Z5xT9_[0在archivelog下,需要把表设置程Nologging模式。
e??&V|0如insert /*+ append */ into t151Testing软件测试网O n8I&{~
select * from t251Testing软件测试网:F)\VrO`+P$}d
注意:如果在9i环境中并设置了FORCE LOGGING,则以上操作是无效的,并不会加快,当然,可以通过如下语句设置为NO FORCE LOGGING。
%{&lk?5}0W_8s5Q0Alter database no force logging;
d/fsbvg_6A]v~I0是否开启了FORCE LOGGING,可以用如下语句查看
[-pR^l5Yl0SQL> select force_logging from v$database;51Testing软件测试网 H-JcS/tA

,~g S;Y n0[Q]怎么避免使用特定索引
f&emS3J Nl0[A]在很多时候,Oracle会错误的使用索引而导致效率的明显下降,我们可以使用一点点技巧而避免使用不该使用的索引,如:
U%Wb$oOgi(ZC4Ag0test,有字段a,b,c,d,在a,b,c上建立联合索引inx_a(a,b,c),在b上单独建立了一个索引Inx_b(b)。
6rr!Ov8O%r0\9O0在正常情况下,where a=? and b=? and c=?会用到索引inx_a,51Testing软件测试网 ~wpM7eYV
where b=?会用到索引inx_b51Testing软件测试网a_)NQ"`r
但是,where a=? and b=? and c=? group by b会用到哪个索引呢?在分析数据不正确(很长时间没有分析)或根本没有分析数据的情况下,oracle往往会使用索引inx_b。通过执行计划的分析,这个索引的使用,将大大耗费查询时间。51Testing软件测试网gt.[,R,~v1A
当然,我们可以通过如下的技巧避免使用inx_b,而使用inx_a。
@J,|dS0where a=? and b=? and c=? group by b||'' --如果b是字符
H(k&X!~ m+K%B+Z0where a=? and b=? and c=? group by b+0 --如果b是数字
/p.P[k8R0Jj0通过这样简单的改变,往往可以是查询时间提交很多倍
6}x2j.vE'H({{0当然,我们也可以使用no_index提示,相信很多人没有用过,也是一个不错的方法:51Testing软件测试网J}q2{i]P{
select /*+ no_index(t,inx_b) */ * from test t51Testing软件测试网e8LW-b#V)d!l
where a=? and b=? and c=? group by b
;G { v1s-yAv `tc't051Testing软件测试网'R%H;S,lz(lO
[Q]Oracle什么时候会使用跳跃式索引扫描51Testing软件测试网d Jh*sZx#D
[A]这是9i的一个新特性跳跃式索引扫描(Index Skip Scan).
:H`%tWt0例如表有索引index(a,b,c),当查询条件为
$|'ESn9m l0where b=?的时候,可能会使用到索引index(a,b,c)51Testing软件测试网 aa,L3z6CIH
如,执行计划中出现如下计划:
s@P-ei2P0INDEX (SKIP SCAN) OF 'TEST_IDX' (NON-UNIQUE)51Testing软件测试网1`:N"P7uv3k1d
Oracle的优化器(这里指的是CBO)能对查询应用Index Skip Scans至少要有几个条件:
(Ypg#IVs(FZ!W01 优化器认为是合适的。51Testing软件测试网i2]Ut ^
2 索引中的前导列的唯一值的数量能满足一定的条件(如重复值很多)。51Testing软件测试网}[qLQE(f
3 优化器要知道前导列的值分布(通过分析/统计表得到)。51Testing软件测试网nXsw?:a\2Y
4 合适的SQL语句
^G*MS9pO0等。
5bO6Z-J+T\Jc0
E/X;q QG4`)m0[Q]怎么样创建使用虚拟索引51Testing软件测试网s#x1z @a
[A]可以使用nosegment选项,如
m$c.Ha+h?0create index virtual_index_name on table_name(col_name) nosegment;51Testing软件测试网`Ife-X;o
如果在哪个session需要测试虚拟索引,可以利用隐含参数来处理51Testing软件测试网"D$y3G^#xf!x1[G
alter session set "_use_nosegment_indexes" = true;51Testing软件测试网4@n.N7Ou;]m
最后,根据需要,我们可以删除虚拟索引,如普通索引一样51Testing软件测试网4N4i/_B5T e4j
drop index virtual_index_name;
-QB`8D8bJ'^bH0注意:虚拟索引并不是物理存在的,所以虚拟索引并不等同于物理索引
+}#{:| KTO'yt0在一些小的表的测试上,虚拟索引不一定能提交查询速度。
AU#p N?6dcAJ5C ^1~n051Testing软件测试网X&xVyS(B*}+Z-E8He
[Q]v$sysstat中的class分别代表什么51Testing软件测试网9Kv2L'` a$Iq
[A]统计类别51Testing软件测试网/y/O8[;K]6_lez ug)a
1 代表事例活动51Testing软件测试网#X B*X@J0I }
2 代表Redo buffer活动51Testing软件测试网2L W#b.gv:Z:}B |
4 代表锁
?A(t+sn7NR08 代表数据缓冲活动
zt+G#R WA];i016 代表OS活动51Testing软件测试网Uy*i-dP1k"T
32 代表并行活动
G*a0VQ7k9am064 代表表访问
Gu?6^rp.|0128 代表调试信息51Testing软件测试网9T)H#K2mS X\@M:|m
51Testing软件测试网Fe0@uZ
[Q]怎么杀掉特定的数据库会话
#ShO:h c*L0[A] Alter system kill session 'sid,serial#';51Testing软件测试网1W;F;Vf7N*m"L.A E
或者
Wm9d;`&P7AKX8H0alter system disconnect session 'sid,serial#' immediate;
N9nwWO.o~6{*L0在win上,还可以采用oracle提供的orakill杀掉一个线程(其实就是一个Oracle进程)51Testing软件测试网AgU;w"H#t qB
在Linux/Unix上,可以直接利用kill杀掉数据库进程对应的OS进程

l#ve&?/d"g0

#A g#O$x;J Z o0一、问题的提出
bp c j,{r:|`/{5f0很多的时候我们迅速的杀掉Oralcle的一些session,理由大体如下:51Testing软件测试网|kEG(f4D9?AW7I

5SEKw\s_ Q01、 一些时候,由于我们的数据量很大,相应的事务大并且多,在做shutdown immediate的时候会花费好多的时间,而我们却想用shutdown immediate的方式,而又要把数据库迅速的shutdown下来。
?S6c j;cI0
5kk g Ek'L.G/a02、 我们的应用可能使用了会话控制,即在应用的层面控制了一些用户的连接的数量。但有时可能网络发生的瞬断,从而就产生了一些死进程,他们的状态为Inactive的状态。当我们用alter system kill session ‘sid,serial#’进行清除时,这些session的状态又变成了killed,这些就由Pmon进程来慢慢进行清除了,而你恰恰又是个急脾气。51Testing软件测试网2w I(@du$zj"I?P7`k}
51Testing软件测试网y? f nT;M
3、 系统忽然慢了现来,你发现是某个session在做怪,想迅速把它迅速结束掉。
/l HF N(Y2vF051Testing软件测试网+\VGh$V3\
二、处理方法
/l2D,[}^y7m7O? C0其实处理方法很简单,是被一些人称为“谋杀”的一种方法。因为一个session会对应着操作系统中相应的一个进程(process),我们不使用Alter system kill session这种方式了,取而代之则是kill的方式,当session的后台进程被杀掉了,便会促使懒散的Pmon进程迅速进行清理工作。51Testing软件测试网 b.F)D5\X"c uq'j!~G!r5Y t

6{BmYLrv6S*K*\ N01、 以一个session做以示例,51Testing软件测试网U6wCd Y N#A

a:T:ofY3p2Fl+p0a、 找到你要杀掉的那个session, 并记下paddr
p:hE~8F B}d X051Testing软件测试网(?4jl0]Y:e1~
select sid, username, paddr, status from v$session51Testing软件测试网"?,hU;Uy7y
where username = '用户名' and
c;p*Z[s'^0status = 'INACTIVE';51Testing软件测试网)k#akxTdM7~l7O

w Ila gW+MZ }+v0b、 找到这个session所对应的spid
/X4djwF6a!oy0
4xBYMfw c0select * from v$process where addr = '上面查寻的paddr';51Testing软件测试网&g)d)K+lI
c、 杀掉spid所标识的那个进程51Testing软件测试网:[m;XIB.?sr

Atn5o^hj.Y0如果你的Oracle是在Unix平台上的,可以用kill。
flN.?L:j051Testing软件测试网TD/e;P-r6^/x8Qx
$kill spid
]J V%_0w.a'aWM0
2{1r+l6lb o0如果你的Oracle是在windown平台上的,有一些的不同,因为windown是以thead来代替process的,需要用到sid和spid两个值,所用的命令也由kill替换为Orakill,格式为rakill sid spid51Testing软件测试网Phr3U_Sq
51Testing软件测试网$p0ab1H:Z
C:\>orakill sid  spid
?ITof-_5o%C0
0VDE q0wO@|0d、 再查一下v$session,看会话在不在了。
,\y4u;FK$n5E:x051Testing软件测试网*^].X9s?];_;z3E _
2、 如何谋杀掉所有的Oracle的用户的进程呢?
2U [.E aw0
Q${/pnH/MvT,VukM0a、windows的环境,执行如下图中的SQL,并把结果存成.bat的文件,比如kill.bat, 执行一下kill.bat就可以了。
y.\ Oo%v7c^oQ051Testing软件测试网tS3EDKo,n\
select 'orakill '||sid||' '||spid as thread from
+CcSu Y%wcB0sys.v_$process p, sys.v_$session s51Testing软件测试网;A Pk^Sr|
where sid > 6 and51Testing软件测试网;gP"o|;Z4h-K
p.addr = s.paddr ;51Testing软件测试网.n w [3Uv

~0DX l `.d-_0
z[StM W~0b、 Unix的环境相对来说就简单多了,执行如下的命令就可以了
)NZ @7D*bv.je5j1y9EP6f+R051Testing软件测试网+mu d1IVM5lKs+me$V
$ ps -ef|grep $ORACLE_SID|grep -v ora_|grep LOCAL=NO|awk '{print $2}'|xargs kill
)tJm9K0W6~^%up(SC0
UP!rO;q!gV&G|%~+k^0然后你再shutdown immediate就很快的了。
)b5|\6I.d.In+Tkg?051Testing软件测试网er6^ _ _7zo

@x#T(lU$z0有一些死锁进程,异常退出后用51Testing软件测试网2]l |/`'Ny.r
alter system kill session 'sid, serial#';无法释放会话
G)t0z%e1jU3o0}M0可从操作系统直接处理。51Testing软件测试网{6h3i*K(m2tX

\2Mb"be051Testing软件测试网Zy dY JG7Y-H
[Q] 如何有效的删除一个大表(extent数很多的表)51Testing软件测试网D.rq/LH6U `sQ7V
[A] 一个有很多(100k)extent的表,如果只是简单地用drop table的话,会很大量消耗CPU(Oracle要对fet$、uet$数据字典进行操作),可能会用上几天的时间,较好的方法是分多次删除extent,以减轻这种消耗:
zCD9Ev.wE01. truncate table big-table reuse storage;
5tig2`,D6Nx*y02. alter table big-table deallocate unused keep 2000m ( 原来大小的n-1/n);51Testing软件测试网7@YJ;U9K\6O M:Q
3. alter table big-table deallocate unused keep 1500m ;51Testing软件测试网S*u"J(G7L;p/};U
....51Testing软件测试网+~ `}U4Ey
4. drop table big-table;51Testing软件测试网jyB a3bS
51Testing软件测试网oBjkG Fm
[Q]如何收缩临时数据文件的大小51Testing软件测试网7g7pP T4c)C })[!j
[A]9i以下版本采用51Testing软件测试网^eLYk7|P1r
ALTER DATABASE DATAFILE 'file name' RESIZE 100M类似的语句
%j2w~tm/q9| _(M;A6H(i09i以上版本采用
e[8g8L|%ZWL_;`Q0ALTER DATABASE TEMPFILE 'file name' RESIZE 100M
8N(a*C/p Y1OM0注意,临时数据文件在使用时,一般不能收缩,除非关闭数据库或断开所有会话,停止对临时数据文件的使用。
!~ NWd+A ]0
q.jL{'ny!gxj0[Q]怎么清理临时段
/^,\]i#Oe0[A]可以使用如下办法
0?$D \R;w GA;mC01、 使用如下语句查看一下认谁在用临时段51Testing软件测试网-i FOV0q`k
SELECT username,sid,serial#,sql_address,machine,program,
-U k*N8b7H/S8P.z0tablespace,segtype, contents
K1OM)~%c,|0W vUa4@q0FROM v$session se,v$sort_usage su
x&ou4@k2KK0WHERE se.saddr=su.session_addr51Testing软件测试网$v#P1xlM'f
2、 那些正在使用临时段的进程
Rt G$u0s}f0SQL>Alter system kill session 'sid,serial#';
8C^4E/L F3Q)ni-v03、把TEMP表空间回缩一下
r/S$E vl C$Q#t z0SQL>Alter tablespace TEMP coalesce;51Testing软件测试网'^'?:]Lw'r2k3}?m
还可以使用诊断事件
#~AMK"l5s01、 确定TEMP表空间的ts#
J ~/Bg&t!f ay0SQL> select ts#, name FROM v$tablespace;51Testing软件测试网9U"]i3AX`t5Y
TS# NAME
$^gND-w2CA h d0-----------------------51Testing软件测试网w.]@v6PH"[,Qu
0 SYSYEM
9~5\;xE+\-c%o01 RBS
C c0IJ[02 USERS51Testing软件测试网 Z4c&ig,oq3T@5g _8K
3* TEMP
3y0No2r@:k|9P:{7P0……
EURs a02、 执行清理操作51Testing软件测试网[ t6} wO { | Fb,LT
alter session set events 'immediate trace name DROP_SEGMENTS level TS#+1'51Testing软件测试网2s^PM,eGs/~
说明:
9dis WD1H?0temp表空间的TS# 为 3*, So TS#+ 1= 4
Fy)M:V.h3]0如果想清除所有表空间的临时段,则
`r.e%Z I&B8{ ` P0TS# = 214748364751Testing软件测试网6F9w:Xo*{7U2n:G&D
51Testing软件测试网6Q,mL$K Nz7]IL
[Q]怎么样dump数据库内部结构,如上面显示的控制文件的结构
#i-] DN kCKY E0[A]常见的有
0\j9CL;@DGq*g01、分析数据文件块,转储数据文件n的块m51Testing软件测试网 \)A yJhSk
alter system dump datafile n block m
G-jn5q:hwx02、分析日志文件
#ol0Z+G(mM0alter system dump logfile logfilename;
E\&r,M(_'E$I;g03、分析控制文件的内容
K-K;Ka~5m0alter session set events 'immediate trace name CONTROLF level 10'51Testing软件测试网+C7j7Sr*W/W)_8e``
4、分析所有数据文件头
5i5Kpx8xU7A*lDDx0alter session set events 'immediate trace name FILE_HDRS level 10'
gHbE4D_3y H+aw05、分析日志文件头
%H7c4SuL5tPP0alter session set events 'immediate trace name REDOHDR level 10'51Testing软件测试网1CV T%e'p0] zK
6、分析系统状态,最好每10分钟一次,做三次对比51Testing软件测试网2r(jl^;cJ
alter session set events 'immediate trace name SYSTEMSTATE level 10'
'j,R-}@-H07、分析进程状态51Testing软件测试网!Gev#dT
alter session set events 'immediate trace name PROCESSSTATE level 10'
*k.Z*O/?6q2^08、分析Library Cache的详细情况
m3`/~i R m m+j?0alter session set events 'immediate trace name library_cache level 10'
(q)l JU;Qbkr0
d9P;n)| [ [-I5{6O8m0[Q]如何获得所有的事件代码
r/Y-y6{r&s'Zcg0[A] 事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息
x}tv;H$qJO0SET SERVEROUTPUT ON
_?k]UY&j2T%_0DECLARE51Testing软件测试网"qS Mve
err_msg VARCHAR2(120);51Testing软件测试网B-~|&@Z M X7o
BEGIN51Testing软件测试网Lv0E V[/g7xt C
dbms_output.enable (1000000);
v bYStb)m0FOR err_num IN 10000..1099951Testing软件测试网K4q1~U+l-AN2Q S-w
LOOP51Testing软件测试网K*@^1j [ y
err_msg := SQLERRM (-err_num);51Testing软件测试网8\;\7_n?p&W
IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN
9J%Q-n v6G/J-Lj0dbms_output.put_line (err_msg);51Testing软件测试网 Y.C0U7M-S wVE*z
END IF;51Testing软件测试网+ic R:} k S4~#Y
END LOOP;
9RCJVP0END;
%Y(cg+ut g&T0/
2a#x;a"n,| FQ0在Unix系统上,事件信息放在一个文本文件里51Testing软件测试网*er%Y#D%R'H `
$ORACLE_HOME/rdbms/mesg/oraus.msg51Testing软件测试网_kc-MSaA;?N
可以用如下脚本查看事件信息51Testing软件测试网!ouqEf?m
event=1000051Testing软件测试网QRYeJP
while [ $event -ne 10999 ]
t'? I'b2af-M0do
p[qr)[0event=`expr $event + 1`
We| Q:Z(g#J0oerr ora $event
woZ2Y.mh,B};u0done
4?/B8{ yUY0对于已经确保的/正在跟踪的事件,可以用如下脚本获得
] D`"e2Tj&V'F-G0SET SERVEROUTPUT ON51Testing软件测试网p v/@ h+T Cd|%E,J[
DECLARE51Testing软件测试网WL)p\'[(@2H
l_level NUMBER;51Testing软件测试网U|$AVZ T6HCe
BEGIN51Testing软件测试网 Yg!A8a D{LM;}
FOR l_event IN 10000..1099951Testing软件测试网~-v(VA bF
LOOP
s aF0Sh8Yvz~~0dbms_system.read_ev (l_event,l_level);
G"?-a*k0NDktf0IF l_level > 0 THEN51Testing软件测试网!U a!} W(q j-B
dbms_output.put_line ('Event '||TO_CHAR (l_event)||51Testing软件测试网P]~!z^
' is set at level '||TO_CHAR (l_level));51Testing软件测试网:q+Oh,_V
END IF;51Testing软件测试网X5pUj&h @K%T
END LOOP;51Testing软件测试网6ZPXI8r"V
END;
c"[PP6Q C0/

i#zk3md6`#s051Testing软件测试网#Wx,RN,XI/|

[Q]怎么样快速重整索引51Testing软件测试网9B e0~7@ ^N m
[A]通过rebuild语句,可以快速重整或移动索引到别的表空间51Testing软件测试网b__+iBklVs
rebuild有重建整个索引数的功能,可以在不删除原始索引的情况下改变索引的存储参数51Testing软件测试网:lZ4`8OfXa
语法为51Testing软件测试网zh5kc;Pg_'Mky
alter index index_name rebuild tablespace ts_name
G](s^ OY0storage(……);51Testing软件测试网,]?7Dgk5s
如果要快速重建整个用户下的索引,可以用如下脚本,当然,需要根据你自己的情况做相应修改51Testing软件测试网*v'b+VeI8]vR
SQL> set heading off51Testing软件测试网|d5Jo4p.fd
SQL> set feedback off
pJ N~"CY!h0SQL> spool d:\index.sql
9];E5cD$l:}\0SQL> SELECT 'alter index ' || index_name || ' rebuild '51Testing软件测试网 O4U4n }7@
||'tablespace INDEXES storage(initial 256K next 256K pctincrease 0);'51Testing软件测试网.zd1H o9H Vy4A5QC
FROM all_indexes
B,{ F Be%r0Mp[q:~0WHERE ( tablespace_name != 'INDEXES'51Testing软件测试网IW$Tp.Q)t+Z:dW
OR next_extent != ( 256 * 1024 )
@2Pviq:^*WV3x0)51Testing软件测试网9gN8t n8_0v9^0a7pS
AND wner = USER
$e^M([~i0SQL>spool off51Testing软件测试网],l/q^.ySK
另外一个合并索引的语句是
7W&]*AOhl4C-\ u)y0alter index index_name coalesce,这个语句仅仅是合并索引中同一级的leaf block
-~8S DdYgI.f0消耗不大,对于有些索引中存在大量空间浪费的情况下,有一些作用。51Testing软件测试网.~} B m3U
 
51Testing软件测试网Wf]p^/D7dFQ

)k3i Rk-V0[Q]怎么快速查找锁与锁等待51Testing软件测试网$JF'l]@:df:g
[A]数据库的锁是比较耗费资源的,特别是发生锁等待的时候,我们必须找到发生等待的锁,有可能的话,杀掉该进程。
!Kes Oc-~!a0这个语句将查找到数据库中所有的DML语句产生的锁,还可以发现,任何DML语句其实产生了两个锁,一个是表锁,一个是行锁。
A6V5ZrjQ0可以通过alter system kill session ‘sid,serial#’来杀掉会话
/C)t~&rL-em p0SELECT /*+ rule */ s.username,
M i^ oK P I0decode(l.type,'TM','TABLE LOCK',
E+h7c"iL7Gq3K0'TX','ROW LOCK',
;q,j\1?0^[?6G9[0NULL) LOCK_LEVEL,51Testing软件测试网2x0yv sE4T7sz
o.owner,o.object_name,o.object_type,51Testing软件测试网 [!x5L-`;i [2eh,ay)s
s.sid,s.serial#,s.terminal,s.machine,s.program,s.osuser
"`4[u8n?^6p9e_0FROM v$session s,v$lock l,dba_objects o51Testing软件测试网e JyheA
WHERE l.sid = s.sid
&~F-LY|{ ^3wQm2N0AND l.id1 = o.object_id(+)
wQ8ZT4JX;d%L;Gdu0AND s.username is NOT NULL51Testing软件测试网*bY _`v.T.vY.CDg
如果发生了锁等待,我们可能更想知道是谁锁了表而引起谁的等待
t_"]myu K"X0以下的语句可以查询到谁锁了表,而谁在等待。
a[I)Zf0SELECT /*+ rule */ lpad(' ',decode(l.xidusn ,0,3,0))||l.oracle_username User_name,
0mGYW ?F8?B p'R0o.owner,o.object_name,o.object_type,s.sid,s.serial#51Testing软件测试网q6Pw+@f;Lz i
FROM v$locked_object l,dba_objects o,v$session s51Testing软件测试网 }c!xA4g'n,y&V'q
WHERE l.object_id=o.object_id
ZO _!\['L%Kg Q0AND l.session_id=s.sid
.U)O9RC3_ cuk0ORDER BY o.object_id,xidusn DESC
?/]C,k7u&A.P0以上查询结果是一个树状结构,如果有子节点,则表示有等待发生。如果想知道锁用了哪个回滚段,还可以关联到V$rollname,其中xidusn就是回滚段的USN51Testing软件测试网/Gs]3c0OrL\x
 

2zVt1] wYi0

2qU%s|D F|-mE'p0[Q]怎样监控无用的索引51Testing软件测试网(Z!@SfUZM MW'R
[A]Oracle 9i以上,可以监控索引的使用情况,如果一段时间内没有使用的索引,一般就是无用的索引51Testing软件测试网-zf3|XvEq'E
语法为:
S&v+DN?5F[0开始监控:alter index index_name monitoring usage;
6Q\4G+sn'u6{|0检查使用状态:select * from v$object_usage;51Testing软件测试网 p9kg0p9yxFG[:l
停止监控:alter index index_name nomonitoring usage;
?TIo kP0当然,如果想监控整个用户下的索引,可以采用如下的脚本:
T*o"i!|I-yvO7D0set heading off
7A5Lq`%^O0set echo off
r{9[m6b"P(o0set feedback off
E$p8I f g|M0set pages 1000051Testing软件测试网"M}J5Q3rL8OxF
spool start_index_monitor.sql
-Q)lqefQ0SELECT 'alter index '||owner||'.'||index_name||' monitoring usage;'51Testing软件测试网vC(} h2QhjN
FROM dba_indexes
.r'J%]D'C]7[0WHERE wner = USER;51Testing软件测试网r4L8pA!|P&MN
spool off51Testing软件测试网x/}^zgqoOW
set heading on51Testing软件测试网iZ0G-e4] H7lt
set echo on
l/Q%U A&V0set feedback on
+Tia p6Ca0qi8LF0------------------------------------------------
pCO-y)f8F&N8kq0set heading off51Testing软件测试网9U WIN5JP}0x5G+d%KI
set echo off51Testing软件测试网%gG~ T+|6` LQ
set feedback off
mhWXn&|0set pages 1000051Testing软件测试网 w.TF|)tuo.^m:{
spool stop_index_monitor.sql51Testing软件测试网v1Z0W;]%{6l+v3Kp;@(PJ/y
SELECT 'alter index '||owner||'.'||index_name||' nomonitoring usage;'51Testing软件测试网sQh0[R&a
FROM dba_indexes
*z fV s*`ZA/xw&P8M0WHERE wner = USER;
s+ZL8jB\&@0spool off
3Dw#q{*?uc E0set heading on51Testing软件测试网mhC&eU n%F `
set echo on
Fc1m[+br'o8k0set feedback on
51Testing软件测试网1v`X2]'Aqp3p.x

51Testing软件测试网us?feW?m

[Q]怎么样根据OS进程快速获得DB进程信息与正在执行的语句51Testing软件测试网+t3D7DDId[X
[A]有些时候,我们在OS上操作,象TOP之后我们得到的OS进程,怎么快速根据OS信息获得DB信息呢?51Testing软件测试网(Yt*uH2?!BdT
我们可以编写如下脚本:
~Ts6k%qoJ7? ^a0$more whoit.sh
(ZHe\VQ{){NIce0#!/bin/sh51Testing软件测试网 s1Xj~1Z0i#J0u.l C
sqlplus /nolog <<EOF51Testing软件测试网VP\]-B@
connect / as sysdba
OqZ T])w2Yze0col machine format a30
I'M&N xm-aG4@0col program format a4051Testing软件测试网uSe"A C*u'?"^9f
set line 200
xF2Zo+Oe(c cv0select sid,serial# ,username,osuser,machine,program,process,to_char(logon_time,'yyyy/mm/dd hh24:mi:ss')51Testing软件测试网](}3r$c&k/~2r(D V,_
from v\$session where paddr in51Testing软件测试网_ X`0g,{ Gr ^k!kH6I
( select addr from v\$process where spid in($1));51Testing软件测试网M T:O4g0I i{f
51Testing软件测试网Sx5RJ'h
select sql_text from v\$sqltext_with_newlines51Testing软件测试网Q(sye]8~9l z
where hash_value in
zpI*yNy0(select SQL_HASH_VALUE from v\$session where51Testing软件测试网j};EyQ^*F4NdU1?
paddr in (select addr from v\$process where spid=$1)
NY:\/A+iLwn3x0)51Testing软件测试网"ygSs)t
order by piece;51Testing软件测试网rGPZ5i&U)F

5xLVk'st#}5c0exit;
q+Z-r@-y0EOF51Testing软件测试网 pSq)I`&v
然后,我们只要在OS环境下如下执行即可
nO#fEb1z@R0$./whoit.sh Spid
51Testing软件测试网"g-pD"t-jW}S

51Testing软件测试网 t2\(c/^]_

[Q]怎么样能固定我的执行计划
`9^:@G&{&^8X0[A]可以使用OUTLINE来固定SQL语句的执行计划51Testing软件测试网l ~%f,p D`;G n
用如下语句可以创建一个OUTLINE
c2J*^{l Ko,T0Create oe replace outline OutLn_Name on
7vI/y&B#z%@V-I(@0Select Col1,Col2 from Table
iC*E7g peo `M0where ……51Testing软件测试网t H{"KN
如果要删除Outline,可以采用51Testing软件测试网(Y:j!nf#`d
Drop Outline OutLn_Name;51Testing软件测试网w@A |]P)b
对于已经创建了的OutLine,存放在OUTLN用户的OL$HINTS表下面51Testing软件测试网v8@"{eP^R!GBK'f
对于有些语句,你可以使用update outln.ol$hints来更新outline
0i9dGY%jR0如update outln.ol$hints(ol_name,'TEST1','TEST2','TEST2','TEST1)
uB:H;h V W#MJ4j$|y0where ol_name in ('TEST1','TEST2');
5?*]M-uB!Q"m0]H!c0这样,你就把Test1 OUTLINE与Test2 OUTLINE互换了
%S%bW1Z#j#h+t-T0如果想利用已经存在的OUTLINE,需要设置以下参数51Testing软件测试网 j$vu*p)Ygtsk3l
Alter system/session set Query_rewrite_enabled = true
pO`u p0Alter system/session set use_stored_outlines = true
-`QD o4n/e!T]0 

IG(L/X9fI D051Testing软件测试网&DdC!hL{'t i

[Q]如何获得所有的事件代码
,H-K0Bq.g{Ey0[A] 事件代码范围一般从10000 to 10999,以下列出了这个范围的事件代码与信息51Testing软件测试网"lcj9n6[Q
SET SERVEROUTPUT ON
/ww/o[n/l,d0DECLARE
v-NT,KpJV0err_msg VARCHAR2(120);
2i];T%Y;M7{4o0BEGIN
&g2kD8q T ]&@]"n(i.C5X0dbms_output.enable (1000000);51Testing软件测试网(Lhc X6]@(W4T"xB
FOR err_num IN 10000..1099951Testing软件测试网 eH^-ai!Z
LOOP
&V8X|(Et;m(E.fmn9]0err_msg := SQLERRM (-err_num);
0~)W pa W*OagS0IF err_msg NOT LIKE '%Message '||err_num||' not found%' THEN51Testing软件测试网%~g+cA6drd G$@
dbms_output.put_line (err_msg);51Testing软件测试网6iDc,M6^*U+E
END IF;
.e\!Lz!k0END LOOP;51Testing软件测试网#G;R&DK.G/s:F
END;51Testing软件测试网&@ ZS$aKC ^#Gku
/51Testing软件测试网.m2Z^8W+R/QE
在Unix系统上,事件信息放在一个文本文件里
2zF ]K3w@9t{e0$ORACLE_HOME/rdbms/mesg/oraus.msg51Testing软件测试网}(`x O&`eAR
可以用如下脚本查看事件信息
+N Dst1q:\ ]j0event=10000
(ViOc Gk[2G7v\0while [ $event -ne 10999 ]
7k J/EXG,D9B(Q0do
(c5dy]7KhG j0event=`expr $event + 1`
](e2p"t`K Gi i0oerr ora $event
l?#SF:PF"a&q0done
-jC7u.BDq0对于已经确保的/正在跟踪的事件,可以用如下脚本获得
D cEh^0SET SERVEROUTPUT ON
R#jk;v'v8n2E0DECLARE51Testing软件测试网Q+s7elAe4K+N*V,s
l_level NUMBER;51Testing软件测试网9PE;b|HH#R
BEGIN51Testing软件测试网&at/i`nE!|
FOR l_event IN 10000..10999
4?\}k%u0LOOP51Testing软件测试网0XJ E-Uu^K'm
dbms_system.read_ev (l_event,l_level);
;BP9n!b5z#B'~@0IF l_level > 0 THEN51Testing软件测试网;NI.PB2zH(~6u
dbms_output.put_line ('Event '||TO_CHAR (l_event)||51Testing软件测试网){UL,YD.T/ED8z2_
' is set at level '||TO_CHAR (l_level));
.s%WzHI9{0END IF;51Testing软件测试网 e"DB Po(S;f7}
END LOOP;51Testing软件测试网1pdiI0un-R
END;51Testing软件测试网*~ ^kg8_k)TnOS:d
/
/_ `6a!bG!v051Testing软件测试网$uMzCJJ_5_q
[Q]什么是STATSPACK,我怎么使用它?
r4|'fE"V#q/]J$JM.uW0[A]Statspack是Oracle 8i以上提供的一个非常好的性能监控与诊断工具,基本上全部包含了BSTAT/ESTAT的功能,更多的信息51Testing软件测试网#d!{D1iB
可以参考附带文档$ORACLE_HOME/rdbms/admin/spdoc.txt。51Testing软件测试网k*m)w xB.\*t
安装Statspack:
H,?r+hW$No0cd $ORACLE_HOME/rdbms/admin51Testing软件测试网3L3wN$zo7|,}Dz
sqlplus "/ as sysdba" @spdrop.sql -- 卸载,第一次可以不需要51Testing软件测试网K~Xt5w)f`
sqlplus "/ as sysdba" @spcreate.sql -- 需要根据提示输入表空间名51Testing软件测试网"R)_*m*a\ t
使用Statspack:51Testing软件测试网G}+`S8f_p[:sz$@
sqlplus perfstat/perfstat51Testing软件测试网*]'WV$t&RR
exec statspack.snap; -- 进行信息收集统计,每次运行都将产生一个快照号
u#ze_1f0-- 获得快照号,必须要有两个以上的快照,才能生成报表
E }p-`1] K8z4c9e0g0select SNAP_ID, SNAP_TIME from STATS$SNAPSHOT;51Testing软件测试网T{}$e(}!@#m
@spreport.sql -- 输入需要查看的开始快照号与结束快照号51Testing软件测试网1c wiw4NZg&wwH.N
其他相关脚本s:51Testing软件测试网yK*O {!TtW
spauto.sql - 利用dbms_job提交一个作业,自动的进行STATPACK的信息收集统计
5u py k*o:Dy[/w7Cu3HB}0sppurge.sql - 清除一段范围内的统计信息,需要提供开始快照与结束快照号
,A0qw7\,A3O w)@5v0sptrunc.sql - 清除(truncate)所有统计信息
R/C_ | mY"^:u&E051Testing软件测试网B'p'j2M|6B AO
51Testing软件测试网cYvwL4tG

_Hq`*se"f K0第五部分、ORACLE网络

4z_/i;_ N!@0

,JQL{L$F;wm0menu51Testing软件测试网4R YEWsr

Bu-T8~]0[Q]如何限定特定IP访问数据库51Testing软件测试网j)LR Mv
[Q]如何穿过防火墙连接数据库51Testing软件测试网GoCYG\
[Q]如何利用hostname方式连接数据库
\eJkQ~'q0[Q]dbms_repcat_admin能带来什么安全隐患
U7Y3jh8RU0[Q]在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?51Testing软件测试网w$o#E'q0d,wHO/P
[Q]如何加固你的数据库51Testing软件测试网?cjz-Z!Bf.Dn
[Q]如何检查用户是否用了默认密码
gL!b6]KbT&F0[Q]如何修改默认的XDB监听端口51Testing软件测试网 e)J)Y*wLV*f4N
[Q]怎么捕获用户登录信息,如SID,IP地址等
y*Kxy!N z5D_ j0[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改51Testing软件测试网]l{nM9@ H
[Q]怎么捕获表上的DML语句(不包括select)语句)51Testing软件测试网pEu0@k)PE0~M
51Testing软件测试网rd)a(D+Bd

qj'W)nCFV Q }0第五部分、ORACLE网络
6J2P-d DM"^_P0[Q]如何限定特定IP访问数据库51Testing软件测试网}[!B mi(PfeB
[A]可以利用登录触发器或者是修改sqlnet.ora(9i以上):51Testing软件测试网`uM,clXN:g
增加如下内容:51Testing软件测试网 H+ID"V_ iesW*Hu
tcp.validnode_checking=yes
;o:ntD)a!V0#允许访问的ip
$jZ1j!E*Bg$M0tcp.inited_nodes=(ip1,ip2,……)
!n vI)o6G{*@6t0#不允许访问的ip51Testing软件测试网;[e{(RK#_ l&@p2D
tcp.excluded_nodes=(ip1,ip2,……)51Testing软件测试网^{d5J9A AS2}7w3l

w2\&Ka5g+W0[Q]如何穿过防火墙连接数据库51Testing软件测试网+F6L"ed8?#y ~&f/URr
[A]这个问题只会在WIN平台出现,UNIX平台会自动解决。51Testing软件测试网g+Raw2L(A_
解决方法:51Testing软件测试网)P0E:O5p)AKd
在服务器端的SQLNET.ORA应类似51Testing软件测试网RMsO]6c
SQLNET.AUTHENTICATION_SERVICES= (NTS)
B3J"|ms^{S0NAMES.DIRECTORY_PATH= (TNSNAMES, ONAMES, HOSTNAME)51Testing软件测试网SI]"n Mmk,r
TRACE_LEVEL_CLIENT = 16
W9_vel2W5_7^!s5K0注册表的HOME0加[HKEY_LOCAL_MACHINE]51Testing软件测试网so_0{5F5N8h-huh
USE_SHARED_SOCKET=TRUE51Testing软件测试网5sAJH.\7d%ho T
51Testing软件测试网h'b;`|Lz
[Q]如何利用hostname方式连接数据库
.KFw q2t;}V0z Y0host name方式只支持tcp/ip协议的小局域网
s;ed:l j5oYw*T0修改listener.ora中的如下信息
"K8GIXs0(SID_DESC =
+LN%W1F^8e0(GLOBAL_DBNAME = ur_hostname) --你的机器名51Testing软件测试网,a GJu~b H`
(ORACLE_HOME = E:\oracle\ora92) --oracle home
;B1Inw&vuD0(SID_NAME = orcl) --sid name51Testing软件测试网Kv)q,I#IEG,BKJ
)51Testing软件测试网)OChGn)e+H
然后在客户端51Testing软件测试网F kk&q#\!K
的sqlnet.ora中,确保有51Testing软件测试网yGr{:andK3Q
NAMES.DIRECTORY_PATH= (HOSTNAME)51Testing软件测试网7dSC!mHd7a
你就可以利用数据库服务器的名称访问数据库了
51Testing软件测试网%cO%FH u!q:rZ}

51Testing软件测试网-bn vv/dn

[Q]dbms_repcat_admin能带来什么安全隐患
"F)fi m*_%r0[A]如果一个用户能执行dbms_repcat_admin包,将获得极大的系统权限。51Testing软件测试网6K;Jp`b)T{)J
以下情况可能获得该包的执行权限:51Testing软件测试网KVh3p9E-}
1、在sys下grant execute on dbms_repcat_admin to public[|user_name]51Testing软件测试网9nn4D9xD,W
2、用户拥有execute any procedure特权(仅限于9i以下,9i必须显示授权)
j-z djX0如果用户通过执行如下语句:51Testing软件测试网]3`JEf R2r4WQ f
exec sys.dbms_repcat_admin.grant_admin_any_schema('user_name');
`9\ `7x^;`0该用户将获得极大的系统特权51Testing软件测试网`2v ^ ~,C)S
可以从user_sys_privs中获得详细信息

It&K2V5Wg};_%sz s051Testing软件测试网p*j_;Vy:eV I

[Q]在不知道用户密码的时候,怎么样跳转到另外一个用户执行操作后并不影响该用户?51Testing软件测试网a0sH(H8B}1US
[A]我们通过如下的方法,可以安全使用该用户,然后再跳转回来,在某些时候比较有用
Jsb#v-v3_$y?0需要Alter user权限或DBA权限:51Testing软件测试网$S,M%E j?0O x M
SQL> select password from dba_users where username='SCOTT';
b'TF/W6z0PASSWORD
~#B8}|]1wT0-----------------------------51Testing软件测试网H)D*F;rHC$I
F894844C34402B6751Testing软件测试网7T9tyA4B7i:CP!t
SQL> alter user scott identified by lion;
R U&M[*g.|_$v0User altered.51Testing软件测试网)Vcri vi ~P.|
SQL> connect scott/lion
~(G R1?E~y%HK#w0Connected.51Testing软件测试网kyFr/r&Q3W
REM Do whatever you like...
R\2x,s x0SQL> connect system/manager51Testing软件测试网$xNS&D'z[cs O
Connected.51Testing软件测试网a e0Gf6^U4TA
SQL> alter user scott identified by values 'F894844C34402B67';51Testing软件测试网:ghI{s'd/n]4u r
User altered.
+}_ m7fj+Z"OP/JX&]"E0SQL> connect scott/tiger
xV(ym vOR G Xy0Connected.51Testing软件测试网2Y1t6E%n8c I3G/p
51Testing软件测试网\b/}W~!we
[Q]如何加固你的数据库
&i!Pq+gJB+Xl0[A]要注意以下方面
PwWY:EiQ01. 修改sys, system的口令。51Testing软件测试网"Ye2H0Kp
2. Lock,修改,删除默认用户: dbsnmp,ctxsys等。51Testing软件测试网/g.`.FKp\Ga#r
3. 把REMOTE_OS_AUTHENT改成False,防止远程机器直接登陆。51Testing软件测试网!t1Kh1l)|w7? o
4. 把O7_DICTIONARY_ACCESSIBILITY改成False。51Testing软件测试网&\e J*Ol?GpC#[
5. 把一些权限从PUBLIC Role取消掉。51Testing软件测试网Da5Z W xG$x0{OD
6. 检查数据库的数据文件的安全性。不要设置成666之类的。检查其他dba 用户。
Ws&JSK07. 把一些不需要的服务(比如ftp, nfs等关闭掉)
*vVB!t0r:uT08. 限制数据库主机上面的用户数量。51Testing软件测试网@/X u:]#q&\p(@
9. 定期检查Metalink/OTN上面的security Alert。比如:http://otn.oracle.com/deploy/security/alerts.htm
"l#C'Q,p{#hl} Ih010. 把你的数据库与应用放在一个单独的子网中,要不然你的用户密码很容易被sniffer去。或者采用advance security,对用户登录加密。
/e-n q/N:jz011. 限止只有某些ip才能访问你的数据库。51Testing软件测试网-F&i;ipNd}
12. lsnrctl 要加密码,要不然别人很容易从外面关掉你的listener。
'S)B ~xdO n)L"e@\013. 如果可能,不要使用默认1521端口51Testing软件测试网5T D9G9M9t-K&B
51Testing软件测试网 |6Y6FW'a!@5}*R~xm
[Q]如何检查用户是否用了默认密码51Testing软件测试网Z+S1D6UwK
[A]如果使用默认密码,很可能就对你的数据库造成一定的安全隐患,那么可以使用如下的查询获得那些用户使用默认密码
6v-Wln6i0}#i qq0select username "User(s) with Default Password!"
2N:Z oj+gEI0from dba_users
M-k!V0bx:G6xc0where password in51Testing软件测试网5M)p:u GS
('E066D214D5421CCC', -- dbsnmp
+N0WQs}d%w7jL0'24ABAB8B06281B4C', -- ctxsys
)s7g#oNix0'72979A94BAD2AF80', -- mdsys51Testing软件测试网N%@1krdA
'C252E8FA117AF049', -- odm
q)d g'NH0'A7A32CD03D3CE8D5', -- odm_mtr
:A cK%P$d0'88A2B2C183431F00', -- ordplugins51Testing软件测试网QYpAs
'7EFA02EC7EA6B86F', -- ordsys51Testing软件测试网s#jA0GL$CG!p
'4A3BA55E08595C81', -- outln51Testing软件测试网 {e?3ot^
'F894844C34402B67', -- scott51Testing软件测试网 ~!kr)u-L8u9nW
'3F9FBD883D787341', -- wk_proxy
*bUg+VBm0'79DF7A1BD138CF11', -- wk_sys
u)Yk x8tZ)?(F*G1eHw0'7C9BA362F8314299', -- wmsys
q3~&g,[-v:q$n$y0'88D8364765FCE6AF', -- xdb
h`D m8OIXex+x0'F9DA8977092B7B81', -- tracesvr
_J/eF8_1x5\4_3K^!i0'9300C0977D7DC75E', -- oas_public51Testing软件测试网7^|z\1N{.Qi
'A97282CE3D94E29E', -- websys
Iu*C%r3k7yi0'AC9700FD3F1410EB', -- lbacsys
6Hvv)d%[:\ lP0'E7B5D92911C831E1', -- rman51Testing软件测试网[9f~(B:D0pJ.l
'AC98877DE1297365', -- perfstat51Testing软件测试网4F$YW+s1y+I4ak(]2v
'66F4EF5650C20355', -- exfsys
^h`7o}&\$j0'84B8CBCA4D477FA3', -- si_informtn_schema51Testing软件测试网5uF-j{HJ
'D4C5016086B2DC6A', -- sys
2m,g7~S/~6o-j"GO0'D4DF7931AB130E37') -- system
Gq8V{.rE[p A0/51Testing软件测试网g w1g5PK/?W1u(zmAj

VL\.g$Z4`&t*iw0[Q]如何修改默认的XDB监听端口
x%Ey6W5T@ MG2h0[A] Oracle9i默认的XML DB把HTTP的默认端口设为8080,这是一个太常用的端口了,很多别的WebServer都会使用这个端口,
qK l*e V_0如果我们安装了它,最好修改一下,避免冲突,如果不使用呢,就最好不要安装51Testing软件测试网 E wD,W$j%Z%D*h$P$J
提供三种修改的方法
ae'Zz#s7G w3vR01.dbca,选择你的数据库,然后Standard Database Features->Customize->Oracle XML DB option,进入这个画面你应该就知道怎么改了。51Testing软件测试网u4M2JGVbl
2.OEM console,在XML Database 的配置里面修改51Testing软件测试网:tCa4p V\HY2nM
3.用oracle提供的包:51Testing软件测试网 hi6dv \c5_ [3E:{S
-- 把HTTP/WEBDAV端口从8080改到8081
HdQ vQ.iCdv0SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
2iG8Wa)~]b,~1@+Y0'/xdbconfig/sysconfig/protocolconfig/httpconfig/http-port/text()',8081))
&a8h^$PG.UR$y0/
TX%W&V,p-QHu0-- 把FTP端口从2100改到211151Testing软件测试网%H^ h_ Ud,Z
SQL> call dbms_xdb.cfg_update(updateXML(dbms_xdb.cfg_get(),
$l3]!i9H:~Hw3Nz;\Y0'/xdbconfig/sysconfig/protocolconfig/ftpconfig/ftp-port/text()',2111))51Testing软件测试网&]#^zgHUMo
/
4XZ[(su0SQL> commit;
%jK-Nx4PzK&R+yK*eN0SQL> exec dbms_xdb.cfg_refresh;
;fL Q:kQ-n0-- 检查修改是否已经成功
m+Y7xl+^{,L0SQL> select dbms_xdb.cfg_get from dual;51Testing软件测试网0b6vsE&{.[m"K

*bKM~L2v(L1c0[Q]怎么捕获用户登录信息,如SID,IP地址等
(@Ppq3Ho }g Z0[A]可以利用登录触发器,如
y~0\g B-^{0CREATE OR REPLACE TRIGGER tr_login_record
h0Mg$s U0AFTER logon ON DATABASE
|#zuz5IM;f0DECLARE51Testing软件测试网 G/a3AC)s(A#b
miUserSid NUMBER;51Testing软件测试网9X#p.S6O0a`G,T
mtSession v$session%ROWTYPE;51Testing软件测试网 M3Gd P:LU
CURSOR cSession(iiUserSid IN NUMBER) IS
8so9B:c|};jT7Z4MF0SELECT * FROM v$session51Testing软件测试网D,}X/bRG+DTk^
WHERE sid=iiUserSid;51Testing软件测试网'W~$xi q;w:s
BEGIN51Testing软件测试网 IGA_I|A)h A
SELECT sid INTO miUserSid FROM v$mystat WHERE rownum<=1;
7TDX0X }4_0OPEN cSession(miUserSid);
{ N-lvp{0FETCH cSession INTO mtSession;51Testing软件测试网'eg.q/x"Un*]
--if user exists then insert data51Testing软件测试网0X0cf^Z
IF cSession%FOUND THEN51Testing软件测试网LHK'UoO
INSERT INTO log$information(login_user,login_time,ip_adress,ausid,terminal,
Bie3Kmi a t0osuser,machine,program,sid,serial#)
d;P+R3M G;Uj,d0VALUES(ora_login_user,SYSDATE,SYS_CONTEXT ('USERENV','IP_ADDRESS'),
0xT(?[Ve i.r~0userenv('SESSIONID'),
v|l4W;a%}-r3f+uq0mtSession.Terminal,mtSession.Osuser,51Testing软件测试网cG$[/OIc._
mtSession.Machine,mtSession.Program,
n5L l;O1W-I b7Q0mtSession.Sid,mtSession.Serial#);
u ?y&d0}E!g0ELSE
r%s5p/A U0--if user don't exists then return error51Testing软件测试网v1w"C8g+C*G
sp_write_log('Session Information Error:'||SQLERRM);
+S`Tc#R,jt0CLOSE cSession;
[]h$Y p(~\ W0raise_application_error(-20099,'Login Exception',FALSE);51Testing软件测试网/J+e0Gi Ic
END IF;
;^0DHT9_(@T&m1e0CLOSE cSession;51Testing软件测试网:C?;lr w/`5?9G
EXCEPTION
9S*y(Z Vf0WHEN OTHERS THEN
.nN#I:O)r{b0sp_write_log('Login Trigger Error:'||SQLERRM);
0kW!A&ynb TcU ?5w0END tr_login_record;
)N2Wl9Io k5A0在以上触发器中需要注意以下几点51Testing软件测试网3g-K7ZW!A]5@0e{8M
1、该用户有v_$session与v_$mystat的对象查询权限,可以在sys下对该拥护显式授权。
wo g$m`qq02、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。
5G o2~US'~+P(k03、必须在创建该触发器之前创建一个log$information的表记录登录信息。51Testing软件测试网B-X:m.P2TX
51Testing软件测试网Z#vj&G7r
[Q]怎么捕获整个数据库的DDL语句或者是说对象结构变化与修改
pJ d7z!K?0[A]可以采用DDL触发器,如
9C:D'tB q%D)?0CREATE OR REPLACE TRIGGER tr_trace_ddl
PPo!u$udI:u \F0AFTER DDL ON DATABASE51Testing软件测试网!\ Wq-^)w-} [K
DECLARE51Testing软件测试网*mDE8h#h|1UA
sql_text ora_name_list_t;
yYss&`4A1J0state_sql ddl$trace.ddl_sql%TYPE;
L|YJ O0BEGIN
&EY/`-?^ l}0FOR i IN 1..ora_sql_txt(sql_text) LOOP51Testing软件测试网` ~H u?7Z2|o-@
state_sql := state_sql||sql_text(i);51Testing软件测试网5Q$hY.xC;HB5e
END LOOP;
])k?1SHl i0INSERT INTO ddl$trace(login_user,ddl_time,ip_address,audsid,51Testing软件测试网kMu ];JilH&~1Le
schema_user,schema_object,ddl_sql)
d4ak-BV5WU0VALUES(ora_login_user,SYSDATE,userenv('SESSIONID'),51Testing软件测试网!XW \0bR._AX-B
sys_context('USERENV','IP_ADDRESS'),51Testing软件测试网 k%FgX-fV7p
ora_dict_obj_owner,ora_dict_obj_name,state_sql);
mPqlAJ Z'D~/z.ll0EXCEPTION51Testing软件测试网4f'L `4t/kf,`#N
WHEN OTHERS THEN
{8h"Z!p J6XS:^1t0sp_write_log('Capture DDL Excption:'||SQLERRM);51Testing软件测试网m*|'?RW_
END tr_trace_ddl;51Testing软件测试网4r2eY ]OLp{
在创建以上触发器时要注意几点
h _hc$Qf&I01、必须创建一个ddl$trace的表,用来记录ddl的记录
/w9M:W`5h\_g02、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。51Testing软件测试网 so]?ZaP'E.P1}

W:[$f+_m5c0[Q]怎么捕获表上的DML语句(不包括select)语句)
7M IfY sYC"P!a P0[A]可以采用dml触发器,如
BK"u"en Q,cP0CREATE OR REPLACE TRIGGER tr_capt_sql
s$rP+xr'OT#V0BEFORE DELETE OR INSERT OR UPDATE
kk(N'S/b0p0ON manager.test
6Hz9Mg0H0DECLARE51Testing软件测试网N8[oj+EXq"~
sql_text ora_name_list_t;51Testing软件测试网$r2zEs6mF
state_sql capt$sql.sql_text%TYPE;51Testing软件测试网ZKLV;wM/^
BEGIN
raJ UK-x0FOR i IN 1..ora_sql_txt(sql_text) LOOP
"sFC*U m:X^0state_sql := state_sql || sql_text(i);
N6A{;b*FT_7f)]3r O$V0END LOOP;51Testing软件测试网9`Y'C:h7Ndqg
INSERT INTO capt$sql(login_user,capt_time,ip_address,audsid,owner,table_name,sql_text)51Testing软件测试网 d0rPM+]
VALUES(ora_login_user,sysdate,sys_context('USERENV','IP_ADDRESS'),51Testing软件测试网zN;JrK1B*j6? yG
userenv('SESSIONID'),'MANAGER','TEST',state_sql);51Testing软件测试网EC+c2A"}1ky.V
EXCEPTION
%[?6O5i9|)_5bL0WHEN OTHERS THEN51Testing软件测试网djFt7DP;S
sp_write_log('Capture DML Exception:'||SQLERRM);
H\1x.}.] M}0END tr_capt_sql;51Testing软件测试网e6['B q$F/]
在创建以上触发器时要注意几点
DReUeL\lw01、必须创建一个capt$sql的表,用来记录ddl的记录51Testing软件测试网2r)TId'N
2、sp_write_log原本是一个写日志的过程,可以置换为自己的需要,如null跳过。51Testing软件测试网+^'c!B!O!WY7_
51Testing软件测试网7WAD Mm#O
51Testing软件测试网 V{%vm:TZbPB

51Testing软件测试网6t*pfcvYQ"D

第六部分、OS相关51Testing软件测试网*f1Z/~R V:C)_4H

.z0dS)s/r0menu

1yCzpZ"Y0

u!hj-r&FC0[Q]怎么样生成日期格式的文件
A!|8zX~:oz M0[Q]测试磁盘与阵列性能51Testing软件测试网#k WyS&o];Pn)jINq
[Q]怎么配置SSH密匙
x#T*g-qt:T4j0[Q]sqlplus怎么与shell结合51Testing软件测试网-L4h`d ^9d
[Q]FTP怎么在脚本中自动上传/下载51Testing软件测试网tj sz;X)O DJ4~'~
51Testing软件测试网2U'l he(o:m

hg2T1U3d"i,K0
^ Oe(`xO0第六部分、OS相关
/POb pS7nS0[Q]怎么样生成日期格式的文件
pU1E{L9Y9D/n)fT0[A]在LINUX/UNIX上,使用`date +%y%m%d` (`这个是键盘上~所在的那个键) 或$(date +%y%m%d),如:
u?mPMu1f0touch exp_table_name_`date +%y%m%d`.dmp51Testing软件测试网ol2K:g&S
DATE=$(date +%y%m%d)
N!g\gLs{~,a@0或者
^+A@["oz0DATE=$(date +%Y%m%d --date '1 days ago') #获取昨天或多天前的日期51Testing软件测试网xd-q%nK ]w
Windows上,使用%date:~4,10%,其中4是开始字符,10是提取长度,表示从date生成的日期中,提取从4开始长度是10的串。你可以改成其它你需要的数字,如:
j2Uij(}y0Echo %date:~4,10%
,[]M7K"t2w}5D\0如果想得到更精确的时间,win上面还可以使用time
M}lu b~)p X051Testing软件测试网_?5G8g,@1^'z
[Q]测试磁盘与阵列性能51Testing软件测试网\5N K3R.O!T\(x
[A]用类似如下的方法测试写能力
~:N&?Esz3`!P'R0time dd if=/dev/zero f=/oradata/biddb/testind/testfile.dbf bs=1024000 count=100051Testing软件测试网agUd m#w w
期间系统IO 使用可以用(unix):51Testing软件测试网BO!EK5f`v
iostat -xnp 2 显示Busy程度51Testing软件测试网s~@$Y1\(L `$K

{9h+AZ S"wY0[Q]怎么配置SSH密匙
d@*^ B;y!Y0[A]可以防止"中间人"的进攻方式
-u!~ jR_d X01、ssh-keygen 或ssh-keygen -d(ssh 2.x)生成钥匙
6o,bi {D L02、然后拷贝公匙到你想登录的服务器,改名为authorized_keys,如果是3.0以下版本,需要改为authorized_keys2
sW[L we03、还可以利用config文件进一步简化操作51Testing软件测试网Y0U`U/R2h? B
51Testing软件测试网xF| MJ
Host *bj51Testing软件测试网w;R[3kgmQ0l:e
HostName 机器名或IP
5x"Q _MR {\0User 用户名51Testing软件测试网;{BJ:N'?[(JZ\n4@
有了这个配置文件,你就可以利用ssh bj来访问指定的机器了,也就可以利用scp与sftp来传送文件了。
4h d{v+[~@~T%eJ0
9JA,H+e c,I~jn4u0[Q]sqlplus怎么与shell结合51Testing软件测试网-`QP8PX3HJ!m;Aqy{
[A]可以用如下的写法
:e]QBJ0sqlplus /nolog << EOF51Testing软件测试网Z6r'U`sFh,ED#dK
connect user/pass
7y*s!G3@4e(Go w V0spool test
KB|G7z N|0select * from tab;51Testing软件测试网L,FY5Jp_4N
spool off
n?\Jj1Y.A0exit51Testing软件测试网&O]+u s X"XP$m-iV
EOF
XA ]\ c2y8f2q*Y7?0当然,RMAN也支持这样的写法。51Testing软件测试网A{*d-aNc

` Le+Y Ji:T]0[Q]FTP怎么在脚本中自动上传/下载
r Dvm`1E%Q0[A]可以把FTP写到shell脚本中,如
IrBQ-`/Q`G0ftp -n -i 主机IP <<EOF51Testing软件测试网${']!W@ h9\Mo.k
user username pass51Testing软件测试网8_3h$^o@S#z
cd 目标目录51Testing软件测试网 S8M8{4})k([K
put file
7p7Gj?e+_`^Y0get file51Testing软件测试网~W1X_%}w+PM
#查询文件51Testing软件测试网x/_}O Hg%b!xG
ls51Testing软件测试网A2ZAk&x_Z \6T
#退出51Testing软件测试网6Br1X eoI%V.M1E
bye51Testing软件测试网N4LS-w#B!pj G:P
EOF
51Testing软件测试网;Ftr/b!Ue


TAG:

 

评分:0

我来说两句

日历

« 2024-04-29  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

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

RSS订阅

Open Toolbar