
在Oracle数据库中要顺利地解决一个问题很不容易 ,你可能会花大量精力去做相应的研究,并按照标准步骤一步一步执行,特别是阅读了官方文档,README文本文件后。在我的Oracle支持笔记中(Metalink),包括了“完整的”FAQ,看了这些后,你成功的可能性几乎会达到100%,如果低于100%,那可能是你不经意发现了Oracle的一个bug,因为Oracle提供的某些官方信息,如安装某个特性X或迁移产品Y的文档也会有错误,有的可能还不完整或未完成。
正如STATSPACK很古老一样,你可能会认为时至今日所有常见的错误或问题都已经收录进Oracle发布的完全FAQ中了;正如版本升级一样会经过大量的测试,你可能会认为“完整的”手动迁移指南中的步骤也是经过多次测试的,把它当作圣经一样对待。另一个是相对简单的操作(通过安装脚本)总会与Metalink上(之前的)的笔记匹配。下面以两个例子进行说明无论你付出多大努力,总是避免不了问题的出现。第三是有些东西很少有人知道,但这并不意味着就没有人遇到过了。
安装STATSPACK
在老的Oracle数据库版本中(10g前),运行spcreate.SQL脚本可能会引起上百个对象无效,不仅仅是你自己的对象,还包括Oracle的对象,你可能会认为这个问题好解决,只需要运行utlrp.sql重新编译所有对象就可以了。如果你坐在那里等待修复脚本运行,你会发现什么事情都没有发生,为什么会这样?因为安装STATSPACK间接让一个对象无效,这个对象就是DBMS_UTILITY包主体。因为首先重新编译的是Oracle的对象,但它不是,你能做的只有手动编译其它对象,但这个包主体的状态仍然是无效的。
你是否认为Oracle提供的内置脚本肯定不会有问题,即使变为无效状态,也可以重新运行它,并不会产生什么不良后果,对系统也不会有什么大的影响?如果你就是这种想法,那赶紧纠正这种想法,安装STATSPACK时,是什么引起这些乱七八糟的事情的?运行spcreate.sql时会调用其它脚本,其中一个就是spcusr.sql脚本,这个脚本又调用“@@dbmsjob”,从名字上猜测出它是干什么的了吗?对了,它就是安装(至少会尝试)内置的DBMS_JOB,如果此时你的系统上恰好有一个DBMS_JOB,那真正发生DBMS_JOB时究竟该使用哪一个呢?
如何来解决这个问题呢?STATSPACK已经安装成功了,在rdbms目录下的文档、发行注记、类REAME文件(spdoc.txt)中也没有任何关于dbmsjob引起问题的描述,至少最近还没有,即使是翻遍STATSPACK完全参考也找不到丁点这方面的信息。现在有一个笔记更新了(149113.1,“安装和配置STATSPACK[sic]包”),它里面推荐注释掉spcusr.sql脚本中调用dbmsjob的代码。在2002年的一个bug中也有提到,但在这个文档中却没有包括,直到六年后才包括进来了。
在几年前发布的Oracle 10g中的spcusr,调用dbmsjob的代码被移除了,更多的是使用DBMS_JOB了。总的说来,这是Oracle历史上一个非常大的败笔,它从来就没有清晰地对比过dbmsjob和DBMS_UTILITY。手动从Oracle 9i迁移到10g
有一个问题在许多论坛中问得比较频繁,那就是如何在Oracle不同版本之间迁移,升级或迁移指南(依赖于版本)列出了许多迁移方法,其中一个就是人工方式。伴随10g的发布,Oracle也提交了一篇笔记(316889.1),标题是“手动升级到10gR2完整检查清单”,总的来说,这篇笔记帮助非常大,它详细地说明了升级要做的一切事项,甚至是一步一步的步骤都列得非常指清楚。不幸的是,这篇笔记还是遗漏了两个东西,其中一个是显示停机地址,这一步对于Oracle来说当然很清楚,因为这是一个未公开的bug,它会删除与XML DB相关的占位符表,在未运行升级脚本前,如果没有删除,它是一个记录表,因此,很可能会导致一个不可恢复的错误,或者需要从备份恢复。这个笔记的早期版本提到过运行了升级脚本后会删除一个表,如果你等待这个错误发生,你就厄运临头了。未公开的bug为什么就不能列在这个指南中呢,最少也应该在指南中将其标志为“已知问题”。
“完全”指南的另一个问题是存在一些关于时区数据的错误信息,笔记中说道这个问题仅在10gR1中存在,但在10gR2中却仍然存在,今天再来看这篇笔记,你会发现已经做了许多修正,甚至多了一个已知问题,但在第5步中仍然写到“请注意,这一步仅在10gR1中才需要”,而且,语句在末尾仍然遗漏了一个句号。

