@会网络的老鼠

涂飞平的博客空间

一次Oracle数据转移的经历

3 年前 0

在用友工作半年了,杭州地税项目中是第一次深度接触Oracle数据库。对于Oracle的感觉,除了之前听说的贵,偶然的了解外,再无别的!
真实使用了之后,感觉Oracle就是一个慢,占用资源太大,像我这种将所有开发环境都置于虚拟机中的主,不得不做出妥协,将部分环境移到实体系统中了。
在负责的第二个项目中(北京地税项目),在本地开发中一直没有问题,直到进入系统测试环境,出现各种问题。
1、测试,生产环境不允许采用数据泵方式备份和恢复,而这正是我们开发时候的标准操作方式;
2、客户的测试和生产环境都采用Oracle10g,而开发环境采用的是Oracle 11g。

1是硬性规定,没有办法,只能采用exp/imp来处理数据了。
备份数据库的过程比较顺利,但发给DBA不到一分钟,告知版本不一致,晕!然后使用exp version选项,还是不行,最后采用网上修改version头的办法(工具可以从这里下载
修改后,可以导入了,但是,导入完成后,导入日志一堆错误,功能也不正常。一个下午,不得其法,最后,没有办法,只好在虚拟机中装一个Oracle 10g(真心不喜欢在虚拟机中装这个玩意),然后,通过Oracle 10g的客户端连接到实体系统中的Oracle 11g,导出文件,然后再导入到10g中,完全没有问题,一个警告都未曾出现。
成功导入后发现还有部分功能不能正常使用,查看nclogs日志,发现很多table or view not exists错误!
难道是表没有创建,打开exp日志,发现,确实只导出了280张表,可实际系统有700多张表
error.png
为什么那么多表没有导出呢?
1、没有权限? 查看后,发现没有导出表的owner也是tax
2、表空间权限?虽然数据分布在7个不同的表空间(USERS,NNC_DATA01,NNC_DATA02,NNC_DATA03,NNC_INDEX01,NNC_INDEX02,NNC_INDEX03,AUD_AUDADMIN)中,但不同的表空间都有表导出,也有表未导出
3、不能导出空表?这是观察导出过程后得出的结论。
之前导出过程,由于需要时间比较久,没有一次认真守在那里看过,都是一边导出操作,一边做其他的事情,这次实在是没辙了,对着导出过程发呆,居然发现导出的都有数据,而数据为0的都没有导出。然后上网搜索验证了这个问题:http://www.2cto.com/database/201203/125469.html
根据文字所述方法:
1、建立i:\sql.txt并输入:
set heading off;
set echo off;
set feedback off;
set termout on;
spool i:\allocate.sql;
Select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows=0;
spool off
2、进入sqlplus中运行
@i:\sql.txt,运行后会生成i:\allocate.sql文件,这个文件就是所有空表更改,如alter table AO_BMXX allocate extent;
3、再次使用exp导出数据,这个时候,发现0记录的表也可以导出了。
export.png
可以导出了,在本机的测试,数据完整了。
succ.png功能也没有问题了


通过深入使用Oracle,也发现Oracle的强大,甚至有点喜欢这个东西,也理解了Oracle为什么会收购Java了!
web.png

编写评论