zoukankan      html  css  js  c++  java
  • IMP-00008: unrecognized statement in the export file: string的问题分析

    分类: Linux

    上周需要将oracle10g中的某一个用户下的对象导入到oracle11g中去。用exp在10g的数据库服务器上导出的dump文件,再用imp在11g的数据库服务器上将dump文件导入到数据库中,前面执行的都很正常,后来发现报如下错误:

    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
       ?
    IMP-00008: unrecognized statement in the export file:
       
    IMP-00008: unrecognized statement in the export file:
      #
    IMP-00008: unrecognized statement in the export file:
      # 
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     
    IMP-00008: unrecognized statement in the export file:
     

    oracle官方文档的对这个错误的是这么说的:

    IMP-00008: unrecognized statement in the export file: string

    Cause: Import did not recognize a statement in the export file. Either the export file was corrupted, or an Import internal error has occurred.
    Action: If the export file was corrupted, retry with a new export file. Otherwise, report this as an Import internal error and submit the export file to customer support.

    看这个没有什么帮助。

    后来查到是由于oracle11g有个新特性,不能导入空表:

    11G中有个新特性,当表无数据时,不分配segment,以节省空间,这样就会没有导出数据 

      ??
    IMP-00008: unrecognized statement in the export file:
      ?
    IMP-00008: unrecognized statement in the export file:
    在用imp 导入数据的时候出现IMP-00008: unrecognized statement in the export file:的错误,

    解决方法

    在Oracle 11g中,exp默认不能导出空表。用传统的exp,imp进行异构平台数据库迁移会比较麻烦。不过可以使用expdp、impdp进行迁移。


    把64位windows 2003的Oracle11gR2数据库迁移到64位Linux RedHat Enterprise 5中,可以使用expdp、impdp进行迁移数据。


    如:Linux 为A服务器,Linux为B服务器,数据库用户为test,把A服务器的数据迁移到B服务器中 

    在A服务器操作
    1、创建目录
    SQL> create directory expdp_dir as '/home/oracle/expdp_dir';  //一台服务器只要创建一次
    2 赋予导出的用户权限
    SQL> grant read,write on directory expdp_dir to test;//一台服务器只要创建一次


    3、在Linux目录创建目录/home/oracle/expdp_dir

    mkdir -p /home/oracle/expdp_dir //一台服务器只要创建一次


    4、在命令窗口导出:

    expdp test/test DIRECTORY=expdp_dir DUMPFILE=test.dmp logfile=testexpdp.log  //每次都要操作
    在B服务器中操作:

    5、SQL> create directory impdp_dir as '/home/oracle/impdp_dir';//一台服务器只要创建一次

      SQL> grant read,write on directory impdp_dir to test;//一台服务器只要创建一次

    6、 在系统中需要有/home/oracle/impdp_dir目录
    7、用ftp把A服务器导出的数据上传到B服务器的/home/oracle/impdp_dir目录中
    在A服务器中配置好B服务器的服务器名,在A服务器导入数据
    8、在命令窗口导入:
    impdp test/test@B_database DIRECTORY=impdp_dir DUMPFILE=test.dmp logfile=testimpdp.log

    (这里注意大小写,如果test.dmp在linux中为大写,必须更改为大写。Linux区分大小写)


    解决方法,原理就是往所有的空表中分配空间:

    --查询当前用户下的所有空表,并生成空表的插入语句脚本
    create or replace
    procedure  generate_tab_segement is
    v_table                      NVARCHAR2(200);
    v_sql                        VARCHAR2(200);
    v_q                          NUMBER;
    v_char_value                 NVARCHAR2(10);
    v_varchar2_value             NVARCHAR2(10);
    v_number_value               NVARCHAR2(10);
    v_date_value                 NVARCHAR2(10);
    v_add_value                  NVARCHAR2(10);
    v_separate_value             NVARCHAR2(10);
    v_insert_sql                 NVARCHAR2(4000);
    col_num                      NVARCHAR2(200);
    tb_name                      NVARCHAR2(200);
    TYPE TCUR IS REF CURSOR; 
    c2 TCUR;
    begin
         FOR r1 IN (SELECT table_name tn FROM tabs) LOOP
            BEGIN
                v_table   :=r1.tn;
                v_sql     := 'SELECT count(*) as q FROM ' || v_table || ' where rownum = 1';
                v_char_value := '''1''';
                v_varchar2_value := '''1''';
                v_number_value := '1';
                v_date_value := 'sysdate';
                v_separate_value := ',';
                v_insert_sql := 'insert into ';
                v_add_value :='null';
                OPEN c2 FOR v_sql ; 
                LOOP
                    FETCH c2 INTO v_q;
                    EXIT WHEN c2%NOTFOUND;
                    IF v_q = 0 THEN
                        --DBMS_OUTPUT.PUT_LINE(v_table);
                        --构造插入行
                        FOR user_null_table IN (select to_char(count(*)) as col_num,
                        t.TABLE_NAME as tb_name
                        from user_tab_columns t
                        where t.TABLE_NAME= v_table
                        group by t.TABLE_NAME) LOOP
                            BEGIN
                                col_num      := user_null_table.col_num;
                                tb_name      := user_null_table.tb_name;
                                v_insert_sql := 'insert into ';
                                v_insert_sql := v_insert_sql || tb_name || ' values(' ;
                                FOR user_tab_cols IN (select * from user_tab_columns t where t.TABLE_NAME = tb_name ORDER BY t.COLUMN_ID) LOOP
                                    BEGIN                                                                   
                                        v_add_value :='null';                                    
                                        IF user_tab_cols.COLUMN_ID = col_num THEN 
                                           v_separate_value := '';
                                        else
                                            v_separate_value := ',';
                                        END IF;                                   
                                        if user_tab_cols.DATA_TYPE = 'CHAR' THEN
                                            v_add_value := v_char_value;
                                        END if;
                                        
                                        IF user_tab_cols.DATA_TYPE = 'VARCHAR2' THEN
                                            v_add_value := v_varchar2_value;
                                        END if;                                    
                                        IF user_tab_cols.DATA_TYPE = 'NVARCHAR2' THEN
                                            v_add_value := v_varchar2_value;
                                        END if;                                    
                                        IF user_tab_cols.DATA_TYPE = 'NUMBER' THEN
                                            v_add_value := v_number_value;
                                        END if;                                    
                                        IF user_tab_cols.DATA_TYPE = 'LONG' THEN
                                            v_add_value := v_number_value;
                                        END if;                                    
                                        IF user_tab_cols.DATA_TYPE = 'DATE' THEN
                                            v_add_value := v_date_value;
                                        END IF;                                    
                                        IF substr(user_tab_cols.DATA_TYPE,0,9) = 'TIMESTAMP' THEN
                                            v_add_value := v_date_value;
                                        END IF;                                   
                                        v_insert_sql := v_insert_sql || v_add_value ||
                                            v_separate_value;                                
                                    end;
                                END LOOP;                            
                                v_insert_sql := v_insert_sql || ');';
                                DBMS_OUTPUT.PUT_LINE(v_insert_sql);                           
                            end;
                        END LOOP;                
                    end if;
                END LOOP;
                CLOSE c2;
            end;
        END LOOP;
    end generate_tab_segement;
    /
    然后用图形界面工具去调用该存储过程,让存储过程语句执行一次,并起作用,不知道什么原因有些表的数据没有插入进去,为了保证不会出错,大家可以将执行完显示的SQL语句在执行一次就绝对不会错误。
    然后将执行完的结果复制一次,在用图形界面执行一次,就可以了
  • 相关阅读:
    基础表达式和运算符
    原型链(_proto_) 与原型(prototype) 有啥关系?
    插件模板
    加减plugin
    原生选项卡、手风琴
    前端基础问题(有答案)
    结构图
    Java环境配置小记
    函数
    砝码称重
  • 原文地址:https://www.cnblogs.com/lcword/p/5711281.html
Copyright © 2011-2022 走看看