eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

September 4, 2017

恩墨学院DBA实战培训全新启航

默认标题_自定义px_2017.08.31.png

毫无疑问,当今时代早已经迈入了『数据时代』,数据无处不生、无处不在,也正以前所未有的方式在改变我们的生活。

  • Oracle数据库的地位

而在IT技术领域,数据无疑落地存储在各种各样的数据库之中,在关系型数据库领域,Oracle 数据库是当之无愧的王者,经过40多年的发展,Oracle数据库在RDBMS领域占据了近50%的市场份额,其从业空间无疑是巨大了。下图展示了2015年的IDC调查数据,其中,中国市场Oracle数据库占有率高达56%,高出亚太区52%、全球43.9%的市场占有率。

DBA

时至今日,Oracle DBA的发展也经过了几个阶段,从最初以基本操作和命令行为主的DBA 1.0 时代,到以诊断工具、图形工具为主的DBA 2.0时代,再发展到今天以大规模集中管理、云化管理的 DBA 3.0 时代,Cloud DBA已经成为新的认知共识。从我们近期总结的『Oracle优化方法进化论』也可以看出时代的不断进步。

恩墨学院

  • Oracle DBA向何处去?

有人说,今天 Oracle DBA 的生存空间变差了,收入待遇上缺乏吸引力了,这个认识是相当片面的,事实上,随着一个行业从业人员的增加,职业生存空间上也必然出现分层,分层的结果是,行业供给关系和回报趋于合理,同时职业纵深也必然加大。这是正常的行业进步,给入行者提出了挑战,但是也给予奋斗者和领先者更多的机遇。

从Oracle DBA们20年探索而言,已经成型的道路非常广阔:

1.甲方,凭一技之长,可以怡然自得,守企业数据安危;

2.乙方,解用户疑难,可以快速成长,成技术领域专家;

3.于技术,转型架构师、设计师,引领团队和应用进步;

4.于管理,可以领一彪人马,以数据驱动革新业务形态;

5.创业,以产品服务、数据分析种种可能另辟一番蹊径;

而在任何一个方向,我们都能找到成功的典范,学习先行者的成功经验,校正自己的职业生涯。右图是我们曾经总结的DBA成长树,直至今日,这个历程并未改变。

然而,我们这个时代,也的确提高了对于入行者的门槛,以前凭借自学命令操作安装部署,就能闯出一条道路,可是今天,OCP、OCM都成为入行的基本配置,对于初学者的入行要求提高了几个量级。技术时代快速变化,我们的时间也更加宝贵,这都要求我们能够快速去找到进阶之路。

  • 何以解忧?唯有实践!

虽然很多DBA早早通过了认证考试,但是缺乏实践经验往往让大家在面对挑战时败下阵来。

如何解决这样的困境?如何解决面试和工作时经验的不足?

恩墨学院凭借团队专家服务全国500多家企业客户的实践积累,将企业中遇到的真实案例采集、整理、脱敏、重现出来,将这些真实案例以场景化方式在培训中重演。同时,以服务于企业的工程师进行现身说法,让大家在真实的实践场景中学习成长,并且在培训后期,学员可以通过实习参与到真实的企业服务当中去,通过安全的步骤、标准的方法、进展的实践,让学员真正的实现全程实战化培训。

在过去恩墨学院的实战培训班中,已经有30位以上的学员,在培训后直接入职云和恩墨,走上数据生涯的起点!

恩墨学院的实战课程,既遵循了Oracle数据库的标准知识体系,又融合了来自实战不断更新的企业案例,形成了6大课程体系,81个企业实战案例,360学时的集中培训,让学员一次性超越重重障碍,抵达职业生涯的真实起点!下图是部分课程设计的大纲内容,真实的实战再现是整个课程体系的核心。

恩墨学院

恩墨学院

恩墨学院的课程体系,从学员的角度出发,为不同水平的Oracle学习者制定最适合自身发展的学习计划,加上雄厚的师资力量,帮助学员更快更好地走入数据领域。

