exp imp 命令使用问题汇总

        exp imp 是数据库导出、导入常用的命令,但是经常会有一些怪异的问题让人很苦恼,今天我把我遇到过的问题在此记录,希望对于我有相同困惑的人有所帮助。

        一版情况下我们都是从一台服务器上exp备份一个库,需要的时候imp到需要的数据库中。所以我们从exp开始。

 

一、exp

  1.  exp 导出基本命令的写法
    exp username/password@数据库 file=导出文件存放位置\文件名.dmp log=导出文件时的log文件位置\log文件名.txt
     
    exp test/test@orcl file=D:\dmp\test.dmp log=D:\log\log.txt
    注意:orcl 指的是你连接数据库的服务名。那么问题来了,如果没有配置服务名怎么办。
    exp text/[email protected]:1521/orcltest file=D:\test.dmp log=D:\log.txt
     也就是说可以用ip:数据库端口号/数据库实例名   这种方式进行连接。

    温情提示,这里的log路径必须存在。否则会报无法打开这个文件的错误。


     
  2. exp 空表并没有导出
    从导出的log中可能会发现导出的表要少于导出用户所拥有的表,这是因为这个表是个空表。
    select t.SEGMENT_CREATED,t. * from user_tables t where num_rows = 0 or num_rows is null;
     SEGMENT_CREATED 单独列出来正是因为它表示了表是否分配了segment,没有分配便导不出来。



     其中TEST3便是空表,导出的时候是导不出来的。


     
    此时就需要设置表,给表分配空间。

    alter table tableName allocate extent;
     因为如果空表比较多,所以如何批量设置呢。
    select 'alter table '||table_name||' allocate extent;' from user_tables where num_rows = 0 or num_rows is null;
     将生成的批量设置语句一起执行。然后在执行导出语句便可导出空表了。
  3. 需要注意的就是导出前看看该用户表空间的名字,以便于导入的时候提前创建对应的表空间,否则会报表空间不存在无法导入。
    select t.username,t.default_tablespace from dba_users t where t.username='TEST';
     

 二、imp 

  1. 导入前如果库中已经存在想要导入的用户需要先将这个用户删掉,提到删掉肯定会有人遇到提示该用户存在连接不让删。

     这个时候就得先杀掉连接的会话。
    select t.sid,t.serial# from V$session t where t.username='TEST';
    结果:
            sid     serial#
    ----------   --------
    1	63	115
    
    alter system kill session 'sid,serial#';
    alter system kill session '63,115';
    
     如果查出此用户存在很多会话那就批量删除吧。
    select 'alter system kill session ',''''||trim(sid)||','||trim(serial#)||''';' from v$session where username='TEST'
     批量杀掉会话后就可以删掉这个用户了,然后重新创建用户。以备导入使用
  2.  如果导出时发现需要特定的表空间,那么就得创建表空间
    create tablespace Test datafile 'test.dbf' size 50M autoextend on next 1G;
     
  3. imp 基本命令导入
    imp test/test@orcl file=D:/test.dmp log=D:/log.txt fromuser=test touser=test full=y
     

 exp imp 命令的基本用法,和导出、导入容易遇到的问题,希望对你有所帮助!

猜你喜欢

转载自yu979735777.iteye.com/blog/2322431
今日推荐