이 document는 version8에 기반하여 upgrade하였다. 또한 단순이 dul executable과 함께 download받는 usg.html을 번역한 것이 아니라 그 동안 dul을 사용하면서 쌓아 왔던 경험 등을 함께 써놓았고 raw device dul을 사용하는데 필요한 내용도 써놓았다

이 document가 site를 지원하는 Engineer에게 조금이라도 도움이 됐으면 하는 바람을 가진다.

1. 개요

 

1. Dul의 원리와 특징

  • 공식 지원 utility가 아니다.
  • Exp, Sql*plus의 대안이 아닌 그야말로 최후의 복구 방법으로 사용 되어 져야 한다.
  • Dul은 데이터 파일의 테이블로 부터 row를 직접 추출하기 위한 C 프로그램으로 RDBMS와는 전혀 별개로 동작한다.(∴data file이 존재해야 한다)
  • Dul은 모든 트랜잭션이 commit되었다고 가정하고 media recovery또한 하지 않는다.
  • 데이타베이스가 손상되었다 해도 각각의 데이터 블록이 100%정확해야 된다
    (만일 bad block이 나오면 error message후 continue)
  • Dul에서는 테이블/클러스터의 data만을 unload한다. 즉 triggers, stored procedures, table/view’s script는 만들지 않는다(그러나 데이터 사전을 unload하므로서 그것들에 대한 정보는 얻을 수 있다.) 추출되는 데이터는 Sql*Loader 이나 IMP형식으로 받을 수 있다 DUL8은 indexes나 Index organized tables를 추출할 수 있는데 index unload는 table이 가지고 있는 row의 개수나 missing된 row가 무었인지를 결정하는데 있어서 유용한 단서가 될 수 있다.
  • (거의)모든 데이터베이스 구조를 지원해 준다.( row chaining, row migration, hash/index clusters, longs, raws, rowids, dates, numbers, multiple free group, segment high water mark, NULLs , trailing NULL columns,unlimited extents, new block layout of oracle8, partitioned table)
  • 모든 Oracle6, Oracle7, 8.0.4에서 동작
  • Multi byte를 지원: dul command에서 multibyte는 사용불가능하지만 multi byte database는 unload가능

     

    2. dul의 제한사항

  • Trusted Oracle에서는 사용할 수 없다.
  • Long raw column을 unload할 수는 있지만 1대1로 sql*loader로 reload하는 방법은 없다. 그러므로 export mode로 unload하던지 별도의 Pro*c program으로 data를 load해야 한다.
  • Oracle8 object option and lobs:lobs,varrays, object, nested table는 아직 지원하지 않는다.

     

     

    3. Dul의 실행절차.

  1. The parameter file “init.dul” is processed.
  2. The DUL control file (default “control.dul”) is scanned.
  3. Try to load dumps of the USER$, OBJ$, TAB$, COL$ if available into DUL’s data dictionary cache.
  4. Try to load seg.dat and col.dat.
  5. Accept DDL-statements or run the DDL script specified as first arg.

     

    2. DUL의 ddl, init.dul, control.dul

     

    1. Dul의 DDL.

    다음은 dul에서 사용가능 한 command 및 init.dul parameter에 대해서 알아보기로 한다.

    Dul실행 시 사용되는 DDL ( DUL DESCRIPTION LANGUAGE )문

    dul을 실행하여 사용되어지는 unload문은 SQL과 비슷하다.

    ALTER SESSION SET init.dul parameter = value ;

    DESCRIBE owner_name . table_name ;

    DUMP [ TABLESPACE tablespace_no ]

    [ FILE file_no ]

    [ BLOCK block_no ]

    [ LEVEL level_no ] ;

    UNLOAD DATABASE;

    UNLOAD USER user_name;

    UNLOAD TABLE [ schema_name . ] table_name

    [ ( column_definitions ) ]

    [ cluster_clause ]

    [ storage_clause ] ;

    UNLOAD EXTENT table_name

    [ ( column_definitions ) ]

    [ TABLESPACE tablespace_no ]

    FILE extent_start_file_number

    BLOCK extent_start_block_number

    BLOCKS extent_size_in oracle_blocks

    storage_clause ::=

    STORAGE ( storage_specification [ more_storage_specs ] )

    storage_specification ::=

    OBJNO object_id_number

    | TABNO cluster_table_number

    | SEGOBJNO cluster/data_object_number /* v7/v8 style data block id */

    | FILE data_segment_header_file_number /* v6 style data block id */

    BLOCK data_segment_header_block_number )

    | any_normal_storage_specification_but_silently_ignored

     

    SCAN DATABASE;

    Scans all blocks of all data files.

    Two files are generated:

    1: seg.dat information of found segment headers (index/cluster/table):

    (object id, file number, and block number).

    2: ext.dat information of contiguous table/cluster data blocks.

    (object id(V7), file and block number of segment header (V6),

    file number and block number of first block,

    number of blocks, number of tables)

    SCAN TABLES;

    Uses seg.dat and ext.dat as input.

    Scans all tables in all data segments (a header block and at least one

    matching extent with at least 1 table).

    SCAN EXTENTS;

    Uses seg.dat and ext.dat as input.

    All extents for which no corresponding segment header has been found.

    (Only useful if a tablespace is not complete, or a segment header

    is corrupt).

    REM any_text_you_like_till_End_Of_Line : comment

    NOT allowed inside ddl statements. ( To avoid a two layer lexical scan).

    EXIT QUIT and EOF all cause DUL to terminate.

     

     

    2. init.dul

    각 init.dul의 내용 과 각 port dependent parameter에 대해서 알아보자

    init.dul의 parameter 설명

    ALIGN_FILLER

    OBSOLETE


    Replaced by OSD_C_STRUCT_ALIGNMENT

    ASCII2EBCDIC

    BOOLEAN

    Must (var)char fields be translated from EBCDIC to ASCII. (For unloading MVS database on a ASCII host)

    BIG_ENDIAN_FLAG

    OBSOLETE


    Replaced by OSD_BIG_ENDIAN_FLAG

    BLOCKS_TO_SKIP

    OBSOLETE

    BUFFER

    NUMBER (bytes)

    row output buffer size used in export mode only. In export mode each row is first stored in this buffer, before it is written to the

    dump file.

    COMPATIBLE

    NUMBER

    Database version , valid values are 6, 7 or 8. This parameter must be specified

    CONTROL_FILE

    TEXT

    Name of the DUL control file (default: “control.dul”).

    DBA_FILE_BITS

    OBSOLETE


    Replaced by OSD_DBA_FILE_BITS

    DB_BLOCK_SIZE

    NUMBER

    Oracle block size in bytes (Maximal 32 K)

    DB_LEADING_OFFSET

    OBSOLETE


    Replaced by OSD_FILE_LEADER_SIZE

    DC_COLUMNS

    NUMBER

    DC_OBJECTS

    NUMBER

    DC_TABLES

    NUMBER

    DC_USERS

    NUMBER

    Sizes of dul dictionary caches. If one of these is too low startup will fail.

    EXPORT_MODE

    BOOLEAN

    EXPort like output mode or SQL*Loader format

    FILE

    TEXT

    Base for (dump or data) file name generation. Use this on 8.3 DOS like file systems

    LDR_ENCLOSE_CHAR

    TEXT

    The character to enclose fields in SQL*Loader mode.

    LDR_PHYS_REC_SIZE

    NUMBER

    Physical record size for the generated loader datafile.

    LDR_PHYS_REC_SIZE = 0 No fixed records, each record is terminated with a newline.

    LDR_PHYS_REC_SIZE > 2: Fixed record size.

    MAX_OPEN_FILES

    Maximum # files that are concurrently kept open at the OS level.

    MAX_UNLOAD_BLOCKS

    OBSOLETE

    OSD_BIG_ENDIAN_FLAG

    Byte order in machine word. Big Endian is also known as MSB first. DUL8 sets the default according to the machine it is running

    on. For an explanation why this is called Big Endian, you should read Gullivers Travels.

    OSD_DBA_FILE_BITS

    File Number Size in DBA in bits. Or to be more precise the size of the low order part of the file number.

    OSD_FILE_LEADER_SIZE

    bytes/blocks added before the real oracle file header block

    OSD_C_STRUCT_ALIGNMENT

    C Structure member alignment (0,16 or 32) Must be set to 32 for most ports

    OSD_WORD_SIZE

    Size of a machine word always 32, except for MS/DOS(16)

    PARSE_HEX_ESCAPES

    Use \\xhh hex escape sequences in strings while parsing. The default value is FALSE. If set to true then strange characters can be

    specified using escape sequences. This feature is also for specifying multi-byte characters.

    TICOM_FILLER

    OBSOLETE

    The new parameter is OSD_C_STRUCT_ALIGNMENT

    USE_SCANNED_EXTENT_MAP

    BOOLEAN

    Use the scanned extent map in ext.dat in unload table. This parameter is only useful if some segment headers are missing or

    incorrect.

    이중 port dependent parameters에 대하여

    1. osd_big_endian_flag (이전 big_endian_flag)

    이는 machine words의 byte order를 설정하는 것으로

    HP, SUN, mainframes은 일반적으로big endian( big_endian_flag = true)

    DEC, Intel platforms 은little endian( big_endian_flag = false) 으로 설정하면 된다.

    이 설정에 특별한 방법은 없고 unix에서라면 다음과 같이 살펴 볼 수 있다.

     

    echo dul | od –x

     

    하여 그 결과가 다음과 같으면

     

    0000000 6475 6c0a

    0000004

    아니면

    0000000 7564 0a6c

    0000004

     

    2. osd_dba_file_bits (이전 dba_file_bits)

    data block address(dba)내의 file number의 low order부분의 bits갯수 이다

    다음과 같은 query를 이용하여 확인하여 설정할 수 있다.

     

    SQL> select dump(chartorowid(‘0.0.1’)) from dual;

    Typ=69 Len=6: 8,0,0,0,0,0 -> osd_dba_filebits = 5 (SCO)

    Typ=69 Len=6: 4,0,0,0,0,0 -> osd_dba_filebits = 6 (Sequent , HP)

    Typ=69 Len=6: 1,0,0,0,0,0 -> osd_dba_filebits = 8 (NCR,AIX)

    Typ=69 Len=6: 0,16,0,0,0,0 -> osd_dba_filebits = 12 (MVS)

    Typ=69 Len=10: 0,0,0,0,0,64,0,0,0,0 osd_dba_filebits = 10 (Oracle8)

     

    3. OSD_C_STRUCT_ALIGNMENT (이전 ALIGN_FILLER) and TICOM_FILLER

    data file header내의Structure layout으로 다음과 같이 설정한다.

    0: No padding between members in a C-struct (VAX/VMS only)

    1: Structure members are member size aligned.(All others including ALPHA/VMS)

    다음과 같은 query를 이용하여 확인하여 설정할 수 있다.

     

    SELECT *

    FROM v$type_size

    WHERE type IN

    ( ‘KCBH’, ‘KTNO’, ‘KCBH’, ‘KTBBH’, ‘KTBIT’, ‘KDBH’, ‘KTECT’, ‘KTETB’, ‘KTSHC’) ;

    일반적으로 사용되는osd_c_struct_alignment = 32(이전align_filler=1) 은 다음과 같은 결과가 나온다

    K KTNO TABLE NUMBER IN CLUSTER 1

    KCB KCBH BLOCK COMMON HEADER 20

    KTB KTBIT TRANSACTION VARIABLE HEADER 24

    KTB KTBBH TRANSACTION FIXED HEADER 48

    KDB KDBH DATA HEADER 14

    KTE KTECT EXTENT CONTROL 44

    KTE KTETB EXTENT TABLE 8

    KTS KTSHC SEGMENT HEADER 8

    8 rows selected.

     

    VAX/VMS, Netware만이 osd_c_struct_alignment = 0(이전align_filler = 0)이고 다음과 같은 결과가 나올 것이다

    COMPONEN TYPE DESCRIPTION SIZE

    ——– ——– ——————————– ———-

    K KTNO TABLE NUMBER IN CLUSTER 1

    KCB KCBH BLOCK COMMON HEADER 20

    KTB KTBIT TRANSACTION VARIABLE HEADER 23

    KTB KTBBH TRANSACTION FIXED HEADER 42

    KDB KDBH DATA HEADER 14

    KTE KTECT EXTENT CONTROL 39

    KTE KTETB EXTENT TABLE 8

    KTS KTSHC SEGMENT HEADER 7

    8 rows selected.

    이외의 결과가 나온다면 dul에 중대한 변화가 요구될 것이다.

    (Email bduijnen@nl.oracle.com)

     

    4. osd_file_leader_size (이전dba_leading_offset)

    Oracle file header 전에 있는 blocks/bytes의 갯수를 말한다.

    . Unix의 datafiles 은 여분의 leading block ( file size, block size magic number)을 가진다

    (100이상의 수라면 byte offset을 나타낸 것이고 작은 수라면 oracle blocks의 수로 생각하면 된다.)

     

    Unix : dba_leading_offset = 1

    Vms : dba_leading_offset = 0

    Desktop : dba_leading_offset = 512

    Others : Unknown ( Use Andre Bakker’s famous PATCH utility to find out)

    Oracle file header block은 0X0B010000 pattern으로 시작된다

    여분의 byte offset 을control.dul의 3번째 인자(optional)에 추가할 수 있다

    (예. AIX or DEC UNIX data files on raw device)

     

    5.dc_columns, dc_objects, dc_tables, dc_users는 dul이 data dictionary cash로서 실제 db내에 저장된 갯수 보다는 크도록 충분한 값을 주어 설정한다.

     

    6.db_block_size : DB의 block size를 쓴다(ex 2048)

     

    7.ldr_phys_rec_size: 하나의 row size를 정의하는 것으로 DB의 최대 row길이보다는 충분히 크게 잡는다.

    ☞dul로 데이터를 sql*loader mode로 내렸을 경우 크게 2가지 mode로 내려오게 되는데

    첫째는 stream mode로 ldr_phys_rec_size=0으로 setting했을 경우에 해당한다.

    그런데 이 mode로 dul을 쓴다는 것은 user의 데이터 중에 newling character가 들어 있지

    않다는 전제하에서 써야 한다. 이전에 dul로 recovery 할때 유저의 프로그램이 파워빌더

    였었는데operator가 특정 text field에서 retune key를 치기도 하는 관계로 이 mode로 내린

    sam file을 load할때 애를 먹은 경우가 있었다.

    이 경우 Fixed Physical Records mode로 내렸을 경우 손 쉽게 할 수 있을 것이다

    Fiexed Physical Record mode는 ldr_phys_rec_size에 size를 주면 설정되면 default는 81이다.

     

    8.LDR_ENCLOSE_CHAR

    ☞dul이 Sql*loader format으로 내릴때 각각의 column을 분리하는 분리자로 흔히 double quotes가 쓰인다. 그런데 user의 data중에 double quotes가 있을 경우 혼돈 되므로 이럴 경우에는 다른 문자로 분리자를 지정해야 한다.

     

    Platform specific parameter 정리

    In this page I will try to collect all init.dul parameters for all

    platforms. Additions and corrections are welcome!

     

    PORT PLATFORM ENDIAN FBITS67 FBITS8 CSTR LEAD WORD

    1 Digital VAX OpenVMS FALSE 8 – 0 0 32

    2 HP Series 9000 HP-UX TRUE 6 10 32 1 32

    21 Novell Netware FALSE 8 – 0 1 32

    22 MS DOS FALSE 8 – 16 512 16

    46 LINUX     FALSE – 10 32 1 32

    168 Silicon Graphics UNIX TRUE 6 ? 32 1 32

    172 Solaris Intel FALSE 5 ? 32 1 32

    198 Sequent Dynix/PTX FALSE 6 ? 32 1 32

    319 IBM RS 600 AIX TRUE 8 ? 32 1 32

    358 NCR intel FALSE 8 ? 32 1 32

    453 Sun Sparc Solaris TRUE 6 10 32 1 32

    912 MS Windows NT Intel FALSE 8 10 32 1 32

     

     

     

     

     

     

    Explanation of the values:

     

    TITLE DESCRIPTION

    ENDIAN OSD_BIG_ENDIAN_FLAG

    FBITS67 OSD_DBA_FILE_BITS (Oracle version6/Oracle7)

    FBITS8 OSD_DBA_FILE_BITS (Oracle8)

    CSTR OSD_C_STRUCT_ALIGNMENT

    LEAD OSD_FILE_LEADER_SIZE

    WORD OSD_WORD_SIZE

     

    Sample init.dul

     

    # sample init.dul configuration parameters

    # these must be big enough for the database in question

    # the cache must hold all entries from the dollar tables.

    dc_columns = 200000

    dc_tables = 10000

    dc_objects = 10000

    dc_users = 40

     

    # OS specific parameters

    osd_big_endian_flag = false

    osd_dba_file_bits = 6

    osd_c_struct_alignment = 32

    osd_file_leader_size = 1

     

    # database parameters

    db_block_size = 2048

     

    # loader format definitions

    LDR_ENCLOSE_CHAR = ”

    LDR_PHYS_REC_SIZE = 81

    2.

    3.Control.dul

    Control file 의 작성

    control file (default name “control.dul”)은 file numbers를 file이름으로 바꾸는데 사용된다

    dul V8부터 그 형식이 확장변화 되었다.

    if COMPATIBLE is 6 or 7:

    control_file_line_for_6_or_7 ::=

    file_number data_file_name

    [ optional extra leader offset ]

    [ startblock block_no ]

    [ endblock block_no ]

    If COMPATIBLE is 8:

    control_file_line_for_8 ::=

    tablespace_no relative_file_number data_file_name

    [ optional extra leader offset ]

    [ startblock block_no ]

    [ endblock block_no ]

     

    ☞이전에 2Giga이상의 unload file이 생성되는 것을 막거나, dul을 써서 Unload한 data를 load할때 원인 불명의 사유로 sql*loader가 특정 row#에 가면 죽어서 이후에 unload한 data조차 집어 넣지 못하게 한적이 있습니다. 그때는 init.dul에 blocks_to_skip, max_unload_blocks라는 parameter(dul v8에서부터는 obsolete됨)를 이용하여 block을 나누어 받아 문제되는 block 을 skip한 적이 있었는데 이 parameter가 이제는 control.dul로 옮겨온 것 같습니다. 직관적으로 생각해도 이것이 더욱 맞는 것 같습니다. 여하튼 startblock block_no, endblock block_no option을 이용하여 위와 동일한 문제에 적용 가능할 것 같습니다.

     

    각file number와 file name(oracle 8에서는 tablespace)을 행으로 분리하여 지정하면 된다.

    세 번째 필드(optional)는 양/음수로 지정하여 byte offset을 나타 내는데(지정된 data file에 lseek()연산을 수행 시킴) AIX의 raw devices를 건너 뛰거나 데이터화일의 조각을 unload 할 때 쓰인다.

    ☞AIX, DEC의 Raw device의 경우 optional option을 사용해야 한다.

    AIX:IBM AIX의 경우 각각의 logical volumn에는 control block[LVCB]이라는 것이 있으며 이것은 각각의 logical volumn의 첫번째 bock에 위치하여 control information을 저장한다(즉 logical volumn data는 second 512-byte block뒤에서 부터 시작하는 셈). 그런데 실제로 oracle의 실 datafile은 이 LVCB(control block) 바로 다음에 위치 하는 것이 아니라 AIX의 alignment issue 등을 고려하여 실제로는 Second 4K(4096) block에 위치한다. 그러므로 dul로 raw device로 이루어진 AIX의 Datafile을 끄집어 내기 위해서는 OS의 4096 byptes을 Skip해야 한다.

    Digital Unix: Digital Unix의 경우 각각의 raw device의 시작부분에 64K Operating System Header를 사용한다 그러므로 Dul로 digital unix raw device의 datafile을 끄집어 내기 위해서는 65536(64K)만큼을 skip해야 한다.

    이것을 하지 않았을 경우 다음과 같은 error를 만날 것이다.

    UnLoader: Release 2.2.0.2 – Very Restricted on Fri Feb 14 20:29:20 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    DUL: Warning: BDU-600[illegal block version]

    DUL: Warning: BDU-600[illegal block version]

    DUL: Warning: Block[1][194] DBA in block different [1][162]

    DUL: Warning: Open of cursor for table failed

    DUL: Warning: BDU-600[illegal block version]

    DUL: Warning: BDU-600[illegal block version]

    DUL: Warning: Block[1][84] DBA in block different [1][52]

    DUL: Warning: Open of cursor for table failed

    DUL: Warning: Block[1][84] DBA in block different [1][52]

    DUL: Warning: Open of cursor for table failed

    ☞가끔 user의 실수로 drop, delete된 table에 대해 기존의 datafile을 이용해서 이를 복구할 경우가 있는데 이때는 굳이 모든 datafile을 unload할 필요 없이 system tablespace datafile과 관련된 tablespace datafile만 내린다. 특히 tape에서 내릴 때 똑같은 directory로 내려 운영중인 datafile을 덮어쓰는 불상사는 반드시 피해야 한다. 임의의 directory로 내렸을 경우

    control.dul file에서 관련 datafile의 directory위치를 modify한 후 unload작업을 진행한다.

    예)

    # AIX version 7 example with one file on raw device

    1 /usr/oracle/dbs/system.dbf 4096

    8 /dev/rdsk/data.dbf 4096

    #Degital Unix example on raw device control.dul ##

    1 /dev/rdrd/drd54 65536(default 2048)

    2 /dev/rdrd/drd47 65536

    # Oracle8 example with a datafile split in multiple parts, each part smaller than 2GB

    #Oracle8에서는 tablespace number , relative file number를 반드시 포함해야 한다.

    0 1 /fs1/oradata/PMS/system.dbf

    1 2 /tmp/huge_file_part1 startblock 1 endblock 1000000

    1 2 /tmp/huge_file_part2 startblock 1000001 endblock 2000000

    1 2 /mnt3/huge_file_part3 startblock 2000001 endblock 2550000

     

    4.DUL에서 데이터 사전(data dictionary)이 사용 가능할 경우의 사용 예

    1.init.dul생성

    2.control.dul 생성

    sqldba

    connect internal

    startup mount

    spool control.dul

    select * from v$dbfile; (Oracle 8에서는: select ts#, rfile#, name from v$datafile;)

    exit

    결과에서 file number와 file이름만 남기고 삭제

    3.data를 unload하기 위한 dictionary cache정보인 user$,obj$,tab$,col$ 정보 dump

    $ dul dictv7.ddl

    UnLoader: Version 2.0.0.0 – Very Restricted on Tue May 16 11:04:12 1995

    Copyright(c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    . unloading table OBJ$ 1487 rows unloaded

    . unloading table TAB$ 197 rows unloaded

    . unloading table COL$ 5566 rows unloaded

    . unloading table USER$ 13 rows unloaded

    4.dul의 재 실행 및 필요한 data unload(table, user, db단위로 가능)

    UnLoader: Version 2.0.0.0 – Very Restricted on Tue May 16 11:05:00 1995

    Copyright(c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Loaded 1487 objects

    Loaded 197 tables

    Loaded 5566 columns

    Loaded 13 users

    DUL> unload table scott.emp;

    About to unload SCOTT’s tables …

    . unloading table EMP 14 rows unloaded

     

    5.Export mode로 unload하는 방법

    Export mode로의 Unload는 dul v3, dul8에서 사용가능하며 이를 사용하기 위해서는 init.dul에 EXPORT_MODE=TRUE로 Setting해야 한다.

    이렇게 한 후 각각의 table들은 import가능한 dump file로 만들어 지는데 사실 이 dump File은 oracle utility인 Export와는 그 내용이 다르다, 즉 oracle utility인 export는 해당 table에 대한 grants, storage절, trigger를 포함하는 dump file을 만드는 반면 dul에 의한 dump file은 table에 insert하는 문장만을 가지게 된다.

    여기에 create table statement가 추가된 dump file을 생성할 수 있는데 이를 위해서는 init.dul에 COMPATIBLE parameter를 6 또는 7로 하면 된다.

    이렇게 해서 만들어진 dump file의 header는 V6 style이며 이는 ASCII based characterset임을 의미한다.

    Dump file을 이용한 import를 하기 위해서는 세심한 주의를 필요로 하는데 dul은 unload 한 row를 dump file에 쓰기 전에 먼저 각각의 buffering하다가 완성된 row만 dump file에 쓰게 되는데 init.dul의 BUFFER parameter를 작게 잡아 buffer가 작을 경우 온전하지 못한 row를 만들게 되고 이 경우 해당 row를 dump파일 쓰지않게 되므로 buffer만 컸으면 unload가능 했던 data가 손실될 수도 있다는 점이다, 그러므로 BUFFER parameter는 충분이 크게 잡아 이러한 일을 방지 해야 한다.

    정리하면 export format으로 받기 위해서는 init.dul에 다음 parameter 추가

    export_mode = true

    compatible=7

    이렇게 한 후 load하면 됨니다.

    예) imp scott/tiger file=SCOTT_TEST_DUL.dmp full=y

     

     

    6.DUL에서 데이터 사전(data dictionary)이 사용 불가능할 경우의 사용 예

    1.init.dul생성

    2.control.dul 생성

    3.scan the database for segment headers and extents:

    $ dul

    UnLoader: Version 2.0.0.0 – Very Restricted on Tue May 16 11:10:16 1995

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    DUL> scan database;

    data file 1 20480 blocks scanned

    data file 4 7680 blocks scanned

    data file 5 512 blocks scanned

    DUL>quit => EXT.dat와 SEG.dat가 생긴다.

    4. DUL을 재실행 시키고 scan때 발견된 segment header와 extent정보를 이용해 column과 tables의 정보를 추출하는데 이 과정에서 큰 화일이 하나 생기므로 충분한 disk용량이 있어야 한다.

    echo scan tables \; | dul > scan.out&

    [결과(output)]

    [ many lines here]

    Object id 1601 table number 0

    UNLOAD TABLE T1601_0 ( C1 NUMBER, C2 UNKNOWN, C3 UNKNOWN,

    C4 NUMBER, C5 DATE , C6 NUMBER, C7 NUMBER, C8 NUMBER )

    STORAGE ( TABNO 0 EXTENTS( FILE 1 BLOCK 10530));

    Colno Seen MaxIntSz Null% C75% C100 Num% NiNu% Dat% Rid%

    1 14 3 0% 0% 0% 100% 100% 0% 0%

    2 14 6 0% 100% 100% 100% 14% 0% 21%

    3 14 9 0% 100% 100% 100% 14% 0% 0%

    4 14 3 7% 0% 0% 100% 100% 0% 0%

    5 14 7 0% 0% 0% 0% 0% 100% 0%

    6 14 3 0% 0% 0% 100% 100% 0% 0%

    7 14 2 71% 0% 0% 100% 100% 0% 0%

    8 14 2 0% 0% 0% 100% 100% 0% 0%

    “7369” “SMITH” “CLERK” “7902” “17-DEC-1980 AD 00:00:00” “800” “” “20”

    “7521” “WARD” “SALESMAN” “7698” “22-FEB-1981 AD 00:00:00” “1250” “500” “30”

    “7566” “JONES” “MANAGER” “7839” “02-APR-1981 AD 00:00:00” “2975” “” “20”

    [ many more lines here ]

    [결과분석]

    위의 결과에서 T1601_0은 table의 object id를 이용하여 임시로 만든 table명으로 이는 system table space가 손상되어 data dictionary정보를 가져오지 못한 상태에서 dul을 사용하였기 때문에 실제 table명을 갖지 못하게 된 것이다. 그러므로 여러분의 table에 관한 지식과 위의 정보를 결합하여 다음과 같이 unload시켜야 한다.

    UNLOAD TABLE emp ( empno number, ename char, job char, mgr number,

    hiredate date, sal number, comm number deptno number)

    STORAGE ( TABNO 0 EXTENTS( FILE 1 BLOCK 10530));

    즉 위의 테이블이름과 컬럼명, data type을 정의하고 scan.out에서 찾은 table의 storage절을 함께 정의하여 Unload를 수행한다.

    5.Table(emp)의 unload 예:

    $ dul

    UnLoader: Version 2.0.0.0 – Very Restricted on Tue May 16 11:46:33 1995

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Loaded 350 segments

    Loaded 204 extents

    Extent map sorted

    DUL> UNLOAD TABLE emp ( empno number, ename char, job char, mgr number,

    DUL 2> hiredate date, sal number, comm number deptno number)

    DUL 3> STORAGE ( TABNO 0 EXTENTS( FILE 1 BLOCK 10530));

    . unloading table EMP 14 rows unloaded

    DUL>quit

    ※scan.out을 이용해 unload시에는 user나 db단위로 unload는 불가능하다.

     

    7.Dul을 이용해 unload후 Reload시 주의할 점

  6. DUL을 이용해 unload하면 하나의 table에 대하여 .ctl과 .dat 두개의 file이 생성되며 User 단위로 Unload하면 해당 User가 갖고 있는 Table의 개수만큼 .ctl과 .dat가 생긴다.
  7. .ctl file은 SQL*Loader에서 이용하는 control file로서 control file내에는 data load방법과 저장할 data가 있는 SAM file에 관한 정보가 있다. 이중에서 input file의 field정보에서 정보가 실제와 틀릴 경우에는 SQL*Loader를 이용해 load시 error가 발생한다.
    이와 같은 현상은 항상 발생되지는 않지만 H/W Platform에 따라 이런 경우가 있는 것으로 생각된다
  8. DUL을 사용해 Recovery할 때는 SQL*Loader를 이용해 data를 복구 하므로 Load하기 전에 미리 table을 create하여야 하므로 table create script를 반드시 갖고 있어야 한다.
    만약, create script가 없다면 input file(.dat file)과 control file(.ctl file)을 이용해 create하여야 하는 문제가 생기면 이렇게 create하였다면 처음 상태와 동일하게 만들어 졌다고 보장하기 어려워 application이 비정상적으로 운영 될 수 있다.
  9.  

     

    8.SQL*Loader 이용할 때 발생 가능한 error와 해결책

    233827 LOADER REJECTS MULTI-LINE RECORDS IF USING ‘TERMINATED

    BY WHITESPACE’

    DESCRIPTION: Load of multi line records fails if the continuation is

    between columns.

    WORK AROUND: Use larger physical records (init.dul:

    LDR_PHYS_REC_SIZE)

    FIXED: 7.3

    250325 CANNOT LOAD CHAR THAT’S USED AS ENCLOSING CHARACTER

    DESCRIPTION: The stutter syntax of a column that starts with an

    enclosing character is not parsed correctly. (“””string itself enclosed

    in quotes””” is not parsed correctly).

    WORK AROUND: Use other enclosing character. (init.dul:

    LDR_ENCLOSE_CHAR)

    FIXED: 7.1.6

     

    9.잘못된 init.dul parameter로 야기 되는 문제 예

    WRONG osd_dba_file_bits size

    This can generate output similar to below. Normally this should not happen since you should create a demo database and check this via

    the DUL documented (in html page) query.

    The mismatch in DBA’s is only in the file number (first number in brackets) part. The second number, the block number, is correct.

     

    Data UnLoader: Release 3.2.0.1 – Internal Use Only – on Wed Sep 3 10:40:33 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    DUL: Warning: Block[1][2] DBA in block mismatch [4][2]

    DUL: Warning: Bad cache layer header file#=1, block#=2

    DUL: Warning: Block[1][3] DBA in block mismatch [4][3]

    DUL: Warning: Bad cache layer header file#=1, block#=3

    ………..and etc……….

     

    WRONG osd_file_leader_size

    This may create output similar to below, but many other flavours are possible. In this case we are a fixed number of blocks off. The file

    number is correct. The difference in the block numbers is constant.:

     

    Data UnLoader: Release 3.2.0.1 – Internal Use Only – on Wed Sep 3 10:44:23 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

     

    DUL: Warning: Block[1][2] DBA in block mismatch [1][3]

    DUL: Warning: Bad cache layer header file#=1, block#=2

    DUL: Warning: Block[1][3] DBA in block mismatch [1][4]

    DUL: Warning: Bad cache layer header file#=1, block#=3

    ………..and etc……….

     

    WRONG osd_c_struct_alignment

    This may generate output similar to the following:

    Data UnLoader: Release 3.2.0.1 – Internal Use Only – on Wed Sep 3 10:46:10 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    . unloading table OBJ$

     

    DUL: Warning: file# 0 is out of range

    DUL: Warning: Cannot read data block file#=0, block# = 262145

    OS error 2: No such file or directory

    DUL: Warning: file# 0 is out of range

    DUL: Warning: Cannot read data block file#=0, block# = 262146

    OS error 2: No such file or directory

    ………..and etc……….

     

    WRONG db_block_size

    The following output was generated when the db_block_size was set too

    small. The correct value was 4096 and it was set to 2048. Normally, the

    value for this parameter should be taken from the Oracle instances’s init.ora

    file and will not be correctly set.

     

    Data UnLoader: Release 3.2.0.1 – Internal Use Only – on Thu Sep 4 12:38:25 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    Session altered.

    DUL: Warning: Block[1][2] DBA in block mismatch [513][1159680]

    DUL: Warning: File=1, block 2: illegal block version 2

    DUL: Warning: Block[1][2] Illegal block type[0]

    DUL: Warning: Bad cache layer header file#=1, block#=2

     

    DUL: Warning: Block[1][4] DBA in block mismatch [1][2]

    DUL: Warning: File[1]Block[4]INCSEQ mismatch[90268!=0]

    DUL: Warning: Bad cache layer header file#=1, block#=4

     

    DUL: Warning: Block[1][6] DBA in block mismatch [1][3]

    DUL: Warning: File[1]Block[6]INCSEQ mismatch[139591710!=86360346]

    DUL: Warning: Bad cache layer header file#=1, block#=6

    ………..and etc……….

    QUOTE MISSING

    If you get the follwing error it is caused by the data dictionary tables “USER$, OBJ$, TAB$ and COL$” not being

    correctly generated. To fix this error simply delete all dictv6.ddl or dictv7.ddl created .dat and .ctl files and restart.

     

    Data UnLoader: Release 3.2.0.1 – Internal Use Only – on Wed Sep 3 10:49:30 1997

    Copyright (c) 1994/95 Oracle Corporation, The Netherlands. All rights reserved.

    DUL: Error: Quote missing

    3.사용 예

     

    1.NT4.0에서의 Oracle 8.0.5 test

    ORACLE_HOME밑에 BIN에 dul8 copy

    ORACLE_HOME/dul/bin/common Directory 생성

    ORACLE_HOME/dul/bin/common에 init.dul과 control.dul을 다음과 같이 생성

    NT에서 줄 수 있는 파라메터는 다음과 같다.

     

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

    init.dul에서 설정한 값

    # sample init.dul configuration parameters FOR WINNT

    # these must be big enough for the database in question

    # the cache must hold all entries from the dollar tables.

    dc_columns = 200000

    dc_tables = 10000

    dc_objects = 10000

    dc_users = 40

     

    # OS specific parameters

    osd_big_endian_flag = false

    osd_dba_file_bits = 10

    osd_c_struct_alignment = 32

    osd_file_leader_size = 1

     

    # database parameters

    db_block_size = 2048

     

    # loader format definitions

    LDR_ENCLOSE_CHAR = ”

    LDR_PHYS_REC_SIZE = 81

     

    compatible=8

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

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

    Contol.dul에서 설정한 값

    0 1 C:\ORANT\DATABASE\SYS1ORCL.ORA

    1 2 C:\ORANT\DATABASE\USR1ORCL.ORA

    2 3 C:\ORANT\DATABASE\RBS1ORCL.ORA

    3 4 C:\ORANT\DATABASE\TMP1ORCL.ORA

    5 5 C:\ORANT\DATABASE\WS_DATA1.ORA

    6 6 C:\ORANT\DATABASE\WS_IDX1.ORA

    7 7 C:\ORANT\DATABASE\OEM_DATA1.ORA

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

     

    CASE1) DUL에서 데이터 사전(data dictionary)이 사용 가능할 경우

    ORACLE_HOME/dul/bin/common>dul dictv8.ddl

     

    ORACLE_HOME/dul/bin/common> dul8

    Dul> unload database; / unload user scott; 실행.

     

    ……………………

     

    CASE2) DUL에서 데이터 사전(data dictionary)이 사용 불가능할 경우

    ORACLE_HOME/dul/bin/common> dul8

    DUL> scan database;

    tablespace 0, data file 1: 30719 blocks scanned

    tablespace 1, data file 2: 4095 blocks scanned

    tablespace 2, data file 3: 5119 blocks scanned

    tablespace 3, data file 4: 8703 blocks scanned

    tablespace 5, data file 5: 10239 blocks scanned

    tablespace 6, data file 6: 15359 blocks scanned

    tablespace 7, data file 7: 5119 blocks scanned

    하면 EXT.dat와 SEG.dat가 생긴다.

    Echo scan tables; | dul 8> scan.out

    하고 결과를 분석해 적당한 테이블을 찾아 sql*loader로 Unload한다

    .

     

    2.hp 에서의 oracle 7.3.3 test

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

    init.dul에서 설정한 값

    # sample init.dul configuration parameters FOR hp, oracle7

    # these must be big enough for the database in question

    # the cache must hold all entries from the dollar tables.

    dc_columns = 200000

    dc_tables = 10000

    dc_objects = 10000

    dc_users = 40

     

    # OS specific parameters

    osd_big_endian_flag = true

    osd_dba_file_bits = 6

    osd_c_struct_alignment = 32

    osd_file_leader_size = 1

     

    # database parameters

    db_block_size = 2048

     

    # loader format definitions

    LDR_ENCLOSE_CHAR = ”

    LDR_PHYS_REC_SIZE = 81

     

    compatible=7

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

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

    Contol.dul에서 설정한 값

    1 /home2/ora733/oradata/test733/system01.dbf

    2 /home2/ora733/oradata/test733/rbs01.dbf

    3 /home2/ora733/oradata/test733/temp02.dbf

    4 /home2/ora733/oradata/test733/tools01.dbf

    5 /home2/ora733/oradata/test733/users01.dbf

    6 /home2/ora733/oradata/test733/users02.dbf

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

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다