Welcome 微信登录

首页 / 数据库 / MySQL / IMP-00008: unrecognized statement in the export file: string的问题分析

上周需要将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 directoryexpdp_diras "/home/oracle/expdp_dir";  //一台服务器只要创建一次
2 赋予导出的用户权限
SQL> grant read,write on directoryexpdp_dirto test;//一台服务器只要创建一次
3、在Linux目录创建目录/home/oracle/expdp_dirmkdir -p /home/oracle/expdp_dir //一台服务器只要创建一次
4、在命令窗口导出:expdp test/test DIRECTORY=expdp_dirDUMPFILE=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区分大小写)
解决方法,原理就是往所有的空表中分配空间:
方法1:
用oracle sqldeveloper ,建立下面的存储过程
--查询当前用户下的所有空表,并生成空表的插入语句脚本
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语句在执行一次就绝对不会错误。
然后将执行完的结果复制一次,在用图形界面执行一次,就可以了Oracle rac11.2.0.3.0的vip在重启后不能马上在其他网段ping 通的问题ORA-01002: 提取违反顺序的问题分析相关资讯      Oracle基础 
  • Oracle基础介绍及常用相关SQL*PLUS  (03月11日)
  • Oracle 角色的两个特性和误区  (09/04/2012 05:56:16)
  • 在Oracle数据库上设置限制ip地址访  (09/02/2012 09:59:55)
  • Oracle中删除用户遇到的问题  (09/08/2012 20:01:42)
  • Oracle rac11.2.0.3.0的vip在重启  (09/02/2012 10:00:39)
  • 查看Oracle某个进程的环境变量  (08/31/2012 11:54:36)
本文评论 查看全部评论 (0)
表情: 姓名: 字数