Oralce exp命令简单使用

     简单的介绍下exp怎么使用,文章略简单,数据库版本是10g,导出错误解决方法在文章最后,首先带上参考链接:

    

http://www.cnblogs.com/zhangzhifeng/archive/2011/08/04/2126935.html
http://blog.csdn.net/oscar999/article/details/7468153
http://daisybabay2012.blog.51cto.com/5007509/853730
http://www.cnblogs.com/lanzi/archive/2011/10/26/2225665.html

    先新建一个普通用户测试用:

   

create user exp_test identified by test;

    赋权:

   

grant resource,connect to exp_test;

    查看系统所有用户:

   

select username from dba_users;

    查看用户权限:

   

select privilege from dba_sys_privs where grantee='EXP_TEST'
union
select privilege from dba_sys_privs where grantee in (select granted_role from dba_role_privs where grantee='EXP_TEST' );

    查看当前登录用户的缺省表空间

   

select username,default_tablespace from user_users; 

    查看用户使用的缺省表空间名称:

   

select username,default_tablespace from dba_users where username='EXP_TEST'

    删除用户:

   

drop user exp_test cascade;

    删除的时候遇到一个问题:

   

    解决方法见博文:

    http://794448033.blog.51cto.com/1541449/1030057
    http://blog.csdn.net/tianlesoftware/article/details/4787074

  

    下面开始介绍exp使用:

     查看exp怎么使用:

     cmd命令行界面下:

    

exp help=y

   

 

     将数据库XE完全导出:

    

exp exp_test/test@xe file=f:/saveFile/tmp/fullxe.dump full=y

   

    可知普通用户不能导出整个表:

    使用dba身份的system导出整个数据库:

   

exp system/root@xe file=f:/saveFile/tmp/fullxe.dump full=y

   

    导出速度有点慢,导出文件用nodepad++打开如下:

   

     第一行是数据库版本号。

     导出过程中发现Sys下面好多函数报错,解决方法在文章最后。

    

     将数据库中tmd用户用户的表导出

    

exp system/root@xe file=f:/saveFile/tmp/tmdtables.dump owner=tmd

  

    导出命令不要在后面添加分号:

   

    如果想导出tmd用户的emp表

    exp system/root@xe file=f:/saveFile/tmp/tmemptable.dump owner=tmd tables=emp log=f:/saveFile/tmp/exp_out.log

    这么写是错误的。

    

     正确的写法是:

    

exp system/root@xe file=f:/saveFile/tmp/tmemptable.dump tables=tmd.emp log=f:/saveFile/tmp/exp_out.log

    导出多个不同用户的表如下:

   

exp system/root@xe file=f:/saveFile/tmp/tmemptable.dump tables=(tmd.emp,exp_test.emp) log=f:/saveFile/tmp/exp_out.log

    将数据库中用户tmd的表emp中的字段deptno=10的数据导出:

   

exp system/root@xe file=f:/saveFile/tmp/expquery.dump tables=tmd.emp query=\" where deptno='10'\"

   

    压缩使用compress=y,带日志log=filepath.log

   

exp system/root@xe file=f:/saveFile/tmp/expquery.dump tables=tmd.emp compress=y

    可以发现,导出没有指定表时候,存储过程或者函数都会一起导出,如果不想要数据,只想要建表语句,可以这样写:

   

exp system/root@xe file=f:/saveFile/tmp/expemp.dump tables=tmd.emp rows=n

    导出结果可以看到触发器也一起导出了,不想要触发器,可以这样:

   

exp system/root@xe file=f:/saveFile/tmp/expemp_no_trigger.dump tables=tmd.emp rows=n triggers=n

    如果我只想导出用户tmd的所有表,不要存储过程和函数,不要数据,具体办法是在tables=()里面把要导出的表写一遍,如:

   

exp system/root@xe file=f:/saveFile/tmp/tmemptable.dump tables=(tmd.emp,--这里面把tmd所有表写一遍) rows=n triggers=n

    举个例子:

   

