前几天接了个老系统迁移,客户那台 Oracle 还是 11g,管理员只给了一个只读账号,连服务器都摸不到,让我想办法把几张表带出来,这种时候 exp 就是救命稻草。

exp 是 Oracle 自带的老式逻辑导出工具,dos 窗口或者 shell 里直接敲就能用,最常见的写法长这样:

exp scott/tiger@orcl file=d:/bak/t1.dmp tables=emp,dept log=d:/bak/t1.log

看到 file 就是导出后落盘的 dmp 文件,tables 指定表名,不写就是整用户全导,log 一定要加,出错了全靠它定位。

最常用的三个参数组合要背下来

只导表结构不要数据,加 rows=n。只导某个用户,加 owner=scott。跨版本迁移,加 statistics=none,不然高版本统计信息导入低版本容易报错,这三个是被问最多的。

还有个坑是字符集,导出端是 ZHS16GBK,导入端是 AL32UTF8,中文直接变问号。动手前先查 NLS_LANG 环境变量,两边对齐了再导,能省一下午返工。

报错 EXP-00008 backing 出问题一般是权限不够

很多人用普通账号导全库,直接报 EXP-00008 或者直接闪退,原因是没有 exp_full_database 角色。老老实实让 DBA 授权,或者改成按表导,别硬刚。

  • 小表迁移:直接 exp 按表导出,imp 导入,十分钟搞定
  • 大库迁移:别用 exp,换 expdp 数据泵,速度差了一个数量级
  • 只读账号:提前确认有没有 select 权限,缺一张表后面全白干

还有个小经验,导出来的 dmp 别直接用 U 盘拷来拷去,先在本地算一遍校验值,传输出错是常有的事,等导入端报文件损坏再回头找,原始文件往往已经被覆盖了。走 FTP 传输记得勾二进制模式,用文本模式传 dmp 十次坏九次,这个坑很隐蔽。

最后说句实在的,exp 现在官方都不主推了,新库一律用 expdp,能并行能压缩,exp 只留给这种老库救急用。