This page was saved using WebZIP 7.0.3.1030 offline browser (Unregistered) on 09/04/11 14:29:53.
Address: http://home2oracle.narod.ru/tts/index.files/Page361.htm
Title: Страница 2  •  Size: 356371  •  Last Modified: Thu, 04 Feb 2010 15:48:32 GMT

EXECTRP sys.dbms_plugts.beginImport ('10.2.0.3.0',171,'2000',10,'Linux IA (32-bit)',52748,75851,1,0,0,0);

EXECTRP sys.dbms_plugts.checkCompType('COMPATSG','10.2.0.3.0');

EXECTRP sys.dbms_plugts.checkUser('ODBA');

EXECTRP sys.dbms_plugts.beginImpTablespace('USERS',4,'SYS',1,0,4096,1,117224182200,1,2147483645,16,256,16,0,1,0,16,

1628821562,1,33,10467,NULL,0,0,NULL,NULL);

EXECTRP sys.dbms_plugts.checkDatafile(NULL,1628821562,4,1280,4,4,4194302,320,10477,117224182200,1,16777218,

NULL,NULL,NULL);

EXECTRP sys.dbms_plugts.reclaimTempSegment(4,19,3,4,1536,21,16,1,2147483645,256,0,0,0,0,0,0,

0,52743,196865,0);

EXECTRP sys.dbms_plugts.commitPluggable;

CONNECT ODBA

TABLE "WWW"

CREATE TABLE "WWW" ("OWNER" VARCHAR2(30) NOT NULL ENABLE, "OBJECT_NAME"

 VARCHAR2 (30) NOT NULL ENABLE, "SUBOBJECT_NAME" VARCHAR2(30), "OBJECT_ID"

 NUMBER NOT NULL ENABLE, "DATA_OBJECT_ID" NUMBER, "OBJECT_TYPE" VARCHAR2(19),

 "CREATED" DATE  NOT NULL ENABLE, "LAST_DDL_TIME" DATE NOT NULL ENABLE, "TIMESTAMP"

 VARCHAR2(19), "STATUS" VARCHAR2(7), "TEMPORARY" VARCHAR2(1), "GENERATED" VARCHAR2(1),

"SECONDARY" VARCHAR2(1))  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 STORAGE

(SEG_FILE 4 SEG_BLOCK 1555 OBJNO_REUSE 52745 INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1

BUFFER_POOL DEFAULT) TABLESPACE "USERS" LOGGING NOCOMPRESS

FIXTABLEPDML "ODBA"."WWW" 536870912

FIXTABLEHAKAN "ODBA"."WWW" 148

ENDTABLE

CONNECT SYS

EXECTRP sys.dbms_plugts.endImport;

EXIT

EXIT

 

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

00

0B

02

00

00

01

00

80

01

00

00

00

00

00

00

01

04

10

D7

2E

00

00

00

00

20

09

00

00

00

08

D5

B1

EB

B3

 20

4D

54

53

00

00

00

00

00

8F

97

01

00

00

64

00

00

30

00

10

00

00

06

00

03

00

00

00

00

00

00

00

00

00

40

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

50

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

60

00

00

00

00

54

F0

1A

4B

1B

00

00

00

F7

10

EE

27

70

0B

C7

A1

27

18

F8

6A

46

1B

00

00

00

00

00

00

00

80

00

00

00

00

00

00

00

00

00

00

04

00

CC

F0

1A

4B

90

1B

00

00

00

3E

11

EE

27

01

00

00

00

0A

00

00

00

A0

3A

E2

02

00

10

00

00

00

02

00

00

00

00

00

00

00

B0

03

00

00

00

00

00

00

00

02

00

00

00

00

00

00

00

C0

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

D0

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

E0

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

F0

00

00

00

00

09

00

00

00

04

00

54

45

53

54

00

00

100

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

110

00

00

00

00

00

00

00

00

06

00

00

00

00

00

00

00

120

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

Ищем  необходимую  информацию  в  заголовке    файла  данных.

 

databaseID  - 0xb3ebb1d5  (3018568149)

curFileBlks – 0x6400(25600)

blkSize  - 0x1000 (4096)

absolute_fno – 0x06  (6)

creation_SCN – 0x1b4b1af054 (117224173652)

