January 2006 Archives

[转载]Oracle 数据库中快照的使用

   oracle数据库的快照是一个表,它包含有对一个本地或远程数据库上一个或多个表或视图的查询的结果。正因为快照是一个主表的查询子集,使用快照可以加快数据的查询速度;在保持不同数据库中的两个表的同步中,利用快照刷新,数据的更新性能也会有很大的改善。

  下面以我在开发襄樊市电信局170话费催缴系统中使用快照加快查询速度的实现过程为例来说明快照的使用方法:


  170话费催缴系统是一个向用户电话播放催缴话费提示音的系统。用户的欠费金额存放在rs6000小型机sffw用户下的表yh_qfcx中(yh_qfcx表是一个随用户缴费情况动态变化的欠费记录表),而催缴系统的数据按要求存放在另外一台xf170服务器dmtcx用户下,为在dmtcx用户下使用sffw用户下表yh_qfcx中的部分数据,我在dmtcx用户下建立了yh_qfcx的快照S_yh_qfcx,以加快查询速度。


  具体步骤如下:


  一、在sffw用户下建立表yh_qfcx的快照日志;


  只有先建立表yh_qfcx的快照日志,才能在快照中执行快速刷新。


  Create snapshot log on yh_qfcx;


  二、在dmtcx用户下建立到sffw用户的数据库链link_sf;


  建立了到sffw用户的数据库链后才能从sffw用户下的表yh_qfcx中获取数据。


  Create database link link_sf


  Connect to sffw identified by xxxxxxx using 'rs6000';


  三、在dmtcx用户下建立快照s_yh_qfcx;


  Create snapshot s_yh_qfcx as


  Select yhh,qf6+qf5+qf4+qf3+qf2+qf1+qf qfje


  From yh_qfcx@link_sf


  Where tjbz='K' and bz6+bz5+bz4+bz3+bz2+bz1+bz>0;


  四、根据需要修改快照刷新的间隔时间;


  dmtcx用户下的快照s_yh_qfcx为了与sffw用户下的主表yh_qfcx保持同步,需要不断刷新快照。只有设定了快照的刷新间隔时间,oracle才会自动刷新该快照。


  快照的刷新有两种方式:快速刷新和完全刷新。快速刷新需要快照的主表先有快照日志存在;完全刷新时oracle执行快照查询,将结果放入快照。快速刷新比完全刷新快,因为快速刷新将主数据库的数据经网络发送到快照的数据少,仅需传送主表中修改过的数据,而完全刷新要传送快照查询的全部结果。


  Alter snapshot s_yh_qfcx refresh fast


  Start with sysdate+1/1440 next sysdate+1/144;


  {此SQL语句的意思为:设定oracle自动在1分钟


  (1/24*60)后进行第一次快速刷新,以后每隔10分钟


  (10/24*60)快速刷新一次。}


  Alter snapshot s_yh_qfcx refresh complete


  Start with sysdate+1/2880 next sysdate+1;


  {此SQL语句的意思为:设定oracle自动在30钞


  (30/24*60*60)后进行第一次完全刷新,


  以后每隔1天完全刷新一次。}


  说明:


  1、因为快照刷新是服务器自动完成的,所以要保证oracle数据库启动了快照刷新进程。查看oracle数据库是否启动了快照刷新进程,可以以数据库sys身份查看视图V_$SYSTEM_PARAMETER中的参数snapshot_refresh_processes的值是否为1,如果不为1,则快照刷新进程未启动。


  2、启动快照刷新进程的方法为:修改oracle数据库的初始化文件initorcl.ora,将其中的snapshot_refresh_processes参数的值改由0改为1,然后重新启动oracle数据即可。


  3、需要说明的是:建立快照日志时oracle数据库为我们建立了一个基于yh_qfcx的触发器tlog$_yh_qfcx和快照日志表mlog$_yh_qfcx;建立快照时oracle数据库为我们建立了一个表、两个视图、一个索引,它们分别为:


  一个表:snap$_s_yh_qfcx;


  两个视图:mview$_s_yh_qfcx和s_yh_qfcx;


  一个索引:I_snap$_s_yh_qfcx(


  基于表snap$_s_yh_qfcx中的m_row$$字段。


http://searchdatabase.techtarget.com.cn/tips/108/2037608.shtml

幽哈苏-名字的困惑

文/徐幼华   


  这麻烦是10年前开始的,记得当年初抵美国,到学校去报到。进门后 老师问我叫什么名字?彼时还不懂几个英文,口不能言,只好拿出入学通 知书给他看。谁知道他疑疑惑惑看了半天不出声。见状我不由得心里发毛, 好不容易等到他抬起头来,见他鼓了几次嘴唇,欲言又止,我的心更慌了, 终于忍不住用仅会的几个英文结结巴巴地问:“什么?”
  “你的名字叫做你?”(Your mame is you?)他困惑地问,我听了丈八 金刚摸不着头脑。
  “你叫做幽哈苏?”
  什么?!我简直愤怒!我叫徐幼华,英文倒装,姓氏放在后面,读幼华 徐。到了他的嘴里,竟成了“幽哈苏”?!
  他大概也看出苗头不对,急忙很有礼貌地问我:“请问你的名字怎么念?”
  “幼华徐”我用标准普通话教了他几遍,他仍是“幽哈,攸哈,苏?” 的,我只好放弃,叹息朽木不可雕。
 
  然而,麻烦并未到此为止。以后不论我到哪里,凡要报上姓名,一遍 说下来,听的美国人十个有十个目瞪口呆。好奇的会叫你再教他(她)一遍, 怕麻烦的干脆就叫我“小姐你”(Miss You),因为“幼”字的大陆汉语拼 音正好跟英文的“你”字的拼写相同,或者叫我XU这是我的“徐”字的拼 音。“华”字从来无人学得会,因为“华”字的拼音是HUA,英文中H不发 音,U和A同是元音,不能相拼。他们读不出来,干脆绕开。有次更可笑, 那年我在纽约曼哈顿一家老人疗养院工作,一天我正在病房里,忽听有人 从走廊那头走过来,一迭声地叫“陈,陈”,我心里纳闷,这层楼里除了 我没有一个亚洲人,她在叫谁呀?没想声音到了跟前停住了,“哈,原来 你在这里,怎不回答我?”抬头看,只见一个漂亮的黑人妇女站在面前, 我认得她是兴趣活动部的助手。她咧开结实莹白的牙齿对我笑,手里拿朵 粉红色的康乃馨,说:“来,来,今天是母亲节,每人一朵。过去时,现 在时,将来时的母亲,人人有份。”不由分说,就把花别在我的襟前。
  “但是我不姓陈啊?”我以为她认错了人。   
  “那你姓什么?”   
  “我姓徐。”
  “喔!”她愣了一下,“你们中国人不是都叫陈什么吗?”说完她哈哈 大笑。也不怪她,我们不也有这样的概念吗?韩国人一定是金什么,日本 人是什么子、第几郎,东欧人是什么什么斯基,南美洲来的不是荷西、玛 丽雅,就是弗南德斯。想到这里,自己也忍不住笑出来。

  但自此以后,我决定为自己起一个英文名字,免得好好一个中文名字 平白被人糟蹋。
叫什么好呢?这世上大多数人都是父母取的名字,生下来名字就定了, 等到了知道自己喜好的年龄,那名字早被人叫了十几二十年,改不过来了。 今天我竟有机会给自己取名字,太好了。想想自己的名字,有几分真朴, 但想到这名字的由来,又有几分不服气。听父母说,当年他们新婚,父亲 雄心万丈,计划要生四个儿子、四个女儿。儿子排章字辈,四个分别为伟、 大、建、设。女儿排华字,婉、幼、薇、丁。男丁气势如虹,小女子则全 都弱不经风。十足的重男轻女。结果母亲有理有节,生了两男两女,自觉 已经可以交代,就此打住。于是在上的两个哥哥是炜樟、大章,气宇轩昂, 大块文章。姐姐排第三叫婉华,气势已急转直下,到得我出世,排到幼华, 可谓大势已去。幸亏母亲没有再生下去,否则如果又是女孩,如此“薇”、 “丁”地排下去,还有什么戏唱?这次既然有自决权,我一定要取一个自 己喜欢的名字。

  字典一页一页地翻过去,突然一个名字跳入眼里,“凯特”,这个好! 记得以前喜欢过一个美国女作家的作品,她的名字就叫凯特,这名字很特 别,有几分阳刚气,我以为。于是当下就决定了。等到这名字用出去,才 知道这个名字非常普通,而且十足女性化。为了表示亲切,有人叫我凯茜, 有人叫我凯蒂。有个学究气的朋友叫我凯瑟琳。据她说,所有的凯什么, 最早都是源自凯瑟琳。凯瑟琳?这令人联想起文学名著《咆哮山庄》,我 从未喜欢过小说那种严峻阴冷的风格。不,不,我立即声明,不是凯瑟琳! 有日读《胡适口述自传》,做译注的唐德刚先生在附注里谈到,对外国文 化的一知半解,常会闹出许多笑话。他举著名英文作家赛珍珠为例,说她 自觉对中国文化了解颇深,她写的中国小说《大地》在西方也颇有名气, 但却为自己取了个风尘味十足的名字,为当时不少中国文人私下里窃笑。 这恐怕连她自己都未必知晓。读到这里,我忽然出了一身冷汗,我会不会 也犯这个错误?

  几年以后结婚怀孕,要为孩子起名字。早早就得到朋友的警告,除了 写入出生证的英文名字外,一定要为孩子另起一个中文名字,因为国内的 老人念不来英文。朋友的儿子叫山姆森,当时没有经验,不曾为他起中文 名字,到他们回国探亲,竟被上海的太公太婆叫成“香芋笋”。我得要小 心,必须起一个不易误读的英文名字。另为保险起见,再起一个中文名字。 孩子生下来是女的,中文名字叫汉菁,英文名字叫DANA,译音成黛娜,蛮 漂亮的,国内的家人叫起来,也没出过什么意外。

   到怀第二个孩子时,超声波看出是女婴,我拟好了中文名字,叫汉云, 义谓汉唐飘过来的一缕云。英文名,这次先生大意了,到临盆前一周还没 想出来。有日看电视,见荧幕上打出一个名字LENNIE。先生问这个如何? 把名字念了两遍,觉得音韵不错,好吧,就定了。孩子生下来,在医院里 要填出生证了,想想LENNIE的中文译音读“莲妮”,不错嘛,就原珠笔一 挥,填了上去。待到孩子抱回家来,美国邻居,友人先后到贺,问过名字 后,抱起婴儿,竟都不约而同地说:“好一个胖小子。”我们连忙更正, 不是啦,这是个女孩。他们都一脸错谔:“LENNIE不是男孩的名字吧?” 这还不是最糟的,女儿到了我父亲手里,他左看右看,自问自答:“阿女 呀,你怎么这么胖啊?你叫什么名字?莲妮?唉呀,什么不好叫,要叫烂泥, 还要姓朱,哎呀呀!”

   开头的几个月真是懊恼不已,先生倒大而化之,说不怕啦,我们医院 有个中国医生姓何,汉语拼音“何”字写作HE,这在英文里正好是“他” 的意思,遇到有人找,总机小姐便开了广播,满医院叫“医生他”。香港 人姓吴的很多,“吴”字在香港的译法是NG,两个字母在英文里都是辅音, 不发音。美国看见傻了眼,念不出声,干脆把它们当成缩写,叫他们MR· NO GOOD((不好先生)。我也想起有次同一位美国友人聊天,他说喜欢音乐, 他最推崇的一个音乐家是我们中国人,名字叫做“幽幽骂”,说我一定知 道。我瞪大眼珠子噎在那里,心想谁家父母给儿子取这么个名字?再问是 玩什么乐器的,答说是大提琴,我才醒悟到这个“幽幽骂”是著名的华裔 大提琴家马友友,天啊!

   广东人常说“不怕入错行,最怕起错名”。但是多少父母费尽心机起 的好名字,到了国外,译成另一种语言,却难保不变成一个啼笑皆非的笑话。

  不久前,141个国家的1亿多人坐在电视机前观看了胡夫金字塔的考古发掘工作。一个小机器人通过了埃及最大的金字塔内一条狭窄的通道,试图揭开4600年前的秘密。它的探秘之行以发现了又一道封闭的石门而告终。世界七大奇观中最古老的一个仍然有许多秘密等待破解。此外,世界上仍有许多有待破解的神秘事物。例如亚特兰蒂斯城位于什么地方?究竟是哪个天才创造了“会说话”的水晶头颅?德国《星期日图片报》列举了7个一直诱发我们幻想的最大的谜团。

一、“埃及艳后”克娄巴特拉的宫殿

古埃及壁画中的克娄巴特拉女王

 
著名影星伊丽莎白·泰勒在电影《埃及艳后》中的扮相(左),和古罗马考古发现的克娄巴特拉的头像(右)


  2000多年来,肯定有足够的关于这位历史上最有魅力的女王的传说和神话。直到1996年,海洋考古学家弗兰克·戈迪奥才在亚历山大东港发现了克娄巴特拉女王沉没的安蒂亚霍多斯岛。
  “奢侈豪华、与众不同、色彩绚丽”,戈迪奥这样描绘这座充满了托勒密王朝末代女王悲惨命运的水下宫殿。戈迪奥不仅发现了克娄巴特拉和凯撒所生的儿子凯撒里翁的玄武岩上身雕像,而且还发现了安东尼自杀的地点:安东尼是克娄巴特拉的最后一位情人和丈夫,当他的死敌渥大维占领了亚历山大后,他可能逃到一个狭长的半岛上。据说公元前30年,安东尼就在这个岛上拔剑自刎,悲伤的克娄巴特拉与篮子中的眼镜蛇握手了……

  二、亚特兰蒂斯城在哪儿?
  2300多年以来,这个充满了传奇色彩的城市之国一直激发着人类的想象力。根据传说,亚特兰蒂斯城的城墙和宫殿都是用黄金筑成的,并且在公元前11500年沉没在大海中。这个神话可以追溯到古希腊哲学家柏拉图,他在《克利梯阿斯篇》和《蒂迈乌斯篇》中第一次提到亚特兰蒂斯城。根据柏拉图的记载,是地震让亚特兰蒂斯沉入大海。柏拉图把这个高度发达的富庶国家描述成“被隔开的水域和士地环绕着”——也就是被环形的运河所环绕。从此,热衷于研究亚特兰蒂斯城的人们在地球上发现了50多个可能是该城遗址的地方:在大西洋、在黑海、在亚速尔群岛、在桑托林岛和克里特岛,甚至在北海中的德国赫尔果兰岛。目前人们仍在继续寻找。

  三、水晶头颅
  1924年,一位英国考古学家17岁的女儿安娜·米歇尔—赫奇斯在英属洪都拉斯(今伯利兹)的玛雅城市卢班图姆发现了这只水晶头颅。它至少有3600年的历史,是用一块水晶凿成的。它是迄今为止发现的最精致、并且唯—一只下颚骨可以活动的水晶头颅。根据人们今天对水晶结构的了解,这只头颅根本就不能存在:它的制造违反了水晶的自然属性。即使利用最现代的技术手段也制造不出这样的水晶头颅,因为在加工过程中水晶会碎成1000多块。20世纪70年代初期,惠普公司在反复研究后认定,这只水晶头颅可能经过了300到800年不停的打磨才达到现在这样精确和光滑。
  迄今为止,人们共发现了21只水晶头颅。科学家们估计,以前水晶头颅可能是被当作祭祀用品。而观察者们一再说,他们在水晶头颅里看到了祭祀的场景。
  有关玛雅的传说还谈到了13只相同的水晶头颅。如果把它们放在一起,它们就能说话、唱歌。

  四、神秘的墓碑
  1949年,考古学家阿尔韦托·鲁斯在墨西哥帕伦克“铭文庙”的最上层平台发现了一个通向坟墓的台阶。他发现了一个3.8米长、2.2米宽、带有神秘装饰图案的石板。50年来,专家们对这个图案的意义争吵不休。它展示了一个祭台上的玛雅少年吗?是一个遭到原台巨型怪物复仇的人?还是一个从脖子上长出玉米新生命的谷神?作家埃里希·冯·德尼肯基甚至从中看到了一个宇航员。只有一点是肯定的:帕伦克墓的死者是玛雅侯爵帕卡尔,他死于公元7世纪。根据传说,他死时“呼出了一口热气”。

  五、这是诺亚方舟吗?
  “你要用柏木造一只方舟,舟内建造一些舱房,内外都涂上沥青。你要从一切有血肉的生物中,各带一对,即一公一母,进入方舟,与你一同生活”,上帝用这几句话命令诺亚造一艘船,用它来拯救他的全家和动物免遭大洪水的淹没。在150天的大水之后,诺亚方舟停靠在今天土耳其东部的亚拉腊山上。
  1949年,人们在亚拉腊山西北翼5000米高处测绘地形时发现了一个罕见的石头形成物。这个形成物像个船身,其183米的长度和《圣经》中记载的诺亚方舟的规格大致吻合。它在研究界引起了“方舟热”。80年代,业余考古学家罗恩·怀亚特对这一现象进行了研究,并根据这个物体上的大量线痕来证明它就是诺亚方舟。它的形成“只是”因为地陷还是更多地涉及科学家们今天所说的“亚拉腊山反常”?现在也许只有通过地质卫星的照片才能展示清楚。大洪水的神话继续流传。

  六、星象盘
  在德国内布拉附近的米特尔贝格山发现的星象盘是直径为32厘米的青铜盘,重达两公斤,有3600年的历史。青铜团和银河。它价值1500万欧元。
  3年前,两个盗墓贼发现了这只星象盘并试图将其卖掉。今年2月,它在瑞土巴塞尔被查封。内布拉的星象盘在全世界引起了轰动。“这只出土文物就像英国著名的巨石阵和埃及的金字塔一样重要”,德国考古学家哈拉尔德·梅勒博士说。
  这只星象盘是在252米高的米特尔贝格山的顶峰上的一堵环形的围墙里发现的。“我们不知道它是侯爵的坟墓还是存放圣物的地方”,梅勒猜测道。对于天文学家沃尔夫哈德·施洛瑟来说,这只星象盘是有关宇宙的最古老的表现形式。“很有可能是当时祭司用这只星象盘来预测下一次月食的发生。他一定是拿着这个铜盘站在那个小丘上。月亮一旦位于昂星团上方,几天后就会出现月食。”在过去长达1000年的时间里,在米特尔贝格山这只星象盘的出土地方有可能被用作天文观测台。目前,这个星象盘已经存放在哈雷的萨克森—安哈尔特州立博物馆里。

  七、恐龙陨石坑
  恐龙是地球上出现过的最大的陆地脊椎动物。它们突然灭绝的谜团看来已经被慢慢地揭开。原因可能是因为6500万年前有一颗小行星撞到了墨西哥尤卡坦半岛上。美国最近的计算机模拟也表明了这一点。直到12年前,这个巨大的陨石坑才被发现。从2001年12月起,德国波茨坦地理研究中心开始了这方面的研究。这个天体可能以相当于100亿颗原子弹的冲击力在地球表面撞出了几公里深的裂缝。撞击的碎片纷纷散落,引起了强烈地震、海啸、大洪水和大火灾。这次碰撞产生的大量灰尘和气体混合到大气中,遮天蔽日,使气候出现反常。先是大火,再是冰川期,接下来又是难以忍受的炎热。这场生态灾难造成了植物群和动物群的灭绝,其中包括恐龙。

漫谈oracle中的空值

河北省统计局 贾书民

在数据库中,空值用来表示实际值未知或无意义的情况。在一个表中,如果一行中的某列没有值,那么就称它为空值(NULL)。任何数据类型的列,只要没有使用非空(NOT NULL)或主键(PRIMARY KEY)完整性限制,都可以出现空值。在实际应用中,如果忽略空值的存在,将会造成造成不必要的麻烦。

例如,在下面的雇员表(EMP)中,雇员名(ENAME)为KING的行,因为KING为最高官员(PRESIDENT),他没有主管(MGR),所以其MGR为空值。因为不是所有的雇员都有手续费(COMM),所以列COMM允许有空值,除300、500、1400、0以外的其它各行COMM均为空值。
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
7698 BLAKE MANAGER 7839 01-MAY-81 2850 30
7782 CLARK MANAGER 7839 09-JUN-81 2450 10
7788 SCOTT ANALYST 7566 09-DEC-82 3000 20
7839 KING PRESIDENT 17-NOV-81 5000 10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30
7876 ADAMS CLERK 7788 12-JAN-83 1100 20
7900 JAMES CLERK 7698 03-DEC-81 950 30
7902 FORD ANALYST 7566 03-DEC-81 3000 20
7934 MILLER CLERK 7782 23-JAN-82 1300 10

本文将以上述EMP表为例,具体讨论一下空值在日常应用中所具有的一些特性。

一、空值的生成及特点

1. 空值的生成

如果一列没有非空(NOT NULL)完整性限制,那么其缺省的值为空值,即如果插入一行时未指定该列的值,则其值为空值。

使用SQL语句INSERT插入行,凡未涉及到的列,其值为空值;涉及到的列,如果其值确实为空值,插入时可以用NULL来表示(对于字符型的列,也可以用''来表示)。

例:插入一行,其EMPNO为1、ENAME为'JIA'、SAL为10000、job和comm为空值。
SQL>insert into emp(empno,ename,job,sal,comm) values(1,'JIA',NULL,1000,NULL);
SQL>select * from emp where empno=1;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
1 JIA 1000

可以看到新插入的一行,除job和comm为空值外,mgr、hiredate、deptno三列由于插入时未涉及,也为空值。

使用SQL语句UPDATE来修改数据,空值可用NULL来表示(对于字符型的列,也可以用''来表示)。例:
SQL>update emp set ename=NULL,sal=NULL where empno=1;

2. 空值的特点

空值具有以下特点:

* 等价于没有任何值。
* 与 0、空字符串或空格不同。
* 在where条件中, Oracle认为结果为NULL的条件为FALSE,带有这样条件的select语句不返回行,并且不返回错误信息。但NULL和FALSE是不同的。
* 排序时比其他数据都大。
* 空值不能被索引。

二、空值的测试

因为空值表示缺少数据,所以空值和其它值没有可比性,即不能用等于、不等于、大于或小于和其它数值比较,当然也包括空值本身(但是在decode中例外,两个空值被认为是等价)。测试空值只能用比较操作符IS NULL 和IS NOT NULL。如果使用带有其它比较操作符的条件表达式,并且其结果依赖于空值,那么其结果必定是NULL。在where条件中,Oracle认为结果为NULL的条件为FALSE,带有这样条件的select语句不返回行,也不返回错误信息。

例如查询EMP表中MGR为NULL的行:
SQL>select * from emp where mgr='';
no rows selected
SQL>select * from emp where mgr=null;
no rows selected
SQL>select * from emp where mgr is null;
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7839 KING PRESIDENT 17-NOV-81 5000 10
第1、2句写法不妥,WHERE条件结果为NULL,不返回行。第三句正确,返回MGR为空值的行。
三、 空值和操作符

1.空值和逻辑操作符

逻辑操作符
表达式
结果
AND
NULL AND TRUE
NULL

NULL AND FALSE
FALSE

NULL AND NULL
NULL
OR
NULL OR TRUE
TRUE

NULL OR FALSE
NULL

NULL OR NULL
NULL
NOT
NOT NULL
NULL

可以看到,在真值表中,除NULL AND FALSE 结果为FALSE、NULL OR TRUE结果为TRUE以外,其它结果均为NULL。

虽然在where条件中,Oracle认为结果为NULL的WHERE条件为FALSE,但在条件表达式中NULL不同于FALSE。例如在NOT ( NULL AND FALSE )和NOT ( NULL AND NULL )二者中仅有一处FALSE和TRUE的区别,但NOT ( NULL AND FALSE )的结果为 TRUE,而NOT ( NULL AND NULL )的结果为NULL。

下面举例说明空值和逻辑操作符的用法:

SQL> select * from emp where not comm=null and comm!=0;
no rows selected
SQL> select * from emp where not ( not comm=null and comm!=0 );
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
--------- ---------- --------- --------- --------- --------- --------- ---------
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0 30

第一个Select语句,条件“not comm=null and comm!=0”等价于NULL AND COMM!=0。对于任意一行,如果COMM为不等于0的数值,条件等价于NULL AND TRUE,结果为NULL;如果COMM等于0,条件等价于NULL AND FALSE,结果为FALSE。所以,最终结果不返回行。

第二个Select语句的条件为第一个Select语句条件的“非”(NOT),对于任意一行,如果COMM为不等于0的数值,条件等价于NOT NULL,结果为NULL;如果COMM等于0,条件等价于NOT FALSE,结果为TRUE。所以,最终结果返回行COMM等于0的行。

2.空值和比较操作符

(1)IS [NOT] NULL:是用来测试空值的唯一操作符(见“空值的测试”)。
(2)=、!=、>=、<=、>、<
SQL>select ename,sal,comm from emp where sal>comm;
ENAME SAL COMM
---------- --------- ---------
ALLEN 1600 300
WARD 1250 500
TURNER 1500 0
sal或comm为空值的行,sal>comm比较结果为NULL,所以凡是sal或comm为空值的行都没有返回。
(3)IN和NOT IN操作符
SQL>select ename,mgr from emp where mgr in (7902,NULL);
ENAME MGR
---------- ---------
SMITH 7902

在上述语句中,条件“mgr in (7902,NULL)”等价于mgr=7902 or mgr=NULL。对于表EMP中的任意一行,如果mgr为NULL,则上述条件等价于NULL OR NULL,即为NULL;如果mgr为不等于7902的数值,则上述条件等价于FALSE OR NULL,即为NULL;如果mgr等于7902,则上述条件等价于TRUE OR NULL,即为TRUE。所以,最终结果能返回mgr等于7902的行。

SQL>select deptno from emp where deptno not in ('10',NULL);
no rows selected
在上述语句中,条件“deptno not in ('10',NULL)”等价于deptno!='10' and deptno!=NULL,对于EMP表中的任意一行,条件的结果只能为NULL或FALSE,所以不返回行。

(4)any,some
SQL>select ename,sal from emp where sal> any(3000,null);
ENAME SAL
---------- ---------
KING 5000
条件“sal> any(3000,null)”等价于sal>3000 or sal>null。类似前述(3)第一句,最终结果返回所有sal>3000的行。

(5)All
SQL>select ename,sal from emp where sal> all(3000,null);
no rows selected
条件“sal> all(3000,null)”等价于sal>3000 and sal>null, 结果只能为NULL或FALSE,所以不返回行。


(6)(not)between
SQL>select ename,sal from emp where sal between null and 3000;
no rows selected
条件“sal between null and 3000”等价于sal>=null and sal<=3000, 结果只能为NULL或FALSE,所以不返回行。
SQL>select ename,sal from emp where sal not between null and 3000;
ENAME SAL
---------- ---------
KING 5000
条件“sal not between null and 3000”等价于sal<null or sal>3000,类似前述(3)的第一句,结果返回sal>3000的行。
下表为比较操作符和空值的小结:
比较操作符
表达式(例:A、B是NULL、C=10)
结果
IS NULL、IS NOT NULL
A IS NULL
TRUE

A IS NOT NULL
FALSE

C IS NULL
FALSE

C IS NOT NULL
TRUE
=、!=、>=、<=、>、<
A = NULL
NULL

A > NULL
NULL

C = NULL
NULL

C > NULL
NULL
IN (=ANY)
A IN (10,NULL)
NULL

C IN (10,NULL)
TRUE

C IN (20,NULL)
NULL
NOT IN
(等价于!=ALL)
A NOT IN (20,NULL)
NULL

C NOT IN (20,NULL)
FALSE

C NOT IN (10,NULL)
NULL
ANY,SOME
A > ANY(5,NULL)
NULL

C > ANY(5,NULL)
TRUE

C > ANY(15,NULL)
NULL
ALL
A > ALL(5,NULL)
NULL

C > ALL(5,NULL)
NULL

C > ALL(15,NULL)
FALSE
(NOT)BETWEEN
A BETWEEN 5 AND NULL
NULL

C BETWEEN 5 AND NULL
NULL

C BETWEEN 15 AND NULL
FALSE

A NOT BETWEEN 5 AND NULL
NULL

C NOT BETWEEN 5 AND NULL
NULL

C NOT BETWEEN 15 AND NULL
TRUE

3、 空值和算术、字符操作符

(1)算术操作符:空值不等价于0,任何含有空值的算术表达式其运算结果都为空值,例如空值加10为空值。

(2)字符操作符||:因为ORACLE目前处理零个字符值的方法与处理空值的方法相同(日后的版本中不一定仍然如此),所以对于||,空值等价于零个字符值。例:
SQL>select ename,mgr,ename||mgr,sal,comm,sal+comm from emp;
ENAME MGR ENAME||MGR SAL COMM SAL+COMM
---------- --------- ------------- --------- --------- ---------
SMITH 7902 SMITH7902 800
ALLEN 7698 ALLEN7698 1600 300 1900
WARD 7698 WARD7698 1250 500 1750
JONES 7839 JONES7839 2975
MARTIN 7698 MARTIN7698 1250 1400 2650
BLAKE 7839 BLAKE7839 2850
CLARK 7839 CLARK7839 2450
SCOTT 7566 SCOTT7566 3000
KING KING 5000
TURNER 7698 TURNER7698 1500 0 1500
ADAMS 7788 ADAMS7788 1100
JAMES 7698 JAMES7698 950
FORD 7566 FORD7566 3000
MILLER 7782 MILLER7782 1300
我们可以看到,凡mgr为空值的,ename||mgr结果等于ename;凡是comm为空值的行,sal+comm均为空值。

四、空值和函数

1.空值和度量函数

对于度量函数,如果给定的参数为空值,则其(NVL、TRANSLATE除外)返回值为空值。如下例中的ABS(COMM),如果COMM为空值,ABS(COMM)为空值。
SQL> select ename,sal,comm,abs(comm) from emp where sal<1500;
ENAME SAL COMM ABS(COMM)
---------- --------- --------- ---------
SMITH 800
WARD 1250 500 500
MARTIN 1250 1400 1400
ADAMS 1100
JAMES 950
MILLER 1300

2.空值和组函数

组函数忽略空值。在实际应用中,根据需要可利用nvl函数用零代替空值。例:
SQL>select count(comm),sum(comm),avg(comm) from emp;
COUNT(COMM) SUM(COMM) AVG(COMM)
----------- --------- ---------
4 2200 550
SQL>select count(nvl(comm,0)),sum(nvl(comm,0)),avg(nvl(comm,0))
from emp;
COUNT(NVL(COMM,0)) SUM(NVL(COMM,0)) AVG(NVL(COMM,0))
------------------ ---------------- ----------------
14 2200 157.14286

第一个SELECT语句忽略COMM为空值的行,第二个SELECT语句使用NVL函数统计了所有的COMM,所以它们统计的个数、平均值都不相同。

另外需要注意的是,在利用组函数进行数据处理时,不同的写法具有不同的不同含义,在实际应用中应灵活掌握。例如:
SQL>select deptno,sum(sal),sum(comm), sum(sal+comm),sum(sal)+sum(comm),sum(nvl(sal,0)+nvl(comm,0))
from emp
group by deptno;
DEPTNO SUM(SAL) SUM(COMM) SUM(SAL+COMM) SUM(SAL)+SUM(COMM) SUM(NVL(SAL,0)+NVL(COMM,0))
--------- --------- --------- ------------- ------------------ ---------------------------
10 8750 8750
20 10875 10875
30 9400 2200 7800 11600 11600

可以看到SUM(SAL+COMM)、SUM(SAL)+SUM(COMM)、 SUM(NVL(SAL,0)+NVL(COMM,0))的区别:SUM(SAL+COMM)为先加然后计算各行的和,如果SAL、COMM中有一个为NULL,则该行忽略不计;SUM(SAL)+SUM(COMM)为先计算各行的合计然后再加,SAL、COMM中的NULL都忽略不计,但如果 SUM(SAL)、SUM(COMM)二者的结果之中有一个为NULL,则二者之和为NULL;在SUM(NVL(SAL,0)+NVL(COMM,0))里,SAL、COMM中的NULL按0处理。

五、空值的其它特性

1.空值在排序时大于任何值。例如:
SQL> select ename,comm from emp where deptno='30' order by comm;
ENAME COMM
---------- ---------
TURNER 0
ALLEN 300
WARD 500
MARTIN 1400
BLAKE
JAMES

2.空值不能被索引。虽然在某列上建立了索引,但是对该列的空值查询来说,因为空值没有被索引,所以不能改善查询的效率。例如下面的查询不能利用在MGR列上创建的索引。
SQL>select ename from emp where mgr is null;
ENAME
----------
KING

另外正是因为空值不被索引,所以可在含有空值的列上建立唯一性索引(UNIQUE INDEX)。例如,可以在EMP表的COMM列上建立唯一性索引:
SQL> create unique index emp_comm on emp(comm);
Index created.


http://www.itpub.net/4365.html

Oracle TAF 的配置

TAF為Transparent Application FailOver的缩写,一般应用TAF都是在OPS/RAC环境中。从8i开始有的这一功能,目的和想法都是很好的,但目前应用还很有限,本文将针对TAF相关问题作个详细探讨。


本文的测试环境是Tru64 V5.1+ Oracle9.2.0.1 RAC。


一、相关参数的说明


说实话oracle关於网络的几个配置参数真的是太乱了,很多人都弄不清到底是怎麼回事,常见的错误為:


"ORA-12514 :TNS:listener could not resolve SERVICE_NAME given in connect descriptor" 和


"ORA-12154 :TNS: Could not resolve service name"


实质都是一样的,要解决这样的问题需要我们弄情几个参数:


initsid.ora中的几个参数:


DB_NAME --- database name,即建数据库时所提供的名称。


GLOBAL_NAMES --- True/false,设定是否使用数据库域名。


DB_DOMAIN --- 数据库域名,如果GLOBAL_NAMES=True则要求提供这个参数。


SERVICE_NAMES --- service names list,服务名称,可以有多个。



INSTANCE_NAME --- instance name,和SERVICE_NAMES一样从817开始支持,即从817开始可以将数据库、实例和服务名称分开。默认instance_name的值為 instance的SID,即环境变量ORACLE_SID所对应的值。在817以前没有instance_name参数时,不同的instance是以 SID来区分的。按照oracle817以后的文档解释:SID是為了区别同一主机上各instance的共享内存,并不是instance的唯一区别标示,而instance_name则是区别各个instance的。


环境变量:


ORACLE_SID --- 在817以前没有instance_name参数时,不同的instance是以SID来区分的(详细说明见上面的initsid.ora参数解释)。


listener.ora中的几个参数:


GLOBAL_DBNAME --- 全局数据库名称,在分布式环境中唯一确定不同的数据库。它的值為initsid.ora中DB_NAME和DB_DOMAIN的组合,即 GLOBAL_DBNAME=DB_NAME.DB_DOMAIN,其中DB_DOMAIN如果没有设此处也就不需要了。这个参数在分布式环境中建议明确指定。


SERVICE_NAME --- 服务名称,取initsid.ora中service_names list至一即可。


SID_NAME --- 对应环境变量ORACLE_SID的值。


INSTANCE_NAME ---对应初始化参数instance_name。


tnsnames.ora中的几个参数:


service_name --- 服务名称,取initsid.ora中service_names list至一即可。


sid_name --- 可以简写成:sid,对应ORACLE_SID,也可以是初始化参数instance_name,当等於instance_name且 instance_name不等於ORACLE_SID时,oracle会自动註册一个监听进程,此用以区分不同的instance。


instance_name --- 从817开始有了这个新的参数可以使用,对应初始化参数instance_name。


这样一来,参数就很复杂了,不过我们实际使用并不会用当然十月简单越好了。



二、相关参数设置


下面我将举例说明相关参数的设置:


1、环境变量:ORACLE_SID=rac1/2


2、initsid.ora:


db_name=ora92


service_names = ora92


instance_name=rac1/2


global_names=false


db_domain=""


3、listener.ora:


SID_LIST_RAC1 =


(SID_LIST =


(SID_DESC =


(GLOBAL_DBNAME = ora92)


(ORACLE_HOME = /oracle/oracle9/app/oracle/product/9.2.0)


(SERVICE_NAME=ora92)(SID_NAME = rac1)


)


)



SID_LIST_RAC2 =


(SID_LIST =


(SID_DESC =


(GLOBAL_DBNAME = ora92)


(ORACLE_HOME = /oracle/oracle9/app/oracle/product/9.2.0)


(SERVICE_NAME=ora92)(SID_NAME = rac2)


)


)



RAC1 =


(DESCRIPTION_LIST =


(DESCRIPTION =


(ADDRESS_LIST =


(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.3.1)(PORT = 1522))


)


)


)



RAC2 =


(DESCRIPTION_LIST =


(DESCRIPTION =


(ADDRESS_LIST =


(ADDRESS = (PROTOCOL = TCP)(HOST = 10.1.3.2)(PORT = 1522))


)


)


)



三、TAF的设置


其实TAF设置很简单,在tnsnames.ora中添加failover=on即可,有两种不同的设置方法:


1、公用一个tns name方式:==================================================


myrac =


(description=


(load_balance=on)


(failover=on)


(address= (protocol=tcp)(host=10.1.3.1)(port=1522))


(address= (protocol=tcp)(host=10.1.3.2)(port=1522))


(connect_data= (service_name=ora92)


(failover_mode=(type=select)(method=basic)(retries=20)(delay=20))


)


)


====================================================


 


2、指明instance backup方式:===============================================


rac1 =


(description=


(load_balance=on)


(failover=on)


(address= (protocol=tcp)(host=10.1.3.1)(port=1522))


(connect_data= (service_name=ora92)


(failover_mode=(type=select)(method=basic)


(backup=rac2)(retries=20)(delay=20))


)


)


 


rac2 =


(description=


(load_balance=on)


(failover=on)


(address= (protocol=tcp)(host=10.1.3.2)(port=1522))


(connect_data= (service_name=ora92)


(failover_mode=(type=select)(method=basic)


(backup=rac1)(retries=20)(delay=20))


)


)


=======================================


 


四、TAF测试方法


一般可以将当前连接的instance down下来,client端将不会断开,并自动切换到backup节点上。相反也会自动切换回来。


当然也有人提出用post_transaction的方式来测试TAF,其实这样有时是得不到预期结果的,原因在於Oracle连接到一个instance 上后,此后它会优先尝试对该instance的连接,当你disconnect后,client端一有新的请求就会自动尝试对最近连接的instance 进行连接,如果不成功才会尝试对backup instance进行连接。 


http://emil.hk-power.net/modules/technicaldoc/article_view.php?id=97

最近因看到论坛有人问起这方面的东西,将自己的理解加上查阅相关资料整理如下,如果不全或不当的地方,望指正并补全它。

数据库名(DB_NAME)、实例名(Instance_name)、以及操作系统环境变量(ORACLE_SID)

在ORACLE7、8数据库中只有数据库名(db_name)和数据库实例名(instance_name)。在ORACLE8i、9i中出现了新的参数,即数据库域名(db_domain)、服务名(service_name)、以及操作系统环境变量(ORACLE_SID)。这些都存在于同一个数据库中的标识,用于区分不同数据库的参数。

一、什么是数据库名(db_name)?
数据库名是用于区分数据的内部标识,是以二进制方式存储于数据库控制文件中的参数,在数据安装或创建之后将不得修改。数据库安装完成后,该参数被写入数据库参数文件pfile中,格式如下:

.........
db_name="orcl"     #(不允许修改)
db_domain=dbcenter.toys.com
instance_name=orcl
service_names=orcl.dbcenter.toys.com
control_file=(...............
......... 


在每一个运行的ORACLE8i数据库中都有一个数据库名(db_name),如果一个服务器程序中创建了两个数据库,则有两个数据库名。其控制参数据分属在不同的pfile中控制着相关的数据库。

二、什么是数据库实例名(instance_name)
数据库实例名则用于和操作系统之间的联系,用于对外部连接时使用。在操作系统中要取得与数据库之间的交互,必须使用数据库实例名。例如,要和某一个数据库server连接,就必须知道其数据库实例名,只知道数据库名是没有用的,与数据库名不同,在数据安装或创建数据库之后,实例名可以被修改。数据库安装完成后,该实例名被写入数据库参数文件pfile中,格式如下:

db_name="orcl"     #(不允许修改)
db_domain=dbcenter.toys.com
instance_name=orcl  #(可以修改,可以与db_name相同也可不同)
service_names=orcl.dbcenter.toys.com
control_file=(...............
.........

数据库名与实例名之间的关系。
数据库名与实例名之间的关系一般是一一对应关系,有一个数据库名就有一个实例名,如果在一个服务器中创建两个数据库,则有两个数据库名,两个数据库实例名,用两个标识确定一个数据库,用户和实例相连接。
但在8i、9i的并行服务器结构中,数据库与实例之间不存在一一对应关系,而是一对多关系,(一个数据库对应多个实例,同一时间内用户只一个实例相联系,当某一实例出现故障,其它实例自动服务,以保证数据库安全运行。)

三、操作系统环境变量(ORACLE_SID)
在实际中,对于数据库实例名的描述有时使用实例名(instance_name)参数,有时使用ORACLE_SID参数。这两个都是数据库实例名,它们有什么区别呢?(经常弄混) 

      (ORACLE_SID)
OS<----------------> ORACLE 数据库 <--------(Instance_name(实例名))

上图表示实例名instance_name、ORACLE_SID与数据库及操作系统之间的关系,虽然这里列出的两个参数都是数据库实例名,但instance_name参数是ORACLE数据库的参数,此参数可以在参数文件中查询到,而ORACLE_SID参数则是操作系统环境变量。
操作系统环境变量ORACLE_SID用于和操作系统交互。也就是说,在操作系统中要想得到实例名,就必须使用ORACLE_SID。此参数与ORACLE_BASE、ORACLE_HOME等用法相同。在数据库安装之后,ORACLE_SID被用于定义数据库参数文件的名称。如:
$ORACLE_BASE/admin/DB_NAME/pfile/init$ORACLE_SID.ora。
定义方法:

export ORACLE_SID=orcl


如果在同一服务器中创建了多个数据库,则必然同时存在多个数据库实例,这时可以重复上述定义过程,以选择不同实例。

还可以用

[oracle@Datacent]$ . oraenv


来切换不同的ORACLE_SID来通过操作系统来启动不同的实例(instance)


http://www.chinaunix.net/jh/19/348162.html

数据库恢复实例

仅仅丢失一个普通用户数据文件的恢复A(联机恢复)

(例如,丢失D:\BACKUPDB\USERS01.DBF)
准备工作, 通过下面的工作,如果完全恢复,应该可以看到;insert into test1 values(2);


SQL> conn lunar/lunar
SQL> select * from tab;
TESTBACKUP3 TABLE
SQL> create table test1 (a number);
SQL> insert into test1 values(1);
SQL> alter system switch logfile;
SQL> commit;
SQL> alter system switch logfile;
SQL> insert into test1 values(2);
SQL> commit;
SQL> alter system switch logfile;
SQL> conn internal
SQL> archive log list
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 3
下一个存档日志序列 5
当前日志序列 5
shutdown abort关闭例程,模拟数据文件丢失
SQL> shutdown abort
ORACLE 例程已经关闭。
Mount数据库
SQL> startup mount
数据库装载完毕。


使损坏的数据文件脱机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' offline;
打开数据库
SQL> alter database open;
拷贝刚才热备的数据文件(USERS01.DBF)
恢复损坏的数据文件
SQL> recover datafile 'D:\BACKUPDB\USERS01.DBF';
ORA-00279: ?? 424116 (? 10/20/2002 20:42:04 ??) ???? 1 ????
ORA-00289: ??: D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: ?? 424116 ???? 1 ???? # 1 ???


指定日志: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: ?? 424125 (? 10/20/2002 20:44:14 ??) ???? 1 ????
ORA-00289: ??: D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: ?? 424125 ???? 1 ???? # 2 ???
ORA-00278: ??????????? 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC'
……………………..
已应用的日志。
完成介质恢复。


使恢复完成的数据文件联机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
验证恢复的结果:完全恢复
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
SQL> select * from test1;


说明:
1. shutdown abort关闭例程,模拟数据文件丢失
2. Mount数据库
3. 使损坏的数据文件脱机
4. 打开数据库
5. 拷贝刚才热备的数据文件(USERS01.DBF)
6. 恢复损坏的数据文件
7. 使恢复完成的数据文件联机


shutdown immedate,恢复全部数据文件(不包括control和redo)

(把热备的数据文件拷贝回来,不包括control和redo)
SQL> conn internal
SQL> shutdown immediate;

复制全部热备的数据文件过来(完全恢复成功!)
mount数据库
SQL> startup mount


完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
……………………………………………..
Log applied.
Media recovery complete.
打开数据库
SQL> alter database open;


验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;


完全恢复成功!
说明:
1. 复制全部热备的数据文件过来
2. mount数据库
3. 完全恢复数据库
4. 打开数据库



shutdown abort的情况,恢复全部控制文件和数据文件(不包括redo)

准备工作 (这样,insert into test1 values(13);就是没有提交的数据了,如果完全恢复,应该一直可以看到insert into test1 values(12);)
SQL> conn lunar/lunar
SQL> select * from test1;
SQL> insert into test1 values(12);
commit;
SQL> insert into test1 values(13);


单开一个session,用来shutdow abort
E:\>sqlplus internal
SQL> shutdown abort
ORACLE 例程已经关闭。


拷贝所有的控制文件和数据文件(不包括redo)
mount数据库,按照提示重建口令文件
SQL> startup mount
ORACLE instance started.
ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'


SQL> host
E:\>cd d:\oracle1\ora81\DATABASE
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA pa
ssword=oracle entries=10
/* orapwd Usage: orapwd file=<fname> password=<password> entries=<users>
where
file - name of password file (mand),
password - password for SYS and INTERNAL (mand),
entries - maximum number of distinct DBAs and OPERs (opt),
There are no spaces around the equal-to (=) character. */
D:\oracle1\ora81\database>exit
这时,试图完全恢复数据库是不成功的
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done
用to trace备份控制文件
SQL>alter database backup controlfile to trace;
SQL>shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
找到并且编辑控制文件
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;
重建控制文件
SQL> startup nomount
SQL> @D:\BACKUPDB\udump\ORA01532.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Control file created.
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1
ORA-00308: cannot open archived log 'ALTER'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'


shutdown immediate,然后重新恢复数据库
SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.


完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
………………………………………..
Log applied.
Media recovery complete.
打开数据库
SQL> alter database open;
SQL> conn lunar/lunar
SQL> select * from test1;

说明:
1. 拷贝所有的控制文件和数据文件(不包括redo)
2. mount数据库,按照提示重建口令文件
3. 这时,试图完全恢复数据库是不成功的
4. 用to trace备份控制文件
5. 找到并且编辑控制文件
6. 重建控制文件
7. shutdown immediate,然后重新恢复数据库
8. 完全恢复数据库
9. 打开数据库



仅仅丢失一个普通用户数据文件的恢复B(脱机恢复)

准备工作 按照下面的输入,如果全部恢复,应该可以看到insert into test1 values(13),因为insert into test1 values(14)没提交。
SQL> conn lunar/lunar
SQL> insert into test1 values(13);
SQL> insert into test1 values(14);


Shutdown immediate,然后模拟数据文件丢失
单开一个session,执行shutdown immediate(保证insert into test1 values(14);没有被隐式提交)
E:\>sqlplus internal
SQL>shutdown immediate
ORACLE 例程已经关闭。
模拟数据文件丢失,然后用热备覆盖这个文件
mount数据库
E:\>sqlplus internal
SQL>shutdown immediate
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist


SQL> startup mount
使损坏的数据文件脱机
SQL>alter database datafile 'D:\BACKUPDB\USERS01.DBF' offline;
Database altered.
恢复数据文件
SQL> recover datafile 'D:\BACKUPDB\USERS01.DBF';
ORA-00279: change 424116 generated at 10/20/2002 20:42:04 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424116 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
…………………………………………………………
Log applied.
Media recovery complete.
使恢复的数据文件联机
SQL>alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
打开数据库
SQL>alter database open;
Database altered.


这时需要重新启动数据库,并完全恢复数据库
SQL> conn lunar/lunar
SQL> select count(*) from test;
select count(*) from test
*
ERROR at line 1:
ORA-00942: table or view does not exist
SQL> conn internal
SQL> shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
重新启动数据库,
SQL> startup
ORACLE instance started.


用recover database再次恢复数据库
SQL> conn internal
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01124: cannot recover data file 1 - file is in use or recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'


重新使恢复的表空间联机
SQL> alter database datafile 'D:\BACKUPDB\USERS01.DBF' online;
SQL> conn lunar/lunar
SQL> select * from test1; ok.


验证恢复结果:完全恢复
说明:
1. 用热备覆盖这个文件
2. mount数据库
3. 使损坏的数据文件脱机
4. 恢复数据文件
5. 使恢复的数据文件联机
6. 打开数据库
7. 这时需要重新启动数据库,并完全恢复数据库
8. 重新启动数据库,
9. 用recover database再次恢复数据库
10. 重新使恢复的表空间联机


shutdown abort后,丢失全部文件(除了archive log和init.ora)

即,丢失了全部:数据文件、控制文件和redo log file
准备工作 下面的信息说明了如果是完全恢复,可以看到insert into test1 values(16);,否则可以看到15,就是被归档的那个。17因为没有提交,是不会被恢复的。


SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 14
Next log sequence to archive 16
Current log sequence 16
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;
SQL> insert into test1 values(15);
SQL> alter system switch logfile;
System altered.
SQL> insert into test1 values(16);
SQL> insert into test1 values(17);
新开一个session,进行shutdown abort


E:\>sqlplus internal
SQL> shutdown abort
ORACLE 例程已经关闭。

把热备的数据文件和控制文件拷贝过来
mount数据库
E:\>sqlplus internal
SQL> startup mount
ORACLE instance started.


ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'


根据提示重建口令文件
SQL> host
E:\>del d:\oracle1\ora81\DATABASE\PWDbackup.ORA
E:\>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=
10

用to trace备份控制文件
SQL> alter database backup controlfile to trace;
Database altered.
找到这个跟踪文件并编辑它
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;


重建控制文件(这种丢失的状态重建控制文件是错误的)
SQL> shutdown immediate
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup nomount
ORACLE instance started.


Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes


SQL> @D:\BACKUPDB\udump\ORA02176.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
*
ERROR at line 1:
ORA-01503: CREATE CONTROLFILE failed
ORA-01565: error in identifying file 'D:\BACKUPDB\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


ORA-01507: database not mounted
ALTER SYSTEM ARCHIVE LOG ALL
*
ERROR at line 1:
ORA-01507: database not mounted
ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01507: database not mounted


可见,因为缺少所有的redo,重建控制文件是行不通的。
Mount数据库
SQL> alter database mount;
Database altered.
用using backup controlfile进行恢复
SQL> alter database mount;
Database altered.
SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
……………………………………………………


ORA-00308: cannot open archived log 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00017.ARC'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


用Open Resetlog 打开数据库
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
SQL> alter database open RESETLOGS;
Database altered.


验证恢复结果:不完全恢复,redo里面的数据丢失了
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 0
Next log sequence to archive 1
Current log sequence 1
说明:
1. 把热备的数据文件和控制文件拷贝过来
2. mount数据库
3. 根据提示重建口令文件
4. 用using backup controlfile进行恢复
5. 用Open Resetlog 打开数据库


丢失非系统非当前活动回滚段表空间中的一个数据文件

首先是做一次热备份(因为上次已经做了不完全恢复resetlogs)
Microsoft Windows 2000 [Version 5.00.2195]


E:\>sqlplus internal
SQL>archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1
SQL> @e:\backupdb\other\aa
TO_CHAR(SYSDATE,'' ………………..YY'2002-10-21 08:10:22'
SQL> @e:\backupdb\other\backup_ts.sql
SQL> set echo off head off feedback off pagesize 0;
21-10月-02


BEGINING ARCHIVE LOG NUMBER IS :
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1


Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace RBS.'D:\BACKUPDB\RBS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEMP.'D:\BACKUPDB\TEMP01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TOOLS.'D:\BACKUPDB\TOOLS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .


Begin Backup Tablespace INDX.'D:\BACKUPDB\INDX01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .


Begin Backup CONTROLFILE 'D:\BACKUPDB\CONTROL01.CTL' ...
Successed End Backup The CONTROLFILE .


Begin Backup CONTROLFILE To Trace ...
Successed End Backup The CONTROLFILE .


Before Switch Log, The Current Log is:
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 0
下一个存档日志序列 1
当前日志序列 1


Begin Backup Switch Current Log ...
Successed End Switch Log .


After Switch Log, The Ending Archive Log Number Is :
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 1
下一个存档日志序列 2
当前日志序列 2
21-10月-02
SQL> --set termout on;
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'2002-10-21 08:10:54'


数据准备工作1
从下面的情况看,因为改变了数据库的结构,所以,首先需要一个热备或者冷备才能进行恢复。如果已经备份,可以找回数据insert into test2 values(2);,因为2是几经commit;的,3是没有commit的,所以能找会到2。3则会丢失。


SQL> alter tablespace system add datafile 'D:\BACKUPDB\SYSTEM02.DBF' size 10M;
表空间已更改。
SQL> alter tablespace users add datafile 'D:\BACKUPDB\USERS02.DBF' size 10M;
表空间已更改。
SQL> create tablespace test datafile 'D:\BACKUPDB\test01.dbf' size 10M;
表空间已创建。
SQL> archive log list;
数据库日志模式 存档模式
自动存档 启用
存档终点 d:\BACKUPDB\archive
最早的概要信息日志序列 1
下一个存档日志序列 2
当前日志序列 2
SQL> alter user lunar quota 10m on test;
SQL> create table test2(a number) tablespace test;
SQL> insert into test2 values(1);
SQL> alter system switch logfile;
系统已更改。
SQL> conn lunar/lunar
SQL> select * from tab;
TESTBACKUP3 TABLE


SQL> insert into test2 values(2);
SQL> insert into test2 values(3);
以上改动后需要作一次热备或者冷备,否则数据文件丢失后不能恢复(增加表空间,数据文件都要备份数据库)
SQL> conn internal
SQL> @e:\backupdb\other\aa
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'2002-10-21 08:10:05'
SQL> set termout off
SQL> @e:\backupdb\other\backup_ts.sql
SQL> --set termout off;
SQL> set echo off head off feedback off pagesize 0;
21-OCT-02
BEGINING ARCHIVE LOG NUMBER IS :
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5


Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace RBS.'D:\BACKUPDB\RBS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEMP.'D:\BACKUPDB\TEMP01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TOOLS.'D:\BACKUPDB\TOOLS01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace INDX.'D:\BACKUPDB\INDX01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace SYSTEM.'D:\BACKUPDB\SYSTEM02.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace USERS.'D:\BACKUPDB\USERS02.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup Tablespace TEST.'D:\BACKUPDB\TEST01.DBF' ...
已复制 1 个文件。
Successed End Backup This File .
Begin Backup CONTROLFILE 'D:\BACKUPDB\CONTROL01.CTL' ...
Successed End Backup The CONTROLFILE .
Begin Backup CONTROLFILE To Trace ...
Successed End Backup The CONTROLFILE .
Before Switch Log, The Current Log is:
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 3
Next log sequence to archive 5
Current log sequence 5


Begin Backup Switch Current Log ...
Successed End Switch Log .


After Switch Log, The Ending Archive Log Number Is :
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 4
Next log sequence to archive 6
Current log sequence 6
21-OCT-02


SQL> --set termout on;
SQL> select to_char(sysdate,'''yyyy-mm-dd hh:mm:ss''') from dual;
'2002-10-21 08:10:31'
1 row selected.


数据准备工作2
可以找回数据insert into test2 values(4);,因为4是几经commit;的,5是没有commit的,所以能找会到2。3则会丢失。
SQL> conn lunar/lunar
SQL> insert into test2 values(4);
SQL> commit;
SQL> insert into test2 values(5);
1 row created.


Shutdow abort,然后删除test01.dbf,模拟数据文件丢失
SQL> conn internal
SQL> shutdown abort
ORACLE instance shut down.

删除test01.dbf,把备份的数据文件test01.dbf拷贝过来
Mount数据库
SQL> startup mount;
………………


Database mounted.
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01113: file 9 needs media recovery
ORA-01110: data file 9: 'D:\BACKUPDB\TEST01.DBF'


在打开数据库的时候,提示'D:\BACKUPDB\TEST01.DBF'需要介质恢复,因为他和其他的文件时间点不一致。


恢复数据文件(把最近的热备的文件拷贝过来)
SQL> recover datafile 'D:\BACKUPDB\TEST01.DBF';
Media recovery complete.
打开数据库
SQL> alter database open;
验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test2;
说明:
? 首先是做一次热备(因为上次已经做了不完全恢复resetlogs)
? 以上改动后需要作一次热备或者冷备,否则数据文件丢失后不能恢复(增加表空间,数据文件都要备份数据库)


1. Shutdow abort,然后删除test01.dbf,模拟数据文件丢失
2. 删除test01.dbf,把备份的数据文件test01.dbf拷贝过来
3. Mount数据库
4. 恢复数据文件(把最近的热备的文件拷贝过来)
5. 打开数据库



shutdown abort的情况,恢复全部数据文件(不包括control和redo)

用热备的数据文件恢复(把热备的数据文件拷贝回来,不包括control和redo)
SQL> conn internal
SQL> shutdown abort
ORACLE instance shut down.

复制全部热备的数据文件过来(完全恢复成功!)
mount数据库
SQL> startup mount
ORACLE instance started.


完全恢复数据库
SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
…………………………………………………
Log applied.
Media recovery complete.


打开数据库
SQL> alter database open;
Database altered.
验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!


说明:
1. 复制全部热备的数据文件过来
2. mount数据库
3. 完全恢复数据库
4. 打开数据库


shutdown immediate的情况,丢失全部控制文件和数据文件(不包括redo),方法1

准备工作
下面的操作,说明如果完全恢复,可以看到insert into test1 values(11);,因为11是redo中已经commit的,12是redo中没有commit的
SQL> insert into test1 values(8);
SQL> commit;
SQL> insert into test1 values(9);
SQL> alter system switch logfile;
System altered.
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 11
Next log sequence to archive 13
Current log sequence 13
SQL> conn lunar/lunar
SQL> insert into test1 values(10);
SQL> commit;
SQL> insert into test1 values(11);
SQL> conn internal
SQL> conn lunar/lunar
SQL> insert into test1 values(12);
1 row created.
然后单独开启一个实例,再shutdown immediate
(这样,insert into test1 values(12);就是没有提交的数据了,如果完全恢复应该一直可以看到insert into test1 values(11);)
E:\>sqlplus internal
SQL>shutdown immediate
数据库已经关闭。
已经卸载数据库。
ORACLE 例程已经关闭。
拷贝热备的所有控制文件和数据文件
mount数据库
SQL> startup mount
ORACLE 例程已经启动。
Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes
ORA-01991: ???????'d:\oracle1\ora81\DATABASE\PWDbackup.ORA'


根据提示,重建口令文件
SQL> host
E:\>cd d:\oracle1\ora81\DATABASE\PWDbackup
系统找不到指定的路径。
E:\>cd d:\oracle1\ora81\DATABASE
E:\>d:
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>dir PWDbackup.ORA
驱动器 D 中的卷是 Program
卷的序列号是 D0E6-FA1C
D:\oracle1\ora81\database 的目录
找不到文件
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA pa
ssword=oracle entries=10;
D:\oracle1\ora81\database>exit
用to trace备份控制文件
SQL> alter database backup controlfile to trace;
数据库已更改。
shutdown immediate关闭数据库
SQL> shutdown immediate;
ORA-01109: ??????


已经卸载数据库。
ORACLE 例程已经关闭。
找到那个控制文件,然后编辑:
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;


重建控制文件,并且恢复数据库
SQL> startup nomount
ORACLE 例程已经启动。


SQL> @D:\BACKUPDB\udump\ORA01904.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.


ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


ORA-00308: cannot open archived log 'ALTER'
ORA-27041: unable to open file
OSD-04002: 无法打开文件
O/S-Error: (OS 2) 系统找不到指定的文件。


ALTER DATABASE OPEN
*
ERROR at line 1:
ORA-01113: file 1 needs media recovery
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'


关闭数据库
除了redo log file中没有提交的数据,其他都可以找回来
SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.


重新mount,作完全恢复(recover database;)
SQL> startup mount
ORACLE instance started.



SQL> recover database;
ORA-00279: change 424112 generated at 10/20/2002 20:40:52 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC
ORA-00280: change 424112 for thread 1 is in sequence #1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00279: change 424125 generated at 10/20/2002 20:44:14 needed for thread 1
ORA-00289: suggestion : D:\BACKUPDB\ARCHIVE\BACKUPT001S00002.ARC
ORA-00280: change 424125 for thread 1 is in sequence #2
ORA-00278: log file 'D:\BACKUPDB\ARCHIVE\BACKUPT001S00001.ARC' no longer needed
for this recovery
…………………………………………..
Log applied.
Media recovery complete.

打开数据库
SQL> alter database open;
Database altered.


验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 12
Next log sequence to archive 14
Current log sequence 14
说明:
1. 把热备的控制文件和数据文件拷贝过来
2. mount数据库
3. 根据提示,重建口令文件
4. 用to trace备份控制文件
5. shutdown immediate关闭数据库
6. 找到那个控制文件,然后编辑
7. 重建控制文件,并且恢复数据库
8. 关闭数据库
9. 重新mount,作完全恢复(recover database;)
10. 打开数据库




shutdown immediate的情况,丢失全部控制文件和数据文件(不包括redo),方法2

准备工作
如果数据不丢失,应该可以恢复到insert into test1 values(14);,因为14是redo中commit的,15是redo中没有commit的
SQL> conn lunar/lunar
SQL> select * from test1;


SQL> insert into test1 values(14);
SQL> commit;
SQL> insert into test1 values(15);


把热备的控制文件和数据文件拷贝过来
mount数据库
SQL> startup mount
ORACLE instance started.


ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'


根据提示,重建口令文件
SQL> host
E:\>del d:\oracle1\ora81\DATABASE\PWDbackup.ORA


E:\>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=
10

尝试恢复数据库(现在恢复是不可以的)
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done


SQL> recover database using BACKUP CONTROLFILE;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed


SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'
可见这样恢复是不行的


试图打开数据库(现在打开是不可以的)
SQL> alter database open;
alter database open
*
ERROR at line 1:
ORA-01589: must use RESETLOGS or NORESETLOGS option for database open


SQL> alter database open resetlogs;
alter database open resetlogs
*
ERROR at line 1:
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'
可见现在打开是不行的


重新mount数据库
SQL> shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
SQL> startup mount;
ORACLE instance started.


备份控制文件
SQL> alter database backup controlfile to trace;
Database altered.
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.


找到那个控制文件,并且编辑它
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;


重建控制文件,并自动完全恢复数据库
SQL> startup nomount
ORACLE instance started.


Total System Global Area 25856028 bytes
Fixed Size 75804 bytes
Variable Size 8925184 bytes
Database Buffers 16777216 bytes
Redo Buffers 77824 bytes
SQL> @D:\BACKUPDB\udump\ORA02020.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Control file created.


ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
System altered.
Database altered.


验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1 where a>10;


说明:
1. 把热备的控制文件和数据文件拷贝过来
2. mount数据库
3. 根据提示,重建口令文件
4. 尝试恢复数据库(现在恢复是不可以的)
如,这三个,都不能恢复数据库:
recover database;
recover database using BACKUP CONTROLFILE;
recover database until cancel using backup controlfile;
5. 试图打开数据库(现在打开是不可以的)
如,这两个,都不能打开数据库
alter database open;
alter database open resetlogs;
6. 重新mount数据库
7. 备份控制文件
8. 找到那个控制文件,并且编辑它
9. 重建控制文件,并自动完全恢复数据库



shutdown abort的情况,恢复全部控制文件(不包括数据文件和redo)

准备工作
以下说明,如果完全恢复数据库,应该可以看到insert into test1 values(7);
SQL> insert into test1 values(3);
SQL> insert into test1 values(4);
SQL> commit;
SQL> alter system switch logfile;
SQL> conn internal
SQL> archive log list;
Database log mode Archive Mode
Automatic archival Enabled
Archive destination d:\BACKUPDB\archive
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence 10
SQL> select * from test1;
SQL> insert into test1 values(5);
SQL> commit;
SQL> insert into test1 values(6);
SQL> alter system switch logfile;
System altered.
SQL> conn internal
SQL> conn lunar/lunar
SQL> insert into test1 values(7);
1 row created.
SQL> shutdown abort;
ORA-01031: insufficient privileges
SQL> conn internal
SQL> shutdown abort;
ORACLE instance shut down.
删除那个控制文件,把热备的控制文件拷贝过来
mount数据库
SQL> startup mount
ORACLE instance started.
ORA-01991: invalid password file 'd:\oracle1\ora81\DATABASE\PWDbackup.ORA'


根据提示,重建口令文件
SQL> host
E:\>cd d:\oracle1\ora81\DATABASE
E:\>d:
D:\oracle1\ora81\database>del PWDbackup.ORA
D:\oracle1\ora81\database>dir
驱动器 D 中的卷是 Program
卷的序列号是 D0E6-FA1C


D:\oracle1\ora81\database 的目录


2002-10-21 00:42 <DIR> .
2002-10-21 00:42 <DIR> ..
2002-10-05 15:36 <DIR> archive
2002-10-17 13:39 40 initBACKUP.ora
2002-10-05 16:09 50 inittest.ora
2002-10-05 15:36 31,744 oradba.exe
2002-10-07 23:39 206 oradim.log
2002-10-16 18:21 1,536 PWDtest.ora
5 个文件 33,576 字节
3 个目录 2,775,724,032 可用字节


D:\oracle1\ora81\database>
D:\oracle1\ora81\database>orapwd file=d:\oracle1\ora81\DATABASE\PWDbackup.ORA password=oracle entries=10;


D:\oracle1\ora81\database>exit
用to trace;备份控制文件
SQL> alter database backup controlfile to trace;
SQL> shutdown immediate
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.


找到那个控制文件,然后编辑
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;


重建控制文件,并且恢复数据库(完全恢复成功!)
SQL> @D:\BACKUPDB\udump\ORA02092.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.


Media recovery complete.
System altered.
Database altered.
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!


说明:
当shutdown abort的以后,如果丢失全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复(一直恢复到redo中commit的数据),必须执行以下步骤:
1. mount数据库,
2. backup controlfile to trace
3. 修改这个生成的控制文件
4. nomount
5. 重建控制文件,



shutdown immediate,丢失全部控制文件(不包括数据文件和redo),A[完全恢复]

SQL> conn internal
SQL> shutdown immediate;

用热备的控制文件恢复(把热备的控制文件拷贝回来)
mount数据库
SQL> startup mount
ORACLE instance started.


完全恢复和until cancel using backup controlfile都失败
SQL> recover database;
ORA-00283: recovery session canceled due to errors
ORA-01610: recovery using the BACKUP CONTROLFILE option must be done


SQL> recover database until cancel using backup controlfile;
ORA-00279: change 424123 generated at 10/20/2002 20:44:12 needed for thread 1


Specify log: {<RET>=suggested | filename | AUTO | CANCEL}
auto
ORA-00266: name of archived log file needed


ORA-01547: warning: RECOVER succeeded but OPEN RESETLOGS would get error below
ORA-01152: file 1 was not restored from a sufficiently old backup
ORA-01110: data file 1: 'D:\BACKUPDB\SYSTEM01.DBF'


重建控制文件
SQL> alter database backup controlfile to trace;
Database altered.


找到那个控制文件,然后编辑
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "BACKUP" NORESETLOGS ARCHIVELOG
MAXLOGFILES 32
MAXLOGMEMBERS 2
MAXDATAFILES 254
MAXINSTANCES 1
MAXLOGHISTORY 453
LOGFILE
GROUP 1 'D:\BACKUPDB\REDO01.LOG' SIZE 1M,
GROUP 2 'D:\BACKUPDB\REDO02.LOG' SIZE 1M,
GROUP 3 'D:\BACKUPDB\REDO03.LOG' SIZE 1M
DATAFILE
'D:\BACKUPDB\SYSTEM01.DBF',
'D:\BACKUPDB\RBS01.DBF',
'D:\BACKUPDB\USERS01.DBF',
'D:\BACKUPDB\TEMP01.DBF',
'D:\BACKUPDB\TOOLS01.DBF',
'D:\BACKUPDB\INDX01.DBF'
CHARACTER SET ZHS16GBK
;
RECOVER DATABASE
ALTER SYSTEM ARCHIVE LOG ALL;
ALTER DATABASE OPEN;


重建控制文件,并且恢复数据库(完全恢复成功!)
SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL> startup nomount;
ORACLE instance started.


SQL>@D:\BACKUPDB\udump\ORA02120.sql
ORA-01081: cannot start already-running ORACLE - shut it down first
Cluster altered.
ORA-00283: recovery session canceled due to errors
ORA-00264: no recovery required
System altered.
Database altered.


验证恢复结果:完全恢复
SQL> conn lunar/lunar
SQL> select * from test1;
完全恢复成功!


说明:
当shutdown immediate的以后,如果丢失全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复(一直恢复到redo中commit的数据),必须执行以下步骤:
1. mount数据库,
2. backup controlfile to trace
3. 修改这个生成的控制文件
4. nomount
5. 重建控制文件

ORACLE9I 控制文件丢失的处理方法

为了测试,我shutdown数据库后,直接把三个控制文件删除了。
  
然后按以下步骤操作,如图:
第一步: 本贴包含图片附件:


第二步:输入以下命令,创建新的控制文件:特别注意红框中需要更改 本贴包含图片附件:

第三步:alter database open,检查数据,如图: 本贴包含图片附件:


补充两种情况 :
  
如果是shutdown immediate
丢失了全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复。
1.  mount数据库,
(完全恢复和until cancel using backup controlfile都失败)
2.  backup controlfile to trace
3.  修改这个生成的控制文件
4.  nomount
5.  重建控制文件,  
  
如果shutdown abort的以后,
丢失全部控制文件(不包括数据文件和redo),需要用热备的控制文件恢复数据库的时候,要想完全恢复(一直恢复到redo中commit的数据),必须执行以下步骤:
  
1.  mount数据库,
2. 根据提示,重建口令文件
3.  backup controlfile to trace
4.  修改这个生成的控制文件
5.  nomount
6.  重建控制文件


http://www.oracle.com.cn/viewthread.php?tid=16526

  经验总结:


  联机日志分为当前联机日志和非当前联机日志,非当前联机日志的损坏是比较简单的,一般通过clear命令就可以解决问题。


  损坏非当前联机日志:


  1、启动数据库,遇到ORA-00312 or ORA-00313错误,如:


  ORA-00313: open failed for members of log group 4 of thread 1


  ORA-00312: online log 3 thread 1: '/opt/oracle/db04/oradata/ORCL/redo03.log'


  从这里我们知道日志组1的数据文件损坏或丢失了


  从报警文件可以看到更详细的信息


  2、查看V$log视图:


  SQL> select group#,sequence#,archived,status from v$log;


    GROUP#  SEQUENCE# ARC STATUS


---------- ---------- --- ----------------


         1         54 YES INACTIVE


         2         55 NO  CURRENT


3             53 YES INACTIVE


  可以知道,该组是非当前状态,而且已经归档。


  3、用CLEAR命令重建该日志文件


  SQL>alter database clear logfile group 3;


  如果是该日志组还没有归档,则需要用


  SQL>alter database clear unarchived logfile group 3;


  4、打开数据库,重新备份数据库


  SQL>alter database open;


  说明:


  1)、如果损坏的是非当前的联机日志文件,一般只需要clear就可以重建该日志文件,但是如果该数据库处于归档状态但该日志还没有归档,就


  需要强行clear.


  2)、建议clear,特别是强行clear后作一次数据库的全备份。


  3)、此方法适用于归档与非归档数据库。


  损坏当前联机日志:


  归档模式下当前日志的损坏有两种情况,


  一、是数据库是正常关闭,日志文件中没有未决的事务需要实例恢复,当前日志组的损坏就可以直接用alter database clear unarchived


  logfile group n来重建。


  二、是日志组中有活动的事务,数据库需要媒体恢复,日志组需要用来同步,有两种补救办法


  A. 最好的办法就是通过不完全恢复,可以保证数据库的一致性,但是这种办法要求在归档方式下,并且有可用的备份


  B. 通过强制性恢复,但是可能导致数据库不一致。


  下面分别用来说明这两种恢复方法


  5.1.2.1 通过备份来恢复


  1、打开数据库,会遇到一个类似的错误


  ORA-00313: open failed for members of log group 1 of thread 1


  ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'


  ORA-27041: unable to open file


  OSD-04002: unable to open file


  O/S-Error: (OS 2) 系统找不到指定的文件


  2、查看V$log,发现是当前日志


  SQL> select group#,sequence#,archived,status from v$log;


GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2


YES INACTIVE
3 3 YES INACTIVE


  3、发现clear不成功


SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'


  4、拷贝有效的数据库的全备份,并不完全恢复数据库


  可以采用获取最近的SCN的办法用until scn恢复或用until cnacel恢复


  recover database until cancel


  先选择auto,尽量恢复可以利用的归档日志,然后重新


  recover database until cancel


  这次输入cancel,完成不完全恢复,也就是说恢复两次。


  如:


SQL> recover database until cancel;
Auto
……
SQL> recover database until cancel;
Cancel;


  5、利用alter database open resetlogs打开数据库


  说明:


  1、这种办法恢复的数据库是一致的不完全恢复,会丢失当前联机日志中的事务数据


  2、这种方法适合于归档数据库并且有可用的数据库全备份。


  3、恢复成功之后,记得再做一次数据库的全备份。


  4、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。


  如果没有备份,进行强制性恢复


  1、打开数据库,会遇到一个类似的错误


ORA-00313: open failed for members of log group 1 of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'
ORA-27041: unable to open file
OSD-04002: unable to open file


  O/S-Error: (OS 2) 系统找不到指定的文件


  2、查看V$log,发现是当前日志


  SQL> select group#,sequence#,archived,status from v$log;


GROUP# SEQUENCE# ARCHIVED STATUS
---------- ---------- -------- ----------------
1 1 NO CURRENT
2 2 YES INACTIVE
3 3 YES INACTIVE


  3、发现clear不成功


SQL> alter database clear unarchived logfile group 1;
alter database clear unarchived logfile group 1
*
ERROR at line 1:
ORA-01624: log 1 needed for crash recovery of thread 1
ORA-00312: online log 1 thread 1: 'D:\ORACLE\ORADATA\TEST\REDO01.LOG'


  4、把数据库down掉


  SQL>shutdown immediate


  5、在init.ora中加入如下参数


  _allow_resetlogs_corruption=TRUE


  6、重新启动数据库,利用until cancel恢复


SQL>recover database until cancel;
Cancel


  如果出错,不再理会,发出


  SQL>alter database open resetlogs;


  7、数据库被打开后,马上执行一个full export


  8、shutdown数据库,去掉_all_resetlogs_corrupt参数


  9、重建库


  10、import并完成恢复


  11、建议执行一下ANALYZE TABLE ...VALIDATE STRUCTURE CASCADE;


  说明:


  1、该恢复方法是没有办法之后的恢复方法,一般情况下建议不要采用,因为该方法可能导致数据库的不一致


  2、该方法也丢失数据,但是丢失的数据没有上一种方法的数据多,主要是未写入数据文件的已提交或未提交数据。


  3、建议成功后严格执行以上的7到11步,完成数据库的检查与分析


  4、全部完成后做一次数据库的全备份


  5、建议联机日志文件一定要实现镜相在不同的磁盘上,避免这种情况的发生,因为任何数据的丢失对于生产来说都是不容许的。


http://oracle.chinaitlab.com/backup/39684.html

新“百家姓”排名


把表里的数据导成 insert 语句

 Internet上还有一种免费的MYSQL数据库很流行。有些时候我们需要把oracle里的数据导入MYSQL里。

生成insert into 表名 .... 是一种很简单直接的方法。

今年六月份从www.arikaplan.com/oracle.html看到一个可以生成insert into 表名 ....语句的存储过程genins_output。

我按中文习惯的时间格式YYYY-MM-DD HH24:MI:SS改了改,并新写了一个存储过程genins_file.sql

它可以把小于16383条记录表里的数据导成(insert into 表名 ....)OS下文件。

调用它之前,DBA要看看数据库的初始化参数 UTL_FILE_DIR 是否已经正确地设置:

SQL> show parameters utl_file_dir;

可以看到该参数的当前设置。

如果没有值,必须修改数据库的initsid.ora文件,将utl_file_dir 指向一个你想用PL/SQL file I/O 的路径。
重新启动数据库。此参数才生效。

调用它,可以把表里的数据生成(insert into 表名 ....)OS下文件的过程genins_file方法:

        SQL>exec genins_file('emp','/oracle/logs','insert_emp.sql');  
                               |         |                |
                           表名,可变     |         生成OS下文件名,可变 
                                         |
                                utl_file_dir路径名,不变(我设置的是/oracle/logs)   

        SQL> exit

        可以在OS目录/oracle/logs下看到insert_emp.sql文件。

        注意事项: 生成(insert into 表名 ....)OS下文件最多32767行。
        因为我一条insert分成两行,所以最多处理16383条记录的表。

在MYSQL数据库里运行insert_emp.sql,就可以方便地把oracle数据转移到MYSQL数据库里。

About this Archive

This page is an archive of entries from January 2006 listed from newest to oldest.

December 2005 is the previous archive.

February 2006 is the next archive.

Find recent content on the main index or look in the archives to find all content.