有关ORACLE DUMP文件的转换

 

在做数据转换时,往往比较重要的环节就是做数据的Mapping。如果能够把两个系统的数据用EXCEL到出来进行对比,那么将大大提高工作效率。

目标:要将遗留系统的数据导出,然后生成CSV文件

思路:通过oracle自带的exp和imp工具进行导出和导入,将遗留系统的数据导出生成dump文件,将dump文件导入自己的数据库,通过PL/SQL导出表生成CSV文件,前提,因为未知遗留系统的数据库信息未知,且手头只有已经导出来的dump文件。

——————————————————————————————————

ORACLE EXP 和 IMP文件的知识

1、Export/Import的用处 
Oracle Export/Import工具用于在数据库之间传递数据。 
Export从数据库中导出数据到dump文件中 
Import从dump文件中到入数据导数据库中 
下面是一般使用他们的情况 
(1)、两个数据库之间传送数据 
       同一个版本的oracle Server之间 
       不同版本的oracle Server之间 
       同种OS之间 
       不同种OS之间 
(2)、用于数据库的备份和恢复 
(3)、从一个SCHEMA传送到另一个SCHEMA 
(4)、从一个TABLESPACE传送到另一个TABLESPACE 

2、DUMP文件 
EXPORT到出的是二进制格式的文件,不可以手工编辑,否则会损坏数据。 
该文件在ORACLE支持的任何平台上都是一样的格式,可以在各平台上通用。 

DUMP文件在IMPORT时采用向上兼容方式,就是说ORALCE7的DUMP文件可以导入 
到ORACLE8中,但是版本相差很大的版本之间可能有问题。 

3、EXPORT/IMPORT过程 
EXPORT导出的DUMP文件包含两种基本类型的数据 
    – DDL 
    – Data 
DUMP文件包含所有重新创建Data Dictionary的DDL语句,基本上是可以读的格式
。 
但是应该注意的是,千万不要用文本编辑器编辑之,oracle说不支持这样做的。

下面列出的是DUMP文件中包括的ORACLE对象,分为TABLE/USER/FULL方式,有些对
象 
只是在FULL方式下才有(比如public synonyms, users, roles, rollback segm
ents等) 

Table mode              User Mode               Full Database Mode 
———————-  ———————-  ———————-
— 
Table definitions       Table definitions       Table definitions 
Table data              Table data              Table data 
Owner’s table grants    Owner’s grants          Grants 
Owner’s table indexes   Owner’s indexes         Indexes 
Table constraints       Table constraints       Table constraints 
Table triggers          Table triggers          All triggers 
                        Clusters                Clusters 
                        Database links          Database links 
                        Job queues              Job queues 
                        Refresh groups          Refresh groups 
                        Sequences               Sequences 
                        Snapshots               Snapshots 
                        Snapshot logs           Snapshot logs 
                        Stored procedures       Stored procedures 
                        Private synonyms        All synonyms 
                        Views                   Views 
                                                Profiles 
                                                Replication catalog 
                                                Resource cost 
                                                Roles 
                                                Rollback segments 
                                                System audit options 
                                                System privileges 
                                                Tablespace definitions

                                                Tablespace quotas 
                                                User definitions 

4、IMPORT时的对象倒入顺序 
在倒入数据时,ORACLE有一个特定的顺序,可能随数据库版本不同而有所变化,
但是 
现在是这样的。 

1. Tablespaces                         14. Snapshot Logs 
2. Profiles                            15. Job Queues 
3. Users                               16. Refresh Groups 
4. Roles                               17. Cluster Definitions 
5. System Privilege Grants             18. Tables (also grants,commen
ts,  
6. Role Grants                             indexes, constraints, audi
ting) 
7. Default Roles                       19. Referential Integrity     
8. Tablespace Quotas                   20.  POSTTABLES actions       
9. Resource Costs                      21. Synonyms 
10. Rollback Segments         22. Views           
11. Database Links                      23. Stored Procedures 
12. Sequences                           24. Triggers, Defaults and Aud
iting 
13. Snapshots                      
按这个顺序主要是解决对象之间依赖关系可能产生的问题。TRIGGER最后导入,所
以在INSERT 
数据到数据库时不会激发TRIGGER。在导入后可能会有一些状态是INVALID的PROC
EDURE,主要 
是IMPORT时会影响一些数据库对象,而IMPORT并不重新编译PROCEDURE,从而造成
这种情况, 
可以重新编译之,就能解决这个问题。 