reset_SCN – 0x1b466af818 (117145532440)

checkpoint_SCN – 0x1b4b1af0cc  (117224173772)

tablespace_ID – 0x09 (9)

tsname  - 0x54455354 (TEST)

relative_fno  - 0x06 (6)

 

Определили   все  необходимые  параметры  процедур  и  владельцем  таблицы  «назначили»  свежесозданного  пользователя TTS_OWNER

 

EXECTRP sys.dbms_plugts.checkUser('TTS_OWNER');

EXECTRP  sys.dbms_plugts.beginImpTablespace

('TEST',9,'SYS',1,0,4096,1,117224173772,1,2147483645,16,256,16,0,1,0,16,3018568149,1,33,

117224173652,NULL,0,0,NULL,NULL);

EXECTRP sys.dbms_plugts.checkDatafile(NULL, 3018568149, 6,25600, 9, 6 , 4194302, 320, 117224173652, 

117224173772, 117145532440, 16777218, NULL, NULL, NULL);

 

И  еще  один  момент:   так  как  экспорт  табличных  пространств  предполагает  их  нахождение  в  режиме  read  only,   а  наш  файл  выдернут  из  базы  данных   в  состоянии  shutdown  abort,  то  Оракл  необходимо  заставить  поверить,  что  файл  согласованный. Достигается  это  путем правки   структур  заголовка  файла  данных   - status:0x4   меняем  на status:0x0 и  сбрасываем  флаг и контрольную  сумму  заголовка

 

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

F

00

0B

02

00

00

01

00

80

01

00

00

00

00

00

00

01

01

10

00

00

00

00

00

00

20

09

00

00

00

08

D5

B1

EB

B3

80

00

00

00

00

00

00

00

00

00

00

00

00

CC

F0

1A

4B

 

Стоит    отметить,  что  в  случае  наличия  в  файле  данных грязных  блоков, с SCN большим,  чем   у  контрольной  точки,  при  обращении  к  этим блокам после  импорта  Оракл  может   выдавать  ошибку, что вобщем-то и  правильно.  Но  если  ошибку видеть  не  хочется,  а  с  мыслью  что   согласованных   данных  никто  в нашей  ситуации  не  гарантирует мы  уже  смирились,  то    избежать ошибки   можно  путем  установки в  заголовке файла данных  checkpoint SCN  превышающий  Highest block SCN, значение  которого  можно получить  из  вывода утилиты  dbv

 

dbv file=test01.dbf_ BLOCKSIZE=4096

 

DBVERIFY: Release 10.2.0.3.0 - Production on Tue Nov 4 18:37:59 2008

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

DBVERIFY - Verification starting : FILE = test01.dbf_

DBVERIFY - Verification complete

 

Total Pages Examined         : 25600

Total Pages Processed (Data) : 1314

Total Pages Failing   (Data) : 0

Total Pages Processed (Index): 0

Total Pages Failing   (Index): 0

Total Pages Processed (Other): 53

Total Pages Processed (Seg)  : 0

Total Pages Failing   (Seg)  : 0

Total Pages Empty            : 24233

Total Pages Marked Corrupt   : 0

Total Pages Influx           : 0

Highest block SCN            : 1260056767 (27.1260056767)

 

   Переходим  к  содержательной   части  файла,  по    принятому  допущению  нам необходимо  извлечь  данные  единственной  таблицы,  заголовочный  блок  которой  можно определить  по  карте  блоков в block_analyzer.xls.

 

Block

Description

Type

SCN

Data Segment

data\index

Object

freelist flag

freelist next

 

 

 

 

 

 

 

 

0

Virgin

0

 

 

 

 

 

1

Data file header block

11

 

 

 

 

 

2

LMT space map header block

29

 

 

 

 

 

3

LMT space map block

30

 

 

 

 

 

4

LMT space map block

30

 

 

 

 

 

5

LMT space map block

30

 

 

 

 

 

6

LMT space map block

30

 

 

 

 

 

7

LMT space map block

30

 

 

 

 

 

8

LMT space map block

30

 

 

 

 

 

9

LMT space map block

30

 

 

 

 

 

10

LMT space map block

30

 

 

 

 

 

11

LMT space map block

30

 

 

 

 

 

