oracle数据库怎么导入dmp,只导入数据不导入表结构?

我是oracle10g的数据库,现在是老库备份出一个dmp备份,想这个dmp导入新库中。但是新库已经存在表结构了,并且新库是带分区的表,老库没分区,所以怎么能导入这个dmp,只导入数据不导入表结构?

参与13

3同行回答

y18511664518y18511664518技术总监长城超云
使用方法:Exp parameter_name=value or Exp parameter_name=(value1,value2……)只要输入参数help=y就可以看到所有帮助.EXP常用选项1.FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:exp userid=test/test file=./db_str.dmp log=./db_str....显示全部

使用方法:
Exp parameter_name=value or Exp parameter_name=(value1,value2……)
只要输入参数help=y就可以看到所有帮助.

EXP常用选项
1.FULL,这个用于导出整个数据库,在ROWS=N一起使用时,可以导出整个数据库的结构。例如:
exp userid=test/test file=./db_str.dmp log=./db_str.log full=y rows=n compress=y direct=y

  1. OWNER和TABLE,这两个选项用于定义EXP的对象。OWNER定义导出指定用户的对象;TABLE指定EXP的table名称,例如:
    exp userid=test/test file=./db_str.dmp log=./db_str.log owner=duanl
    exp userid=test/test file=./db_str.dmp log=./db_str.log table=nc_data,fi_arap
    3.BUFFER和FEEDBACK,在导出比较多的数据时,我会考虑设置这两个参数。例如:
    exp userid=test/test file=yw97_2003.dmp log=yw97_2003_3.log feedback=10000 buffer=100000000 tables=WO4,OK_YT
    4.FILE和LOG,这两个参数分别指定备份的DMP名称和LOG名称,包括文件名和目录,例子见上面。
    5.COMPRESS参数不压缩导出数据的内容。用来控制导出对象的storage语句如何产生。默认值为Y,使用默认值,对象的存储语句的init extent等于当前导出对象的extent的总和。推荐使用COMPRESS=N。
  2. FILESIZE该选项在8i中可用。如果导出的dmp文件过大时,最好使用FILESIZE参数,限制文件大小不要超过2G。如:
    exp userid=duanl/duanl file=f1,f2,f3,f4,f5 filesize=2G owner=scott
    这样将创建f1.dmp, f2.dmp等一系列文件,每个大小都为2G,如果导出的总量小于10G
    EXP不必创建f5.bmp.

IMP常用选项
1、FROMUSER和TOUSER,使用它们实现将数据从一个SCHEMA中导入到另外一个SCHEMA中。例如:假设我们做exp时导出的为test的对象,现在我们想把对象导入用户:
imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1
2、IGNORE、GRANTS和INDEXES,其中IGNORE参数将忽略表的存在,继续导入,这个对于需要调整表的存储参数时很有用,我们可以先根据实际情况用合理的存储参数建好表,然后直接导入数据。而GRANTS和INDEXES则表示是否导入授权和索引,如果想使用新的存储参数重建索引,或者为了加快到入速度,我们可以考虑将INDEXES设为N,而GRANTS一般都是Y。例如:imp userid=test1/test1 file=expdat.dmp fromuser=test1 touser=test1 indexes=N

表空间传输

表空间传输是8i新增加的一种快速在数据库间移动数据的一种办法,是把一个数据库上的格式数据文件附加到另外一个数据库中,而不是把数据导出成Dmp文件,这在有些时候是非常管用的,因为传输表空间移动数据就象复制文件一样快。

关于传输表空间有一些规则,即:
·源数据库和目标数据库必须运行在相同的硬件平台上。
·源数据库与目标数据库必须使用相同的字符集。
·源数据库与目标数据库一定要有相同大小的数据块
·目标数据库不能有与迁移表空间同名的表空间
·SYS的对象不能迁移
·必须传输自包含的对象集
·有一些对象,如物化视图,基于函数的索引等不能被传输
可以用以下的方法来检测一个表空间或一套表空间是否符合传输标准:
exec sys.dbms_tts.transport_set_check(‘tablespace_name’,true);
select * from sys.transport_set_violation;
如果没有行选择,表示该表空间只包含表数据,并且是自包含的。对于有些非自包含的表空间,如数据表空间和索引表空间,可以一起传输。
以下为简要使用步骤,如果想参考详细使用方法,也可以参考ORACLE联机帮助。
1.设置表空间为只读(假定表空间名字为APP_Data 和APP_Index)
alter tablespace app_data read only;
alter tablespace app_index read only;
2.发出EXP命令
SQL>host exp userid=”””sys/password as sysdba”””
transport_tablespace=y tablespace=(app_data, app_index)
以上需要注意的是
·为了在SQL中执行EXP,USERID必须用三个引号,在UNIX中也必须注意避免“/”的使用
·在816和以后,必须使用sysdba才能操作
·这个命令在SQL中必须放置在一行(这里是因为显示问题放在了两行)
3.拷贝数据文件到另一个地点,即目标数据库
可以是cp(unix)或copy(windows)或通过ftp传输文件(一定要在bin方式)
4.把本地的表空间设置为读写
5.在目标数据库附加该数据文件
imp file=expdat.dmp userid=”””sys/password as sysdba””” transport_tablespace=y “datafile=(c:\temp\app_data,c:\temp\app_index)”
6.设置目标数据库表空间为读写
alter tablespace app_data read write;
alter tablespace app_index read write;

