sqlserver 와 Oracle 내부 의 오류 데이터 복구 (DBCC, DBMS REPAIR)

데이터 베 이 스 를 장시간 실행 한 후에 단전, 운영 체제, 물리 적 저장 등 원인 으로 인해 데이터 베이스 내부 의 논리 나 물리 적 오 류 를 초래 할 수 있 으 므 로 우 리 는 일반적인 방식 으로 복 구 를 시도 할 수 있다.
sqlserver 에 대해 서 는 DBCC 명령 을 사용 할 수 있 습 니 다.
-- sqlserver
use dbName 
GO

--exec sp_dboption @databasename, N'single', N'true' --              
ALTER DATABASE dbName SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO

DBCC CHECKDB(dbName, REPAIR_ALLOW_DATA_LOSS) 
GO
DBCC CHECKDB(dbName, REPAIR_REBUILD) 
GO

--exec sp_dboption @databasename, N'single', N'false'--              
ALTER DATABASE dbName SET MULTI_USER
GO

공식 참조:
https://msdn.microsoft.com/zh-cn/library/ms176064.aspx
http://blogs.msdn.com/b/apgcdsd/archive/2014/05/05/dbcc-checkdb.aspx
 
 
Oracle 에 대해 서 는 DBMS 를 사용 할 수 있 습 니 다.REPAIR.SKIP_CORRUPT_BLOCKS 가 나 쁜 블록 을 건 너 뛴 후 데이터 시트 를 읽 고 다시 만 듭 니 다.
흔히 볼 수 있 는 물리 적 블록 (Physical Block Corruptions) 은 블록 과 블록 끝의 정보 가 일치 하지 않 고 (Fractured / Incomplete), checksum 값 이 유효 하지 않 으 며 데이터 블록 정보 가 모두 0 인 경우 가 있 으 며 오류 ORA - 1578 과 ORA - 1110 이 수 반 될 수 있 습 니 다.
물리 적 나 쁜 블록 과 나 쁜 블록 이 발생 하 는 원인 을 신속하게 발견 하기 위해 Oacle 은 초기 화 매개 변수 DB 를 설정 하 는 것 을 권장 합 니 다.BLOCK_CHECKSUM = TYPICAL (기본 값).일반적인 상황 에서 물리 적 나 쁜 블록 은 바 텀 OS / disk 시스템 의 오류 / 손상 으로 인해 데이터 블록 이 수정 되 고 데이터 블록 표 지 는 나 쁜 블록 (corruption) 입 니 다.  
 
1. 현재 데이터베이스 초기 화 매개 변수 설정 DBBLOCK_CHECKSUM = TYPICAL 이 므 로 disk 에서 데이터 블록 을 읽 을 때 checksum 을 검사 합 니 다.
SQL> show parameter DB_BLOCK_CHECKSUM
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
db_block_checksum                    string      TYPICAL
 
2. 조회 표 dept 에서 고장 난 블록 을 발 견 했 습 니 다. 잘못된 정 보 를 보 고 했 습 니 다. ORA - 1578 과 ORA - 1110, 고장 난 블록 은 file \ # 4, block \ # 133 입 니 다.
SQL> select * from dept;
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 4, block # 133)
ORA-01110: data file 4: '/u01/app/oracle/oradata/orcl/users01.dbf'
 
데이터 블록 을 복구 하 는 방법 은 백업 을 통 해 복구 하거나 DBMSREPAIR.SKIP_CORRUPT_BLOCKS 는 나 쁜 블록 을 건 너 뛰 고 후 자 는 실행 하기에 더욱 편리 한 것 같 습 니 다.
SQL> alter session set db_file_multiblock_read_count=1;
SQL> execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('SCCOT','DEPT');
SQL> create table dept_new as select * from dept;
 
공식 참조:https://blogs.oracle.com/Database4CN/entry/oracle%E6%95%B0%E6%8D%AE%E5%BA%93%E5%9D%8F%E5%9D%97_corruption_%E7%89%A9%E7%90%86%E5%9D%8F%E5%9D%97

좋은 웹페이지 즐겨찾기