根据前些天为某大飞机公司导入某大飞机生产数据的经历,准备写篇关于Oracle导出文件DMP格式的分析,结果在本机导出一组演示数据时候,出现了错误,顺便解决下。

本机装的是Oracle 11g 32bit(11.0.6)的Client,主要是为了使用ODT.Net 11.0.6.21,支持VS2008。但是采用EXP命令导出数据库的时候,出现了些诡异的错误。

执行

C:/>EXP plx/plx@orcl  FILE=c:/plx.dmp TABLES=(s,sc,c)

结果报错

Export: Release 11.1.0.6.0 – Production on 星期日 7月 26 12:42:19 2009

Copyright (c) 1982, 2007, Oracle.  All rights reserved.
连接到: Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – Production
With the Partitioning, OLAP and Data Mining options
已导出 ZHS16GBK 字符集和 UTF8 NCHAR 字符集
服务器使用 UTF8 字符集 (可能的字符集转换)

即将导出指定的表通过常规路径…
. . 正在导出表                               S
EXP-00008: 遇到 ORACLE 错误 904
ORA-00904: “MAXSIZE”: invalid identifier
. . 正在导出表                              SC
EXP-00008: 遇到 ORACLE 错误 1003
ORA-01003: no statement parsed
. . 正在导出表                               C
EXP-00008: 遇到 ORACLE 错误 904
ORA-00904: “MAXSIZE”: invalid identifier
EXP-00008: 遇到 ORACLE 错误 942
ORA-00942: table or view does not exist
EXP-00024: 未安装导出视图, 请通知您的 DBA
EXP-00000: 导出终止失败

很诡异,从来没见过的错误,怎么会报没有字段的错误呢。

于是Google(在技术资料方面BAIDU就是垃圾),

有个哥们说是数据字典丢了,我很诧异,我前几天在Oracle 10g Client下导出过了,怎么会丢失数据字典,还是半信半疑的执行了。

在服务器上执行

oracle@linux-lrn6:~> sqlplus sys/sys@orcl as sysdba

SQL>@/opt/oracle/product/10.2/db_1/rdbms/admin/catexp.sql

以重建数据字典。

建好了后,再次执行导出,还是不行。

但是我在服务器上执行同样的语句就可以。

于是我意识到可能是EXP版本问题,于是测试。

在一台11g的机器上运行一条SQL检测那个MAXSIZE是个什么列。

SQL> select distinct table_name from user_col_comments where column_name=’MAXSIZE’;

TABLE_NAME
————————————————————
EXU9STOU
EXU9PLB
EXU9PDSU
EXU9LBCPU
EXU9PDS
EXU9IXCP
CPOOL$
EXU9TBCPU
EXU9TBCP
EXU9STO
EXU9IXCPU

TABLE_NAME
————————————————————
DBA_CPOOL_INFO
EXU9TBS
EXU9PLBU
EXU9LBCP

然后在10g的服务器上运行同样的语句,没有返回行。可见MAXSIZE是11g在数据字典中新加的项,10g是没有的。

#10g
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 – 64bit Production
With the Partitioning, OLAP and Data Mining options

SQL> desc sys.exu9tbs
名称                                      是否为空? 类型
—————————————– ——– —————————-
ID                                        NOT NULL NUMBER
OWNER                                                CHAR(6)
NAME                                   NOT NULL VARCHAR2(30)
ISONLINE                                              VARCHAR2(7)
CONTENT                                              VARCHAR2(9)
INIEXT                                  NOT NULL NUMBER
SEXT                                    NOT NULL NUMBER
PCTINC                                 NOT NULL NUMBER
MINEXT                                 NOT NULL NUMBER
MAXEXT                                NOT NULL NUMBER
MINLEN                                                 NUMBER
DEFLOG                                 NOT NULL NUMBER
EXT_MGT                               NOT NULL NUMBER
ALLOC_TYPE                          NOT NULL NUMBER
BLOCKSIZE                            NOT NULL NUMBER

#11g
Oracle Database 11g Enterprise Edition Release 11.1.0.7.0 – Production
With the Partitioning, OLAP and Real Application Testing options