5、兼容性问题 
IMPORT工具可以处理EXPORT 5.1.22之后的版本导出的DUMP文件,所以你用ORACL
E7的IMPORT 
处理ORACLE6的DUMP文件,依次类推,但是ORACLE如果版本相差很大有可能不能处
理。具体的 
问题可以参照相应的文档,比如有关参数设置等(COMPATIBLE参数) 

6、EXPORT需要的VIEW 
EXPORT需要的VIEW是由CATEXP.SQL创建,这些内部VIEW用于EXPORT组织DUMP文件
中数据格式。 
大部分VIEW用于收集创建DDL语句的,其他的主要供ORACLE开发人员用。 

这些VIEW在不同ORACLE版本之间有可能不同,每个版本可能都有新的特性加入。
所以在新的 
版本里面执行旧的dump文件会有错误,一般可以执行CATEXP.SQL解决这些问题,
解决向后兼容 
问题的一般步骤如下: 
  导出数据库的版本比目标数据库老的情况: 
  – 在需要导入的目标数据库中执行旧的CATEXP.SQL 
  – 使用旧的EXPORT导出DUMP文件  
  – 使用旧的IMPORT导入到数据库中 
  – 在数据库中执行新的CATEXP.SQL,以恢复该版本的EXPORT VIEW 

  导出数据库的版本比目标数据库新的情况: 
  – 在需要导入的目标数据库中执行新的CATEXP.SQL 
  – 使用新的EXPORT导出DUMP文件  
  – 使用新的IMPORT导入到数据库中 
  – 在数据库中执行旧的CATEXP.SQL,以恢复该版本的EXPORT VIEW 

7、碎片整理 
EXPORT/IMPORT一个很重要的应用方面就是整理碎片。因为如果时初次IMPPORT,

就会重新CREATE TABLE 再导入数据,所以整张表都是连续存放的。另外缺省情况

下EXPORT会在生成DUMP文件是“压缩(COMPRESS)”TABLE,但是这种压缩在很多情

况下被误解。事实上,COMPRESS是改变STORAGE参数INITIAL的值。比如: 

  CREATE TABLE …. STORAGE( INITIAL 10K NEXT 10K..) 
  现在数据已经扩展到100个EXTENT,如果采用COMPRESS=Y来EXPORT数据, 
  则产生的语句时 STORAGE( INITIAL 1000K NEXT 10K) 

  我们可以看到NEXT值并没有改变,而INITIAL是所有EXTENT的总和。所以会出现

如下情况,表A有4个100M的EXTENT,执行DELETE FROM A,然后再用COMPRESS=Y 导

出数据,产生的CREATE TABLE语句将有400M的INITIAL EXTENT。即使这是TABLE中

已经没有数据!!这是的DUMP文件即使很小,但是在IMPORT时就会产生一个巨大
的 
TABLE. 

  另外,也可能会超过DATAFILE的大小。比如,有4个50M的数据文件,其中表A有

15个10M的EXTENT,如果采用COMPRESS=Y的方式导出数据,将会有INITIAL=150M,

那么在重新导入时,不能分配一个150M的EXTENT,因为单个EXTENT不能跨多个文
件。 

8、在USER和TABLESPACE之间传送数据 
一般情况下EXPORT的数据要恢复到它原来的地方去。如果SCOTT用户的表以TABLE

或USER方式EXPORT数据,在IMPORT时,如果SCOTT用户不存在,则会报错! 

以FULL方式导出的数据带有CREATE USER的信息,所以会自己创建USER来存放数据
。 

当然可以在IMPORT时使用FROMUSER和TOUSER参数来确定要导入的USER,但是要保
证 
TOUSER一定已经存在啦。 

