本篇是 LINUX 平台上的 ORACLE 踩坑日记 -- 之 IMP 导数据
系统要迁移到新的数据库,先尝试了 RMAN 异机恢复,一步一坑地走到最后一步 ( 执行升级脚本 @$ORACLE_HOME/rdbms/admin/catupgrd.sql; ),但是各种报错。百度了一下,在浩如烟海的经验教训贴中翻到一篇(https://blog.youkuaiyun.com/couyifu7209/article/details/100378598 RMAN跨版本恢复--从Oracle10.2.0.5恢复到Oracle11.2.0.4 ),告诉我如下这个残酷的事实:
下图是Oracle数据库升级路线,从图看到 Oracle10.2.0.1 不能直接升级到11gR2版本,至少需要先升级到10.2.0.2以后才可以升级到11gR2,必须是10.2.0.2以上或者是10.1.0.5版本才可以直接升级到11gR2。
查看 oracle 版本:sqlplus -v
很不幸我的源数据库版本正好是: Oracle10.2.0.1
而我的目标数据库版本正好是:11.2.0.4.0
就是说 RMAN 那些坑踩过就算是为未来哪天做准备了,这次是指望不上了。
于是开启 B 计划 -- 用传统的 imp 工具导数据。
先拎要点:(都是吐血踩坑得到的教训!)
1. EXP 导出时,不用全库导出,费时费力,只要导你的应用账号下的全部对象即可;
2. IMP 导入前,一定要将数据库运行模式切换为“非归档模式”(noarchivelog),否则归档日志增长太快,来不及删除,账号会被封;
3. IMP 导入前,建立你的应用账号XXXXUSER,为该账号建立并分配表空间,!!!为表空间添加足够多的数据文件!!!切记此点,否则会空间满了半途中止,浪费时间;
想要看为啥要有上述要点,请慢慢看后文解释。
用传统的 exp ,imp 导数据,分为如下两大步:
一. exp 将数据从源数据库导出:(先说全库导出,其它各种带条件导出,放到最后的附录中去)
exp 工具在 $ORACLE_HOME/bin 目录下
[oracle@jcpt bin]$ cd $ORACLE_HOME/bin
[oracle@jcpt bin]$ exp -help 可以查 exp 命令的参数 。
为了避免客户端关闭后,进程也被关闭,我们用 nohup 方式启动工具,让其到后台去运行。
(nohup 是指 no hang up 的意思,就是不挂起。一般格式是:nohup cmd命令区 >>mynohup.out & 。
最后这个 & 是指让进程后台运行,>>mynohup.out 则是将输出存放到当前目录下的 mynohup.out 日志文件中。
nohup 方式启动进程后,按几次回车,会退出到 CMD 状态,然后请输入 exit 退出远程窗口,另开一个远程窗口,去看是否还有进程,以及 mynohup.out 日志文件是否有被刷新,就能看出进程是否还在执行 )
[oracle@jcpt bin]$ nohup exp userid=system/manager@TestDB file=/home/data/oracle/backup/fullDB.dmp full=y log=/home/data/oracle/backup/exp_full.log &
参数:
userid:是登录 ORACLE 账号和密码,只能用 system 用户,因为 system 是 DBA 账号,能访问所有的表;@TestDB 这里是 SID。
file:定义要将备份的数据文件保存到哪里,最好给全路径文件名,清楚;
log:定义将 EXP 过程输出信息保存到哪个日志文件中去,格式是纯文本。我们启动 EXP 命令后(大数据量的情况下,这是一个漫长的过程,好几个小时)到哪里去观察导出进度;
full:默认值为 N,这里指定为 Y,表示全库导出,包括系统控制表的一切。
注意:
在真实应用中,其实我们往往会将应用数据保存到特定的用户下,其实只要到这个用户下的全部对象就可以了(含表、函数、存储过程、触发器等等)
导某个用户的全部对象语法如下:
[oracle@jcpt bin]$ exp userid=system/manager@TestDB file=/home/data/oracle/backup/fullDB.dmp owner=(system,sys) log=/home/data/oracle/backup/exp_full.log
owner:就是要导哪个账号的全部对象。
启动了 exp 进程后,可以如下方式去观察进程执行情况:
1)ps -aux | grep exp
如果列表中有刚刚执行的命令 exp,那就对了,证明正常起来进程了。
2)top
如果在 1 秒一刷新的列表中,偶尔能看到 exp 进程,证明正常运行中。
3)观察 mynohup.out 日志,如果有被写的痕迹(从被改日期就能看出),那么证明进程正常运行中,可以打开看进度。
然后就等着去取导出