- 注意点
--------------------------------------------------------------------
- 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博客 ” ,链接:https://blog.itpub.net/22558114/viewspace-1086548/
,如需转载,请注明出处,否则将追究法律责任。