今天为XXX导数据的记录
本文内容遵从CC版权协议, 可以随意转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明网址: http://www.penglixun.com/database/a_record_about_oracle_imp.html
约的9:30,我八点多醒了,一看天黑黑的,于是,嗯,继续睡……
后来知道这是传说中的“日全食”。
然后刷牙洗脸就P颠P颠地跑到某个地方,虽然已经超过9:30了,但是,嗯,客户又没来……还是我等他(没打错,谢谢合作)。
鉴于电脑还在,我就先开工了~
昨天对方已经先重装Oracle了,系统表丢失的问题已经没有了,只要导入两个DMP文件就可以了。
本以为很轻松的事情,还是耗了很久,最后经我鉴定是导出文件的问题。
问题描述:有ARJ.DMP和M3.DMP两个备份文件,导出时的状态是,ARJ和M3两个用户分别拥有ARJ和M3两个表空间,然后表又混乱分分布在USERS,ARJ,M3甚至SYSTEM中。
作为一名专业的DBA(呕吐……),显然不能允许这种诡异状态的出现,根据客户的要求我计划的导入目标是:所有表都导入在同一表空间M3下,所有表属于M3用户模式。
于是就开工了,首先采用一般方法,剥夺M3用户的 UNLIMITED TABLESPACE 权限,然后将M3用户的默认表空间修正在M3表空间,并给予无限额权限,同时防止 SYSTEM 表被写,取消了M3用户对 SYSTEM 表的配额。
REVOKE UNLIMITED TABLESPACE FROM m3;
ALTER USER m3 DEFAULT TABLESPACE m3;
ALTER USER m3 QUOTA UNLIMITED ON m3;
ALTER USER m3 QUOTA 0 ON system;
然后开始导入工作:
IMP M3/M3@ORCL FILE=M3.DMP FROMUSER=M3 TOUSER=M3
IMP M3/M3@ORCL FILE=ARJ.DMP FROMUSER=ARJ TOUSER=M3
导入过程中有大约20张表无法导入,都是原先USERS、ARJ表空间下的,经过搜索,这是Oracle的BUG,只能另想办法。
于是我采用导出表结构的方法,手动运行SQL建表,然后再次IMP:
–获得DMP中所有用户表的建表语句,将CREATE.SQL中的注释(REM)等杂信息替换成空格,然后在SQLPlus中执行脚本,就把表建好了。
IMP M3/M3@ORCL FILE=ARJ.DMP INDEXFILE=CREATE1.SQL FROMUSER=ARJ TOUSER=M3;
IMP M3/M3@ORCL FILE=M3.DMP INDEXFILE=CREATE2.SQL FROMUSER=M3 TOUSER=M3;
@C:\CREATE1.SQL
@C:\CREATE2.SQL
–再次执行导入
IMP M3/M3@ORCL FILE=M3.DMP FROMUSER=M3 TOUSER=M3
IMP M3/M3@ORCL FILE=ARJ.DMP FROMUSER=ARJ TOUSER=M3
理论上已经成功的导入了所有表,但是经过实测,还是有部分表信息不全,导入了一部分行,这个很诡异,我也不知道怎么回事,于是另想办法。
想遍了所有办法,只能手动改DMP了,很伟大的事业……嗯~
打开伟大的gVim,将DMP中所有的 TABLESPACE “XXX” 全部替换成TABLESPACE “M3″,
再次执行导入:
IMP M3/M3@ORCL FILE=M3.DMP FROMUSER=M3 TOUSER=M3
IMP M3/M3@ORCL FILE=ARJ.DMP FROMUSER=ARJ TOUSER=M3
完全正常。
同时也发现,确实有些表,在上次导入的时候(那次不是我……)没有把信息导出来,只有表结构,这个我就回天乏术了,
我已经已经尽力而为,将导出各种混乱的表至少整齐划一的导入到了统一表空间下存储,导出时丢失数据,这个可以研究下是怎么丢失的~