cf. 참고
체크포인트의 종류
 
- 쓰레드 체크포인트 : RAC의 경우 각 노드별로 체크포인트 따로 일으킬수 있다.
RAC가 아닌경우 글로벌체크포인트 = 쓰레드 체크포인트
 
- 테이블스페이스 체크포인트 (=데이터파일 체크포인트) :
alter tablespace users offline 수행하면, users안의 모든 내용들만 다 내려쓴다.
 
- 테이블 체크포인트 :
어떤 테이블을 read only로 만들면 테이블 단위로 체크포인트가 일어날 수 있다.
 
- 리커버리 체크포인트 :
recover database 하면 리커버된 내용들이 파일로 저장된다.
메모리에서 리커버가 되고 그것을 파일로 내려쓴다.


 
 
※ 일반적으로 체크포인트 일어나면 내려쓴다.
insert 작업할때는 체크포인트 안 일어나도 내려쓴다. → 오라클생각 : 일반적으로 insert후 commit할 확률이 많다.
 
 


 
Block Corruption
 
ABCDE
 
B블락이 고장나면 A이후 블락 모두 조회되지 않는다.
shutdown abort (정전) 때 일어난다.
 
- 이유 : 각 블락은 다음블락의 주소 정보를 가지고 있다.
         C,D,E 의 데이터는 살아있지만 조회할수 없다.
 

 
오라클에서 제공
1. DBV (DBVerify) : Data file 만. redo log 못살림
2. DBMS_REPAIR
 
▶ 장애난 블락을 고장이라고 막고, 나머지 블락을 살린다. : 해당 블락 포기
→ 무조건 장애난 블록의 데이터를 날리기 때문에 사실상 복구가 아님..
 
 


3. BBED  ← 장애블락복구
 
▶ 블락에 들어가 장애 블락까지 복구한다.
 
1,2 로 복구후 select 해보면 장애 블락에 해당하는 내용은 나오지 않는다.(총 1000건중 해당 블락내용 누락되어 x00건만 조회됨)
3 으로 복구후 select 해보면 장애 블락까지 나온다. (총 1000건중 1000건 조회됨. 대신 해당 라인은 내용이 달라져있다.)
 




Block Corruption 일으키는 방법 --->>>>>
 


1. 테이블 만들기
SQL> create tablespace test2
SQL> datafile '/hoem/oracle/oradata/testdb/test02.dbf' size 1m;
 
SQL> create table tt2 (no number, name varchar2(10)) tablespace test2;
 
SQL>
begin
for i in 1..100 loop
  insert into tt2 values (1,dbms_random.string('A',9));
end lop;
commit;
end;
/
 
SQL> select * from tt2
 
SQL> alter tablespace test2 offline;
오프라인하면 체크포인트가 자동으로 일어나서 데이터파일에 다 저장된다.
 
 
2. winscp로 파일 윈도우로 옮기기
 
 
3. 울트라에디터 평가판실행
복사해온 파일 열어서 편집
 
특정문구 찾아서(ctrl + F)
옵션:아스키, 대소문자 일치
찾아내면 HEX코드 바꾸고 저장
 
 
4. winscp로 다시 리눅스로 옮기기
 
 
5. 리눅스에서 해당테이블 온라인시키기
SQL> alter tablespace test2 online

...
....
...
 
ORA-01578: ORACLE data block corrupted (file # 7, block # 16)
ORA-01110: data file 7: '/home/oracle/oradta/testdb/test02.dbf'
 
 
765 rows selected
 
에러 완성(?) 
 
 
 
 
복구 --->>>>>
 
 
 
1. dbv
 
$ dbv file=/home/oracle/oradta/testdb/test02.dbf
 
...
..
 
 
SQL> select * form tt2
 
$ dbv file=/home/oracle/oradta/testdb/test02.dbf
 
 
 
2. DBMS_REPAIR (프로시저)
사용전 준비 사항
1) REPAIR_TABLE 생성하기
 : 어떻게 어떻게 문제가 생겼다고 적어놓는 장소 = ADMIN TABLE
 
2) Orphan-key-table 생성하기
 : 장애난 테이블과 관련 있는 다른 Object(관련인덱스, FK등의 정보) 를 저장하는 곳
 
3) DB_Block_checking = true
 : 파라미터 파일에 DB_Block_checking = true로 해주면 오라클이 모든 블록을 체크하기 시작한다.
 : 평소에는 false로 되어있다(성능상) : false면 SYSTEM Tablespace만 체크한다.
 
※ 복구 과정중 corrupt 된 block 를 skip 하도록 설정하기
 : corrupt 된 블록을 Fix 한후 select 해보면 해당 블록에 문제가 있다고 나오고 select 가 정상적으로 수행이 안된다.
   예를들어 데이터파일에 수많은 블록에 데이터가 들어있다고 가정할 경우 1개의 block 가 corrupt 가 발생할 경우 전체 데이터를 읽어오지 못하는 상황이 된다는 뜻이다.
   그래서, corrupt 된 블록의 데이터는 복구 못하니까 읽지 말고 나머지 블록만 읽어서 남아있는 데이터만이라도 살려내고 싶을 때 skip 작업을 해줘야 한다.
 
 


3. BBED

1) BBed link - 리눅스 버전 기반
 : 오라클 엔진을 설치하면 bbed의 기본적인 라이브러리들이 설치됨.
   사용가능 상태는 아니기 때문에 사용하기 위해 link라는 작업을 별도로 해줘야 한다.
 
 

** 10g까지 링킹 방법
$ cd $ORACLE_HOME/rdbms/lib
 
$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
 
