Oracle 导入导出--and一些知识,备忘

Posted on 2016-09-02 13:19  小唐525  阅读(374)  评论(0编辑  收藏  举报
这两天在做迁移Ora数据库,有一个圆友帮忙,哈哈,两个臭皮匠顶半个诸葛亮。

本来以为很简单的就imp和exp就欧了,结果各种状况百出,百度了老多,学到好多东西。

 


你的导出:exp yc/yc@orcl flie=d:/expdat.dmp log=d:/explog.log full=y 
buffer=100000000 
    用户名/密码 文件=绝对地址 日志=地址 全部=y/n 缓存大小
你的导入:imp yc/yc@orcl file=F:/directory/expdat.dmp 
log=F:/directory/implog.log fromuser=yczfw ignore=Y buffer=100000000

看日志解决问题很重要。

 

-------------------------

[from]oracel数据导出导入 - StarkSoft - 博客园
http://www.cnblogs.com/starksoft/p/5009805.html

一、导出模式(三种模式)及命令格式

1、 全库模式

exp 用户名/密码@网络服务名 full=y file=路径\文件名.dmp log=路径\文件名.log

2、 用户模式(一般情况下采用此模式)

exp 用户名/密码@网络服务名 owners=(用户1,用户2,用户3,…) file=路径\文件名.dmp 
log=路径\文件名.log

3、 表模式

exp 用户名/密码@网络服务名 tables=(表名1,表名2,表名3,…)file=路径\文件名.dmp 
log=路径\文件名.log

4、 另外,还可以只导出某个表空间

exp 用户名/密码@网络服务名 tablespaces=(表空间1,表空间2,表空间3,…) file=路径\ 
文件名.dmp log=路径\文件名.log

二、导入模式(三种模式)及命令格式

1、 全库模式

imp 用户名/密码@网络服务名 full=y file=路径\文件名.dmp log=路径\ds110.log

2、 用户模式(一般情况下采用此模式)

imp 用户名/密码@网络服务名 file=路径\文件名.dmp fromuser=导出的用户名 touser=导 
入的用户名 log=路径\ds110.log

3、 表模式

imp 用户名/密码@网络服务名 tables=(表名1,表名2,表名3,…)file=路径\文件名.dmp 
fromuser=导出的用户名 touser=导入的用户名 log=路径\ds110.log

4、 另外,还可以只导入某个表空间

imp 用户名/密码@网络服务名 tablespaces=(表空间1,表空间2,表空间3,…) file=路径\ 
文件名.dmp fromuser=导出的用户名 touser=导入的用户名 log=路径\ds110.log

 

----------------------

出现问题及解决 集锦

1.解决Oracle 11g在用EXP导出时,空表不能导出

http://www.cnblogs.com/live365wang/p/4482585.html

 (1)11g,可以考虑用expdp/impdp

 (2) 解决方法:

    1、先查询一下当前用户下的所有空表
    select table_name from user_tables where NUM_ROWS=0;
    2、用以下这句查找空表
    select 'alter table '||table_name||' allocate extent;' from user_tables  where num_rows=0

        把查询结果导出,执行导出的语句

        -----------
        set heading off;
        set echo off;
        set feedback off;
        set termout on;
        spool C:\allocate.sql;
        Select 'alter table '||table_name||' allocate extent;' from user_tables where 
        num_rows=0;
        spool off;
      -----------

      'ALTERTABLE'||TABLE_NAME||'ALLOCATEEXTENT;'
      --------------------
      alter table AQ$_AQ$_MEM_MC_H allocate extent;
      alter table AQ$_AQ$_MEM_MC_G allocate extent;
      alter table AQ$_AQ$_MEM_MC_I allocate extent;
       ……

      alter table AQ$_KUPC$DATAPUMP_QUETAB_I allocate extent;

        查看sql文件,去掉.sql文件里的 SQL>语句,只留sql语句,执行SQL;SQL>@ C:\allocate.sql
    3、然后再执行
    exp 用户名/密码@数据库名 file=/home/oracle/exp.dmp  log=/home/oracle/exp_smsrun.log 成功!

2.

   在6楼的提醒下,经过观察和上网查询,确实如6楼所说,在oracle11g中如果表为空,是不 会导出到dmp文件中: 我这这样解决的
    1). 利用PL/SQL Developer 中的 Reports > Objects > Tables 分析工具,可以通过 Num Rows 查看到记录为 0 的表
    2). 在 PowerDesigner 中建立逆向工程,选中刚才的表,执行测试数据的插入,然后再执行删除旧记录的操作,就使数据库完成了给表分配数据段的工作,就可以正常导出了。

    提示: 第一步分析表的功能,建议在服务不忙时再做,因为我们在执行完这个命令后,应用突然连接不上数据库了,后来查询得知,引用如下内容
“对表和索引的分析也需要占用系统资源,可能会影响到其他事务的运行。”

    “一些数据量小的数据表(数据字典表)就没有必要进行分析,对于一些数据量频繁变化的数据表倒是有必要经常进行分析,避免对执行计划的影响。”
重起服务后,就可以了

执行如下命令 alter system set deferred_segment_creation=false; 执行后,新建 
的表,即使数据为空,也会被导出了(旧表不起作用)

 

3.

