分类: 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语句在执行一次就绝对不会错误。
然后将执行完的结果复制一次,在用图形界面执行一次,就可以了

IMP-00008: unrecognized statement in the export file: string的问题分析的更多相关文章

  1. IMP-00009: abnormal end of export file解决方案

    一.概述 最近在测试环境的一个oracle数据库上面,使用exp将表导出没有问题,而将导出的文件使用imp导入时却出现了如下错误. IMP-00009: abnormal end of export ...

  2. 【Oracle】IMP-00010: not a valid export file, header failed verification

    别人给了一个Oracle文件,结果在导入的时候发现有问题,报错如下: IMP-00010: not a valid export file, header failed verification 在网 ...

  3. ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”

    ERROR: “System.Web.Mvc.Controller.File(string, string, string)”是一个“方法”,这在给定的上下文中无效 这是一个与Controller.F ...

  4. 【new File(String Path)加载资源问题】

    2017-12-17   15:07:38  [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...

  5. File(File f, String child) File(String parent, String child)

    (转载)File(File f, String child) 根据f 抽象路径名和 child 路径名字符串创建一个新 File 实例. f抽象路径名用于表示目录,child 路径名字符串用于表示目录 ...

  6. Python使用eval强制转换字符串为字典时报错:File "<string>", line 1, in <module> NameError: name 'nan' is not defined

    文本中保存的内容为: { 'QQQ': [0.067, 0.167, 0.2, 0.033, 0.233, 0.267, 0.1, 0.133], 'TTT': [0.5, 0.375, 0.25, ...

  7. new File(String Path)加载资源问题

    2017-12-17   15:07:38  [原创-wx] 一.我们在用IO流加载资源的时候,创建文件资源 1 File file = New File("String Path" ...

  8. Oracle EBS Export File Format

    Profile Option Name Site Application Responsibility Server Server Org User Remark Export MIME type t ...

  9. android uri , file , string 互转

    1:android Uri 介绍 http://www.cnblogs.com/lingyun1120/archive/2012/04/18/2455212.html 2:File 转成Uri < ...

随机推荐

  1. 获取第下一个兄弟元素 屏蔽浏览器的差异(nextElementsibling)

    //获取element下一个兄弟元素 function getNextElementSibling(element){ //能力检测 判断是否支持nextElementSibling if(eleme ...

  2. SSIS: Lookup组件高级用法,生成推断成员(inferred member)

    将数据导入事实表如果无法匹配维度表的记录一般有两种处理方式. 一是将不匹配记录输出到一个表中待后续处理,然后重新导入.二是先生成维度Key,后续再完善维度key,本文指导各位使用第二种方式. 背景 比 ...

  3. C#根据文件流判断文件类型

    判断文件真实的类型,不是通过扩展名来判断: /// <summary> /// 判断文件格式 /// http://www.cnblogs.com/babycool /// </su ...

  4. 用css控制一个DIV画图标。

    在实际开发中,我们会用到一些小图形,图标.大多数情况下都是用图片来实现的,同时对图片进行处理使图片大小尽可能的缩小.但是图片在怎么处理也是按KB来算的.但是要是用CSS画,只要用很少的空间就能完成同样 ...

  5. HOJ题目分类

    各种杂题,水题,模拟,包括简单数论. 1001 A+B 1002 A+B+C 1009 Fat Cat 1010 The Angle 1011 Unix ls 1012 Decoding Task 1 ...

  6. firebreath注册接口

    对firebreath文档进行翻译,顺便做个笔记,原地址:http://www.firebreath.org/display/documentation/JSAPIAuto 综述: 你可能会对需要转换 ...

  7. linux杂记(八)linux压缩与打包

    linux系统常见的压缩指令 一般被压缩过的档案,通常其附档名都是[*.tar,*.tar.gz,*.tgz,*.gz,*.Z,*.bz2]等等. *.tar:tar程序打包的数据.并没有压缩过 *. ...

  8. JavaScript 反柯里化

    浅析 JavaScript 中的 函数 uncurrying 反柯里化 柯里化 柯里化又称部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间 ...

  9. Data Mining

    数据探索: 数据探索有助于选择合适的数据处理与数据分析技术.它甚至可以解决一些数据挖掘问题. 1.汇总统计:量化用单个数或数据的集合展示数据的特性: 如集合的平均值.方差. 2.可视化技术:以图形或表 ...

  10. linux内核升级图文攻略

    Linux内核概览 Linux是一个一体化内核(monolithic kernel)系统. 设备驱动程序可以完全访问硬件. Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设 ...