优化EXP/IMP的方法:

当需要exp/imp的数据量比较大时,这个过程需要的时间是比较长的,我们可以用一些方法来优化exp/imp的操作。

exp:使用直接路径 direct=y
oracle会避开sql语句处理引擎,直接从数据库文件中读取数据,然后写入导出文件.
可以在导出日志中观察到: exp-00067: table xxx will be exported in conventional path

如果没有使用直接路径,必须保证buffer参数的值足够大.
有一些参数于direct=y不兼容,无法用直接路径导出可移动的tablespace,或者用query参数导出数据库子集.
当导入导出的数据库运行在不同的os下时,必须保证recordlength参数的值一致.

imp:通过以下几个途径优化
1.避免磁盘排序
将sort_area_size设置为一个较大的值,比如100M
2.避免日志切换等待
增加重做日志组的数量,增大日志文件大小.
3.优化日志缓冲区
比如将log_buffer容量扩大10倍(最大不要超过5M)
4.使用阵列插入与提交
commit = y
注意:阵列方式不能处理包含LOB和LONG类型的表,对于这样的table,如果使用commit = y,每插入一行,就会执行一次提交.
5.使用NOLOGGING方式减小重做日志大小
在导入时指定参数indexes=n,只导入数据而忽略index,在导完数据后在通过脚本创建index,指定 NOLOGGING选项

导出/导入与字符集

进行数据的导入导出时,我们要注意关于字符集的问题。在EXP/IMP过程中我们需要注意四个字符集的参数:导出端的客户端字符集,导出端数据库字符集,导入端的客户端字符集,导入端数据库字符集。

我们首先需要查看这四个字符集参数。
查看数据库的字符集的信息:
SQL> select * from nls_database_parameters;
PARAMETER VALUE


NLS_LANGUAGE AMERICAN
NLS_TERRITORY AMERICA
NLS_CURRENCY $
NLS_ISO_CURRENCY AMERICA
NLS_NUMERIC_CHARACTERS .,
NLS_CHARACTERSET ZHS16GBK
NLS_CALENDAR GREGORIAN
NLS_DATE_FORMAT DD-MON-RR
NLS_DATE_LANGUAGE AMERICAN
NLS_SORT BINARY
NLS_TIME_FORMAT HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZH:TZM
NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZH:TZM
NLS_DUAL_CURRENCY $
NLS_COMP BINARY
NLS_NCHAR_CHARACTERSET ZHS16GBK
NLS_RDBMS_VERSION 8.1.7.4.1
NLS_CHARACTERSET:ZHS16GBK是当前数据库的字符集。

我们再来查看客户端的字符集信息:
客户端字符集的参数NLS_LANG=_< territory >.
language:指定oracle消息使用的语言,日期中日和月的显示。
Territory:指定货币和数字的格式,地区和计算星期及日期的习惯。
Characterset:控制客户端应用程序使用的字符集。通常设置或等于客户端的代码页。或者对于unicode应用设为UTF8。
在windows中,查询和修改NLS_LANG可在注册表中进行:
HKEY_LOCAL_MACHINE\SOFTWARE\Oracle\HOMExx\
xx指存在多个Oracle_HOME时的系统编号。

在unix中:
$ env|grep NLS_LANG
NLS_LANG=simplified chinese_china.ZHS16GBK

修改可用:
$ export NLS_LANG=AMERICAN_AMERICA.UTF8

通常在导出时最好把客户端字符集设置得和数据库端相同。当进行数据导入时,主要有以下两种情况:
(1) 源数据库和目标数据库具有相同的字符集设置。
这时,只需设置导出和导入端的客户端NLS_LANG等于数据库字符集即可。
(2) 源数据库和目标数据库字符集不同。

先将导出端客户端的NLS_LANG设置成和导出端的数据库字符集一致,导出数据,然后将导入端客户端的NLS_LANG设置成和导出端一致,导入数据,这样转换只发生在数据库端,而且只发生一次。
这种情况下,只有当导入端数据库字符集为导出端数据库字符集的严格超集时,数据才能完全导成功,否则,可能会有数据不一致或乱码出现。

不管新库是不是分区,就正常导入,而且你要看新库的字符集什么的,上边的资料仅供参考。

收起
金融其它 · 2017-07-07
浏览23783
陈聪陈聪数据库管理员chen
如果是 exp/imp 导入时加参数 ignore=y就可以了显示全部

如果是 exp/imp 导入时加参数 ignore=y就可以了

收起
互联网服务 · 2017-07-18
浏览20403
renou2012renou2012数据库管理员KE
对于已经存在的表,impdp 有专门的参数table_exists_action=append显示全部

对于已经存在的表,impdp 有专门的参数table_exists_action=append

收起
金融其它 · 2017-07-07
浏览21896

提问者

yuansuiyun
数据库架构师LL

问题来自

相关问题

相关资料

问题状态

  • 发布时间:2017-07-07
  • 关注会员:4 人
  • 问题浏览:28362
  • 最近回答:2017-07-18
  • X社区推广