今天是2007年最后一天上班了,看了大家的年终总结,发现大家的生活还是过得很丰富的。
eygle上演 2007 年终总结-已完成和未完成的,讨了老婆,有了儿子,写了新书,还在装修房子,成功人士的典范啊。
fenng则一如即往的在做web方面的总结,web方面他是天才,我是只能望其项背了,具体可以见:
07 年 DBA notes 在抓虾上被推荐最多的文章
年度回顾:2007 年最常用的 Web 2.0 服务
dcba则在专心的写他的小工具,整一个牛人,估计代码开放给我,我也看不懂。具体看他的2007年度总结
回想自己的2007,真正回想起来,好象也没有做过什么,只有廖廖几件事情可以拿出手
1、完成了从技术到管理的转型,不过,未来的路还很艰难,2007年仅仅是一个开始,2008年才是挑战。
2、自己独立的创作了一本书,算是对我现在职业生涯的一个总结,也是送给我宝贝女儿的礼物。
3、赶上了2007 Oracle ACE的末班车
其它的事情,没有什么好记录的了,唯一可以记录一下我的宝贝女儿,刚过了一岁的生日,现在可以满地跑了,还可以清楚的叫爸爸、妈妈,真是聪明的可爱。估计到明年,就是一小尾巴了。
同事去交违章罚款,系统突然跳出ORA-00257错误,然后就什么也做不了。一直等了半个多小时,后面的队伍排起了老长,这个问题才解决掉。
那ORA-00257是什么错误呢?
00257, 00000, "archiver error. Connect internal only, until freed."
// *Cause: The archiver process received an error while trying to archive
// a redo log. If the problem is not resolved soon, the database
// will stop executing transactions. The most likely cause of this
// message is the destination device is out of space to store the
// redo log file.
// *Action: Check archiver trace file for a detailed description
// of the problem. Also verify that the
// device specified in the initialization parameter
// ARCHIVE_LOG_DEST is set up properly for archiving.
估计是归档的磁盘空间满了,这么一个错误就需要半个小时来解决,其内部办事效率也可见一斑。
新书在平安夜正式排版、校样完成,下面的流程就是出版流程了。经过一年的辛苦,终于感觉轻松了很多,第一批书可以在ITPUB年会上与大家见面。
感谢博文视点的辛苦工作,他们的执行效率是最高的,感谢周老师的支持,感谢何艳编辑等众多为这本书付出过辛苦劳动的人,谢谢你们。
新书名为:
构建Oracle高可用环境——企业级高可用数据库架构、实战与经验总结
新书的封面如下:
当初,Oracle ACE也是红火一时,现在,在Oracle官方网站,已经找不到直接的入口链接了,起码,我找了半天还没有找到。
在Taobao,我们很多人都错过了第一,二批成为Oracle ACE的机会,不是没有收到邀请,而是错误的估计了ACE的价值。因为就算我们自己不认可Oracle ACE的价值,但是,别人是认可的。
就跟当初biti_rainy第二批,成为中国第8个,全球第100个ACE,有人写信祝贺说,“恭喜你成为中国第八,真厉害啊”。我相信biti_rainy除了苦笑,不会认为这是表扬吧。
第三批Oracle ACE汪海与我都添了表,不过,从处理速度上来看,就知道Oracle的重视程度已经严重不如以前了,现在在Oracle的官方网站已经能查到我们的信息了。
汪海的信息
我的信息
这样一来,Alibaba起码有4位Oracle ACE,所谓的Oracle ACE,其实,就是Oracle找的一群免费讲师,没有什么值得祝贺的,不过是Oracle把握了大家的心理而已。
今天是女儿的周岁生日,早上一起来就帮女儿定生日蛋糕,网络就是好,google了一下,查了个元祖店的电话,一个电话就搞定了。定了一个非奶油的低糖低脂的蛋糕,当然,对比奶油蛋糕,价格也高多了。
想不到,蛋糕刚定好,就有人送了个蛋糕过来,送蛋糕的人是保险公司的一个销售,女儿曾经在那里买过一个保险。想不到这些人还挺有人情味的。
中午出去吃饭,记得上次有一个吃千岛湖鱼头的地方,鱼头与甲鱼很好吃,今天一家人,包括女儿的爷爷,外公,舅舅,姨姨等一起杀了过去。结果发现什么东西总是第一次吃的时候好吃,第二次去吃的时候就不好吃了。
晚上无聊,想了个主意,用老家的方法给女儿抓周。放了一些玩具,书,笔,还放了手表,U盘,老婆还放了100块钱。结果女儿第一个抓的是U盘,第二个抓的居然是钱,第三个抓的是手表。
然后开始吃蛋糕,小家伙太小了,只知道伸手要抓,点上生日蛋糕,唱起生日快乐歌,然后一起帮她吹熄了蜡烛。果然,非奶油的蛋糕好吃多了。过了今天,女儿就超过一周岁了,女儿长大了。
Oracle 的专业书籍,或强调概念、或强调经验,但以往基本都是在Oracle自身范畴之内。有些概念与经验并重的书籍也基本都偏重于某个方面的内容,如备份恢复或者数据库优化,很少有书籍横跨主机、存储、数据库,原因是多方面的。国外专业分工更明确,三个方面基本都是专业的team各负其责,DBA一般很少需要去通晓三方面内容,这也是数据库书籍作者比较少涉足主机和存储的重要原因;对大多国内技术从业者来讲,也是这样的分工情况,三个方面其实都需要倾注非常多的精力才能做好,这样同时驾驭三个方面内容的人就更少了。不少Oracle技术从业者逐渐转向去了主机或者存储相关的公司,但也大多倾向于架构或者售前,对技术细节的把握逐渐淡化。种种现实使得能分享自己在多个领域相关联的知识和经验的人很少,而能成书,更需要勇气,需要能坚持下来的勇气。
与作者相识快5年了,几年来这一代Oracle技术爱好者之间频繁的沟通交流,使得大家快速的成长。作者从开发到数据库管理,然后涉足主机和存储领域,基于对技术工作的热爱,坚持下来,最后对三个领域的专业知识融会贯通。很高兴现在作者有这个勇气,将自己的经验和知识写下来,分享给大家,这是众多不局限于Oracle数据库的技术从业者的福音。但横跨三大领域的知识,对初学者有相当大的难度,万事开头难,只要努力并坚持下去,最终都能学有所成、学有所用。
最后再次感谢作者辛勤写作,让本书与读者见面。
冯春培
在2007年ITPUB(http://www.itpub.net)香山年会上,我曾经对参会的Puber说,我想写一本关于Oracle高可用的书,一晃一年就快过去了,今年的年会即将到来,希望这本书可以在年会之前与大家见面。
其实一直有这么一个写本书的愿望,也曾经写过不少的文章,但是真正动手的时候,才发现写书与写文章的差异有多大,写文章可以哪里熟悉写哪里,但是,写书却是一个系统性的工作,需要把平常积累的点,串成线,连成面,必须具备非常全面的,系统性的知识。
本书最大的困难在于铺的面太广了,有同事开玩笑说,我可以写续集了,把每一章分开下来都可以再写一本书。写续集暂时没有想过,但是,要汇总这么多的知识量在一本书中,还是非常不容易的。所以在写作的过程中,我也是一个自我学习与完善的过程,把很多以前只是了解的东西,重新的学习,并反复的实验。>
本书所定位的读者,是公司与企业级的中高级读者,或者是以后想到公司与企业级环境中工作的中高级读者。所有描绘的场景,与实验的环境,都是基于Linux以及Unix的,硬件环境则是中高端小型机与中高端企业级存储。其实,也没有必要被企业级这三个字吓倒,或许现在,或许今后的某一天,您就是里面的系统维护员,数据库管理员,构架师甚至决策者,那么希望这本书能给您提供非常大的帮助。
本书汇集了我这些年以来的高可用性管理经验,特别是最近几年,在淘宝(www.taobao.com)中的高可用管理经验,作为数据的维护者,团队的管理者,面临系统管理,系统设计与构架,决策与支持很多角色。也正因为这么多的角色,让我学到了非常多的东西,这里要非常感谢汪海以及淘宝的环境,没有这里的环境,也就不会有这本书。
但是,需要提醒的是,作为读者,不要过分期望在本书中能找到很多具体的方法,本书更希望的是提供思想,跟很多编程思想的书一样,不会告诉大家怎么样具体的用代码实现一个什么东西,而是告诉大家怎么样正确的写代码。说到这里,我很欣赏张三丰与太级拳,无招无式,但是能克敌于无形。如果哪一天,你的脑袋中已经不需要记忆任何方法,但是,却可以举一反三,由面及里,从一个微小的表面事件看到事情的本质,并能够从根源上杜绝该事情的发生,那么,恭喜您,您的“太级拳”练成了。
初级的DBA碰到一个问题解决一个问题,永远都是在等问题,头疼医头,脚疼医脚。
中级的DBA知道怎么样去避免一些常规问题的发生,防止重复性错误。
高级的DBA知道了问题的原因与发生途径,能从流程规范等领域避免问题的出现。
资深的DBA知道了问题的本质,还能从规划设计上避免问题的出现。
顶级的DBA在问了,“什么是问题?我没有问题”。
记得禅学里面有这么一个故事,悟道者在悟道以前,见山是山,见水是水,悟道过程中,见山不是山,见水已不是水,但是,悟道了以后,见山还是山,见水还是水。
扯远了,话归正题。
最近几年,我面试了很多人,也看到很多人的简历,比如今年的毕业生招聘,一个岗位的竞聘者可以上千位。结果是,应聘的人感觉工作太难找,招聘的人却感到,合适的人更难找。这个就是差距,很多学生,成了中国教育体制下的牺牲品,上学的时候打游戏,考试的时候作弊,毕业的时候蒙混,找工作的时候就开始埋怨。
不管任何行业,高级的人总是奇缺,而低端的人总是遍地都是,永恒不变的金字塔结构持续了一年又一年。如果你不想做金字塔底端,就必须从早自我做起,当然,也希望本书能给您提供一些帮助。
在杭州站的考试中,有人在答卷上道,这些不是Oracle的题,体现不出我的优势。我给了他面试的机会,我问他,如果基本的算法题也不会,那么你觉得你的Oracle的优势在哪里?你觉得你能比别人强多少呢?回答不上来。一个连SGA分几部分,LGWR进程是怎么被触发也不知道的人,对比一个不懂Oracle的人,根本就没有优势可言。记得以前有人说过,有些毕业生只要会安装Linux,就可以说自己精通Linux,那是一个胆量!
要记住,机遇永远只给有准备的头脑,天上没有掉下来的馅饼。
也并不是所有人都这样,相对来说,另外一部分人就好得多,他们在学校里面,或者是毕业之后,有明确的方向与兴趣去学好Oracle,并能有明确的方向与目标。也收到过很多的求助信,问我怎么样能学好Oracle,说到方法,又是老生长谈了,我并不想多谈,关于怎么样学好Oracle,我只想送9个字:
多实践、多思考、多总结
除了学习Oracle如此,做任何技术,任何行业都是一样的道理。Oracle DBA是一个辛苦的活,在选择Oracle DBA之前,一定弄清楚自己是否真的愿意去做Oracle,是否适合去做Oracle,没有兴趣而仅仅是工资驱动的工作,是不会有太多的提高的。
在IT技术领域,很多人认为这里是一个吃青春饭的地方,而且最主要的是,干的是粗重活,得不到应得的尊重。对此,很多人都有比较极端的看法与讨论。但是,有一点我是需要说明的,这些情况正在好转,老的企业中可能还如此,但是在新型的,技术型的公司中,技术人员也有其宽松的环境与丰厚的待遇。
我的公司,淘宝(www.taobao.com)就是这样的公司,在这里,技术可以有最广阔的发挥空间,我在淘宝的3年多时间里面,学到了很多的东西,当然,也能最大限度的把学到的东西学以致用。我的团队,也是一个团结的,积极向上的团队,我们可以在1年多的时间中,把一个毕业生培养成一个高级DBA。我们互相帮助,共同努力,为一个公共的目标而奋斗,我们要打造中国最强大的DBA团队。
我要感谢我的公司与我的团队对我的支持,也希望有更多有理想有抱负有能力的人士,加入我们的公司,以及我们的团队,成为我们的一员。
本书最主要的话题就是高可用性,主要基于我最近一些年来的高可用数据库管理、维护、设计与构架经验。如在OLTP与OLAP不同数据类型下的高可用维护与管理,以及一些非常有用的经验总结。
所以,与高可用有关系的特性,在本书基本都可以找到,甚至是Oracle 11g的高可用特性。当时,为了补充这一部分信息,我停了2个月的写作,等8月份上海Oracle 11g的Open World之后,才继续写下去。本书最开始的时候,规划了24章,后来,很多章节都合并了,现在全书共分为16章共5个大部分。
第一部分:高可用性篇
介绍了Oracle以及周遍环境的高可用特性,包括硬件环境,存储环境,容灾与业务连续性,分级存储与信息的生命周期,Oracle RAC技术,Data guard技术,Streams技术,主机HA技术,Flash back技术,Logmnr,SQL Loader技术等等。同时,这一部分也是本书最重要的部分,占了本书绝大部分的篇幅。
第二部分:数据处理篇
介绍了在高可用环境下,怎么样规划备份与恢复策略,怎么样在高可用环境下做数据的迁移。特别是高可用环境下的数据迁移方法,是具有自主知识产权的一些新型迁移思想与方法,具有非常大的参考价值。
第三部分:系统优化篇
介绍了高可用环境下的优化方法与思路,以及优化案例。如通过对表空间的内部介绍到数据文件的规划,从优化工具的使用到优化案例的分析,解释了高可用环境中必须要注意的一些优化思想。
第四部分:系统维护篇
介绍了高可用环境下锁、阻塞以及死锁的原理,分析了高可用环境下的并发处理方法,并通过案例来说明高可用环境下大规模DML与DDL的操作方法与注意事项。
第五部分:系统监控篇
这部分只有一章,但是,这一章介绍的监控体系思想是非常不错的,解释了在高可用环境下,怎么样搭建一个自动的,高效率的,可伸缩性的监控体系结构。
在本书的编写与审编过程中,首先要感谢我老婆,虽然不懂技术,也把所有的文章读了一遍,并发现了很多错误。也要感谢我的团队,他们在工作上的支持,出色保证了系统的稳定运行。还要感谢冯春培(biti_rainy),赵林(zhaolinjnu),宁海元(ningoo),薛晓斌(blue_prince)对部分章节的审阅。
本书内容虽然很多,但是因为代码量少,页数也不算多。另外,因为本人文笔有限,书中内容不追求华丽,仅以通俗为主。虽然审阅多遍,仍然不可能避免有错误的出现,如果有任何问题,希望能多谅解。可以上我的个人网站(www.ixdba.com)提出疑问或者是直接邮件给我(piner.chen@gmail.com)。我的个人网站也随时提供对新书的支持服务与代码服务,以及更丰富,更深入的知识与内容。
最后,谨把本书献给我的宝贝女儿,作为她即将到来的周岁礼物。
2007年12月8日于杭州。
有人问到了这篇文章中,为什么RAID5写进去是4个IO。认为根据xor算法,只读出来原始数据以及校验数据还不能计算出新的校验数据。其实是可以的。
如,假定就是4块盘
再假定
那么上式可以简写为
写入新数据d1,读出原始数据p与d
- p1 = m xor d1 = p xor d xor d1
计算完成。
比较早的时候,在这里写过一篇存储虚拟化的文章,这里再把主机的虚拟化简单的总结一下。
虚拟化的概念在 20 世纪 60 年代首次出现,虚拟化技术是未来的发展方向,在存储中如此,在主机中也是一样。在以前,主机虚拟技术基本上大型机上的专利,利用它可以对属于稀有而昂贵资源的大型机硬件进行分区。不过,现在终于走向小型机甚至是PC构架的服务器上了。
虚拟化是一个抽象层,它将物理硬件与操作系统分开,从而提供更高的 IT 资源利用率和灵活性。分区技术就是虚拟化技术的一个重要体现,主机的虚拟化也可以大致分为4个层次。
1、主机之上的虚拟化,也就是说,可以将多个主机虚拟成一个真实的主机,对于用户来说,其实就是一个主机,资源(主要是CPU与内存)可以在不同的主机上共享,实现分布计算。不过,目前的小型机与PC Server还没有实现这样的技术,因为分布计算的技术难度太大。最好的也仅仅是IBM的Power6+AIX6+虚拟IO技术,可以实现在不同的主机上平滑的迁移资源,有点类似HA,所以实际使用用途不大。
2、主机之下,硬件之上的虚拟化,如HP的电路板方式的硬分区,IBM的静态与动态分区(LPAR)。在同一个物理主机上,可以把硬件隔离成几个部分,每个部分运行不同的OS并且互相没有影响。更高级别的主机内部虚拟化,如动态逻辑分区,可以实现资源在不同的分区之间的动态迁移。
3、硬件层之内的虚拟化,这个是更细粒度的虚拟化,一个分区中,可能只拥有5%或者是10%的物理CPU,以及完全虚拟化的IO子系统。如一个主机只有1张硬盘,或者是1个网卡,但是可能虚拟化出来10个OS,每个OS都可以看到虚拟化过后的自己独立硬盘或者是网卡。Vmware的虚拟化也是采用类似的方法实现,但是,这种虚拟化技术是改变不了CPU指令的,也就是说,intel构架服务器虚拟化以后还只是intel构架,不能在上面装AIX(Power体系构架)。
4、OS之内的虚拟化技术,如solaris 10的zone技术,AIX6以后也支持类似的技术。这类的虚拟化计划是在一个OS中再克隆出来很多不同的子系统,他们有自己的用户系统,文件系统,程序等。他们的内核是一样的,所以,这种虚拟化出来的OS必须是一样的OS,如果内核问题,可能导致所有的OS都有问题。
Logmnr在Oracle 9i以后做了众多的改进,如可以不需要build flat文本文件就可以分析日志了,也就表示可以不需要修改参数utl_file_dir就可以分析日志了,避免了修改参数utl_file_dir导致的重起数据库问题。另外也开始支持把字典信息build到联机日志中,在异地分析归档日志。
在flashback也不能帮上忙的时候,logmnr却是非常有用的。因为只要误操作时期的归档日志存在,就可以通过归档日志来恢复误删除(delete)的数据。
如果在Oracle 9i以上,采用在本地的在线数据字典分析归档日志,就这么简单:
- Piner@9iR2>exec -
- sys.dbms_logmnr.add_logfile(LogFileName=>'/archive_log/archive/1_9.arc',-
- options => dbms_logmnr.new);
- PL/SQL procedure successfully completed.
-
- Piner@9iR2>exec sys.dbms_logmnr.start_logmnr( -
- Options => sys.dbms_logmnr.dict_from_online_catalog);
- PL/SQL procedure successfully completed.
可以看到,在线分析其实就只需要这两步,添加日志并分析日志。注意以上OPTIONS => DBMS_LOGMNR.NEW,表示添加第一个日志,如需要另外添加更多的日志,可以用如下方式即可。
- Piner@9iR2>exec sys.dbms_logmnr.add_logfile(LogFileName=>'/archive_log/archive/1_10.arc');
如果日志分析完成,可以把需要的信息保存到临时表,如
- Piner@9iR2>create table tmp_logmnr as
- 2 select operation,sql_redo,sql_undo from v$logmnr_contents
- 3 where seg_name='TEST';
然后,终止日志分析过程。
- Piner@9iR2>exec sys.dbms_logmnr.end_logmnr
对于临时表中的SQL_UNDO,可以选择性的恢复,如采用如下的脚本来恢复,这里为了减少阻塞,每1000条提交一次。另外,需要注意的是,SQL_UNDO中的分号,如果想用动态SQL来执行的话,是需要去掉的。
- declare
- mysql varchar2(4000);
- num number :=0;
- begin
- for c_tmp in (select sql_undo from tmp_logmnr where operation = 'DELETE') loop
- --去掉语句中的分号,这里假定只有语句结尾有分号,语句中间并没有分号。
- --如果语句中也有分号,则可以考虑替换语句结尾的;'(分号单引号)为'(单引号)。
- mysql := replace(c_tmp.sql_undo,';','');
- execute immediate mysql;
- num := num + 1;
- if mod(num,1000)=0 then
- commit;
- end if;
- end loop;
- commit;
- exception
- when others then
- --异常处理
- end;
以上的PL/SQL代码其实还可以加强,如恢复成功一条,就设置状态值为1,否则,设置状态值为-1,方便跟踪那些记录恢复成功,哪些记录恢复失败了。
另外,需要注意的是,在Oracle 10g以下,LOGMNR的临时表v$logmnr_contents,使用的是system表空间,在Oracle 10g以后改为sysaux表空间。可以使用如下的命令,更改logmnr的特定表空间,防止system表空间出现空间不够。
- Piner@9iR2>exec sys.dbms_logmnr_d.set_tablespace('USERS');