以下是在实战班毕业季收到的来自学员的感谢信,他们在恩墨学院经过两个多月的学习成长,最终坚定而自信地迈入职场,也希望将自己的经验与祝福传送给更多的学弟学妹。

"转眼间培训班的课程已经结束,经过2个月的学习,收获了很多知识。感觉参加云和恩墨的DBA实战班是非常有意义的,非常有必要的,因为他不仅让我充实了理论知识,更多的收获了实战经验。从上课老师的理论讲解到课余的实战操作都让我有所收获。与来自全国各地的同学们汇聚一堂,相互交流学习经验,思路方法,全面提高了自己的理论水平和学习能力。"

--恩墨学员 李雄

"如何入门是许多初学者最头疼的事情。Oracle涉及的方面太多了,SQL、管理、优化、备份恢复......那么从哪开始学好呢?如果学过数据库理论,或有一定的数据库基础自然很好;如果没有的话,真的是个大问题。经过了几个月自学,我感觉自学比较茫然,很多东西不知该怎么学,从哪里下手,同时又没有试验环境,有些知识理解起来很困难,学习效率也很低,综合考虑,我决定去参加培训。众所周知,现在的培训机构很多,师资力量也是参差不齐。经过一段时间的搜素和咨询,试听了几家的课程,最终选择了恩墨学院。恩墨学院的课程都是独自研发,理论部分有恩墨学院ACE专家团队编写,训练任务有云和恩墨一线工程师贡献,真实再现DBA工作场景。培训过程以实操训练为主,理论学习为辅,是恩墨学院着力打造的精品特色课程。教辅人员全程指导训练,主讲老师随时答疑解惑,通过考试便可获得云和恩墨一线实习机会,表现优异者直接留用。几个月的学习,印证了我选择的正确性,在老师的帮助下,我建立起了一套完整的学习体系,明白了应该先学什么后学什么,整个学习思路豁然开朗。学习中我补充了我自学无法学到的东西,结业时对ORACLE已经有了一个清晰的理解。"

--恩墨学员 刘正保

『原理通透,思路清晰,操作娴熟,这是恩墨学院实战体系一直遵循的理念,源于实践,学于实战,成于未来』,恩墨学院院长侯圣文如是说。

理论+实践,场景+实习,恩墨学院全流程的实战培训,助力学员开启数据职业生涯,赢在起跑线!

恩墨学院简介

恩墨学院隶属于云和恩墨(北京)信息技术有限公司,Oracle WDP 合作伙伴,致力于提供专业、高水准的数据库培训服务,发掘与培养数据库专业人才,打造数据库精英圈子, 探索数据库培训新模式。恩墨学院讲师团队云集了业内顶尖的技术专家,首席讲师侯圣文(网名 Secooler)、李轶楠(网名 ORA-600)、盖国强(eygle)、张乐奕(kamus)、杨廷琨(yangtingkun)、熊军(老熊)为 ACE Director,强大的讲师团队堪称业内翘楚。目前, 恩墨学院提供包括个人实战技能培训、个人认证培训、企业内训在内全方位数据库技术培训。

Posted by enmotech at 7:44 PM | Permalink | Activity (150)

August 7, 2017

Oracle中如何获取给定SQL的SQL_ID - dbms_sqltune_util0

在 Oracle 数据库中,如何得到给定SQL的 SQL_ID ? 这是曾经被广泛讨论的一个问题。
现在,在Oracle 11g中,Oracle 给出了一个系统包,通过 dbms_sqltune_util0 可以简便的计算出给定SQL的SQL_ID。