12

LMT space map block

30

 

 

 

 

 

13

LMT space map block

30

 

 

 

 

 

14

LMT space map block

30

 

 

 

 

 

15

LMT space map block

30

 

 

 

 

 

16

LMT space map block

30

 

 

 

 

 

17

ASSM level 1 bitmap block

32

 

 

94CE00

 

 

18

ASSM level 2 bitmap block

33

 

 

94CE00

 

 

19

ASSM segment header block

35

 

 

94CE00

 

 

20

Table/cluster/index segment data block

6

 

 

94CE00

 

 

21

Table/cluster/index segment data block

6

 

 

94CE00

 

 

22

Table/cluster/index segment data block

6

 

 

94CE00

 

 

23

Table/cluster/index segment data block

6

 

 

94CE00

 

 

24

Table/cluster/index segment data block

6

 

 

94CE00

 

 

25

Table/cluster/index segment data block

6

 

 

94CE00

 

 

26

Table/cluster/index segment data block

6

 

 

94CE00

 

 

27

Table/cluster/index segment data block

6

 

 

94CE00

 

 

28

Table/cluster/index segment data block

6

 

 

94CE00

 

 

29

Table/cluster/index segment data block

6

 

 

94CE00

 

 

30

Table/cluster/index segment data block

6

 

 

94CE00

 

 

31

Table/cluster/index segment data block

6

 

 

94CE00

 

 

32

Table/cluster/index segment data block

6

 

 

94CE00

 

 

    Как  видим заголовок   таблицы  находится  с  блоке  с  номером 19, object_id  таблицы - 0xce94 (52884). Осталось  определить   типы  полей,  для  этого  проанализируем    произвольный  блок  данных  таблицы,  например  с номером 20, извлечем  данные   и  методом  подбора  определим  типы  полей.

Число  полей  в  таблице  -  13

Field1 – varchar2(100)

Field2 – varchar2(100)

Field3 – number

Field4 – number

Field5 – number

Field6 – varchar2(100)

Field7 – date

Field8 – date

Field9 – varchar2(100)

Field10 – varchar2(100)

Field11 – varchar2(100)

Field12 – varchar2(100)

Field13 – varchar2(100)

 

Ну  а  саму   таблицу   назовем,  например, table1.

Итак, метаданные  для    импорта  табличного  пространства  с  данными  нашей таблицы  выглядят  так

 

CONNECT TTS_OWNER

TABLE "TABLE1"

CREATE TABLE "TABLE1" ("FIELD1" VARCHAR2(100), "FIELD2" VARCHAR2(100), "FIELD3" NUMBER, "FIELD4" NUMBER, "FIELD5" NUMBER, "FIELD6" VARCHAR2(100), "FIELD7" DATE, "FIELD8" DATE , "FIELD9" VARCHAR2(100), "FIELD10" VARCHAR2(100), "FIELD11" VARCHAR2(100), "FIELD12" VARCHAR2(100), "FIELD13" VARCHAR2(100))   STORAGE(SEG_FILE 6  SEG_BLOCK 19  OBJNO_REUSE 52884) TABLESPACE "TEST"

ENDTABLE

 

   И  вот готовый dmp-файл    - users.dmpФайл данных  - test01.dbf Запустим    процедуру  импорта.

 

$ORACLE_HOME/bin/imp \'sys/sys  as sysdba\'  transport_tablespace=y  tablespaces=(test) datafiles=('/opt/oracle/oradata/tts/test01.dbf')   file=users.dmp log=log_tts_im

 

Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - Production

With the Partitioning, OLAP and Data Mining options

Export file created by EXPORT:V10.02.01 via conventional path

About to import transportable tablespace(s) metadata...

import done in US7ASCII character set and AL16UTF16 NCHAR character set

import server uses CL8MSWIN1251 character set (possible charset conversion)

. importing SYS's objects into SYS

. importing SYS's objects into SYS

. importing TTS_OWNER's objects into TTS_OWNER

. . importing table                       "TABLE1"

. importing SYS's objects into SYS

Import terminated successfully without warnings.

 

Проверим   доступность  данных

