比如数据库用户kms下有一个表PAYMENT,导出该表的数据
1.expdp导出
expdp \'/ as sysdba \' directory=dpdir dumpfile=PAYMENT0510.dmp tables=kms.PAYMENT
directory:导出文件到指定目录
dumpfile:导出指定文件名
tables:导出的表
图中看出有几个报错,最终导出的结果是失败或文件损坏,如果拿该文件执行impdp导入操作会报文件不完整的错误,所以执行expdp导出时一定保证导出的文件是完整的成功的,
图中框起来部分:ORA-27072: File I/O error
Linux-x86_64 Error: 28: No space left on device 说明
服务器磁盘已满,导致导出失败,df -h 查看磁盘空间,如果该目录下磁盘已满,可以清理一些无用的大文件。
导入上面导出的文件报错:文件已损坏
df -h 查看磁盘已满:
清理一些大文件后磁盘空间充足正常导出:
2.impdp导入
导入前查看一下PAYMENT表的记录数
错误 ORA-39151
指出 "KMS"."PAYMENT"
表已经存在,并且由于 table_exists_action
参数被设置为 skip
,所以所有依赖的元数据和数据都被跳过了,导致该表的数据和依赖的元数据没有被导入。如果希望更新现有表,而不是跳过它可以在 impdp
命令中添加 table_exists_action=replace
或 table_exists_action=append
参数。
table_exists_action=replace
:如果表存在,则删除它并重新创建。table_exists_action=append
:如果表存在,则只导入新数据(不删除现有数据)。
由于我是在测试环境操作,且原表数据基本无用,所以选择的是前者替换方式,请确认你的表数据是替换还是追加,如果是替换请做好备份操作!!!!!
impdp \"/ as sysdba\" directory=dpdir dumpfile=PAYMENT0510.dmp tables=kms.PAYMENT table_exists_action=replace
这次 impdp
命令尝试替换现有的 KMS.PAYMENT
表,但在处理过程中遇到了两个错误:
-
ORA-01917: user or role 'KMSQURY' does not exist
这个错误表明在导出文件中有一个授权给KMSQURY
用户的 SELECT 权限,但是在目标数据库中这个用户或角色不存在。为了解决这个问题,您需要在目标数据库中创建KMSQURY
用户,或者如果您不需要这个授权,您可以在导入之前编辑导出文件以删除这个授权语句,或者在导入时使用exclude=GRANT
参数来排除所有授权语句。 -
ORA-02298: cannot validate (KMS.FK_PAYMENT_DEALSCONFIRMID) - parent keys not found
这个错误表示KMS.PAYMENT
表上的外键FK_PAYMENT_DEALSCONFIRMID
引用了KMS.DEALSCONFIRM
表中的某个列,但在目标数据库中找不到相应的父键。这可能是因为KMS.DEALSCONFIRM
表不存在,或者该表中没有包含DEALSCONFIRM_ID
列的相应数据。要解决这个问题,您需要确保KMS.DEALSCONFIRM
表和相应的数据存在于目标数据库中。
对于第一个问题,您可以在目标数据库中创建 KMSQURY
用户,或者使用以下命令导入,同时排除授权语句:
impdp '/ as sysdba' directory=dpdir dumpfile=PAYMENT0510.dmp tables=kms.PAYMENT exclude=GRANT table_exists_action=replace
对于第二个问题,您需要确保 KMS.DEALSCONFIRM
表存在,并且包含所有必要的数据。如果 KMS.DEALSCONFIRM
表在目标数据库中不存在,您可能需要先导入它,或者手动创建它并填充必要的数据。
另外,请注意,使用 table_exists_action=replace
会删除现有的表及其所有数据,然后再重新创建它。这是一个破坏性的操作,所以在执行之前请确保您已经备份了任何重要的数据。
上述两个问题即使不解决也不影响数据的导入,测试环境数据随便玩