9、EXPORT/IMPORT对SQUENCE的影响 
在两种情况下,EXPORT/IMPORT会对SEQUENCE。 
(1)如果在EXPORT时,用户正在取SEQUENCE的值,可能造成SEQUENCE的不一致。

(2)另外如果SEQUENCE使用CACHE,在EXPORT时,那些在CACHE中的值就会被忽略
的, 
     只是从数据字典里面取当前值EXPORT。 

如果在进行FULL方式的EXPORT/IMPORT时,恰好在用sequence更新表中某列数据,

而且不是上面两种情况,则导出的是更新前的数据。 

如果采用常规路径方式,每一行数据都是用INSERT语句,一致性检查和INSERT T
RIGGER 
如果采用DIRECT方式,某些约束和trigger可能不触发,如果在trigger中使用 
sequence.nextval,将会对sequence有影响。

————————————————————————————————————————–

开始导入

1。创建用户DBUSRPUB

SQL> CREATE USER DBUSRPUB IDENTIFIED BY HANDHAND;

2。创建表空间

SQL> CREATE TABLESPACE DATA_SPC

      2  DATAFILE ‘E:\DATA_SPC.DBF’ 1024M

      3 AUTOEXTEND ON

      4 NEXT 500M

      5 MAXSIZE 2048M

      6 EXTEND MANAGEMENT LOCAL;

SQL> CREATE TABLESPACE IDX_SPC

      2  DATAFILE ‘E:\DATA_SPC.DBF’ 1024M

      3 AUTOEXTEND ON

      4 NEXT 500M

      5 MAXSIZE 2048M

      6 EXTEND MANAGEMENT LOCAL;

3。给DBUSRPUB赋予SYSDBA权限以及相关权限

SQL> CONNECT SYS/HANDHAND@ORCL AS SYSDBA

SQL> GRANT SYSDBA, TO DBUSRPUB;

4。分析字符集

遗留系统字符集使用的是WE8ISO8859P1,自己的数据库用的是ZHS16GBK。如果盲目进行数据导入,将会有一部分数据无法导入。原因就在两个字符集,可以通过以下的两个实例看到他们分别占用的字节数。

SQL> select dump(‘你好’,16) from dual;

DUMP(‘你好’,16)
————————-
Typ=96 Len=4: c4,e3,ba,c3

SQL> select dump(convert(‘你好’,’ZHS16GBK’,’WE8ISO8859P1′),16) from dual;

DUMP(CONVERT(‘你好’,’UTF8′,’WE8ISO88
————————————
Typ=1 Len=7:a3,bf,a3,bf,6f,a3,bf

在ZHS16GBK中,你好字符占用了4个字节,而在WE8ISO8859P1中却占用了7个字节。这样看来,如果盲目进行导入。因为从上面的准备知识中也可以知道DUMP文件导入是会先建立表结构,这样以来,由于字符集不同,就会造成字段长度不够的错误信息。导入终止。

5。修改本地数据库字符集

首先查看当前数据库的字符集

SQL>SELECT VALUE, PARAMETER
      2 FROM NLS_DATABASE_PARAMETERS
      3 WHERE PARAMETER IN (‘NLS_LANGUAGE’, ‘NLS_TERRITORY’, ‘NLS_CHARACTERSET’);

VALUE                    PARAMETER

——————-     ——————-

1    AMERICAN    NLS_LANGUAGE
2    AMERICA      NLS_TERRITORY
3    ZHS16GBK    NLS_CHARACTERSET

需要把字段NLS_CHARACTERSET更新为WE8ISO8859P1.

—————————————-方法一———————————————-

      1).以SYS用户登录:CONNECT SYS/HANDHAND@ORCL AS SYSDBA;

      2).SQL>ALTER SESSION SET SQL_TRACE=TRUE;
          SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
          SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
          SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
          SQL>ALTER  DATABASE  CHARACTER  SET  INTERNAL_USE  WE8ISO8859P1

      3).重启数据库

—————————————-方法二———————————————–

      1).以SYS用户登录:CONNECT SYS/HANDHAND@ORCL AS SYSDBA;

      2).SQL>UPDATE PROPS$ SET VALUE$=’WE8ISO8859P1′ WHERE NAME=’NLS_CHARACTERSET’;
      3).重启数据库

