V1.0
Revision |
Author/Modifier | Comments | |
No. |
Date |
||
1.0 | 2012/2/15 | 张中靖 | |
一、 目的
说明使用exp/imp进行数据迁移的前置条件、操作步骤,降低对对应用造成的影响及避免故障
二、 适用范围
l 所有线上库
三、 风险评估
l exp导出数据时没有使用compress=n参数,导致所有数据被压缩在一个extent里,导入可能由于没有连续的blocks满足需要,导致imp失败。
l 进行跨版本迁移数据时,exp导出数据没有使用低版本软件,导致无法imp数据
l 有些os对文件大小有限制,exp数据时需要使用filesize参数来分割导出文件
l exp导出数据时没有正确估计dmp文件所需空间,导致主机磁盘满。
l imp导入数据时没有使用ignore=y参数,目标库上存在表的情况下数据无法导入
l imp导入大量数据时没有使用commit=y参数,导致事务太久,undo资源占用过大无法及时回收。
l 跨字符集的数据迁移,由于字符集不兼容导致数据迁移失败。
l imp跨schema进行数据迁移时,没有正确指定fromuser、touser,导致数据没有正确导入
l imp时由于目标库上表结构和源库不一致,导入数据失败。
l imp导入结构后,由于导出不完整,导致有对象失效。
l 导入表空间不存在或者空间不足,导致表创建失败或者数据导入失败,导致其他应用报错
四、 操作流程
1. 准备工作
a) 检查源数据库和目标库的版本、字符集,如果目标库版本低于源库,使用目标库的软件做导出。字符集不一致,不建议使用exp/imp迁移数据。
b) 检查目标库上表结构和源结构是否一致,如果不一致,先修复结构,保证一致。
c) user_segments里查出导出表所占的空间大小,检查os对文件大小的限制。如果表大小超出文件大小,exp导出时加上这两个参数:
filesize=小于文件限制的数值m,file=exp01.dmp,exp02.dmp,…多个dmp文件
d) 表比较多的情况下,建议用parfile。各个参数在parfile里写好。
tables=(tab1,tab2,tab3,..)
e)根据需要书写query子句,这个参数跟direct=y冲突
2. 执行过程
a) 如果目标表是已存在数据,跟应用确认后,可以先进行导出备份,以防后面需要回退。
这里给出一个示例,将数据从schema:zhangzj迁移到zzzzzz。
先根据需求编辑exp、imp的参数文件:’-‘后面是参数说明,实际使用时去掉
cat exp_ws0208.par
userid=zhangzj/password@oindeve
direct=y –直接路径导出,加快导出速度
compress=n –避免数据全部压缩在一个数据块上
file=exp0208.dmp
log=exp0208.log
recordlength=65535 –写dmp文件时一次IO的大小,上限是65535,可以加快导出速度
tables=yz_ongimt_jingtzt
exp parfile=exp_ws0208.par –进行数据导出
cat imp_ws0208.par
userid=zzzzzz/xxxxxx
commit=y –开启批量提交,避免长事务
ignore=y –如果目标表已经存在,只导入数据
fromuser=zhangzj
touser=zzzzzz
tables=yz_ongimt_jingtzt
file=exp0208.dmp
log=imp0208.log
buffer=100000 –大小控制导入速度的,设置过大会导致日志产生很快
imp parfile=imp_ws0208.par –进行数据导入
注意上面的fromuser和touser。如果将表导入到两个schema:zzzzzz,yyyyy
需要按照这种格式配置参数:
fromuser和touser一一对应,即使导出时只有一个schema.
fromuser=zhangzj,zhangzj
touser=zzzzzz,yyyyy
1
2
b) exp导出数据时,检查exp的日志,如果报错,一般是参数配置错误,参考官方文档调整参数。
c) imp导入数据过程,需要监控下数据库事务和日志产生速度。
d) 对导入的表收集统计信息。
3. 验证方案
对比exp、imp的日志,确认导出导入数据量是否一致。并在数据库上检查数据量。
比如上面的数据迁移,检查数据量跟日志显示是否一致。
select count(*) from zzzzzz.yz_ongimt_jingtzt;
跨schema或者数据库迁移数据时,除检查日志外,还需要检查源和目标的对象数据量、
是否有失效对象。
select object_type,count(*) from dba_objects where owner=’源schema’;
select object_type,count(*) from dba_objects where owner=’目标schema’;
select * from dba_objects where status<>’VALID’ and owner=’ 目标schema’;
五、 核心对象风险
由于核心表访问、变更频繁,不宜直接使用imp对核心表大量导入数据。
六、 回退方案
exp对应用无影响,不需要回退。
imp后可能数据有误,需要进行回退操作。
如果目标表本来就是空表,跟应用确认后,直接清空即可。
如果目标表原有数据,跟应用确认是否使用原有备份数据进行恢复。若需要,先exp备份当前数据,然后清空再导入前面的备份数据。