SQL> desc sys.exu9tbs
名称                                      是否为空? 类型
—————————————– ——– ————————-
ID                                         NOT NULL NUMBER
OWNER                                                 CHAR(6)
NAME                                    NOT NULL VARCHAR2(30)
ISONLINE                                              VARCHAR2(7)
CONTENT                                              VARCHAR2(9)
INIEXT                                   NOT NULL NUMBER
SEXT                                     NOT NULL NUMBER
PCTINC                                  NOT NULL NUMBER
MINEXT                                  NOT NULL NUMBER
MAXEXT                                 NOT NULL NUMBER
MINLEN                                                  NUMBER
DEFLOG                                  NOT NULL NUMBER
EXT_MGT                                NOT NULL NUMBER
ALLOC_TYPE                            NOT NULL NUMBER
BLOCKSIZE                             NOT NULL  NUMBER
MAXSIZE                                                 NUMBER ———>问题在这里

所以,导入导出数据的时候,还是尽可能的版本统一,10g导10g的,11g导11g的,免得不必要的麻烦。

好了,言归正传,分析DMP格式。

DMP是什么诡异格式?就是上面Oracle的EXP工具导出的备份文件的格式。

某次脑子发烧用gVim打开DMP猛然发现它就是一些SQL,令我非常诧异,于是发现了一些诡异的修改备份的方法,就是直接修改DMP文件。

下面我打开一个新鲜导出的备份文件,分析一下DMP的结构。

首先一打开DMP,最上面有几行这样的东西:

DPLX
RUSERS
8192
0
20
0

下面那些数字不要管,数据库的一些参数,DPLX就是导出的用户名,D是标识,PLX是用户名,EUSERS是默认表空间,E是标识,USERS是表空间。

继续往下看,能看到这样的语句:

