OCM,与技术能力无关

Posted by boypoo on January 15th, 2010

我在招聘帖子里说过,我这里提供OCM免费考试机会,当然也欢迎OCM加入我们的团队。

但是,并非是说OCM就真的是Master(大师)了,因为几乎绝大多数考试到了中国后,都可以在5年之内泛滥,OCM也不例外。

最近面试了一些朋友,其中有一个都在09年通过了OCM。但是我的同事们面试过后,却连连摇头。这多少让我有些诧异。

为了安全起见,同一个人,我都会安排2-3个同事先后电话面试,结束前他们不能交流各自的看法。

但是当聚集在会议室的讨论,意见却基本一致————OCM已经失去意义。他们认为,这位朋友的经验和基础能力只能算作中级水平。

其实这不是个案,在这里也不是为了贬低这位朋友。因为老耿在去年5月份考完OCM就曾向我吹嘘,这玩意,三天我就搞定了。

所以,如果有免费的机会参加OCM考试,那不要拒绝,go!

如果自费去,那坚决不要!

如果你看到了OCM,那不要迷信,看看再说!

OCM终归来说,就是一场已经基本透明化的考试而已!

按照机械的步骤,只要你的运气不是太酶,收获率还是大大地!

不过,我要说一句,我不是OCM,也不准备是。

—eof—

Can U restore the dropped procedure?

Posted by babyblue on December 23rd, 2009

这是个挺极端的话题,因为标题中问题的前提是:没有任何备份。

不要抱怨,“命苦不能怪政府,点背不能怨社会” ^_^

而我一个同事,就真正碰上这样的问题。当然,最后也成功恢复了。

有人会想到logminer和archive log,但是sp被删除时archive log并不记录sp的文本内容。当然logminer有用处,起码能定位到准确的删除时间。

存储过程的文本内容通常被记录在source$中。

SQL> conn blue/blue

Connected.

SQL> create or replace procedure sp_test2

2     is

3     begin

4       dbms_output.put_line(‘procedure restore’);

5     end;

6     /

Procedure created.

SQL> conn / as sysdba

Connected.

SQL> select s.obj#,s.source from source$ s,obj$ o

2  where s.obj#=o.obj#

3  and o.name=’SP_TEST’;

OBJ# SOURCE

———- ————————————————–

53258 procedure sp_test

53258    is

53258    begin

53258      dbms_output.put_line(‘procedure restore’);

53258    end;

不过可惜的是,当sp或整个schema被drop后,source$中对应的内容也一并被删除。

21:56:42 SQL> drop procedure blue.sp_test;

Procedure dropped.

21:56:54 SQL> select s.obj#,s.source from source$ s,obj$ o

21:57:20   2  where s.obj#=o.obj#

21:57:20   3  and o.name=’SP_TEST’;

no rows selected

我们想要得到的,是过去某个时间点里source$中的内容。

然而,sys schema下不支持flashback table,Oracle不允许你这么干,如果部分数据字典表被回退到过去的时间点,这全乱套了。

有人用flashback database,没错,这确实可以实现,只是,这也太小题大作了吧?辛辛苦苦几十年,一下回到解放前。

so,why not flashback query?

21:59:53 SQL> select obj#,name from obj$ as of timestamp  sysdate-5/1440

21:59:55   2  where name =’SP_TEST’;

OBJ# NAME

———- ——————————

53258 SP_TEST

22:00:22 SQL> select obj#,source from source$ as of timestamp sysdate-6/1440

22:00:24   2  where obj#=53258;

OBJ# SOURCE

———- ————————————————–

53258 procedure sp_test

53258    is

53258    begin

53258      dbms_output.put_line(‘procedure restore’);

53258    end;

回到最开始的话题,2点警示:

1、制订完善的备份策略并实施

2、规划日常操作

how to find out implicit conversion

Posted by babyblue on December 11th, 2009

隐式转换是DBA们所不愿意看到的,有人说“I believe implicit conversion to be bad. Badder. Evil. A serious no-no!”

举个例子:

有一条SQL

select * from t_table where id=:1;

