Поиск по этому блогу

среда, июня 03, 2009

Ковыряем BBED. Block Browser and EDitor. Часть 3. Сладенькое. Приводим файлы к одному SCN.

Пример как согласовавать файлы данных. Приводим к одному SCN


[oracle@localhost ~]$ sqlplus /nolog
SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 2 19:07:46 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.

Как обычно делаю выборку файлов.
SQL> conn / as sysdba;
Connected.

SQL> select file#||' '||name||' '||bytes from v$datafile;
FILE#||''||NAME||''||BYTES
--------------------------------------------------------------------------------
1 /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf 503316480
2 /home/oracle/oracle/product/10.2.0/oradata/pahom/undotbs01.dbf 36700160
3 /home/oracle/oracle/product/10.2.0/oradata/pahom/sysaux01.dbf 251658240
4 /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf 5242880
5 /home/oracle/oracle/product/10.2.0/oradata/pahom/example01.dbf 104857600

Хочу посмотреть как себя будут чувствовать данные. Поэтому делаю выборку до изменеий.
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500
30
7566 JONES MANAGER 7839 02-APR-81 2975
20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400
30
7698 BLAKE MANAGER 7839 01-MAY-81 2850
30
7782 CLARK MANAGER 7839 09-JUN-81 2450
10
7788 SCOTT ANALYST 7566 19-APR-87 3000
20
7839 KING PRESIDENT 17-NOV-81 5000
10
7844 TURNER SALESMAN 7698 08-SEP-81 1500 0
30
7876 ADAMS CLERK 7788 23-MAY-87 1100
20
7900 JAMES CLERK 7698 03-DEC-81 950
30
7902 FARD ANALYST 7566 03-DEC-81 3000
20
7934 MILLER CLERK 7782 23-JAN-82 1300
10
14 rows selected.


Тушим базу и копируем файл данных /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf
Затем поднимаем базу.Делаем пару каких либо движений. Я решил апдейтить многострадальную строку.


Неудачная попытка. Данные есть но условие выбора не отрабатывает. Потому как мы издевались над этой же строкой в части 2. Перестроим индекс все пойдет. В теории :)
SQL> update scott.emp set ename='FAAD' where empno=7902;
0 rows updated.
SQL> select * from scott.emp where empno=7902;
no rows selected

Все равно меняем эту же строку :)
SQL> update scott.emp set job='ANULIST' where ename='FARD';
1 row updated.
SQL> commit;
Commit complete.

Смотрим чего наменяли
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30

* * * * * *

7902 FARD ANULIST 7566 03-DEC-81 3000
20

7934 MILLER CLERK 7782 23-JAN-82 1300
10
14 rows selected.

Тушим базу и переименовываем файл данных /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf и копируем на его место файл бэкапа.
SCN которого неправильный.
SQL> shutdown immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.

Поднимаем базу. И получили ожидаемое.
SQL> startup;
ORACLE instance started.
Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 71305460 bytes
Database Buffers 92274688 bytes
Redo Buffers 2973696 bytes
Database mounted.
ORA-01113: file 4 needs media recovery
ORA-01110: data file 4:
'/home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf'
--------------------------------------------------------------



Начинаем лечебные процедуры.
BBED> set list '/home/oracle/oracle/product/10.2.0/bbed/list2.txt'
LISTFILE /home/oracle/oracle/product/10.2.0/bbed/list2.txt

Смотрим файл /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf. Будет эталоном.
BBED> set file 1
FILE# 1


Смотрим значения kscnbas, kcvcptim, kcvfhcpc, kcvfhccc
BBED> p kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x0008543e
ub2 kscnwrp @488 0x0000
ub4 kcvcptim @492 0x2909bfb8
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x00000004
ub4 kcrbabno @504 0x0000f554
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00

BBED> p kcvfhcpc
ub4 kcvfhcpc @140 0x0000003a

BBED> p kcvfhccc
ub4 kcvfhccc @148 0x00000039

Так как я ленивый и мне лень переворачивать байты. Делаю дамп блока. Ссылки у нас есть.
BBED> dump /v dba 1,1 offset 140 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf (1)
Block: 1 Offsets: 140 to 163 Dba:0x00400001
-------------------------------------------------------
3a000000 6e480929 39000000 00000000 l :...nH.)9.......
00000000 00000000 l ........
<16 bytes per line>

BBED> dump /v dba 1,1 offset 484 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/system01.dbf (1)
Block: 1 Offsets: 484 to 507 Dba:0x00400001
-------------------------------------------------------
3e540800 00000000 b8bf0929 01000a00 l >T...... .)....
04000000 54f50000 l ....T
<16 bytes per line>

Переходим к файлу который будем лечить.
BBED> set file 4
FILE# 4

BBED> set dba 4,1
DBA 0x01000001 (16777217 4,1)