sys.dbms_logrep_imp.instantiate_schema(schema_name=>SYS_CONTEXT(’USERENV’,'CURRENT_SCHEMA’), export_db_name=>’ORCL.REGRESS.RDBMS.DEV.US.ORACLE.COM’, inst_scn=>’5603910′);

这个是建立模式的语句,原则上每个用户就是一个模式,Schema。

这上面这些东西,最好都不要改,改了要出事的,一般导入就不行了,会失效,因为DMP虽然大部分是明文SQL,但是也有一部分是二进制的,改了这里会影响校验。

再往后看就有建表语句了,

CREATE TABLE “C” (”CNO” NUMBER(10, 0) NOT NULL ENABLE, “CNAME” VARCHAR2(20) NOT
NULL ENABLE, “CPNO” NUMBER(10, 0), “CCREDIT” NUMBER(3, 0) NOT NULL ENABLE)  PCTF
REE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE(INITIAL 65536 FREELISTS 1 FREE
LIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE “USERS” LOGGING NOCOMPRESS

有时候导出的表空间混乱,就可以在黄色底色的那里改,替换成想要的表空间。

然后一个表下面就是插入数据的语句了:

INSERT INTO “C” (”CNO”, “CNAME”, “CPNO”, “CCREDIT”) VALUES (:1, :2, :3, :4)
再往下就是一堆二进制,就是要插入的数据,那个就改不了了,Oracle没有公开格式。

不过知道这些已经足以解决导入中的很多问题,尤其是表空间混乱的问题。

某大飞机数据库就非常混乱,一个ARJ用户模式(我没有泄密,公开的)下有来自ARJ,M3,USERS,SYSTEM等表空间的表,就是导入的时候方法不正确。然后用上篇Oracle日志中取消权限的方法,也会有些表导不进去,这是Oracle的BUG,但是我这样改了以后,导入后想在哪个表空间就哪个表空间。

用这种方法修改了某大飞机的两个数据库导出文件,导入到同一个用户模式下了,表空间全部统一,数据没有丢失,导入过程完全没用警告。

Oracle常见错误——ORA-00942相关推荐

  1. oracle错误01653,oracle 10g 错误 ORA 01653 的解决过程

    oracle 10g 错误 ORA 01653 的解决过程 早上用户反应在操作用友NC时报错 ORA-01653 ,详细信息:ORA-01653: 表 NCV35.GL_DETAIL 无法通过 102 ...

  2. Oracle 常见错误总结(如:ORA-XXXXX)及问题解决方法

    转: Oracle 常见错误总结(如:ORA-XXXXX)及问题解决方法 ORA-00001: 违反唯一约束条件 ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 O ...

  3. oracle ora-01476: 除数为 0,Oracle常见错误:ORA-01403 的根本原因和解决方案

    Oracle常见错误:ORA-01403 ORA-06512: 在 "MALL.PUB_YANG_LOGON_ORGAN", line 88 ORA-06512: 在 line 1 ...

  4. oracle触发器ora01403,Oracle常见错误:ORA-01403 的根本原因和解决方案

    Oracle常见错误:ORA-01403 ORA-06512: 在 "MALL.PUB_YANG_LOGON_ORGAN", line 88 ORA-06512: 在 line 1 ...

  5. oracle olap 不可用,[数据库]ORACLE OLAP错误ORA

    [数据库]ORACLE OLAP错误ORA 0 2015-04-25 00:00:20 刚刚安装了ORACLE 10g R2后,启动数据库时发现告警日志有如下错误: Database Characte ...

  6. 2021-08-12_简单的处理oracle常见错误ORA-12170、ORA-12541、ORA-12514、

    oracle 常见的错误 1 ORA-12170错误 1.1 描述 由于windows10本地和虚拟机上的linux服务器上也安装了oracle,如果使用localhost可能会创建dblink时不能 ...

  7. Oracle 常见错误总结及问题解决方法

    ORA-00001: 违反唯一约束条件  ORA-00017: 请求会话以设置跟踪事件 ORA-00018: 超出最大会话数 ORA-00019: 超出最大会话许可数 ORA-00020: 超出最大进 ...

  8. linux安装oracle常见错误 总结

    PS:新手,没装过数据库,各种错误基本都碰上了...血泪史 1,打开11.2.0.3安装脚本报错,查看日志. 造成错误的原因可能是dns没有返回服务名的IP,可能是hosts原因 经查看/etc/ho ...

  9. oracle 常见错误

    1.由于Oracle安装在虚拟机上,打开vmware虚拟机有时出现如下错误: 解决:因为虚拟机服务没开,运行-->services.msc-->打开vmware服务 2.ORA-01034 ...

最新文章

  1. WCF契约的简单介绍(服务契约 数据契约 消息契约)
  2. 字符串的最大最小表示法 模板
  3. Java控制台如何输入一行、多行?
  4. SAP用Function发布供外部调用的webservice
  5. html 如何用图片代替单选按钮,HTML中图像代替提交按钮
  6. Spring boot集成spring-boot-starter-data-jpa环境搭建
  7. UIWebView相关应用
  8. 论文阅读笔记:A Fast Triangle-Triangle Intersection Test
  9. Shell_mysql命令以及将数据导入Mysql数据库
  10. [2021-09-04 AtCoder Beginner Contest 217] 题解
  11. 远程拷贝 linux服务器,linux scp 服务器远程拷贝(示例代码)
  12. (需求实战_01)_shell脚本 ftp协议下载文件
  13. Nginx反向代理的使用
  14. springMVC接受参数总结
  15. N天学习一个linux命令之rsync
  16. SAP License:无奈的采购处理时间
  17. java质数和合数的程序_《java项目实训》课程设计计算器.doc
  18. ARMv8体系结构基础03:加载和存储指令
  19. 2020 年百度之星·程序设计大赛 - 复赛 1002 Binary Addition
  20. 让你认识Android 开发简介及应用程序架构示例

热门文章

  1. 【探究网络安全与网络安全文化及网络安全防范】计算机网络安全现状
  2. iOS 布局 Masonry详解
  3. 关于MFC中的MS Shell Dlg字体
  4. python毕业设计作品基于django框架 校园二手书籍交易系统毕设成品(5)任务书
  5. 006.尚学堂阶段1_简单错误如何处理_守破离学习法_程序员修炼手册
  6. Turning Design Mockups Into Code With Deep Learning
  7. 傅里叶变换及低通滤波再反变换(C++opencv)
  8. Pyhotn3,爬取B站up主的信息!
  9. python 全栈开发是什么意思_python全栈要学什么
  10. 数据结构(四):二叉树