exp system/root@xe file=f:/saveFile/tmp/tmemptable.dump tables=(tmd.XMLTYPE_TABLE,tmd.FILTER_PARAM_NAME,tmd.EXCEPTION_URL_LOG,tmd.FILTER_WHITE_LIST,tmd.TEST_LAG,tmd.VALID_ORDERS,tmd.BIG_ORDERS,tmd.REJECTED_ORDERS,tmd.TB_EMP,tmd.TB_A,tmd.TB_B,tmd.QRTZ_JOB_DETAILS,tmd.QRTZ_TRIGGERS,tmd.QRTZ_SIMPLE_TRIGGERS,tmd.QRTZ_CRON_TRIGGERS,tmd.QRTZ_FIRED_TRIGGERS,tmd.C3P0TESTTABLE,tmd.SYS_ADMIN,tmd.TBL_USER,tmd.T_PZ,tmd.TMP_MICHAEL,tmd.T_BLOB_TEST,tmd.TEST_USERS,tmd.EMP,tmd.DEPT,tmd.T_USER,tmd.PAGE_USERS,tmd.ACCOUNT,tmd.ANIMUS_PARAM_INFO,tmd.ANIMUS_URL_LOG,tmd.EXCEPTION_DIM_INFO,tmd.FILTER_INFO,tmd.PICK_PARAM_INFO,tmd.SYS_KEY_INFO,tmd.PICK_URL_LOG,tmd.PLUG_SAFE_BSDIM,tmd.PLUG_SAFE_BSLOG,tmd.PLUG_SAFE_BSRULE,tmd.SYS_FILTER_MAP,tmd.SYS_FILTER_PROP_MAP,tmd.SYS_INFO,tmd.T_TEST_USER,tmd.T_STR_TEST,tmd.TSQL_ARTICLE,tmd.USERINFO,tmd.USER_TEST,tmd.G_GROUP,tmd.G_STUDENT,tmd.TEST_INSERT,tmd.H_USER,tmd.T_STU,tmd.T_TEST,tmd.T_CLASS,tmd.TMYSQL_SCHEDULER_TEST,tmd.TMYSQL_USER_4TEST,tmd.TSQL_USER_BASIC_INFO,tmd.BXXX,tmd.T_COMPANY,tmd.TSQL_DECODE_TEST,tmd.SYS_AUTHORITIES,tmd.SYS_AUTHORITIES_RESOURCES,tmd.SYS_RESOURCES,tmd.SYS_ROLES,tmd.SYS_ROLES_AUTHORITIES,tmd.SYS_USERS,tmd.SYS_USERS_ROLES,tmd.T_ENUM_USER,tmd.TEST_DBMS,tmd.TMENU,tmd.TUSER,tmd.TEST_SQLLDR_USERS,tmd.T_PERSON,tmd.T_STUDENT_TEST,tmd.TORACLE_TEST_LOADDATA,tmd.TB2) rows=n triggers=n

    可以使用sql查出当前登录用户所有的表:

   

SELECT max(substr(sys_connect_by_path('tmd.' || table_name, ','), 2))
  FROM (SELECT table_name, rownum rn FROM user_tables)
 START WITH rn = 1
CONNECT BY rn = rownum;

    dba可以这样写:

   

SELECT max(substr(sys_connect_by_path('tmd.' || table_name, ','), 2))
  FROM (select table_name,rownum rn from dba_tables where owner='TMD')
 START WITH rn = 1
CONNECT BY rn = rownum;

    只导出数据不要建表语句,这个我也不知道。

    普通用户tmd使用exp时:

    导出用户tmd的表:

   

exp tmd/tmd@xe file=f:/saveFile/tmp/current_tables.dump owner=tmd

    普通用户导其他用户的表

   

exp exp_test/test@xe file=f:/saveFile/tmp/tmd_tables.dump owner=tmd rows=n

   

    可见普通用户不能导出其他用户的表,不能导出整个数据库,其他的和上面例子一样。

    如导出用户tmd所有表

   

