今天接了封邮件,项目经理要俺做个数据迁移,将开发环境中的某个表迁移到测试环境。很简单的需求。
常用的迁移有 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:指明目的用户方