Oracle数据库的导入与导出,及数据库的异常处理

来源:互联网 发布:仿真设计软件 编辑:程序博客网 时间:2024/06/07 16:56

Oracle数据导入导出imp/exp就相当于oracle数据还原与备份。exp命令可以把数据从远程数据库服务器导出到本地的dmp文件,imp命令可以把dmp文件从本地导入到远处的数据库服务器中。 利用这个功能可以构建两个相同的数据库,一个用来测试,一个用来正式使用。


下面介绍的是导入导出的实例。
数据导出:
1 将数据库TEST完全导出,用户名system 密码manager 导出到D:/daochu.dmp中
exp system/manager@TEST file=d:/daochu.dmp full=y

:full=y 表示全库导出。full总共有2个可选项yes(y)/no(n),缺省情况下full=no,这时只会将该用户下的对象导出。

2 将数据库中system用户与sys用户的表导出
exp system/manager@TEST file=d:/daochu.dmp owner=(system,sys)

full方式可以备份所有用户的数据库对象,包括表空间、用户信息等,owner=XX只能备份指定用户的对象,其他用户下的就不备份了,EXPfull=yowner=XX是不能同时使用的。
3 将数据库中的表inner_notify、notify_staff_relat导出
exp aichannel/aichannel@TESTDB2 file= d:/data/newsmgnt.dmp tables=(inner_notify,notify_staff_relat)

tables=xx 表示备份相关表,不能同时和ownerfull使用。

4 将数据库中的表table1中的字段filed1以"00"打头的数据导出
exp system/manager@TEST file=d:/daochu.dmp tables=(table1) query=/" where filed1 like '00%'/"

query主要是导出合适条件的数据。使用该参数时,需要注意对所有操作系统保留字符都要使用转义符号。若有括号()也需要转义:

   query=\"where dt=to_date\(\'2007-09-22\',\'yyyy-mm-dd\'\)\" 

   如果遇到条件比较繁琐的语句,频繁的转义操作不仅费时,还很容易出错。我们可以使用expexpdpPARFILE参数避免query内容的繁琐转义问题。

  例:

   oracle DBALNP01 > cat > zxcc.par

   tables=table1

   file=test.dmp

   query="where dt_time=to_date('2010-06-25','yyyy-mm-dd')" 

   这时就可以尽情的再双引号中写条件语句了。

上面是常用的导出,对于比较大的数据库,我们可以对导出文件进行压缩处理,可用winzipdmp文件进行压缩。

    也可以在上面命令后面加上 compress=y 来实现。


数据的导入:

 1、将D:\zxcc.dmp 中的数据导入 zxcc数据库中。

   imp kf/zx@zxcc file=D:\zxcc.dmp

   

   导数据得时候,有可能报错。为什么?有以下主要的原因:

  A. 导入的对象(表,视图,方法等)原本不属于当前连接的用户的

  B. 导入的对象在该数据库的指定用户下已经存在

  C. 导入的对象的原本用户不在这个数据库里

    对于这三个问题的处理方法如下:

    

    a/c、所有对象全部导入到指定的账户下:

    

    imp kf_new/zx@zxcc_new file=d:\zxcc.dmp fromuser=kf touser=kf_new

    

    其中fromuser=kf.dmp文件里的对象的原先的owner, touser=kf_new 为作为导入的对象的新的Owner.

    

    b、忽略/插入数据:

  imp kf_new/zx@zxcc_new file= d:\zxcc.dmp ignore=y

    

    其中ignore=y告诉imp.exe把数据直接插入到相应对象(并且如果导入的对象里面有其他的对象,如约束,索引等,会在数据插入后被创建)。

    

 2、将d:\zxcc_tb.dmp中的表tb_operator 导入

   imp kf/zx@zxcc  file=d:\zxcc_tb.dmp  tables=(tb_operator)

 

   忽略加载约束

  有时候导数据进来的时候,我们不需要把它的约束,比如一些外键约束等都导进来,可以加上参数constraints=N

  不加载索引(比如唯一性的索引),可以加上参数indexs=N

    

   只加载结构,不加载数据,如果只要表的结构等定义(约束,触发器),而不要里面的数据,可以加上参数rows=N

  对于上述操作登陆操作的用户需是管理员,如果不是管理员,而是普通用户,那么这个用户必须有创建删除对象的权利,对象可能包括表,视图,方法,存储过程等等常见的对象。为什么“可能”包括?因为这个视导入导出的时候是否涉及相关类型的对象而定。 

   

   Imp kf/zx@zxcc_new file=d:\zxcc.dmp fromuser=kf touser=kf_new ignore=y

 

   基本上面的导入导出够用了。不少情况要先是将表彻底删除,然后导入。

 

