'장애처리'에 해당되는 글 2건

  1. 2009/02/09 온라인 페이지 복원 테스트
  2. 2009/02/09 Suspect 발생시 처리


1. 테스트 데이터베이스 생성

IF DB_ID('PageTest') IS NOT NULL
    DROP DATABASE PageTest
GO

CREATE DATABASE PageTest
GO




2. 테스트 테이블 생성

USE PageTest
GO

CREATE TABLE T1 (
   SEQ INT PRIMARY KEY IDENTITY, 
   COL1 VARCHAR(2000)
)
GO

INSERT INTO T1 VALUES(REPLICATE('A', 2000))
INSERT INTO T1 VALUES(REPLICATE('B', 2000))
INSERT INTO T1 VALUES(REPLICATE('C', 2000))
INSERT INTO T1 VALUES(REPLICATE('D', 2000))
INSERT INTO T1 VALUES(REPLICATE('E', 2000))
INSERT INTO T1 VALUES(REPLICATE('F', 2000))
INSERT INTO T1 VALUES(REPLICATE('G', 2000))
INSERT INTO T1 VALUES(REPLICATE('H', 2000))
INSERT INTO T1 VALUES(REPLICATE('I', 2000))
INSERT INTO T1 VALUES(REPLICATE('J', 2000))
INSERT INTO T1 VALUES(REPLICATE('K', 2000))
INSERT INTO T1 VALUES(REPLICATE('L', 2000))
INSERT INTO T1 VALUES(REPLICATE('M', 2000))
INSERT INTO T1 VALUES(REPLICATE('N', 2000))
INSERT INTO T1 VALUES(REPLICATE('O', 2000))
INSERT INTO T1 VALUES(REPLICATE('P', 2000))
INSERT INTO T1 VALUES(REPLICATE('Q', 2000))
INSERT INTO T1 VALUES(REPLICATE('R', 2000))
INSERT INTO T1 VALUES(REPLICATE('S', 2000))
INSERT INTO T1 VALUES(REPLICATE('T', 2000))
INSERT INTO T1 VALUES(REPLICATE('U', 2000))
INSERT INTO T1 VALUES(REPLICATE('V', 2000))
INSERT INTO T1 VALUES(REPLICATE('W', 2000))
INSERT INTO T1 VALUES(REPLICATE('X', 2000))
INSERT INTO T1 VALUES(REPLICATE('Y', 2000))
INSERT INTO T1 VALUES(REPLICATE('Z', 2000))
GO

CHECKPOINT
GO




3. 페이지 확인

USE PageTest
GO
DBCC TRACEON(3604)
DBCC IND('PageTest', 'T1', 1)



결과





4. HEX EDITOR 에서 페이지를 손상시키기 위해서 페이지 확인

- 1:109 페이지를 손상시킨다.

DBCC PAGE('PageTest', 1, 109, 1)


결과





5. 전체 데이터베이스 백업

BACKUP DATABASE PageTest TO DISK = 'D:\BACKUP\PageTest.BAK'



6. SQL 서버 중지



7. HEX EDITOR로 페이지 손상시킴

- 1:109 페이지
   30000800 06000000 0200fc01 00df0746 를 손상시킨다.










8. SQL 서버 다시 시작



9. 데이터 확인

USE PageTest
GO
SELECT TOP 3 * FROM T1
SELECT * FROM T1



결과





10. 손상된 페이지 확인

USE msdb
SELECT * FROM msdb..suspect_pages

SELECT DB_NAME(11)



결과





11. 최근 로그까지 백업

USE master
GO
BACKUP LOG PageTest TO DISK = 'D:\BACKUP\PageTest_LOG.BAK'
WITH NO_TRUNCATE, INIT
GO



12. 페이지 복원

RESTORE DATABASE PageTest PAGE = '1:109'
FROM DISK = 'D:\BACKUP\PageTest.BAK'
WITH NORECOVERY
GO




13. 페이지 복원 중에 데이터 확인

USE PageTest
GO