BBED> p kcvfhckp
struct kcvfhckp, 36 bytes @484
struct kcvcpscn, 8 bytes @484
ub4 kscnbas @484 0x0008529c
ub2 kscnwrp @488 0x0000
ub4 kcvcptim @492 0x2909bda7
ub2 kcvcpthr @496 0x0001
union u, 12 bytes @500
struct kcvcprba, 12 bytes @500
ub4 kcrbaseq @500 0x00000004
ub4 kcrbabno @504 0x0000f3d4
ub2 kcrbabof @508 0x0010
ub1 kcvcpetb[0] @512 0x02
ub1 kcvcpetb[1] @513 0x00
ub1 kcvcpetb[2] @514 0x00
ub1 kcvcpetb[3] @515 0x00
ub1 kcvcpetb[4] @516 0x00
ub1 kcvcpetb[5] @517 0x00
ub1 kcvcpetb[6] @518 0x00
ub1 kcvcpetb[7] @519 0x00

BBED> p kcvfhcpc
ub4 kcvfhcpc @140 0x00000037

BBED> p kcvfhccc
ub4 kcvfhccc @148 0x00000036

BBED> dump /v dba 4,1 offset 140 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 140 to 163 Dba:0x01000001
-------------------------------------------------------
37000000 6e480929 36000000 00000000 l 7...nH.)6.......
00000000 00000000 l ........
<16 bytes per line>

BBED> dump /v dba 4,1 offset 484 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 484 to 507 Dba:0x01000001
-------------------------------------------------------
9c520800 00000000 a7bd0929 01000a00 l .R...... .)....
04000000 d4f30000 l ....
<16 bytes per line>

Как уже говорил забываю про режим редактирования.
BBED> modify /x 3a000000 dba 4,1 offset 140
BBED-00215: editing not allowed in BROWSE mode

BBED> set mode edit
MODE Edit

Подставляем значения из "эталонного" файла всем четырем параметрам указанным выше (kscnbas, kcvcptim, kcvfhcpc, kcvfhccc )
BBED> modify /x 3a000000 dba 4,1 offset 140
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 140 to 163 Dba:0x01000001
------------------------------------------------------------------------
3a000000 6e480929 36000000 00000000 00000000 00000000
<32 bytes per line>

BBED> modify /x 39000000 dba 4,1 offset 148
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 148 to 171 Dba:0x01000001
------------------------------------------------------------------------
39000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>

BBED> modify /x 3e540800 dba 4,1 offset 484
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 484 to 507 Dba:0x01000001
------------------------------------------------------------------------
3e540800 00000000 a7bd0929 01000a00 04000000 d4f30000
<32 bytes per line>

Вот непонял чего артачится видать слишком большое число. Офигела система маленько
BBED> modify /x b8bf0929 dba 4,1 offset 492
BBED-00209: invalid number (b8bf0929)

Правим меньше байтов.
BBED> modify /x b8bf dba 4,1 offset 492
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 492 to 515 Dba:0x01000001
------------------------------------------------------------------------
b8bf0929 01000a00 04000000 d4f30000 1000ffbf 02000000
<32 bytes per line>

Рихтуем контрольную сумму.
BBED> sum dba 4,1
Check value for File 4, Block 1:
current = 0xd835, required = 0xdc8a

BBED> sum dba 4,1 apply
Check value for File 4, Block 1:
current = 0xdc8a, required = 0xdc8a

Ну так на всяк случай проверяю.
BBED> dump /v dba 4,1 offset 140 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 140 to 163 Dba:0x01000001
-------------------------------------------------------
3a000000 6e480929 39000000 00000000 l :...nH.)9.......
00000000 00000000 l ........
<16 bytes per line>

BBED> dump /v dba 4,1 offset 484 count 24
File: /home/oracle/oracle/product/10.2.0/oradata/pahom/users01.dbf (4)
Block: 1 Offsets: 484 to 507 Dba:0x01000001
-------------------------------------------------------
3e540800 00000000 b8bf0929 01000a00 l >T...... .)....
04000000 d4f30000 l ....
<16 bytes per line>


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

Тушу базу, так как она в режиме МОУНТ. И стартую.
SQL> startup
ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1218316 bytes
Variable Size 71305460 bytes
Database Buffers 92274688 bytes
Redo Buffers 2973696 bytes
Database mounted.
Database opened.

Смотрю как там мои данные.
SQL> select * from scott.emp;
EMPNO ENAME JOB MGR HIREDATE SAL COMM
---------- ---------- --------- ---------- --------- ---------- ----------
DEPTNO
----------
7369 SMITH CLERK 7902 17-DEC-80 800
20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300
30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500
30

* * * * *

7902 FARD ANALYST 7566 03-DEC-81 3000
20
7934 MILLER CLERK 7782 23-JAN-82 1300
10
14 rows selected.

УСЕ