一次因缺失分区功能导致数据迁移失败的案例分享
Oracle支持分区表功能,这也是Oracle支持海量数据处理的一个关键特性,我们在使用Oracle数据时基本不会考虑由于缺失分区功能导致的数据库故障,这个案例来自于我在某银行工作时期的一个变更。变更对银行来讲是十分重要的事情,一个变更要实现变更测试、变更方案,变更审核,变更实施甚至还需要变更回退的方案,是十分严谨的操作流程,自从来了新公司,还是对之前银行工作的经历十分“怀念”,这里我加了个引号,其实我更想强调严谨的流程,标准化流程的重要性,但是对DBA确实增加许多工作量和工作心里压力,银行都是跟“钱”打交道,每一笔数据都不能出错,这也是可以理解的。我经常跟团队的DBA讲,如果有过银行的工作经历对DBA是很有好处的(但是他们基本缺乏这个经历,也就很难理解一个变更还要这么复杂)。
今天跟大家分享的一个案例,技术本身没有难度,百度一搜可以找到,这里主要是强调DBA工作的细心也严谨,以及犯了错误一定要用于承认,承认错误是对自己的负责也是自己或者团队改进工作的良好契机。某个下午,江总找到我说”林工,今晚的实施你们都测过了对吧“,”嗯,测过了,就是个用户数据导入,应该很快“,可以感受到时领导习惯性的提醒,因为这是个很小的操作,也几乎没有技术含量,我也没有太在意,然后后续的问题基本让我处于十分尴尬的境地。变更窗口到了,我申请了变更的key,看着上面隔几秒就要变的数字,总是担心输错,因为以前遇到过输错导致延时半个小时才可以使用,这样就拖延了变更时间,这样给变更就增加了风险。下面我用模拟案例的方式讲述这个过程。
我们首先在某个库做数据的逻辑全备,这个全备自然包含用户scott的分区表
1做全库逻辑备份,有分区表功能
[oracle@dg1 ~]$ expdp \' / as sysdba \' full=y dumpfile=full.dmp directory=dir1 statistics=no direct=y;
SYS@prod> col parameter for a20
SYS@prod> col value for a20
SYS@prod> set line 120
SYS@prod>select parameter,value from v$option where parameter='Partitioning';
PARAMETER VALUE
-------------------- --------------------
Partitioning TRUE
然后我们把导出文件拷贝到目标库,通过如下方式将用户scott的数据迁移到新创建的数据库。
impdp \' / as sysdba \' dumpfile=full.dmp directory=dir1 statistics=no schemas=scott;
此时提示,无法创建分区表,即:ora-00439 未启用功能:partitioning
心里本来是觉得不会遇到什么问题,是很顺利的一个变更,竟然遇到一个完全意料之外报错,当时真是慌了,变更失败对于负责人都是有绩效考核的,再说之前我信誓旦旦的说都测试了,此时不是给自己打脸吗。于是赶紧查如何通过数据字典确定分区功能,如下方式实现
SYS@prod>select parameter,value from v$option where parameter='Partitioning'
PARAMETER VALUE
-------------------- --------------------
Partitioning FALSE
确实,数据库没有启用分区功能。”林工,这个数据库前几天我记得是你装的吧!“,江总的提醒一下让我意识到,我的问题大了,也就是这次变更都是我的原因导致失败。没等我回答,江总接着说”你是不是选择安装选项时,没有勾选分区功能“,说实话这个问题我真不能确定,但是事实如此,我说”可能吧,但是鼠标不能用,我就用聚焦选择的,可能没有勾选“,这种问题很难去找,但是数据库是我装的,我们安装数据库是由规范的,没有这个功能确实也无法解释,所以我必须承认安装过程我出错了。看着江总一脸凝重表情,我真是由无地自容的感觉,虽然人家没有明确批评你,但是大家一起工作那么长时间,我还是可以感觉到领导的心情。
怎么办?这种时刻DBA首要的是解决问题,当时一个刚入职的DBA出去百度,回来说”我查了下,这个可以重新link解决“,既然有方案,这个时候也来不及测试了,经过江总同意,直接重新link,后续再补方案吧!想想这个也是无奈之举,否则变更失败损失更大,毕竟应用需要这些数据做测试,都有项目周期或者项目规划,如果事情耽误在我们数据库这里,必然领导要担责任,所以,江总还是做了个决策,重新link,如下所示:
关闭数据库 重新link 分区功能
[oracle@dg1 ~]$ cd $ORACLE_HOME/rdbms/lib
[oracle@dg1 lib]$ make -f ins_rdbms.mk part_on
[oracle@dg1 lib]$ make -f ins_rdbms.mk ioracle
而后,再次重新导入数据,问题解决!
相关文章