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 |
|
|
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)
|