RAC - Block Corruption 고치기 (DBVerify, DBMS_REPAIR, BBED) / 체크포인트 종류
Oracle/Oracle - RAC 2012. 3. 12. 18:45cf. 참고
체크포인트의 종류
- 쓰레드 체크포인트 : 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
'Oracle > Oracle - RAC' 카테고리의 다른 글
RAC - vote / OCR, OCR 백업복구하기 (0) | 2012.03.09 |
---|---|
RAC Extra - 노드1 lvcreate로 디스크 하나 추가후, 노드 2 를 재부팅하지 않고 디스크를 인식시키기 (0) | 2012.03.09 |
RAC 리두로그,컨트롤파일 재생성할때. (0) | 2012.03.09 |
RAC Extra - Single 노드로 복구시 ORA-38856 발생 (2) | 2012.03.09 |
RAC - 백업 및 복구 (간단Ver. Cold backup 및 복구) (0) | 2012.03.09 |