6。开始导入DUMP

1).进入命令行模式

输入D:\oracledev10g\bin\imp.exe file=I:\GOODSBASE.DMP FULL=Y
用户名:DBUSRPUB/HANDHAND@ORCL AS SYSDBA

也可以使用

D:\oracledev10g\bin\imp.exe DBUSRPUB/HANDHAND@ORCL file=I:\GOODSBASE.DMP FULL=Y

7。客户端字符集更改

虽然导入数据不报错,但是如果客户端,如PL/SQL字符集没有设置好,同样不能看到正常的字符串。

运行-REGEDIT-HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_DevSuiteHome1-NLS_LANG
修改文件为WE8ISO8859P1

8。将导入到本地数据库的GOODSBASE导出为CSV格式文件。

有关Oracle Retail 数据转换的一些准备知识

Chapter1: Preface And Overview

clip_image002

在完成数据统一之前,我们需要熟悉Oracle 零售系统自带的工具集。并且需要做如下工作。

准备工作与假设条件

1. 准备工作

在准备做data convention之前,需要按照上述流程图做好外部系统数据的分析、整理、映射、以及生成平面文件。其中最主要的就是和oracle 零售系统的映射工作。也就是后面会讲到的外部系统数据表的定义工作。

2. 假设条件

Oracle 零售系统的工具集的数据转换通常情况下是会假设所有的待转换的数据都是不需要验证的;你对UNIX环境下的SHELL编程熟悉

工具集

数据转换是通过工具集的脚本,以外部系统的为基准,并且通过一个“主程序”脚本,以队列的形式运行的脚本集合。大致分为三类脚本:

1. 主控脚本 DC_LOAD_MAIN.KSH

主控脚本,主要是用来运行其他脚本,也可以把这个脚本看成是一个容器,稍作改动(客户化脚本),就可以用来装米饭,甚至是用来喝汤。当然,主控脚本主要是为下面的段值载入脚本服务,同时,主控脚本还可以运行其他的一些KSH脚本和SQL脚本;另外,我们还可以通过修改脚本,使脚本可以指向任意数量的数据表。

2. 段值载入脚本

段值载入程序通常调用外部数据表创建脚本和数据导入脚本。当然,我们也可以修改段值载入脚本,达到只导入数据,而不创建外部数据表的目的。

3. 外部数据表创建脚本

外部数据表创建脚本通常包含如下要素:外部数据表列定义;目标导入文件(以DAT批处理文件为主);目标导入文件地址以及定义此次导入行为所生成的输出、日志、坏死以及忽略信息;

综上所述,在做数据转换工作中,各脚本的层级关系可以概括如下图A。

clip_image003

功能区域介绍

下面是整个数据转换所涉及到的功能划分:

1. 核心(Core) DC_LOAD_CORE.KSH

2. 商品架构 DC_LOAD_MERCH.KSH

3. 组织架构 DC_LOAD_WH_ORG.KSH

4. 供应商 DC_LOAD_SUPPLIER.KSH

5. 商品 DC_LOAD_FASHION_ITEM.KSH

————————————————————————————————————————–

————————————————————————————————————————–

Chapter 2.Master Script

概述

1抛出异常以及日志文件的生成都是通过调用单独的一个库文件生成,而全局变量、脚本、数据以及其他的目标定义都是被定义在单独的一个配置文件中:DC_LOAD.CFG

2.所有的脚本程序都可以在后缀名为*.seq的队列文件中定义脚本程序执行的先后顺序。

3.先导入-后验证,验证程序需要自己写进脚本里面,并且在每段验证程序加上注释。

4.主控脚本可以运行如下脚本

a.其他KSH脚本

b.SQL脚本

c.独立或者是关联成链的RMS中的BATCH程序.

配置文件DC_LOAD.CFG

配置文件DC_LOAD.CFG包含了对可执行的KSH脚本、SQL脚本的所有执行路径信息,以及DC_LOAD_MAIN.KSH和段值脚本所产生的日志文件和临时目录的路径信息。