说明:t_table记录量在数万条,id varchar2类型,主键。

1.用户用pl/sql等工具执行非常快。

2.在应用中执行该语句非常慢,通过statspack,awr等发现,并且发现是全表扫描。

这种情况很有可能是绑定变量类型不匹配而导致的。

某些情况下,隐式转换会让数据库性能变得很糟糕。有同事处理过这样的案例,在消灭隐式转换后,原本一个需要2小时的业务操作可以在6秒内便可完成。
Oracle也强烈建议使用explicit conversion而不是implicit conversion,explicit conversion相比implicit conversion有如下的好处:

SQL statements are easier to understand when you use explicit datatype conversion functions.

Implicit datatype conversion can have a negative impact on performance, especially if the datatype of a column value is converted to that of a constant rather than the other way around.

Implicit conversion depends on the context in which it occurs and may not work the same way in every case. For example, implicit conversion from a datetime value to a VARCHAR2 value may return an unexpected year depending on the value of the NLS_DATE_FORMAT parameter.

Algorithms for implicit conversion are subject to change across software releases and among Oracle products. Behavior of explicit conversions is more predictable.

在发生隐式转换SQL的诊断过程中,我们使用一些第三方的工具看到的执行计划往往没有异常。因为在使用这些工具的时候,解释的是用户手工输入的而不是应用程序产生的SQL.

那么,如何确定应用程序的SQL是不是发生了隐式转换呢?

在Oracle 10g提供过滤谓词的信息当中,包含了是否发生转换。

查看过滤谓词的方式较多,比如autotrace  、explain plan、utlxpls、dbms_xplan等。

前面3种方法需要手工输入SQL文本,所以看到的同样不是我们需要的结果。而10g中dbms_xplan可以通过指定SQLID来查看用户关心的特定SQL。

SQL> select /*+ hint1 */hiredate from scott.emp where    hiredate between ‘17-DE

C-80′ and ‘20-FEB-81′ ;

HIREDATE

———

17-DEC-80

20-FEB-81

SQL> col sql_id for a20

SQL> select sql_id,sql_text from v$sql where sql_text like ‘%hint1%’;

SQL_ID

——————–

SQL_TEXT

——————————————————————————–

2k4kk1zvp8jz1

select /*+ hint1 */hiredate from scott.emp where    hiredate between ‘17-DEC-80′

and ‘20-FEB-81′

28n8kr51sv6s6

select sql_id,sql_text from v$sql where sql_text like ‘%hint1%’

SQL> select * from table(dbms_xplan.display_cursor(‘&SQLID’));

Enter value for sqlid: 2k4kk1zvp8jz1

old   1: select * from table(dbms_xplan.display_cursor(‘&SQLID’))

new   1: select * from table(dbms_xplan.display_cursor(‘2k4kk1zvp8jz1′))

PLAN_TABLE_OUTPUT

——————————————————————————-

SQL_ID  2k4kk1zvp8jz1, child number 0

————————————-

select /*+ hint1 */hiredate from scott.emp where    hiredate between

‘17-DEC-80′ and ‘20-FEB-81′

Plan hash value: 3896240783

—————————————————————————

| Id  | Operation          | Name | Rows  | Bytes | Cost (%CPU)| Time     |

—————————————————————————

|   0 | SELECT STATEMENT   |      |       |       |     3 (100)|          |

PLAN_TABLE_OUTPUT

——————————————————————————-

|*  1 |  FILTER            |      |       |       |            |          |

|*  2 |   TABLE ACCESS FULL| EMP  |     1 |     8 |     3   (0)| 00:00:01 |

—————————————————————————

Predicate Information (identified by operation id):

—————————————————

1 – filter(TO_DATE(‘17-DEC-80′)<=TO_DATE(‘20-FEB-81′))

2 – filter((“HIREDATE”<=’20-FEB-81′ AND “HIREDATE”>=’17-DEC-80′))

21 rows selected.

SQL>

然而9i的过滤谓词没这么详细的信息,v$sql 视图中不包含SQLID信息,dbms_xplan中也不提供display_cursor这样的function。就是说,9i不能用以上的方法来辅助判断。