SQL> desc dbms_sqltune_util0 FUNCTION EXTRACT_BIND RETURNS SQL_BIND Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- BIND_DATA RAW IN BIND_POS BINARY_INTEGER IN FUNCTION EXTRACT_BINDS RETURNS SQL_BIND_SET Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- BIND_DATA RAW IN FUNCTION GET_BINDS_COUNT RETURNS BINARY_INTEGER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- BIND_DATA RAW IN FUNCTION IS_BIND_MASKED RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- BIND_POS BINARY_INTEGER IN MASKED_BINDS_FLAG RAW IN DEFAULT FUNCTION SQLTEXT_TO_SIGNATURE RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SQL_TEXT CLOB IN FORCE_MATCH BINARY_INTEGER IN DEFAULT FUNCTION SQLTEXT_TO_SQLID RETURNS VARCHAR2 Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SQL_TEXT CLOB IN FUNCTION VALIDATE_SQLID RETURNS BINARY_INTEGER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- SQL_ID VARCHAR2 IN
函数 sqltext_to_sqlid 用于实现这个功能,以下测试使用了一个简单的SQL查询。
注意Oracle在SQL最后加入一个 chr(0) 的不可见字符,我们需要补齐:
SQL> select dbms_sqltune_util0.sqltext_to_sqlid('select sysdate from dual'||chr(0)) sql_id from dual;

SQL_ID
-------------------------------------------------------
7h35uxf5uhmm1

接下来看一下执行这个查询,数据库中自动生成的SQL_ID,与通过函数转换生成的完全一致:
SQL> select sysdate from dual;

SYSDATE
------------
07-AUG-17

SQL> select sql_id from v$sql where sql_text='select sysdate from dual';

SQL_ID
-------------
7h35uxf5uhmm1

Oracle 的改进一点点向前。

Posted by eygle at 7:33 PM | Permalink | Internal (125)

July 12, 2017

Oracle SQL和PL/SQL中字符串单引号的处理

在 Oracle 的查询中,经常因为字符串要添加单引号,但是单引号的位置和个数往往不易把握。很多朋友都问过这样的问题。

请看以下查询,最外层的两个单引号作为引号操作符,第二个作为转义符号,随意第三个单引号是真实的数据输出,所以,以下查询输出的是第三个单引号:

SQL> select '''' from dual;

'
-
'

进一步的,如果我们希望在字符串中也留有单引号,那么会是这一个样子的:

SQL> select '''YUNHE''ENMO' from dual;

'''YUNHE''E
-----------
'YUNHE'ENMO

SQL> select '''YUNHE''''ENMO' from dual;

'''YUNHE''''
------------
'YUNHE''ENMO

SQL> select '''YUNHE''''ENMO''' from dual;

'''YUNHE''''E
-------------
'YUNHE''ENMO'

总之,只要理解转义符号的存在,处理单引号就不复杂了。

Posted by eygle at 6:01 PM | Permalink | FAQ (252)

July 7, 2017

Oracle Mutex 等待事件之: cursor mutex X

Cursor Mutex X 是当会话对某个 Cursor 请求排他模式锁,但是该Cursor 上已经有 S 或 X 模式的锁定,因而产生的等待。

The session requests the mutex for a cursor object in exclusive mode, and it must wait because the resource is busy. The mutex is busy because either the mutex is being held in exclusive mode by another session or the mutex is being held shared by one or more sessions. The existing mutex holder(s) must release the mutex before the mutex can be granted exclusively.

ParameterDescription

P1

Hash value of cursor

P2

Mutex value (top 2 bytes contain SID holding mutex in exclusive mode, and bottom two bytes usually hold the value 0)

P3

Mutex where (an internal code locator) OR'd with Mutex Sleeps

需要持有 Cursor Mutex X 的操作主要有:

  • 在父游标下创建新的子游标,但是这类操作在11.2之后被 Build Lock 替代,不再需要;
  • 捕获SQL中的绑定变量;
  • 更新、生成 SQL 统计信息,主要是 V$SQLSTATS 的内容;
  • Cursor Mutex X 主要指对于父游标的操作;
  • Building a new cursor under a parent
    • Although this operation is cheaper, building many cursors under a parent cursor is not recommended.
  • Capture SQL bind data
  • Build or Update statistics blocks
  • Mutex is in the parent cursor.