아래의 두쿼리는 문제없이 잘된다.
SELECT * FROM sys.objects
SELECT TOP 3 * FROM T1

이 쿼리는 에러발생
SELECT * FROM T1


결과





14. 로그 복원

USE master
GO

RESTORE LOG PageTest
FROM DISK = 'D:\BACKUP\PageTest_LOG.BAK' WITH RECOVERY
GO




15. 확인

USE PageTest
GO

SELECT * FROM T1



결과
문제 없이 잘나온다.


크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 리치타이거


1. SQL 2000

-- 1. 시스템 카탈로그를 수정할 수 있게 설정
USE MASTER
GO

SP_CONFIGURE 'ALLOW UPDATE', 1
RECONFIGURE WITH OVERRIDE
GO


-- 2. 해당 DB를 응급모드(32768 = EMERGENCY MODE)로 변경
UPDATE SYSDATABASES SET STATUS=32768 WHERE NAME = 'DB_NAME'


-- 3. SQL 서비스를 재시작
-- 서비스 재시작 작업시 서비스 중지
-- 기존 LDF 파일을 리네임 또는 COPY 하여 BACKUP 한 후 SQL 서비스 재시작


-- 4. 로그파일 재생성
-- DB의 LDF 파일이 초기화되면서 DB는 dbo만 사용가능한 상태로 활성화됨
DBCC REBUILD_LOG ('DB_NAME' , 'LDF 파일의물리적경로')


-- 5. DB의 상태를 먼저 확인
-- 복구한 DB의 상태는 '2048 = DBO USE ONLY'
SELECT * FROM SYSDATABASES


-- 6. 복구한 DB의 모드를 '기본모드= 0' 변경
UPDATE SYSDATABASES SET STATUS=0 WHERE NAME = 'DB_NAME'


-- 7. 시스템 카탈로그를 수정할 수 없게 설정
USE MASTER
GO

SP_CONFIGURE 'ALLOW UPDATE', 0
RECONFIGURE WITH OVERRIDE
GO

-- 8. DBCC CHECKDB
-- 일관성 오류가 있는지 검사
DBCC CHECKDB


-- 9. 일관성 오류를 수정하기 위해 USER를 싱글유저로 변경
ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE

-- 10. 오류수정
DBCC CHECKDB('DB_NAME', REPAIR_ALLOW_DATA_LOSS)


-- 11. 오류수정 후 다시 DBCC CHECKDB를 수행
DBCC CHECKDB


-- 12. 오류가 더 이상 없다면 USER 모드를 변경
USER MASTER
GO
ALTER DATABASE TESTDB SET MULTI_USER
GO



2. SQL 2005

--1. SUSPECT MARKT 해제
EXEC SP_RESETSTATUS 'DB_NAME';


--2. 모든 로그인이 해제
-- SYSADMIN 고정 서버역할의 멤버만 로그인 할 수 있게된다.
ALTER DATABASE DB_NAME SET EMERGENCY


-- 3. DBCC CHECKDB
-- 일관성 오류가 있는지 검사
DBCC CHECKDB


-- 4. 일관성 오류를 수정하기 위해 USER를 싱글유저로 변경
ALTER DATABASE DB_NAME SET SINGLE_USER WITH ROLLBACK IMMEDIATE


-- 5. 오류수정
DBCC CHECKDB('DB_NAME', REPAIR_ALLOW_DATA_LOSS)


-- 6. 오류수정 후 다시 DBCC CHECKDB를 수행
DBCC CHECKDB


-- 7. 오류가 더 이상 없다면 USER 모드를 변경
USER MASTER
GO
ALTER DATABASE TESTDB SET MULTI_USER
GO


참고:
http://www.codeproject.com/KB/reporting-services/SQL_2005_Suspect_Database.aspx
http://www.microsoft.com/korea/technet/sql/tuning_guide_developer03.mspx
http://winlife.tistory.com/entry/SQL-2000-DB-Suspect-발생-시-대처-요령

크리에이티브 커먼즈 라이선스
Creative Commons License
Posted by 리치타이거