Jonathan Lewis 世界级Oracle资深专家,有20多年Oracle关系数据库管理经验。主要从事自由咨询顾问工作,其Oracle数据库引擎方面的培训课程和研讨会世界闻名。Jonathan曾是UKOUG(UK Oracle User Group)的负责人,他著有多本Oracle方面的畅销书,并维护自己的Oracle技术博客。他的博客:http://jonathanlewis.wordpress.com |
图灵社区: Oracle的自动化程度变得越来越高,很多需要人为介入的优化手段也变得越来越简单。在这种情况下,DBA怎么才能跟上发展、更好地提高数据库的效率?
JL:要想跟上Oracle的发展是十分困难的。我之所以无法完成我想要写的书,就是因为我总是跟不上(笑)。虽然我可以解决很多实际问题,就算面对全新的难题,我也可以通过了解Oracle的表现,结合它的工作原理,很快诊断出问题。但是我却无法反向推断,如果你告诉我某种情况,我可能无法说出Oracle会做什么。我现在已经很难再进行预测了,但是我可以根据问题找原因。跟上发展的意思我认为应该是预前判断Oracle的工作状态,要做到这些,我认为要有足够的经验。
阅读手册是十分重要的事。我认为市面上还有两三本书,也可以帮助你掌握必要的信息。Christian Antognini有一本书叫做《Oracle性能诊断艺术》,在这本书中,他讲述了很多Oracle运作的知识,以及如何利用工具找到问题,同时也提出了如何解决问题的建议,这样的好书会教你Oracle怎么工作,然后会举一些例子告诉你Oracle能完成什么。如果你仔细读过手册,也读过这些书,你就知道如何构造模型,如何用特殊方式建立两个表,如何选择查询,如何选择Oracle的特性……你可以亲手实践手册或者从《Oracle性能诊断艺术》里学来的东西,然后自己创造出一个可以解决自己实际问题的办法。通过亲力亲为的实践这些知识,你就会知道Oracle可以做什么,什么又是错的了。我认为实践是最好的学习方法。
但是很多人没有时间来做这些事。你的公司可能会说:9点到岗,5点之前不许下班。这样你就没有空余时间,一直都忙着做别人安排好的事情。每天重复做同样的事,一做就是5年,于是你没有时间跳出来,尝试一些新方法。
有两个办法可以帮你获取更多的经验。第一个就是像今天这样的大会是很好的机会。你可以离开你的工作,听听别人分享的经验。你会得到很多新的启发,也会找到解决问题的不同方法。得到这样的启发是大有裨益的。
另外一点就是,我作为一个咨询师,我工作的方式会让我每年大概接触到20家公司,我就会知道20种运作方式。大多数人只能有机会看到Oracle如何工作的冰山一角,但是我几乎有机会看到全貌。所以关于在Oracle上可以做什么,我可能更有经验。常规公司的DBA经常会说:我们公司在过去5年中就是这么做的,我们有其他的办法吗?DBA们应该经常安排自己重头思考一下,忘掉自己惯常的做法和思路,重新读手册,看看能不能想到一些新的办法。对于我来说,如果我看到你们在做的工作,我可能会想出5种不同的方式来达到同样的目的,因为我见过这些方式。对于 Oracle来说,完成任务的方式多种多样,而普通DBA只能看到他每天接触的方式。所以,要成为出类拔萃的DBA,你就必须去了解和尝试不同的做法。这些学习会花费你的时间,但是这也是必须要做的事。
图灵社区:你作为一位独立Oracle性能专家是如何工作的?在接到一个新案子之后你询问的第一个问题是什么?
JL:我还是挺出名的,所以经常会接到电话或者是邮件说:我们这出问题了,你下个礼拜哪天有时间能来一趟吗?我大概每周工作3天时间,我还要留出一天做一些很重要的试验,来了解Oracle,了解更好的运作方式,剩下一天我会从事写作,无论是书还是博客。所以接到这样的电话,我通常都是有时间的,也许是下周,也许是下下周。
一般我在接到工作的时候,他们都会告诉我,哪里出了问题,需要我来做什么。在整个解决问题的过程中,我第一步需要了解的永远都是:你们想要这个系统做什么?出现问题时的状况是什么样的?并不是Oracle在干什么,机器在干什么,而是用户在做什么。然后他们可能就会说,银行系统处理了大批量的境外交易,每个月我们在做账目核对的时候,就会出现性能问题。这就会告诉我他们平常的进程是什么,当在某天引入特殊进程的时候就会出现严重的性能问题,这两个进程之间哪里发生了冲突,它们的运行机制是什么。经常会有这样的情况,在得知业务在做什么,然后转入Oracle问题的时候,我就可以预测出数据库服务器上Oracle出现的是什么类型的问题。一旦我得到整体的情况,就可以追踪到具体的代码了,我开始检查数据库结构,询问为什么要建立这个索引,想通过它做什么。然后重新运行,如果不行就导出性能数据,找出AWR报告、历史信息存储,以及其他Oracle能提供的信息,由此得出下一条线索。
图灵社区:我知道您满世界解决Oracle难题,现在您已经去过超过50个国家了。你有没有在这过程中遇到过很棘手很难解决的问题?
JL:中国应该是第52个国家了(笑)。确实有这样的情况,很难判断问题究竟出在哪里。有的时候问题其实是一个Oracle bug,但是很难证明。有时候会遇到关于并发行为很稀有的问题,两件事必须严格在同一时间发生才能出现这个问题。于是我就只能说有可能是什么出了错,于是解决方法很有可能就是需要绕过这个问题。有那么几次,我最终也无法说出是哪里出了问题,虽然我知道在什么条件会产生这样的问题,但是我无法给出足够的信息来从根本上解决这个问题,甚至都没办法提供足够信息找到Oracle向他们寻求产品改进。我们能做的只能是建立历史记录,证明问题确实发生了。还有几次,在我找出问题后,其他人在我之前找到了解决方法。在我从业的25年中,有一两次这样的情况。
图灵社区:你有没有打算建一个团队来从事现在的咨询业务?
JL:大家总在问我这个问题。他们总是说:我可以为你的公司工作吗?事实上,我没有公司。我觉得有了公司之后就要为这个公司负责,这样就没法一直做自己喜欢的工作了。而这两点对我来说都没有什么吸引力。我不想为找到合适的工作者而发愁,我无法给出这就是他们需要用来养家糊口的工作的保障。所以,可以说我从来都没有考虑过成立一个公司。
图灵社区:当你的孩子还小的时候,你不仅要写书,还要忙着满世界做咨询服务,你是如何分配你的时间的?
JL:在1999年,当我的孩子还很小的时候,我开始写我的第一本书,当时还没有人像我一样做Oracle的咨询工作,大家当时都忙着重新编写程序,所以我觉得很有必要写一本书。我下决心花上半年的时间写这本书,暂时放下平常的工作。我告诉我的家人:我要写书了!第二天,我的女儿对我说:“你还在写那本书吗?”她以为我花了一整天写书,第二天肯定应该写完了!
在我的孩子很小的时候,大概是12岁之前,我会尽量少出门做咨询,可以说我基本没怎么出远门。在他们大一些之后,我重新开始我的咨询工作,但是我会保证周末一定在家。我不会在一周内工作超过5天。今天大概是我25年中第三次,我周末没有和家人在一起。
图灵社区:这可能是你作为独立专家的福利之一吧。
JL:是的,我已经把很多人引诱到加入这个行列了(笑)!我跟他们说:如果你们周末工作的话,就要花上两倍的时间,如果你们星期天工作的话,就要用上三倍的时间。
图灵社区:想以数据库作为事业的人通常面临两个选择,一个是作为DBA,另一个是作为开发者。你对面对这两个选择犹豫不决的人有什么建议吗?
JL:对我来说最大的问题就是我所看到的Oracle应用,它们没有体现出大家所说的DBA和开发者之间足够的合作性。有些人接受具体任务,他们写的代码需要和Oracle数据库交流,还有人管理Oracle数据库,他们整天看数据库的SQL。有时候他们会说:这人会不会写SQL啊?这写的是什么呀?我认为不应该有这样的分界线。如果你的应用背后有Oracle数据库,你应该知道数据库是如何工作的,这样开发者和DBA之间的对话就会更有效。
很多DBA抱怨,现在的数据库很大程度上就是按按钮。如果你是一位DBA,你可能这辈子都在做支持,没有机会接触像我所做的这些有趣的东西。如果你想精通如今的Oracle,并且享受你在Oracle上的工作,我认为你应该把自己放在两种工作的中间。这样你就会了解数据如何工作,就会享受和数据库交互的过程,也会喜欢和业务应用交流的过程,你会知道如何构建自己的代码和数据库更好的交流。所以,“DBA开发者”也许才是最合适的位置,并不仅仅作为一个程序员,而是一个和数据库有亲密接触的程序员,享受数据库所能提供的帮助。当然,这可能需要找到一家能够提供这样位置的公司。
图灵社区:对于内核和功能,你认为关注哪个更重要?
JL:我认为每个人都应该熟悉undo和redo的运行方法,每个人也应该了解一些类似库缓存如何工作的知识,因为他们应该知道,在完成一个很简单的任务时,后台都发生了些什么。也许你不需要对所有事情都知道得一清二楚,但是你需要知道什么时候需要干什么,需要对整体有一个把握。一旦你对所有事都有了大概的了解,我认为你不需要再有更深的考虑了。大多数人需要知道的就是索引表怎么工作,群怎么工作,压缩索引有什么好处。当你改变数据的时候,当你需要优化的时候,你就知道如何避免信息阻塞。基于此,你就可以去研究一下物理设计,这就是你需要掌握知识的上线了。
我对OTN数据库论坛上的一件事感到很有趣,几乎每周,论坛上都会有一个问题“如果我把这行上移到这里,而不提交,在这之后我们运行了很久,但是突然间数据库崩溃了,Oracle会如何处理这件事?”我对这类问题出现的频率感到惊讶,因为从很多方面来说,需要了解这些事的人非常少,你不需要知道如何解决和为什么这么解决,只需要知道它就是这样就够了。多掌握一些知识当然好,但是如果这需要耗费你大量的时间和精力的话就不划算了。人们总是不厌其烦的问我这些问题,这其实也是我写这本书的一个原因,你们来看书吧,别问了。
图灵社区:如果您的子女对计算机科学感兴趣,你会让他们选什么具体的方向呢?
JL:我的孩子对计算机科学一点都不感兴趣,甚至对科学都没什么兴趣。他们主修的都是艺术。如果要我给其他的人建议的话,我其实没法给出具体的建议。我对自己从事的工作很喜欢,我也鼓励别人做自己真正感兴趣的工作。如果你能通过这件事赚到钱,那就去试试吧。我不会和任何人说,你去做Oracle。我知道有些人他们并不对Oracle感兴趣,只是因为他们做的不赖,做其他的事又做不来,所以才从事这份工作。刚才这个问题的实质其实是预测这个市场:5年之后的就业市场会是什么样呢?
如果有人要根据未来就业市场的走向来定夺自己的未来。那我就大胆猜测一下。我认为对于Oracle顶级专家来说,会有一个很小的市场。5年后,可能很大部分的普通Oracle工种都会被挪到云端,只会有不多的用可插拔数据库的支持,来维持很少数量的数据库。而大部分小型企业,只要租赁Oracle的云端数据库就可以了。他们不需要自己买硬件和软件,也不需要有自己的DBA,只要为自己的应用租赁一块可运行的数据库就可以了。如果你想在5年后成为Oracle DBA,你要么就是为很大的公司工作,他们自己为了保护数据的隐密性,而把数据留在自己这里。要么就是为很大的机器工作,500台机器上运行着上百个数据库。小公司里的多数DBA,就不会存在了。除了Oracle,也会有其他的数据库技术也向这个方向发展。
事实上,需要维持大数据库的大公司数量并不很大。无论你的技术是什么,DBA都不会很多。我将在5年内退休,对此我长出一口气。很高兴我不是个初出茅庐的专家,因为我很担心在5年后很多DBA的命运,他们找工作也许会很困难。除非他们真的出类拔萃,而且大家也认可他的能力。
图灵社区:你会考虑开发某种工具让代码可以跨越各种版本的限制吗?
JL:绝对不会。我从来没有想过要把我做的东西变成某种产品。因为如果要有产品的话,那个产品就一定要尽善尽美,而且要完美适配所有版本的Oracle。这就意味着我要花很多时间对已经存在的东西改来改去。这对任何人来说,都是得不偿失的。我甚至都不会公布我的SQL代码,在我的博客上只有很少几个,我会说:这是一个很小的例子,这是2003年在某个版本的Oracle上运行的代码,它的作用是告诉你这个东西大概是怎么完成的。我绝不会说:这是一个在所有Oracle上都能运行的程序。看着我现在用的某些代码,我认为我可以把它们改得效率更高,这个高效版本可以在10上运行,也可以在11上运行,我十年前写的代码,现在仍然可以在9,10,11上用,对于我的要求来说完全适用。但是如果要我做一个产品来解释,我就需要它在所有产品上适用,而且还要回过头修改以前的代码。人们不会为不产生新的结果的事情付钱。所以从经济学上来说也是不合算的。
市场上有些工具,我不会说具体名字,当你仔细观察它们运行的SQL,你就会发现他们的效率很低,这不是做事的正确方法。但你会认识到,在十年前,没有改变的需求的时候,它们仍然能够运行。在很多年以前,当Oracle 9刚问世的时候,有一个公司有个这样的标准工具,我在一个大会上看到了,是一个很小的展台。他们有一个产品在Oracle 8上小有名气,当时展台上挂着一个巨大的条幅,上面写:“Oracle 9的保证”。我就去问他们一些细节:“你们说Oracle 9的保证是什么意思?你们能做这些那些吗?”最终他们终于承认,这句话的意思其实是,代码在Oracle 9上仍然可以运行。但是这样的产品并不是为Oracle 9设计的,而是为Oracle 8设计的,只是可以在9上运行罢了。可以说如果我是这个产品的顾客的话,我听到这些话可不会高兴的。但是商业公司有自己的考虑,也就是这种考虑上的差别,使得我做梦也不想把我做的东西变成产品。
图灵社区:《Oracle核心技术》和《基于成本的Oracle优化法则》是两本很受欢迎的技术书。在《基于成本的Oracle优化法则》中你说过,会有一系列关于此主题的书,《Oracle核心技术》是这个系列的第二本,这个系列的其他书也在准备中吗?
JL:事实上,《Oracle核心技术》并不是这个系列的第二本书。当我写完《基于成本》,我决定不再继续写那些复杂、耗费时间,但又不是十分必要的主题,比如分布查询和平行查询。因为这些很让人费神的东西的需求并不很大。但我确实有计划继续写书,主题是我所掌握的其他信息。这个决定的根源是Oracle的变化和升级太快了,就算是有我这样背景的人,也无法跟上Oracle发布的步伐,无法预测在所有情况下Oracle的反应。虽然我一直尝试紧跟发展,写一本关于优化,内容丰厚的书,但是却一直无法开始。
《Oracle核心技术》其实是倒退了一步,它跟随的是我在2000年写的一本书《Practical Oracle 8i》,介绍了Oracle工作的核心机制。《Oracle核心技术》扩展讲述的就是这本书一、二章的内容。我要小声透露一个消息,我可能会写一本关于物理结构、索引,以及表方面的书,但是这件事还没有确定。这本书是要把《Oracle核心技术》中尚未展开的部分写出来,教你在写代码之前,通过如何选择不同的物理结构,让数据库变得更有效率。如果可能的话,这将是一本很有意思的书,但是让我完成另一本关于Oracle的书希望渺渺。《Practical Oracle 8i》是一本好书,现在仍有人在买,如果我真的能完成下一本书,内容会和这本书一、二章之后的内容相关。
转载自:http://www.ituring.com.cn/article/62995