以下是在生产环境中观察到的实际现象,注意在获取 cursor:mutex X 的过程中,调用的底层函数是kkscsAddChildNode 这是增加子游标的操作,需要进一步的获取排他Mutex ,使用的函数是 kgxExclusive :

SQL> select sid,event,p1,p2,p3 from v$session where username='EYGLE' and sid=135;
       SID EVENT				      P1	 P2	  P3
---------- ---------------------------------- ---------- ---------- ----------
       135 cursor: mutex X		       978779761 1.6063E+12 1.4603E+11

SQL> oradebug short_stack;
ksedsts()+461<-ksdxfstk()+32<-ksdxcb()+1876<-sspuser()+112<-__sighandler()<-semtimedop()+10
<-skgpwwait()+160<-ksliwat()+1865<-kslwaitctx()+163<-ksfwaitctx()+14<-kgxWait()+650
<-kgxExclusive()+295<-kkscsAddChildNode()+337<-kkscscid_opt_eval()+1290<-kkscsCheckCriteria()+211
<-kkscsCheckCursor()+783<-kkscsSearchChildList()+1262<-kksfbc()+12105<-kkspsc0()+1173
<-kksParseCursor()+116<-opiosq0()+1588<-opipls()+11479<-opiodr()+916<-rpidrus()+211
<-skgmstack()+148<-rpiswu2()+638<-rpidrv()+1384<-psddr0()+473<-psdnal()+457<-pevm_EXIM()+308
<-pfrinstr_EXIM()+53<-pfrrun_no_tool()+63<-pfrrun()+627<-plsql_run()+649<-peicnt()+301
<-kkxexe()+525<-opiexe()+17785<-kpoal8()+2224<-opiodr()+916<-ttcpip()+2755<-opitsk()+1717
<-opiino()+966<-opiodr()+916<-opidrv()+570<-sou2o()+103<-opimai_real()+133
<-ssthrdmain()+252<-main()+201<-__libc_start_main()+253<-_start()+36

关于Mutex 的使用一直在变化之中。

Posted by eygle at 5:12 PM | Permalink | FAQ (252)

July 6, 2017

Oracle Mutex 等待事件之: cursor: mutex S

Cursor: Mutex S 等待事件是指,一个会话以共享模式请求一个Mutex,而其他会话以排他模式正在持有Cursor 上的 Mutex。

文档说明可以看到,此处的Mutex是位于 Cursor 对象上的固有 Mutex,也就是针对 Parent Cursor 的。这个等待的第一个参数会披露出 SQL 的 Hash Value。

A session waits on this event when it is requesting a mutex in shared mode, when another session is currently holding a this mutex in exclusive mode on the same cursor object.

ParameterDescription

P1

Hash value of cursor

P2

Mutex value (top 2 bytes contain SID holding mutex in exclusive mode, and bottom two bytes usually hold the value 0)

P3

Mutex where (an internal code locator) OR'd with Mutex Sleeps

Posted by eygle at 5:05 PM | Permalink | FAQ (252)

近期发表

  • Oracle Mutex 等待事件之: cursor pin X - July 5, 2017
  • Oracle Mutex 等待事件之: cursor pin S - July 5, 2017
  • Oracle 11.2.0.4 和 12c 安装 INS-30131 临时位置权限解决 - July 3, 2017
  • Mac微信客户端的备份恢复功能和备份文件存储 - June 12, 2017
  • Oracle 11.2.0.4 最终版本发布以来的 Oracle PSU 列表 - June 8, 2017
  • 云和恩墨 Oracle Database 12.2 体系结构图海报发布 - May 19, 2017
  • 在Mac上通过Docker部署Oracle Database 12.2版本 - May 18, 2017
  • Oracle数据库中 MISSING 文件名称的出现和处理 - May 17, 2017
  • 警惕:Oracle中删除的分区不会进入回收站(Recyclebin) - April 25, 2017
  • 如何修改 VirtualBox 虚拟机的磁盘大小 - April 25, 2017


  • CopyRight © 2004 ~ 2012 eygle.com, All rights reserved.