那Oracle 9i下怎么办呢?

试试10046吧,部分级别的10046 trace内容中包含了绑定变量及其变量类型dty信息。

Trace文件可能会包含类似内容:

bind 3: dty=180 mxl=11(11) mal=00 scl=00 pre=00 oacflg=01 oacfl2=0 size=0 offset=72

bfp=ffffffff7f5500f0 bln=11 avl=11 flg=01

value=

Dump of memory from 0xFFFFFFFF7F5500F0 to 0xFFFFFFFF7F5500FB

FFFFFFFF7F5500F0 78640101 0A353619 08B10000           [xd...56.....]

bind 4: dty=180 mxl=11(11) mal=00 scl=00 pre=00 oacflg=01 oacfl2=0 size=0 offset=88

bfp=ffffffff7f550100 bln=11 avl=11 flg=01

value=

下表为Oracle内部的数据类型代码

Data Type Numeric Type Codes

0 placeholder for procedures with no arguments
1 VARCHAR, VARCHAR2, STRING, NVARCHAR2
2 NUMBER, INTEGER, SMALLINT, REAL, FLOAT, DECIMAL
3 BINARY_INTEGER, PLS_INTEGER, POSITIVE, NATURAL
8 LONG
11 ROWID (old)
12 DATE
23 RAW
24 LONG RAW
58 OPAQUE TYPE
69 ROWID (new)
96 CHAR (ANSI FIXED CHAR), NCHAR, CHARACTER
100 BINARY_FLOAT
101 BINARY_DOUBLE
106 MLSLABEL
121 OBJECT
122 NESTED TABLE
123 VARRAY
178 TIME
179 TIME WITH TIME ZONE
180 TIMESTAMP
181 TIMESTAMP WITH TIME ZONE
231 TIMESTAMP WITH LOCAL TIME ZONE
250 PL/SQL RECORD
251 PL/SQL TABLE
252 PL/SQL BOOLEAN

武汉 南京 杭州 招oracle工程师

Posted by boypoo on November 16th, 2009

要求: 初、中级别
职责: 1.给客户提供Oracle技术支持工作
基本条件:
1、有2年或以上数据库维护经验,理解oracle概念
2、熟悉1种以上UNIX操作系统(AIX, HP-UX, Linux, Solaris),对存储及网络有一定了解
3、了解RAC、DG、Partition
4、对oracle产品线有一定了解
5、良好的文档编写习惯
6、有较强的学习能力,很快地掌握新技术
7、有很好的职业道德及团队精神

这里有:

1.宽松的工作环境,良好的工作氛围
2.友好、协作、积极的团队
3.每年有Oracle、AIX、存储的培训机会
4.每年一次与全国工程师见面交流的机会
5.定期区域技术交流
6.3年内通过OCM考试,培训、考试费公司报销

待遇,视能力而定,面议!

有意者请发简历到boypoo@gmail.com (希望您:1.不要用附件,附件的邮件一律忽略;2.在邮件标题上写上您的名字)

满足条件的请多多支持! 所有朋友的邮件,我将一一回复,谢谢!

坐台小姐应该怎么选择?

Posted by boypoo on October 26th, 2009

一个技术较好的同事,是部门里的干将之一,经常被客户指明要求去服务,出台较多多。但最近由于不堪某客户的态度,出于对该职业的悲观情绪,出离愤怒的想要辞职了。

这是一个很好的同事,有着技术工程师最重要的学习能力和技术爱好。因此,这引起了我的思考。

于是杜撰了如下故事:

一群身强力壮的男人进了一家夜总会,然后老鸨带着很多小姐过来了。其中一个人,是老板,但是身上有很严重的狐臭,隔老远都能闻到。很自然的,老板先挑。小姐们一批批的来,一批批的去,终于,这家夜总会的镇店之宝,文成公主,出现了,老板满意之。

然,公主一被搂入怀中,就猛打喷嚏。

她会怎么做呢?