在运行DC_LOAD_MAIN.KSH之前,需要做如下准备工作,才可以成功的运行DC_LOAD_MAIN.KSH

A.建立路径目录

$ chmod 777 Directory_Name

路径                                        路径名称                            路径描述

数据库路径                               orclDataDir          用来指定系统数据库路径

数据库日志文件路径                   orclLogDir           用来存放外部数据表中生成的日志文件路径

数据文件路径                            dataDir                用来存放平面文件的路径

完成数据文件路径                      dataCompDir       用来存放已经传输完成的数据的路径

坏死文件路径                            badDir                 在数据文件传输过程中生成的坏死文件的存放路径

忽略文件路径                            dscDir                 在数据文件传输过程中生成的忽略文件的存放路径

脚本路径                                  scriptDir             存放在数据转换过程中所有相关的脚本文件的路径

日志文件路径                            logDir                 用来存放脚本运行的过程中生成的日志文件

状态文件路径                            statusDir            用来存放在整个转换过程完成时生成的.status状态文件。

注意:此路径可以和日志文件路径logDir相同

RMS程序路径                           rmsBinDir           存放RMS系统所安装的batch文件

B.定义环境变量

变量名称                                 描述

connectStr                        连接Oracle 数据库的用户名和密码,格式为 username/password

dataExt                             文件扩展名定义,默认为 .dat

badExt                              文件扩展名定义,默认为 .bad

dscExt                               文件扩展名定义,默认为 .dsc

statusExt                          文件扩展名定义,默认为 .status

seqExt                               文件扩展名定义,默认为 .seq

C.队列文件定义

标签  

PGM

KSH以及其他的可执行的脚本文件的文件名;如/$HOME/RETAIL/SCRIPTS/STOREADD.KSH,如果没有路径,则将使用上面配置文件中的路径scriptDir 做为默认可执行脚本的路径

SQL

该标签用来运行SQL脚本;如/$HOME/RETAIL/SCRIPTS/DC_CUSTOMER.SQL,如果没有路径,则将使用上面配置文件中的路径scriptDir 做为默认可执行脚本的路径

RMS

用来执行RMS的BATCH程序。

注意:尽管BATCH程序本身就可以直接运行,但是仍然需要确保BATCH程序是在上面CFG文件中定义的rmsBinDir路径下,除非是调用客户化BATCH程序,那么需要在前面加上客户化程序的完整路径,并且需要加入BATCH程序的控制表:restart_control(prepost情况除外)

>

表示该行客户化定制的信息将显示在屏幕和日志文件中

#

注释掉该行

例子:

[oracle@syfr12 ~]$ vi LOAD_SUPPLIER.seq

#This section will load the supplier information to the RMS tables

>Running LOAD_SUPPLIER.KSH…

PGM load_supplier.ksh

>Loading Supplier Information Completed

#Now Validating Supplier Information

SQL dc_validate_supplier.sql

配置库文件DC_LOAD.LIB

DC_LOAD.LIB包含以下文件的配置如下FUNCTION

1.checkCfg

被导入程序调用,用来检查DC_LOAD.CFG文件是否存在,并且是否所有的配置信息都已经配置以用来完成整个流程。

2.checkError

将被后面的execPgmexecSql 两个Function调用,用来在执行完在队列文件中定义的脚本后,对流程的状态进行检查并且将相关信息写入日志文件

3.checkFile [-e\–x\-r\-s\-x]

检查文件是否符合载入要求

-x 检查是否可执行

-e 检查文件是否存在

-r 检查文件是否可读

-s 检查文件的大小

1)对于平面文件(*.dat)和(*.seq),需要检查文件的是否存在、文件大小、还有是否可读;

2)对于坏死文件(*.bad)、可忽略文件(*.dsc)以及状态文件(*.status),仅仅检查文件是否存在;

4.getAvailThread

从restart_program_status表中取状态为”ready for start”,字段thread_val的最小值

SELECT MIN(T.THREAD_VAL)

FROM RESTART_PROGRAM_STATUS T

WHERE 1=1

AND T.PROGRAM_STATUS = ‘ready for start’

