简单的介绍下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.sqlselect
'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次,给各位造成麻烦了,下次我会确认有正确解决方案在写,谢谢大家。
全文完。