exp,imp问题

今天接了封邮件,项目经理要俺做个数据迁移,将开发环境中的某个表迁移到测试环境。很简单的需求。

常用的迁移有 EXP,IMP,DATAPUMP,DBLINK等等。由于无法登陆数据库主机操作系统,所以无法用DATAPUMP。

另外也没有创建DBLINK权限,而且数据库中也没有创建好了的DBLINK,这也否定了,我只能用EXP,IMP这种最原始的方法。

下面说说导入导出应该注意的事项

一:首先应该查询数据库的字符集

SQL> select * from nls_database_parameters where parameter='NLS_LANGUAGE' or parameter='NLS_TERRITORY' or parameter='NLS_CHARACTERSET';

PARAMETER                      VALUE
------------------------------ --------------------------------------------------------------------------------
NLS_LANGUAGE                   AMERICAN
NLS_TERRITORY                  AMERICA
NLS_CHARACTERSET               AL32UTF8
我们知道NLS_LANG = language_territory.charset

Language指的是服务器消息语言,territory指的是服务器日期和数字,货币格式,charset指字符集。

知道了NLS_LANG的组成原理之后,就明白了,只要设置NLS_LANG中的charset一样,那么就不会产生导入导出的乱码问题

NLS_LANG中的language用来显示log中记录的语言

然后查看客户端字符集

SQL> select userenv('language') from dual;

USERENV('LANGUAGE')
--------------------------------------------------------------------------------
SIMPLIFIED CHINESE_CHINA.AL32UTF8

可以看到客户端字符集为AL32UTF8,所以导入导出是不会引起乱码的,不过由于客户端的language设置为SIMPLIFIED CHINESE,那么导入导出的log就会用中文的形式记录,如果和老外一起工作那么就设置AMERICAN_AMERICA.AL32UTF8,这样老外就能看懂log了

二:设置客户的字符集

如果是windows 直接在cmd中 set nls_lang=AMERICAN_AMERICA.AL32UTF8

如果是linux  要在shell中 export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

三:执行exp

exp常用语句:

 exp 'sys/oracle as sysdba' file=D:/full.dmp full=y log=D:/full.log consistent=y direct=y 

//导出整个数据库 导出如果设置了direct=y就不用设置buffer了,consistent=y表示导出期间数据报错read only

exp  system/oracle file=D:/scott.dmp owner=scott buffer=10240000 log=D:/scott.log
//导出Scott的所有对象到D盘,并且命名为scott.dmp 
  exp  system/oracle file=D:st.dmp owner=scott,test buffer=10240000 log=D:/test_scott.log
//导出scott,test的所有对象 
  exp  system/oracle file=D:emp.dmp tables=scott.emp buffer=10240000 log=D:/scott.log
//导出scott的emp表,也可以用scott账号来导出,这个时候表前面就不用加上scott了 
  exp scott/oracle file=D:et.dmp tables=emp,dept
 buffer=10240000 log=D:/scott.log
imp常用语句
 
 imp scott/oracle file=D:et.dmp table=emp commit=y log=D:/emp.log buffer=10240000
//导入emp表 
  imp system/oracle file=D:scott.dmp full=y 
//导入scott的所有对象,注意如果是由system导出的,就必须由system或者权限比他高的导入;这里就是最开始由system导出的,所以还是由system来导入; 
  exp scott/oracle file=D:emp.dmp table=emp 
由soctt 把emp到出,如果想导入到scott用户下 
  imp scott/oracle file=D:emp.dmp table=emp // scott就可以直接导入到scott用户下; 
如果想用system用户把scott导出的内容再倒入到scott 就需要用以下方法 
  imp system/oracle file=D:emp.dmp fromuser=scott touser=scott 
  当然也可以到入到其他用户中 
  imp system/oracle file=D:emp.dmp fromuser=scott touser=test 
//将scott导出的内容导入到test中
  imp 'sys/oracle as sysdba' file=D:full.dmp full=y ignore=y;

//导出scott的emp,dept表 

exp选项:

buffer:下载数据缓冲区,以字节为单位,缺省依赖操作系统 
consistent:下载期间所涉及的数据保持read only,缺省为n 
direct:使用直通方式 ,缺省为n 
feeback:显示处理记录条数,缺省为0,即不显示 
file:输出文件,缺省为expdat.dmp 
filesize:输出文件大小,缺省为操作系统最大值 
indexes:是否下载索引,缺省为n,这是指索引的定义而非数据,exp不下载索引数据 
log:log文件,缺省为无,在标准输出显示 
owner:指明下载的用户名 
query:选择记录的一个子集 
rows:是否下载表记录 
tables:输出的表名列表 

imp选项:

buffer:上载数据缓冲区,以字节为单位,缺省依赖操作系统 
commit:上载数据缓冲区中的记录上载后是否执行提交 
feeback:显示处理记录条数,缺省为0,即不显示 
file:输入文件,缺省为expdat.dmp 
filesize:输入文件大小,缺省为操作系统最大值 
fromuser:指明来源用户方 
ignore:是否忽略对象创建错误,缺省为n,在上载前对象已被建立往往是一个正常现象,所以此选项建议设为y 
indexes:是否上载索引,缺省为n,这是指索引的定义而非数据,如果上载时索引已建立,此选项即使为n也无效,imp自动更新索引数据 
log:log文件,缺省为无,在标准输出显示 
rows:是否上载表记录 
tables:输入的表名列表 
touser:指明目的用户方 

原文地址:https://www.cnblogs.com/hehe520/p/6330601.html