注意:

   (1)、操作者要有足够的权限,权限不够会有提示。

   (2)、数据库链接正常,可以用tnsping zxcc 来检测数据库zxcc能否连上。

   (3)、导入/导出数据库时注意字符集。可能会出现导出/导入时数据库字符集不一致而报错。


附录一:
给用户增加导入数据权限的操作
第一,启动sql*puls
第二,以system/manager登陆
第三,create user 用户名 IDENTIFIED BY 密码 (如果已经创建过用户,这步可以省略)
第四,GRANT CREATE USER,DROP USER,ALTER USER ,CREATE ANY VIEW ,
DROP ANY VIEW,EXP_FULL_DATABASE,IMP_FULL_DATABASE,
DBA,CONNECT,RESOURCE,CREATE SESSION TO 用户名字 
第五, 运行-cmd-进入dmp文件所在的目录, 
imp userid=system/manager full=y file=*.dmp
或者 imp userid=system/manager full=y file=filename.dmp

执行示例:
F:/Work/Oracle_Data/backup>imp userid=test/test full=y file=inner_notify.dmp

 

屏幕显示
Import: Release 8.1.7.0.0 - Production on 星期四 2月 16 16:50:05 2006
(c) Copyright 2000 Oracle Corporation. All rights reserved.

连接到: Oracle8i Enterprise Edition Release 8.1.7.0.0 - Production
With the Partitioning option
JServer Release 8.1.7.0.0 - Production

经由常规路径导出由EXPORT:V08.01.07创建的文件
已经完成ZHS16GBK字符集和ZHS16GBK NCHAR 字符集中的导入
导出服务器使用UTF8 NCHAR 字符集 (可能的ncharset转换)
. 正在将AICHANNEL的对象导入到 AICHANNEL
. . 正在导入表 "INNER_NOTIFY" 4行被导入
准备启用约束条件...
成功终止导入,但出现警告。


附录二:
Oracle 不允许直接改变表的拥有者, 利用Export/Import可以达到这一目的.
先建立import9.par,
然后,使用时命令如下:imp parfile=/filepath/import9.par
例 import9.par 内容如下:
FROMUSER=TGPMS 
TOUSER=TGPMS2 (注:把表的拥有者由FROMUSER改为TOUSER,FROMUSER和TOUSER的用户可以不同) 
ROWS=Y
INDEXES=Y
GRANTS=Y
CONSTRAINTS=Y
BUFFER=409600
file==/backup/ctgpc_20030623.dmp
log==/backup/import_20030623.log


1. 如果出现 ORA-12541: TNS:no listener 错误,说明需要开启监听。

              监听命令

              启动监听:lsnrctl start 
              查看监听:lsnrctl status 
              停止监听:lsnrctl stop 

2. 如果出现 ORA-12514: TNS:listener does not currently know of service requested in connect descriptor 错误,说明当前用户没有权限导入/导出这个数据库。先确定已经打开数据库,然后回到SYS用户后再试。


  数据库时可以连上的。可以用tnsping TEST 来获得数据库TEST能否连上。






0 0
原创粉丝点击