您的位置:首页 > 数据库 > Oracle

oracle导入导出数据不完整问题

2014-11-12 03:18 447 查看
                       oracle数据的导入导出

 

  
导入导出出现数据不全的原因是因为当我们导入用户对象之后,把外键约束导入了,如果导入的数据没有按照主表----副表,那么如果先导入副表,副表就导入不进去,从而数据不完整了,解决这个问题就是当我们导入了用户对象的时候,要导入数据之前,先禁止当前用户的外键约束,下面就详细介绍如何保证导入导出数据完整。

 

一:oracle数据的导入导出

1.通过PLSQLdeveloper工具导出用户对象:

把你所需要的用户的用户对象全部导出来。

 

 2.导出用户数据

导出你需要导出的所有用户的用户数据。

 

3.在你的新环境数据库上导入用户对象

4.物化视图的处理

说明:

之前导入库环境的时候就已经导入了物化视图,但是物化视图需要对应的基表有物化视图日志,物化视图日志是导入不了的,所以在部署应用之前我们可以先处理下物化视图的问题,避免后面管理后台出现报表出错的问题。

 

先查看用户abc的所有表:

 

selecttable_name from user_tables;

 

然后可以利用excel表格和Uedit编辑器,拼凑出给所有表添加物化视图日志的命令:

如:

                                                                 
上条命令查出的所有表

   固定语法                                                                                            
  固定语法

creatematerialized view log on    abc        with
rowid;








再次导入abc库环境

然后在PLSQL,abc中再次执行 abc.sql
脚本(abc的库环境)

若出现表或视图不存在,就再次执行(因为创建物化视图有依赖关系,没有按顺序创建)

此时,所有物化视图都会创建成功了。

 

 

 

 

5.在新环境数据库上导入用户数据

 

在导入之前先禁止用户的外键约束-------方法如下:

用当前用户通过PLSQLdeveloper登入数据库:

查询当前用户所有表的外键:

SELECT * FROM  USER_CONSTRAINTS
 WHERE CONSTRAINT_TYPE = 'R'

-------------------查看是否所有约束都是enabled的

 然后禁止当前用户所有外键:

--先用过命令生成禁止命令:
select
'alter table'||table_name||' disable constraint '||constraint_name||';' fromuser_constraints where constraint_type='R'

把命令粘贴在一个新文本文件中:

然后复制全部到对应的用户里面执行即可禁止外键

 

然后就可以导入数据了:

其他用户同上操作即可。

 

6.数据导入完成之后-----恢复所有用户的外键约束

---先查出恢复用户外键的命令:
select 'alter
table '||table_name||' enable constraint'||constraint_name||';' from user_constraints where constraint_type='R'

然后也全部复制到新文本中,再复制到PLSQLdeveloper中执行即可恢复外键。

 

其他用户也这样操作

 

--------完成

 

 二:第二种导入导出方法

PS:用PLSQLdeveloper(imp,exp)导入导出对于数据量大的话,会比较慢,对于大数据量建议使用expdp和impdp或者RMAN第三方工具。

下面先介绍expdp和impdp吧,这个对导入导出大数据来说很好用:

 

2.1.创建备份目录:

[root@oracle ~]$mkdir /u01/backupfile/                   //用root用户创建目录

[root@oracle ~]$chown oracle:oinstall /u01/backupfile/  //用root用户授权

 

2.2.定义备份目录以及给用户授权:

 

[oracle@oracle ~]$sqlplus sys AS SYSDBA //在root用户下执行命令

 

SQL> create DIRECTORY dmpdir AS '/u01/backupfile';    //指定备份目录

SQL>grant read,write ON DIRECTORY dmpdir TO abc;//授权备份用户

 2.3.接下来按用户导出数据:

[oracle@oracle~]$expdp abc/password@orcl  schemas=abc  dumpfile=abc.dmp
DIRECTORY=dmpdir

 
2.4.PS:有的时候需要导出单独的表或者数据库:如下

按表名导出:

expdp
abc/password@orcl TABLES=emp,deptdumpfile=expdp.dmp DIRECTORY=dmpdir

导出整个数据库:

expdp system/password dmpfile=full.dmp FULL=y DIRECTORY=dmpdir;

 

 2.5.最后导入到指定用户下(这个也是需要先禁止用户的外键约束的)

[oracle@oracle~]impdp abc/password directory=dmpdirdumpfile=abc.dmp schemas=abc TABLE_EXISTS_ACTION=append;

 
2.6.对应如果导入单独的表的话:如下

导入数据库:

impdp system/password dumpfile=full.dmp FULL=yDIRECTORY=dmpdir;

导入表:

impdp abc/password DIRECTORY=dmpdir dumpfile=expdp.dmpTABLES=emp,dept;

 

2.7.导入时看相应日志文件



如有错误或疑问欢迎指出和追问
联系邮箱:qrcg92@foxmail.com 


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle 导入导出