ITPub博客

首页 > 数据库 > Oracle > imp/exp数据迁移

imp/exp数据迁移

原创 Oracle 作者:leon830216 时间:2014-02-23 21:39:15 0 删除 编辑
- 注意点
--------------------------------------------------------------------
- nls_lang的设置
imp之前,最好show y一下dmp文件中字符集和目标库是否一致

-- 导出数据库和导出端客户端保持一致
数据库:select * from nls_database_parameters;
客户端:env|grep NLS_LANG

-- 导入时
目标库与源库有相同字符集,则NLS_LANG与其设置相同即可
目标库与源库有不同字符集,则NLS_LANG与导出端NLS_LANG设置相同即可
此时,要求导入端是导出端的严格超集,否则会有乱码

- 版本问题
-- 总是使用IMP的版本匹配数据库的版本,如:要导入到817中,使用817的IMP工具。
-- 总是使用EXP的版本匹配两个数据库中最低的版本,如:从9201往817中导入,则使用817版本的EXP工具

- 查看帮助
exp/imp help=y

- 全库迁移的例子
--------------------------------------------------------------------
-- 首先要把目标的库建好,同名、同样大的表空间建好

-- 用dbartisan等软件把源库的用户的建立语句抓出来,存成一个脚本,去掉object级的grant语句,在目标库把这个脚本执行一下,即把这些用户建上。
需要说明的是,你只需关注的是你的应用用的用户,像sys,system,dbsnmp,traceserver等等这些系统用户都不在你的关心范围内

-- 执行exp操作
--- 把结构导出来
exp system/oracle@source_db file=... log=... buffer=... owner=go,... rows=N COMPRESS=N

--- 把数据导出来
exp system/oracle@source_db file=... log=... buffer=... owner=go,... rows=Y  COMPRESS=N GRANTS=N INDEXES=N TRIGGERS=N CONSTRAINTS=N

-- 导入
--- 先导入结构
imp system/oracle@target_db file=... log=... buffer=... fromuser=go,... touser=go,... rows=N 

--- 把trigger,外键constraint disable掉

--- imp数据
exp system/oracle@target_db file=... log=... buffer=... fromuser=go,... touser=go,... rows=Y GRANTS=N INDEXES=N TRIGGERS=N CONSTRAINTS=N ignore=Y

--- 恢复trigger,约束为enable

---------------------------------------------------------------------------------------------------
- 判断dmp文件是以什么模式导出的
head expdat.dmp | strings
RENTIRE     full
RUSERS      owner
RTABLES     tables

- 从dmp文件中抽取创建语句
strings expdat.dmp | grep "CREATE USER"
strings expdat.dmp | grep "CREATE TABLESPACE"
strings expdat.dmp | grep "CREATE PROFILE"

---------------------------------------------------------------------------------------------------
- sys用户操作
Linux:    "\"/ as sysdba\""
Windows:  """/ as sysdba"""

---------------------------------------------------------------------------------------------------
- 大量exp导出效率优化
exp go/go owner=go file=expdat.dmp buffer=204800000 compress=n direct=y recordlenth=65535 feedback=10000 log=exp.sql

direct参数的限制:
无法用直接路径导出可移动的tablespace,或者用query参数导出数据库子集
当导入导出的数据库运行在不同的os下时,必须保证recordlength参数的值一致

- 大量imp导入提高效率的方法

-- 增大sort_area_size为100M,避免磁盘排序
-- 增加redo日志组,增大日志文件大小
-- 增大log_buffer,不要超过5M
-- 使用阵列插入与提交
-- 重建Index是使用脚本Nologging方式创建
-- 若系统允许,可同时开多个imp进程来导入不同的表数据

- 从dmp文件导出索引创建语句,以备最后创建索引用 -> idx.sql
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexfile=idx.sql log=imp.sql

- 仅导入定义(索引除外)
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexes=n rows=n log=imp.sql

-- 目标表nologging并且去掉约束触发器
alter table t nologging
alter trigger tr disable

-- 只导入数据(索引除外)
imp go/go@orcl fromuser=go touser=go file=expdat.dmp buffer=20480000 indexes=n rows=y ignore=y feedback=1000 log=imp.sql

-- 创建索引并恢复约束和logging
@/home/oracle/idx.sql
alter table t logging
alter trigger tr enable

-- 最后确认导入是否成功
select owner, index_name, tablespace_name from dba_indexes where owner = 'GO';
select owner, table_name, tablespace_name from dba_tables where owner = 'GO';

-- imp导入时排除部分表
先在目标库创建与待排除表名相同的View,在imp导入时设置ignore=n即可

---------------------------------------------------------------------------------------------------
- 不导入数据库,查看dmp文件内容 --- 个数不是很准确
imp go/go full=y show=y log=imp_full_show.sql indexfile=idx_full.sql buffer=204800000 file=/data/exp.dmp

-- idx_full.sql
查看表,索引,约束创建语句以及行数等信息
grep "CREATE*" idx_full.sql |wc -l
grep "CREATE* TABLE\|CREATE GLOBAL* TEMPORARY TABLE" idx_full.sql |wc -l
grep "CREATE* UNIQUE INDEX\|CREATE* INDEX" idx_full.sql |wc -l
grep "CREATE* TABLE\|CREATE* GLOBAL TEMPORARY TABLE\|REM  ...* rows" idx_full.sql > count_msmmail.sql
......

-- imp_full_show.sql
查看函数,包等创建信息
grep "CREATE* PACKAGE" imp_full_show |wc -l

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/22558114/viewspace-1086548/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-09-18

  • 博文量
    164
  • 访问量
    319881