Oracle利用impdp 导入数据库的归纳

来源:互联网 发布:武汉软件新城吧 编辑:程序博客网 时间:2024/05/18 22:42

我们知道,当我们要导入一个数据库的时候,说起来很简单,但是其中会遇到各种问题,这个就占个位置慢慢整理吧:

1, 利用impdp导入数据库分类

    a, 完整导入:就是加入full=y这个关键词,不能和schemas, tables,等关键词重用

 impdp \"/ as sysdba\" full=y directory=expdump dumpfile=test1.dmp logfile=test1_impdp.log PARALLEL=100

    b, 根据用户导入:即选择Schema来导入,加入schemas=.... 或者 remap_schema=....  把dump文件中的某个schema 改名

impdp \"/ as sysdba\" schemas=user1,user2 remap_schema=user1:user3,user2:user4 directory=EXPDUMP dumpfile=test.dump logfile=test_schemas_impdp.log  PARALLEL=20

    c, 改变表空间导入:其实就是利用remap_tablespace来导入原来数据库使用的表空间,这样可以不需要再取创建表空间

impdp \"/ as sysdba\" schemas=user1,user2 remap_tablespace=tp1:tp3, tp2:tp4 directory=EXPDUMP dumpfile=test.dump logfile=test_schemas_impdp.log  PARALLEL=20

 

2, 导入impdp的整个过程

    a, 试图获得要导入的数据库数据的导出日志

    b, 了解原来数据库的信息,比如字符集、本地字符集、数据库时区等等,判断源数据库和目标数据库是否一致

    c, 获得要导入的schema,查看当前数据库是否已有改schema。如果有,则最好运行drop user cascade。如果没有,则判断是否需要更改密码,若不需要,则无需手动创建改用户

    d, 获得要导入的数据库数据相关的表空间

    e, 了解要导入的数据库数据、用户的权限问题

    f,  然后就可以开始导入了

 

3, 导入过程中可能会遇到这些问题:

    a, 目录没有创建或者没有权限

ORA-39002: invalid operationORA-39070: Unable to open the log file.ORA-39087: directory name expdump is invalid


说明expdump 目录可能没有在数据库上建立,运行下面语句就可以创建

create directory expdump as "/expdump"; 

也可能是用来导入数据的用户没有权限,运行下面语句就可以

grant read on directory expdump to imp_user

 

    b, 创建tablespace失败,或者tablespace不存在

ORA-01119: error in creating database file '/dbdata/dbservice1/test01.dbf'ORA-27040: file create error, unable to create fileLinux-x86_64 Error: 2: No such file or directory

在新的数据库文件路径不一样,所以创建不成功,方法就是先创建它

CREATETABLESPACE "test" DATAFILE '+FDA1/dbservice1/test01.dbf'   SIZE 16597383

CREATE BIGFILE TABLESPACE "test" DATAFILE '+FDA1/dbservice1/test01.dbf'   SIZE 16597383

 

    c, 客户端字符集的问题

ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]ORA-06502: PL/SQL: numeric or value errorLPX-00231: invalid character 63 ('?') found in a Name or Nmtoken


导致这种问题主要是因为客户端的字符集和数据库的字符集不符,解决方法如下:

SQL> select value from nls_database_parameters where parameter='NLS_CHARACTERSET';VALUE----------------------------------------WE8MSWIN1252Linux-Host: EXPORT LANG=WE8MSWIN1252

 

    d, 数据库本地字符集的问题

ORA-39083: Object type TABLE:"test"."TESTLOG" failed to create with error:ORA-00910: specified length too long for its datatype

原因是某些本地字符集能支持的最大长度只有2000,即NVARCHAR2(2000), 而要创建的表超过2000,就报错,改为UTF8,能支持最大4000。

但是改字符集是个很大的工程,涉及export full (backup), character scan, character convert, drop national character related data, alter database national character等等,下面是简单的方法,但internal_use 一般来说,Oracle不推荐用

SHUTDOWN IMMEDIATE;STARTUP MOUNT; ALTER SYSTEM ENABLE RESTRICTED SESSION; ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0; ALTER SYSTEM SET AQ_TM_PROCESSES=0; ALTER DATABASE OPEN; ALTER DATABASE NATIONAL CHARACTER SET INTERNAL_USE UTF8;SHUTDOWN IMMEDIATE;


 

    e, 操作系统线程、文件问题

ORA-39095: Dump file space has been exhausted: Unable to allocate 8192 bytes


第一种可能是:dump的文件不够大,空间不足,操作系统能支持的文件大小不够等,只要增加dump文件就可以

39095, 00000, "Dump file space has been exhausted: Unable to allocate %s bytes"// *Cause:  The Export job ran out of dump file space before the job was//          completed.// *Action: Reattach to the job and add additional dump files to the job//          restarting the job.


第二种可能是:因为线程太多,比如 parallel=100, 线程在写入文件的时候冲突导致写入失败,datadump认为dump文件不足,但奇怪的是,删除文件再执行同样的命令还会报错,报错的时间以及生成的文件大小都不一样。把parallel相应减小,比如 parallel=6, 就不再报错


     f, 系统对象失效

OBJECT_NAME--------------------------------------------------------------------------------OBJECT_TYPE         OWNER------------------- ------------------------------_ALL_REPCONFLICTVIEW                SYS_ALL_REPPARAMETER_COLUMNVIEW                SYS_ALL_REPRESOLUTIONVIEW                SYS_ALL_REPCOLUMN_GROUPVIEW                SYS


利用sysdba运行命令@?/rdbms/admin/utlrp.sql 基本就可以解决

原创粉丝点击