SQL> desc tts_owner.table1;

 Name                                      Null?    Type

 ----------------------------------------- -------- ----------------------------

 FIELD1                                             VARCHAR2(100)

 FIELD2                                             VARCHAR2(100)

 FIELD3                                             NUMBER

 FIELD4                                             NUMBER

 FIELD5                                             NUMBER

 FIELD6                                             VARCHAR2(100)

 FIELD7                                             DATE

 FIELD8                                             DATE

 FIELD9                                             VARCHAR2(100)

 FIELD10                                            VARCHAR2(100)

 FIELD11                                            VARCHAR2(100)

 FIELD12                                            VARCHAR2(100)

 FIELD13                                            VARCHAR2(100)

 

SQL>select  *  from tts_owner.table1 ;

 

Ну и  в  конце    приведу     пару  примеров,   когда   знания  механизма  экспорта-импорта   табличных  пространств   позволяют  решить  задачи    извлечения  данных.

1. База  данных   требует  восстановления  с  резервной  копии,  а резервная  копия  не  может  быть  донакачена  до  текущего  состояния   либо  в  силу   потери  логов,  либо  просто     такой  вариант  восстановления  не  был  предусмотрен.  По  факту  -  имеется  некоторый   файл  данных (файлы  данных) от  корапт-базы  и    копия  этой   базы,  сделанная   некоторое  время   назад. Задача -  получить  актуальные  данные.  Решается  очень  просто  -  из копии  базы  данных  формируется  файл  экспорта  метаданных,  корректируется  его  содержимое  и    структуры    заголовков  файлов,  и  осуществляется  их импорт   в   промежуточную    базу.  Потери  в  данном  случае  ограничиваются   объектами,  созданными\пересозданными  после   сохранения  резервной  копии  базы.

2. Имеется   большое  табличное  пространство,  состоящее  из  большого  числа   файлов  данных  и  стоит  задача  извлечь  данные  одной  единственной  таблицы либо  партиции,  например  для  тестовых целей.  Причем  эта  таблица  велика  настолько,  что вытаскивать ее  данные   селектом  достаточно  затруднительно, а  восстанавливать  полностью  табличное  пространство     нет  возможности,  например  из-за  отсутствия  дискового  пространства. Решение этой   задачи  в  состоит  в  формировании   файла  экспорта  метаданных  с  включением  в  него  только  файлов,  в  которых  содержатся  экстенты  таблицы, их  номера   можно  вычислить  последовательно  проделав  импорт  несколько  раз.  Для  первой  процедуры  импорта  берется  файл  с  заголовком  сегмента,  после  осуществления  импорта  при  попытке  просканировать   данные  таблицы,  если  Оракл  обнаруживает  информацию  о  наличии   экстентов  в  отсутствующем  файле,  то он  выдает  ошибку  ora-600,    в  параметрах  которой  указан  номер  недостающего  файла,  информация  о  файле  добавляется  в dmp-файл,  а сам  файл  идет  в набор  для  импорта  и  осуществляется вторая  попытка  импорта. Ну  и  процесс  заканчивается,  когда  будет определен  полный  набор   файлов  данных  с  экстентами нашей  таблицы.

 

 

 

Offset

Row flag

K

C

H

D

F

L

P

N

Colums Number

Field1

 

Field2

 

Field3

Field4

 

 

 

 

 

 

 

 

 

 

 

1

1

3

3

4018

44

0

0

1

0

1

1

0

0

13

 53 59 53

 49 5F 54 53 23

NULL

 C1 08

 

 

 

 

 

 

 

 

 

 

 

SYS

I_TS#

 

7

3940

44

0

0

1

0

1

1

0

0

13

 53 59 53

 43 5F 43 4F 42 4A 23

NULL

 C1 1E

 

 

 

 

 

 

 

 

 

 

 

SYS

C_COBJ#

 

29

3867

44

0

0

1

0

1

1

0

0

13

 53 59 53

 46 45 54 24

NULL

 C1 0D

 

 

 

 

 

 

 

 

 

 

 

SYS

FET$

 

12

3791

44

0

0

1

0

1

1

0

0

13

 53 59 53

 49 5F 43 4F 42 4A 23

NULL

 C1 1F

 

 

 

 

 

 

 

 

 

 

 

SYS

I_COBJ#

 

30

Oracle Transportable Tablespaces  (TTS)