AND T.PROGRAM_NAME = ‘posupld’;

5.refreshThreads

把已经成功完成的流程的状态转换成为”ready for start”;

UPDATE RESTART_PROGRAM_STATUS T

SET T.PROGRAM_STATUS = ‘ready for start’

WHERE 1 = 1

AND T.PROGRAM_STATUS = ‘completed’

AND T.PROGRAM_NAME = ‘posupld’;

6.execPgm

checkFile函数返回值为0的时候,被队列文件中定义的主控脚本以及其他的可执行脚本来调用,并且将生成日志文件。

7.execSql

checkFile函数返回值为0的时候,通过定义sqlplus –s执行SQL脚本,并且通过环境变量connectStr来连接数据库。并且生成日志文件。

8.execRms

Restart_control的作用:

DD_RESTART_RECOVERY调用RESTART_CONTROL表,来决定当前的BATCH PROGRAM的driver以及thead 数量。

该函数会首先检查要运行的batch 文件是否存在以及是否可执行,然后会检查该batch文件的类型。

类型可以分为下面三种:

1) Prepost

2) File类型

3) Table类型

如何运行KSH脚本

A.准备工作

创建环境变量

>vi /home/oracle/.bash_profile

PATH=$PATH:$HOME/external/scripts #视具体情况而定

Export PATH

B., 运行脚本

> dc_load_main.ksh –q <sequence-name>

> dc_load_core.ksh

————————————————————————————————————————–

————————————————————————————————————————–

Chapter 4 Example

有关具体细节的开发,参看一下图B。就可以知道大概的流程了。

image

在做好外部系统的分析、整理、生成DAT文件之后,通过DBC_CREATE_SUPS_TAB.SQL、DBC_CREATEC0SUP_ADDR_TAB.SQL、DBC_CREATE_SUP_IMORT_ATTR_TAB.SQL脚本来创建外部系统数据表DC_SUPS、DC_SUP_ADDR、DC_SUP_IMORT_ATTR。这些表用来存放从DAT文件中抽取出来的外部系统数据。然后再运行dc_load_supplier.ksh这个process,通过前面的准备工作,我们已经可以顺利并且成功运行dc_load_supplier.ksh脚本啦。那么,这样就可以把上面的表中的信息导入到RMS系统中的SUPS、ADDR、SUP_IMPORT_ATTR表中。至此,整个data convention结束。

————————————————————————————————————————–

RMS系统中有很多的BATCH Program,在当前的测试阶段,由于Batch program本身就具有可执行性,但是由于在跑完一个batch只有我们需要手工到后台数据库中去改状态(相当于上面的库函数DC_LOAD.LIB中的refreshThreads以及getAvailThread两个函数的功能)。APPWORX本身就集成了Oracle Retail的相关的batch来做成的chain,其中也都是用shell编程来达到流程控制的目的。我想,之所以用APPWORX,是因为它的窗口化,而不是上面所做的代码化(我们需要在Linux下运行命令脚本)。

————————————————————————————————————————–

从遗留POS系统到Oracle Retail的数据转换

简要介绍遗留系统数据整理的工作内容.

问题的提出:

1、遗留系统的基础数据编码统一究竟需要统一那些数据?

2、遗留系统统一后的基础数据需要整理成怎样的格式才能利用Retail现有的数据转换工具进行转换后导入到Oracle Retail系统?

 

 

数据转换流程:

image

数据转换工作是极其重要的,将有一支专门的Team来完成这件事情,我们称为主数据Team,其主要任务有两个:
1)各遗留系统的主数据统一
2)遗留系统的主数据转换导入到Retail 系统。

在数据转换前,主数据实施团队必须已经完成如下事情:
1) 从遗留系统的数据库中抽取需要被转换的数据到平面文件。
2) 进行数据分析、清理、Mapping。

需要被整理的数据包括:

1)快速编码(比如运费类型,运费条款,增值税率编码,增值税区域,各种单据类型编码)
2)商品架构
3)组织架构
4)供应商资料
5)商品资料
等等。。。

详情请参考文档《merch-1203-dcog.pdf》merch-1203-dcog