为什么故事里要是一群男人,且该男子是老板。代表甲方是强势群体。

如果是一两个人,遇到这种情况,我猜想,文成公主有可能直接发飙,怒斥该男子。但是,一群人,她就得掂量掂量,一发飙可能会被揍死。

那么,这种情况,最好的选择似乎是小姐就只好自认倒霉。

如果接二连三的发生这种情况,这公主是不是就考虑从良或自尽呢?

唐太宗(夜总会老板)是否可以帮助这位文成公主么?

不得而知,不能入眠。仅记之200910110335。

杭州.全国工程师会议

Posted by boypoo on October 8th, 2009

全国工程师会议的主要目的本身不是技术本身,而是有个让兄弟们聚在一起吃牛聊天的机会。

会议的地址原本定在花港海航酒店,但由于销售部门与五洋假日酒店有协议,加之更便宜些,所以最后定在了五洋,不过还是要感谢ningoo和blue_prince(roby)的热心推荐。

本次会议历时两天,预计主题如下:

扫盲型: 1. Oracle数据安全产品 
                    2. 中间件服务市场与未来

基础型:
                     1. RAC for WIN部署与排错 
                     2. 浅析数据迁移
                     3. 索引与查询

深入型:
                    1. CBO探索 
                    2. Oracle索引与性能
                    3. Oracle块操作与BBED
     4. 数据块与空间管理
     5. Oracle内存结构深入分析

 期待同事们的精彩分享。

expdp很慢 impdp很快

Posted by boypoo on September 29th, 2009