改变单词大小
当你从32位迁移/升级到64位系统时(反之亦然),你应该格外小心,具体要取决于你是如何升级/迁移的。如果你所有要做的事情是从32位版本迁移到64位(反之亦然),需要手动改变单词,此时需要运行一个脚本(utlirp.sql),取决于你文档的源(包括Metalink上的笔记),当脚本编译完所有对象时,可能会给你一个提示,但那不是真的。
单词大小的改变使数据库中的所有PL/SQL无效,直到你重新编译所有对象,你可以阅读这个脚本,你会发现它的主要步骤是更新一个属于SYS用户的表,将status列的值设为6,在哪里调用utlrp.sql呢?
传达改变
你可能是第一个遇到新bug的幸运儿,你如何提取你的经验,将其吸收进“完全”指南和勘误表中呢?不要指望分析你的例子会一翻风顺,在Oracle的所有权上有一个巨大的缺点,这里的所有权指的是有一个顾问取得了顾客问题的所有权,并解决了这个问题,使用Oracle支持,你最大的收获是“通过你的注释分析是谁写的这个笔记,我现在可以关闭这个SR吗?”
在面向最佳客户服务的公司里,缺乏正确地响应客户问题的姿态和策略,这样的公司都不会有大发展,可为什么在Oracle这样的大公司里仍然存在这个问题呢?认真地说,我知道Oracle公司的人肯定会读到这些文章的,当人家已经给你指出其中的错误,为什么你却仍然不修复它呢?我不止一次在技术活动日上听取某些组织或公布了联系信息的高级支持经理的演讲,要等到异常事件在公司内被处理过后才修复笔记吗?
总结
当你执行某些准备工作(研究和测试)时,你会感觉非常沮丧,因为你执行步骤不正确踩到了Oracle地雷,它使我想起了电影“死亡区域”,当Christopher Walken抓住了deputy(他就是杀手)妈妈的机械臂时,通过对视,他察觉到他的妈妈已经知道她儿子犯罪了,Walken义愤填膺地吼道:“你知道了,是不是,你一定知道了”,这和“完整”FAQ中的事情是一样的,有人明明知道Metalink上存在问题,但就是不说出来。
真的不用为这种情况辩论,但你能够做什么来缓和这个不良影响呢?使用这个方法你可以将一个无意识的数据变更事件变成一个服务变更事件,如果你偶然发现了某些遗漏的步骤或信息,请在论坛中要求分析员更正相关笔记。
【编辑推荐】
oracle学习过程
Oracle有很多值得学习的地方,Oracle体系太庞大了,对于初学者来说,难免会有些无从下手的感觉,什么都想学,结果什么都学不好,所以把学习经验共享一下,希望让刚刚入门的人对Oracle有一个总体的认识,少走一些弯路。 一、定位 Oracle分两大块,一块是开发,一块是管理。 开发主要是写写存储过程、触发器什么的,还有就是用Oracle的Develop工具做form。 有点类似于程序员,需要有较强的逻辑思维和创造能力,个人觉得会比较辛苦,是青春饭;管理则需要对Oracle数据库的原理有深刻的认识,有全局操纵的能力和紧密的思维,责任较大,因为一个小的失误就会down掉整个数据库,相对前者来说,后者更看重经验。 因为数据库管理的责任重大,很少公司愿意请一个刚刚接触Oracle的人去管理数据库。 对于刚刚毕业的年轻人来说,可以先选择做开发,有一定经验后转型,去做数据库的管理。 当然,这个还是要看人个的实际情况来定。 二、学习方法 我的方法很简单,就是:看书、思考、写笔记、做实验、再思考、再写笔记。 看完理论的东西,自己静下心来想想,多问自己几个为什么,然后把所学和所想的知识点做个笔记;在想不通或有疑问的时候,就做做实验,想想怎么会这样,同样的,把实验的结果记下来。 思考和做实验是为了深入的了解这个知识点。 而做笔记的过程,也是理清自己思路的过程。 Oracle学习过程是使一个问题由模糊到清晰,再由清晰到模糊的过程。 而每次的改变都代表着你又学到了一个新的知识点。 Oracle学习过程也是从点到线,从线到网,从网到面的过程。 当点变成线的时候,你会有总豁然开朗的感觉。 当网到面的时候,你就是高手了。 很多网友,特别是初学的人,一碰到问题就拿到论坛上来问,在问前,你有没有查过书,自己有没有研究过,有没有搜索一下论坛?这就叫思维惰性。 由别人来回答你的问题,会让你在短时间内不费劲地弄懂这个知识点,然而通过自己的努力去研究它,不但会更深入的了解这个知识点,更重要的是在研究的过程会提高你解决问题和分析问题的能力。 总的来说,没有钻研的学习态度,不管学什么东西,都不会成功的。 当然,初学的人很多时候是因为遇到问题时,无从下手,也不知道去哪里找资料,才会到论坛上提问题的。 但我认为,在提问的时候,是不是可以问别人是如何分析这个问题?从哪里可以找到相关的资料?而不是这个问题的答案是什么?授人以鱼不如授人以渔。
如何从SQL Server迁移大批量数据到Oracle
1、使用etl工具进行抽取,如:kettle2、使用oracle的gateway。 实现从sqlserver到oracle的数据网关功能。
在Oracle数据库中,如何增加表空间的大小?
表空间在初始建立的时候最好设置成自动扩展的,如果没有设置成扩展的,则有四种方法可以增加表空间的大小,其中增加数据文件是经常用的一种。四种方法如下:Meathod1:给表空间增加数据文件altER TABLESPACE app_data ADD DATAFILED:\ORACLE\ProDUCT\10.2.0\ORADATA\EDWTEST\ SIZE 50M;Meathod2:新增数据文件,并且允许数据文件自动增长ALTER TABLESPACE app_data ADD DATAFILED:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\ SIZE 50MAUTOEXTEND ON NEXT 5M MAXSIZE 100M;Meathod3:允许已存在的数据文件自动增长ALTER DATABASE DATAFILE D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\ ON NEXT 5M MAXSIZE 100M;Meathod4:手工改变已存在数据文件的大小ALTER DATABASE DATAFILE D:\ORACLE\PRODUCT\10.2.0\ORADATA\EDWTEST\ 100M;
发表评论