exp tmd/tmd@xe file=f:/saveFile/tmp/currenttables.dump tables=(XMLTYPE_TABLE,FILTER_PARAM_NAME,EXCEPTION_URL_LOG,FILTER_WHITE_LIST,TEST_LAG,VALID_ORDERS,BIG_ORDERS,REJECTED_ORDERS,TB_EMP,TB_A,TB_B,QRTZ_JOB_DETAILS,QRTZ_TRIGGERS,QRTZ_SIMPLE_TRIGGERS,QRTZ_CRON_TRIGGERS,QRTZ_FIRED_TRIGGERS,C3P0TESTTABLE,SYS_ADMIN,TBL_USER,T_PZ,TMP_MICHAEL,T_BLOB_TEST,TEST_USERS,EMP,DEPT,T_USER,PAGE_USERS,ACCOUNT,ANIMUS_PARAM_INFO,ANIMUS_URL_LOG,EXCEPTION_DIM_INFO,FILTER_INFO,PICK_PARAM_INFO,SYS_KEY_INFO,PICK_URL_LOG,PLUG_SAFE_BSDIM,PLUG_SAFE_BSLOG,PLUG_SAFE_BSRULE,SYS_FILTER_MAP,SYS_FILTER_PROP_MAP,SYS_INFO,T_TEST_USER,T_STR_TEST,TSQL_ARTICLE,USERINFO,USER_TEST,G_GROUP,G_STUDENT,TEST_INSERT,H_USER,T_STU,T_TEST,T_CLASS,TMYSQL_SCHEDULER_TEST,TMYSQL_USER_4TEST,TSQL_USER_BASIC_INFO,BXXX,T_COMPANY,TSQL_DECODE_TEST,SYS_AUTHORITIES,SYS_AUTHORITIES_RESOURCES,SYS_RESOURCES,SYS_ROLES,SYS_ROLES_AUTHORITIES,SYS_USERS,SYS_USERS_ROLES,T_ENUM_USER,TEST_DBMS,TMENU,TUSER,TEST_SQLLDR_USERS,T_PERSON,T_STUDENT_TEST,TORACLE_TEST_LOADDATA,TB2) rows=n triggers=n

   

   -----------------------------------------------------关于导出过程中可能出现的错误----------------------------

    导出整个数据库时候,有很多sys报错,谷歌了下,找到了篇文章:

    http://www.dba-oracle.com/t_compile_pl_sql_procedures.htm

    上面有个脚本:

    

set heading off;
set feedback off;
set echo off;
Set lines 999;

Spool f:/saveFile/tmp/run_invalid.sql

select 
'ALTER ' || OBJECT_TYPE || ' ' ||
OWNER || '.' || OBJECT_NAME || ' COMPILE;'
from
dba_objects
where
status = 'INVALID'
and
object_type in ('PACKAGE','FUNCTION','PROCEDURE')
;

spool off;

    可以看到结果,老外也提供了一种方法:

    

Try to do it with catrep.sql.
You could also try to execute utlrp.sql and post the result.
Both as SYSDBA.

    但是我试了下,还是有很多错误,最后找到了这篇博客:

    http://blog.csdn.net/chensrao/article/details/6459687

    按他说的执行:

    

@D:\oracle\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catalog.sql
@D:\oracle\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catproc.sql

    再导出tmd数据的时候,出现错误:

   

    网上解决方法:

    http://wenwen.soso.com/z/q318771546.htm

    执行:

   

@D:\oracle\app\oracle\product\10.2.0\server\RDBMS\ADMIN\catmetx.sql 

    现在可以导出用户tmd的表不报错。

   

    但是如果尝试导出整个数据库数据时候,还是报错,如下:

   

    这是最后时候才报错的,中间一直没出现错误,解决方法,

    http://wuhuizhong.iteye.com/blog/1932098

   

SQL> DELETE FROM SYS.EXPACT$
  2  WHERE FUNC_PACKAGE = 'DBMS_AQ_IMPORT_INTERNAL';

已删除6行。

    再导出整个数据库:

    

exp system/root@xe file=f:/saveFile/tmp/
xedb.dump log=f:/saveFile/tmp/system_exp.log direct=y indexes=n rows=y CONSISTEN
T=y buffer=104857600 compress=n feedback=100000

    结果为:

   

     上面那个执行结果很快,但是导出文件只有300k,全库完全导出可以使用

    

exp system/root@xe file=f:/saveFile/tmp/
fullxe.dump full=y

    测试,结果为:

   

 

    最后2次导出的文件大小为:

   

 

    这里,我要想各位道歉,我在没有完全解决问题的情况下写博客,博客是快中午的时候写的,写的很急,出现问题后搜索了很久才找到答案,本人也是oracle的菜鸟,搜索到答案我就在文章后面加上一段,本文已经修改了3次,给各位造成麻烦了,下次我会确认有正确解决方案在写,谢谢大家。

    全文完。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值