Expdp 很慢 impdp很快
又要签一个合同,毕竟还是很happy的事。
签合同之前,客户抛出来一个小问题,是的,对将要进行的合同来说,这个问题绝对只是九牛一毛。这是个问题是,客户一个比较关键、但是中小型的数据库(数据文件100G以内),导出花了1个多小时,导入只要5分钟。导出导入的工具是用的Oracle10gR2的expdp,数据库是Oracle10.2.0.4 ,平台是AIX5300TL4. EXpdp慢的问题,让我想起了南京事件(http://www.zhihong.org/nanjing_expdp_image.html)。
当时是一个expdp 时快时慢的问题,消耗了数家高手而未决,最后花了我一个周末的case。 今天的情况明显不同,因为这次是一直慢。通过测试,发现是其中的带有lob字段的一张大表比较慢。既如是,事情就比较好办了,先看看是否有相关的bug。

Jacky查到了如下bug:

Bug 5599947 – Export Data Pump is slow when table has a LOB column
- Defect:  Bug 5599947 “DATAPUMP EXPORT VERY SLOW”
Symptoms:  Export Data Pump has low performance when exporting table with LOB column
- Releases:  11.1.0.6 and below
- Fixed in:  not applicable, closed as not feasible to fix
- Patched files:  not applicable
- Workaround:  if possible re-organize the large table with LOB column and make it partitioned
- Cause:  if a table has a LOB column, and the unload or load takes place in “External Tables” mode, then we cannot make use of parallel I/O execution Processes (PX processes)
- Trace:  not applicable
- Remarks:  see also Bug 5943346 “PRODUCT ENHANCEMENT: PARALLELISM OF DATAPUMP JOB ON TABLE WITH LOB COLUMN”

 方案可以比较简单,这张lob表用传统的方式exp/imp,其余的用expdp,导出的使用使用exclude选项。当然,如果嫌麻烦,1小时也不是太长的时间。

旁听一堂英语课

Posted by boypoo on September 27th, 2009

周五晚通宵,周六电话骚扰,周日不停写报告,周一现场,然后周二就调休了一下。

正好老婆周二上午要去上英语课,并吹嘘他们的英语老师很风趣,老师不点名,不打考勤,还口出狂言不听是学生的损失。于是蠢蠢欲动。

南浦大桥在改修,所以迟到了10分钟到的课堂。

在后门中间的玻璃缝中看到老师讲的激情四射,学生们聚精会神的听课样,我有点打退堂鼓了。可惜被老婆一把逮住,没跑掉。

今天讲的是主题是Healing your self,之前应该讲过Know yourself.之后一堂应该是 Conquer yourself.

讲课的老头很幽默,听课的同学哈哈大笑的时候我还在莫名其妙(所以还是有点想睡觉)。

虽然大部分没听懂,不过还是记住了几个句子,觉得有意思,记录一下:

1.如果某个人好久没吃饭了(晕死,差点写成没睡觉了),看到他狼吞虎咽的样子,你不能说please eat slow,那不是英语,你应该说 pace yourself .Its real English.

2.如果你在校园里看到漂亮的小姑娘,follow她,然后人家说 I accompanied with my boyfriend,你就要小心了。如果你抢了银行,上车后你的同伴说,we are accompanied,那就是警车来了。

3.如果别人问你的事你刚好不知道,不说Idon’t know,最好说I have little idea.

4.handle/deal with/cope with /approach是同义词哦

最后,Psychologically,do something positive and meaningful add balance to my existence。

搜了一下,百度百科里有他的记录:

Read the rest of this entry »

电话支持

Posted by babyblue on September 2nd, 2009

在城西蹲了三天,终于把这个客户积累一个月的大小问题悉数处理完毕。签完服务单,小心翼翼的穿过没有爱心的斑马线,人品神奇的爆发,竟然在下班高峰期很快坐上一个出租车。

正窃喜呢,电话响了,另外一个客户的号码。

“兄弟,出事了”。这哥们向来很正规的称呼我潘工,突然叫兄弟,看来是真碰到什么麻烦了。

“我修改了一套库的内存设置,现在数据库起不来了”他接着说。

“把参数改回去,先把库起来”我没多思索,跟他说。

“我用的是spfile”。他说。

“strings或cat查看spfile内容然后复制出来,编辑initSID.ora文件,将内容贴进后把内存设置改回去”对方有点慌乱,我此时更需要条理清晰。“startup时指定pfile启动。”

“好的,我试试”一阵键盘声后,他说“还是不行,报控制文件出错”

我心头一惊,难道控制文件出错了?自己不在电脑旁,没法看错误码,也没法Google。

“你看看pfile中指定的控制文件位置对应的控制文件是不是都存在”我考虑了一下,跟他说。

“都在”

是我自己提醒了自己,控制文件的位置。忽然想起来自己刚刚教他是用复制spfile内容的方法创建的pfile。换行,没错,应该是换行。

“你vi刚创建的pfile文件,到控制文件那一行的末尾输入x 试试”

对方明白了我的意思是换行有问题,修改后很快将数据库起来了,善后工作在这里暂且不提。

biti大师在pub上说过一段话,印象尤为深刻。“我理解的思考问题的方式或者思维方式,就是如何有效地根据已有的知识和经验 去解决 未知的问题,去解决没有这方面经验的问题。”。是的,直接的粘贴跟编辑在换行处理上不一样我的客户应该也知道,他没想到而已,当然,他或许只是太慌乱了。他错过了一个机会,一个用他自己已有知识解决于他而言有点恐惧的问题的机会。当然,我应该教客户用create pfile from spfile。

他或许想到了Google,但Google只知道控制文件出错,它并不知道我们用的参数文件是复制粘贴来的。Google还不能代替我们思考,起码目前不能。

菜在推上曰“上网以后,我们把信息当做了知识,把收藏当做了学习,把阅读当做了思考,把储存当做了掌握。像个花栗鼠在秋天收藏坚果一样,把自己的阅读器和硬盘塞满,却依旧觉得饥渴难耐。”

这段话太精辟了,不得不赞。

坐在玄武湖畔

Posted by boypoo on July 24th, 2009

南京站是个好地方,出了地道,就是宽大的广场,还有这略带神秘的玄武湖。

我喜欢宽大的地方。走出上海的蜗居,我就会很开心。

雨后秋天的午后

独自坐在玄武湖畔

掠过湖面

缓缓飘来

摩挲着脸庞

闭上干涸的眼睛

幻觉顿生

Read the rest of this entry »


Copyright © 2007 数据工人. All rights reserved.