假设在数据库实例中还有bbb、ccc、ddd用户;数据库还有ora、oracl实例,加full=y 
和不加有什么区别?
key:
full=y默认是禁止的。
1.如果加上“full=y”,将整个数据库全部导出,需要特殊的权限(具体什么权限没研究过 
),一般用system用户就足够了,普通用户是不可以的
2.不加“full=y”,默认导出连接数据库的用户数据库对象,比如:exp aaa/abc@oracle 
file=a.dmp,导出aaa模式下的所有数据库对象,bbb用户的数据就不会导出来 
3.你说的有多个用户,可以使用system来指定导出哪个用户的数据库对象,比如:exp 
aaa/abc@oracle file=a.dmp owner=(bbb,ccc),普通用户是不可以指定owner的
4.数据有多个实例的情况,这个要看你“@”后面是什么,如果@oracle,则在oracle实例上 
进行导出,@ora,则在ora实例上进行导出

 

4.

?oracle 一个用户如何分配2个表空间。具体怎么操作?
key:
alter user aaa
quota unlimited on inx
quota unlimited on tb;

如果要想更改用户在表空间的配额的话: alter user user_name quota size on 
tablespace_name
其中size可以是诸如‘32M’,‘2G’,‘unlimited‘ 等 unlimited 就是没有限制的

    1、一个用户只能属于一个表空间
    2、同一个数据库用例中,用户名是不能重复的
    3、不同用户中可以创建同名的表
    4、表空间创建后需要创建用户后才能使用,因为任何数据库对象都需要建立在一个数据用户上
    5、连接dba权限的用户可以直接访问其他用户的数据库对象,否则需要相关用户授权
    6、访问其他用户的数据库对象是时需要加上对象所属用户的用户名

/*第1步:创建临时表空间 */ 
create temporary tablespace user_temp 
tempfile 'D:\oracle\oradata\Oracle9i 
\user_temp.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management 
local; 
/*第2步:创建数据表空间 */ 
create tablespace user_data 
logging 
datafile 'D:\oracle\oradata\Oracle9i\user_data.dbf' 
size 50m 
autoextend on 
next 50m maxsize 20480m 
extent management local; 
/*第3步:创建用户并指定表空间 */ 
create user username identified by password 
default tablespace user_data 
temporary tablespace user_temp;
/*第4步:给用户授予权限 */ 
grant connect,resource,dba to username;

 

 

5.

oracle备份空表数据时候报错
即将导出 yc  的表通过常规路径... . . 正在导出表 DEF$_AQCALL EXP-00008: 遇到 
ORACLE 错误 6550 ORA-06550: 第 1 行, 第 19 列: PLS-00201: 必须声明标识符 
'SYS.DBMS_DEFER_IMPORT_INTERNAL'
key:
查看一下对象SYS.DBMS_DEFER_IMPORT_INTERNAL是否存在
select object_type,object_name from dba_objects where object_name like 
'DBMS_DEFER_IMPORT%';
存在的可能性比较大
如果存在,应该是你导出时那个用户权限丢失了,你需要给他们权限,假设你导出是用yc用户
grant exp_full_database to yc;
grant execute on SYS.DBMS_DEFER_IMPORT_INTERNAL to yc;

再重新导出试一下
我觉得你导出时用的
不是yc用户

 

======== 其他知识 汇总===========

exp/imp buffer大小设置的问题:buffer_size = rows_in_array * maximum_row_size
key:
就是起到批量提交的作用
表的行数*最大一的行所占字节
一般如实比较大的dmp,需要设定一下,一般100m左右

 

现在更多使用的是expdp即数据泵方式,客户端的exp方式已经不再适应多用户迁移。
追问
用expdp导出整个数据库也会停在
‘处理对象类型DATABASE_EXPORT/SYSTEM_PROCOBJACT/PROCOBJ’。
EXPDP USERID='system/manager@TEST as sysdba' directory=DATA_PUMP_DIR 
dumpfile=daochu.dmp parallel=4 full=y

 

expdp/impdp  20G的库 恢复就得快30-40分钟。
exp 500M,用了10分钟。

exp 用户名/密码@地址:端口/实例名 

 

 

查询ORACLE数据库名:SQL> select name from v$database。
查看实例名:SQL> select instance_name,host_name from v$instance。

查看exp卡住等待:
select sid,event,p1,p2,p3 from v$session_wait where sid='exp会话'
-------------
需要使用有DBA权限的用户,用如下语句查询:
查找用户默认的表空间
select username,default_tablespace from dba_users; 
设置默认的表空间的语法如下:
alter database default [temporary] tablespace tablespace_name;
如果使用temporary关键字,则表示设置默认临时表空间;如果不适用该关键字,则表示设 
置默认永久性表空间。
修改用户默认表空间
alter user 用户名 default tablespace mytds01表空间名
-------------

查看表空间是否存在
select tablespace_name from dba_tablespaces where tablespace_name="YCWS" 
系统用户才能查表空间的
select name from v$tablespace;
知道表名,查看该表属于那个表空间
select tablespace_name,table_name from user_tables where table_name='emp'

 好多sql 用什么查什么就欧了

 

====================

参考:

1.oracle权限全集 http://blog.itpub.net/29863023/viewspace-1327586/

2.如何彻底删除Oracle数据库,以创建相同实例名称的库 
http://blog.itpub.net/7192724/viewspace-1228347/

3.用exp_imp远程操作数据库,附帶Oracle数据导入导出imp/exp詳解
http://blog.csdn.net/heirenheiren/article/details/10199233

4. oracle IMP EXP的技巧,和解决IMP-00003: 遇到 ORACLE 错误 1435 ORA-01435: 用户不存在
http://blog.csdn.net/johnstrive/article/details/5483571

5.imp时候,只导入某表的表结构,而不导入此表数据
http://biancheng.dnbcw.info/oracle/149103.html

6.ORACLE EXP IMP 导入导出数据 解决如何导出空表
http://blog.csdn.net/yudehui/article/details/8078294

7.oracle11g Exp Imp 后,发现表少了很多 
http://bbs.csdn.net/topics/360025948