Oracle

게시글 보기
작성자 유건데이타 등록일 2015-05-16
제목 File 번호/Block 번호와 DBA 사이의 변환 script
File 번호/Block 번호와 DBA 사이의 변환 script
----------------------------------------------------------
block dump나 block corruption 등의 해결을 위해 file 번호와
block 번호를 DBA로 변환하거나 그 반대의 경우가 필요한 경우가 종종 있다.
여기에서는 이를 수행하기 위한 간단한 script를 제공한다.

아래의 script를 각각 별도의 file로 save한 후 file을 실행하여
procedure를 생성시킨 후 usage에 적힌대로 수행하면 된다.
usage 내의 procedure의 input 값은 단지 예이므로 실제 사용 시에는
적당한 값을 사용하도록 한다.

(주의)여기에서 dba값은 십진수이므로, 0x로 시작하는 값은 십진수로 변환한 후
작업하여야 한다.

1. DBA를 이용하여 file#, block# 를 찾아내는 procedure

rem *************************************************************
rem * *
rem * usage : 1. procedure 생성 *
rem * 2. SQL> set serveroutput on *
rem * 3. SQL> exec dba_to_file(123456789) *
rem * *
rem *************************************************************
create or replace procedure dba_to_file(in_dba number) is
file_num integer;
block_num integer;
begin
file_num := dbms_utility.data_block_address_file(in_dba);
block_num := dbms_utility.data_block_address_block(in_dba);
dbms_output.put_line('--------------------------------');
dbms_output.put_line('File number => '|| file_num);
dbms_output.put_line('Block number => '|| block_num);
dbms_output.put_line('--------------------------------');
dbms_output.put_line('Good luck to you');
end;
/


2. file#, block#를 가지고 DBA를 계산해 내는 procedure

rem ************************************************************
rem * *
rem * usage : 1. procedure 생성 *
rem * 2. SQL>set serveroutput on *
rem * 3. SQL>exec file_to_dba(10, 100) *
rem * *
rem ************************************************************
create or replace procedure file_to_dba(file_num number,
block_num number) is
dba number;
begin
dba := dbms_utility.make_data_block_address(file_num, block_num);
dbms_output.put_line('--------------------------------');
dbms_output.put_line('DBA => '|| dba);
dbms_output.put_line('--------------------------------');
end;
/

3. file#, block#를 이용하여 해당 object를 알아내기 위한 script

select owner, segment_name, segment_type, blocks, block_id
from dba_extents
where file_id = &file_number and
&block between block_id and (block_id + (blocks - 1));
Comment
등록된 코멘트가 없습니다.