Linking BBED utility (bbed)
rm -f /home/oracle/product/10g/rdbms/lib/bbed
gcc -o /home/oracle/product/10g/rdbms/lib/bbed -L/home/oracle/product/10g/rdbms/lib/ -L/home/oracle/product/10g/lib/ -L/home/oracle/product/10g/lib/stubs/ -L/usr/lib -lirc  /home/oracle/product/10g/lib/s0main.o /home/oracle/product/10g/rdbms/lib/ssbbded.o /home/oracle/product/10g/rdbms/lib/sbbdpt.o `cat /home/oracle/product/10g/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 /home/oracle/product/10g/rdbms/lib/defopt.o -ldbtools10 -lclntsh  `cat /home/oracle/product/10g/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /home/oracle/product/10g/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /home/oracle/product/10g/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /home/oracle/product/10g/lib/ldflags`    -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10   -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10  -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10  -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10   `cat /home/oracle/product/10g/lib/sysliblist` -Wl,-rpath,/home/oracle/product/10g/lib -lm    `cat /home/oracle/product/10g/lib/sysliblist` -ldl -lm   -L/home/oracle/product/10g/lib
 
$ pwd
/home/oracle/product/10g/rdbms/lib
 
$ ls -l bbed
-rwxr-xr-x  1 oracle dba 552665 Mar 15 23:49 bbed  ← 파일생성됨
 
$ cp bbed $ORACLE_HOME/bin/


 
 

** 11g부터 링킹 방법
$ cd $ORACLE_HOME/rdbms/lib/
$ make -f ins_rdbms.m k $ORACLE_HOME/rdbms/lib/bbed
에러발생함
11g에는 기본적인 라이브러리 ssbbded.o, sbbdpt.o 두파일이 없어서 나는 에러.
9/10g 의 경로에서 11g 의 동일한 경로로 복사하고,
위 두 파일을 가지고 와도 추가로 아래의 파일이 더 필요하므로 아래의 해당 파일 역시 복사 해 오신 후 링킹 하여 사용
 
$cp $ORACLe_HOME/rdbms/mesg/bbedus.msb $ORA11g_HOME/rdbms/mesg
$cp $ORACLe_HOME/rdbms/mesg/bbedus.msg $ORA11g_HOME/rdbms/mesg
$cp $ORACLe_HOME/rdbms/mesg/bbedar.msb $ORA11g_HOME/rdbms/mesg


 
 

2) 실행하기 (모든 버전 공통)
 
$ bbed
Password: (암호입력 : 기본값 → blockedit )
 
BBED: Release 2.0.0.0.0 - Limited Production on Thu Mar 15 23:57:01 2012
 
Copyright (c) 1982, 2007, Oracle.  All rights reserved.
 
************* !!! For Oracle Internal Use only !!! ***************
 
BBED>


 
 
 
복구하기 -------->>>>>>>>>>>>>
 : 에러는 위의 방법과 동일하다.
 
 
SQL> select * from tt940;
select * from tt940
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 7, block # 30)
ORA-01110: data file 7: '/home/oracle/test10.dbf'
 
 
 
BBED> set dba 7,30
        DBA             0x01c0001e (29360158 7,30)
 
BBED> corrupt block 30
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
Block marked media corrupt.
 
BBED> p kcbh
struct kcbh, 20 bytes                       @0
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x01c0001e
   ub4 bas_kcbh                             @8        0x00000000
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0xff
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x67e3
   ub2 spare3_kcbh                          @18       0x0000
 
BBED> m /x 01 dba 7,30 offset 14
 File: /home/oracle/test10.dbf (7)
 Block: 30               Offsets:   14 to  525           Dba:0x01c0001e
------------------------------------------------------------------------
 0104e367 00000100 00001729 00009c14 03000000 00000200 32001900 c0010200
 2e009e00 0000b300 80002300 26000520 0000c014 03000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000001 0500ffff 1c005c1f
 401f401f 00000500 8c1f801f 741f681f 5c1f0000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 
 <32 bytes per line>
 
BBED> p kcbh
struct kcbh, 20 bytes                       @0
   ub1 type_kcbh                            @0        0x06
   ub1 frmt_kcbh                            @1        0xa2
   ub1 spare1_kcbh                          @2        0x00
   ub1 spare2_kcbh                          @3        0x00
   ub4 rdba_kcbh                            @4        0x01c0001e
   ub4 bas_kcbh                             @8        0x00000000
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x01
   ub1 flg_kcbh                             @15       0x04 (KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x67e3
   ub2 spare3_kcbh                          @18       0x0000
 
BBED> p tailchk
ub4 tailchk                                 @8188     0x000006ff
 
BBED> m /x 01060000 dba 7,30 offset 8188
 File: /home/oracle/test10.dbf (7)
 Block: 30               Offsets: 8188 to 8191           Dba:0x01c0001e
------------------------------------------------------------------------
 01060000
 
 <32 bytes per line>
 
BBED>
BBED> sum dba 7,30 apply
Check value for File 7, Block 30:
current = 0x67e3, required = 0x67e3
 
 
 
SQL> select * from tt940;
select * from tt940
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 7, block # 30)
ORA-01110: data file 7: '/home/oracle/test10.dbf'
 
 
SQL> alter tablespace test10 offline;
 
Tablespace altered.
 
SQL> alter tablespace test10 online;
 
Tablespace altered.
 
SQL> select * from tt940;
 
        NO NAME
---------- ----------
         1 1EEEA
         2 BBBBB
         3 CCCCC
         4 DDDDD
         5 EEEEE
 
Posted by 딩구르
,