이 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의 실행절차.
- The parameter file “init.dul” is processed.
- The DUL control file (default “control.dul”) is scanned.
- Try to load dumps of the USER$, OBJ$, TAB$, COL$ if available into DUL’s data dictionary cache.
- Try to load seg.dat and col.dat.
-
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시 주의할 점
- DUL을 이용해 unload하면 하나의 table에 대하여 .ctl과 .dat 두개의 file이 생성되며 User 단위로 Unload하면 해당 User가 갖고 있는 Table의 개수만큼 .ctl과 .dat가 생긴다.
- .ctl file은 SQL*Loader에서 이용하는 control file로서 control file내에는 data load방법과 저장할 data가 있는 SAM file에 관한 정보가 있다. 이중에서 input file의 field정보에서 정보가 실제와 틀릴 경우에는 SQL*Loader를 이용해 load시 error가 발생한다.
이와 같은 현상은 항상 발생되지는 않지만 H/W Platform에 따라 이런 경우가 있는 것으로 생각된다
- DUL을 사용해 Recovery할 때는 SQL*Loader를 이용해 data를 복구 하므로 Load하기 전에 미리 table을 create하여야 하므로 table create script를 반드시 갖고 있어야 한다.
만약, create script가 없다면 input file(.dat file)과 control file(.ctl file)을 이용해 create하여야 하는 문제가 생기면 이렇게 create하였다면 처음 상태와 동일하게 만들어 졌다고 보장하기 어려워 application이 비정상적으로 운영 될 수 있다.
-
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
———————————————————————————-