바사아자'S BLOG

검색 :
RSS 구독 : 글 / 댓글 / 트랙백 / 글+트랙백

MS SQL 전체 백업, 차등 백업, 트랜잭션 백업 에서의 데이터베이스의 복원.

2010/02/12 12:42, 글쓴이 basaaja


1.데이터베이스 백업


1.1 백업 종류

 데이터베이스 백업의 종류는 다음과 같다.

전체 백업, 증분 백업, 차등 백업, 트랜잭션 백업


전체 백업 : 데이터베이스의 모든 데이터를 백업 하는 것을 의미 한다.

증분 백업 : 전체 백업후 증가한 데이터만 백업하며 다음 증분 백업시에는 마지막 증분 백업 데이터를 기준으로 증가한 데이터만 백업 한다. 그럼으로 매번 증분 백업 후의 늘어난 데이터베이스만 백업 함으로 백업 파일의 크기는 작지만 전체 백업 후 여러개의 증분 백업이 생성 됨으로 해당 되는 증분 백업을 모두 포함하여 복구 해야 함으로 번거롭고 복구에 시간이 걸리는 단점이 존재 한다.

차등 백업 : 전체 백업후 증가한 데이터만 백업하지만 차등 백업의 기준이 무조건 전체 백업 이후 임으로

백업되는 파일의 양은 많지만 복구시 전체 백업과 마지막 차등 백업 파일만을 가지고 복구 하게되어 시간이 단축된다.

트랜잭션 백업 : 지정된 시간에 지정된 크기의 트랜잭션 백업을 진행 할 경우 지정 시간안에 늘어난 데이터만큼만 백업 하고 지정된 크기로 LDF 파일을 재조정 하여 데이터베이스가 필요 이상으로 페이징을 하여 I/O가 증가 하는 것을 방지 할 수 있습니다.


1.2 적용된 백업

 이 문서에 적용된 적용된 백업은 다음과 같다.

 

 전체 백업, 차등 백업, 트랜잭션 백업


1.3 적용된 백업 스케쥴


 전체 백업 : 로컬 매일 04시 , 원격 04:30분

 차등 백업 : 매시 00분, 원격 매시 10분

 트랜잭션 백업 : 매 10분 마다, 백업 후 200MB로 재조정


 복원 가능 시점

*로컬 백업 : 장애 발생전 최대 10분의 데이터베이스












2.데이터베이스 복원


2.1 복원 준비 단계

1. 전체 백업 : 04시 생성 (파일명 ex : 데이터베이스1_backup_201002080400.bak ) 2. 차등 백업 : 10시 생성 (파일명 ex : 데이터베이스1 1_backup_201002081000.bak ) 3. 트랜잭션 백업 : 10시 10분, 10시 20분 생성 (파일명 ex : 데이터베이스1 1backup_20100208101000.trn , 데이터베이스1 1backup_20100208102000.trn )





2.2 복원 순서 및 방식

1. 모든 네트워크 연결을 차단한다. 콘솔 작업시 네트워크의 활성화되어 있는 네트워크를 중지 시키는 것만으로도 되며 원격 작업시 1433번 포트에 타 네트워크에서 접근을 하지 못하게 설정 한다.

2.윈도우 계정으로 로컬의 SQLServer에 접근 한다.

3.데이터베이스 (오른쪽 마우스 클릭) -> 데이터베이스 복원을 클릭 한다.

4.전체 백업을 복원 하기 위해 복원에 사용할 원본 -> 장치를 선택 후 우측의 “...” 을 클릭하여 백업 지정 창을 띄운 후 백업 미디어 : 파일 체크 하고 추가를 클릭 하여 전체 백업 파일을 선택한다.


5.복원에 사용할 원본 에서 목록에 있는 데이터베이스를 체크 한다.


6.상단의 복원 대상의 데이터베이스를 선택한다. ( 조금전에 선택한 데이터베이스 명이 새로 생겼을 것이다.)


7.전체 복원만 진행 하려면 여기서 바로 확인을 클릭 하면 바로 복원 작업이 진행 된다. 하지만 우린 차등 백업도 복원 할것임으로 왼쪽 페이지 선택 메뉴의 옵션을 선택한다.  

8.복원 옵션에서 데이터베이스 파일을 다음으로 복원 에서 복원될 장소를 지정 할 수도 있다.


9.복구 상태에서 “데이터베이스를 비작동 상태로 유지하고 커밋되지 않은 트랜잭션을 롤백하지 않습니다. 추가 트랜잭션 로그를 복원 할 수 있습니다” 를 선택후 확인을 클릭하면 전체 복구를 진행 한다.

10. 전체 복구를 완료 하였다. 여기까지가 오전 04시까지의 복원이 완료된것이다.


11. 정상적으로 전체 백업이 복원 되면 다음과 같은 화면을 볼 수 있다. ( 전체백업만 진행한 것이라면 아래 화면과는 다르게 정상으로 보이지만 차등 백업을 진행 한다면 다음의 화면과 같이 복원 중... 으로 떠야 정상이다.


12. 차등 백업을 복원 한다. 복원할 파일만 차등 백업 파일을 선택하며 전체적인 과정은 아래와 같다. 이미지로 설명을 대처 하겠다. 데이터베이스 복원을 선택 한다.


13. 모든 순서는 파일명을 제외한 전체 백업 복원과 동일 하다 . ( * 옵션에서 복원 상태 2번째의 “데이터베이스를 비작동 상태로 유지하고 커밋되지 않은 트랜잭션을 롤백하지 않습니다. 추가 트랜잭션 로그를 복원 할 수 있습니다” 를 선택한다. ) 물론 여기서 다음의 트랜잭션 백업 복구를 진행 하지 않을 것이라면 복원 옵션의 첫번째를 선택후 확인을 클릭하면 복원후 추가 복원을 하지 않게 된다.




14. 차등 백업의 복원을 완료 하였다. 여기까지가 오전 10시 데이터까지 복구가 완료 된것이다.


15. 트랜잭션 백업의 복원을 진행 할 것이다. 작업 -> 복원 -> 트랜잭션 로그를 선택 한다.


16. 복구해야할 트랜잭션 로그가 총 2개인것을 기억 해두고 (10시 10분, 10시 20분의 트랜잭션) 아래의 복원할 트랜잭션 10시 10분에 생성된 것을 선택한다. 또한 아래의 복원 위치를 통하여 복구할 좀더 정확한 시간의 지정도 가능하다. 우리는 트랜잭션을 10분마다 백업했음으로 트랜잭션이 작성된 10분 이내에서만 가능 할 것이다.


17.여기서도 옵션 에서 복구 상태 2번째를 선택해야 추가로 트랜잭션을 복구 할 수 있다. 물론 복구를 종료 하려면 첫번째를 선택한다.


18. 확인을 클릭 한다. 여기까지가 10시 10분의 데이터까지 복원된 상태이다.



19. 10시 20분의 트랜잭션 복원도 위의 (15번 이후) 트랜잭션 복원과 동일하다. 단 복원 파일은 10시 20분의 트랜잭션 로그이며 옵션 의 복구 상태는 첫번째를 선택하여 모든 복원이 종료 됨을 알려야 한다. 확인을 클릭한다.



20. 완료 되었다는 메세지를 볼 수 있다. 이제는 정말로 데이터베이스가 복원 된것이다.

21. 데이터베이스 목록에서 아래의 그림과 같이 기존에는 “복원 중...” 에서 정상적인 데이터베이스명이 표시 되는것을 확인 할 수 있다.


22. 네트워크 단에서 1433port 로 다른 사용자의 정상적인 SQLServer 접속을 허용 한다.


2.3 복원된 데이터의 확인

*최근 사용자 로그인 정보등의 로그 테이블에서 조회를 해보면 알 수 있다. (이건 데이터베이스 마다 다름으로 로그 관련된 테이블을 직접 찾아 보기 바란다.)

크리에이티브 커먼즈 라이센스
Creative Commons License
2010/02/12 12:42 2010/02/12 12:42

맨 위로

mysql 5.0.44 사용자 계정 추가& INNODB

2008/06/19 09:37, 글쓴이 basaaja
test base : mysql 5.0.44

mysql 5.0.44 사용자 계정 추가 



* 사용자 추가
insert into user values ('localhost','아이디',password('비밀번호'),'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y', 'Y','Y','Y','Y','Y','Y','0','0','0','0');

* DB 추가
insert into db values ('%',' 데이터베이스명','아이디','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y','Y');

flush privileges;

SHOW VARIABLES LIKE 'have_innodb';SHOW STATUS LIKE '%innodb%';
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/06/19 09:37 2008/06/19 09:37

맨 위로

DB 백업 후 복구시 사용자 계정이 일치 하지 않을때 연결 방법

2008/06/17 15:16, 글쓴이 basaaja
Test Base : ms-sql 2005

데이터 베이스를 bak파일로 부터 복구 시에는 데이터 베이스의 사용자와 로그인 계정이 일치

하지 않아서 문제가 발생 한다. 이때는 아래의 SP로 사용자와 계정을 일치 시킨다.

*선행 작업 : 사용자를 백업의 사용자와 같은 이름으로 먼저 추가 시킨다.

1. 연결 되지 않은 사용자 조회
use 데이터베이스명;
exec sp_change_users_login 'Report';

2.사용자와 계정 연결
use 데이터베이스명 ;
go
exec sp_change_users_login 'Auth_Fix','사용자',null,'비밀번호';


관련 링크 : How to troubleshoot orphan users in SQL Server databases?
크리에이티브 커먼즈 라이센스
Creative Commons License
2008/06/17 15:16 2008/06/17 15:16

맨 위로

GROUP BY Example

2003/06/23 18:21, 글쓴이 basaaja
SET STATISTICS TIME ON
SELECT p.prIdx,min(p.prTitle),min(p.prImagePath),count(r.rvIdx) as count  FROM beauty_product as p LEFT JOIN beauty_reView as r ON p.prIdx = r.rvPrIdx
GROUP BY p.prIdx
크리에이티브 커먼즈 라이센스
Creative Commons License
2003/06/23 18:21 2003/06/23 18:21

맨 위로

SQL - rowid 를 이용한 중복된 행 삭제

2003/05/06 00:51, 글쓴이 basaaja
delete from AeRang  
where rowid in ( select max(a.rowid) from AeRang a, ( select Name, count(*) from AeRang  
group by Name having count(*) > 1 ) b  
where a.Name = b.Name );  

크리에이티브 커먼즈 라이센스
Creative Commons License
2003/05/06 00:51 2003/05/06 00:51

맨 위로

SET STATISTICS IO ON - 페이지 I/O 빈도 발생 출력

2003/04/22 15:05, 글쓴이 basaaja
SET STATISTICS IO ON

해보세요 뭐라고 나오는지 ;;
크리에이티브 커먼즈 라이센스
Creative Commons License
2003/04/22 15:05 2003/04/22 15:05

맨 위로

SET STATISTICS TIME ON - 쿼리 실행 시간 측정

2003/04/22 15:04, 글쓴이 basaaja
SET STATISTICS TIME ON

쿼리 실행 시간을 측정한다

쿼리분석기에 입력하고 쿼리를 실행하면 결과가 출력된다.

ex>

SET STATISTICS TIME ON
SELECT * FROM goods

-----------------------------
SQL Server 실행 시간:
   CPU 시간 = 156ms, 경과 시간 = 14494ms.
ms = milli second , 10의 마이너스 3승 -_-;;

크리에이티브 커먼즈 라이센스
Creative Commons License
2003/04/22 15:04 2003/04/22 15:04

맨 위로

sql - 클러스트된 인덱스와 클러스트되지 않은 인덱스의 짧은 글

2003/04/22 14:41, 글쓴이 basaaja
클러스터 색인(Clustered Index)

물리적인 행의 순서와 색인된 순서가 동일하다.

        - 연속적인 키 값을 가지는 컬럼들을 검색할 때 유리하다

        일정한 범위를 주고 찾는 경우에 속도 향상에 도움이 된다.

        - 클러스터 색인은 테이블의 물리적 순서를 바꾼다.

        색인의 리프에 실제 데이터가 존재한다.

        - 디폴트는 비 클러스터 색인이다.



고려사항

        - 모든 테이블은 단지 하나의 클러스터 색인을 가질 수 있다.

        - 색인을 생성하는 동안 실제 색인을 저장할 공간의 두배가 필요하다.

        tempdb가 아닌 해당 데이터베이스에 공간이 필요하다

        SORTED DATA키워드를 사용하면 필요한 공간이 줄어든다.

        - 다른 색인보다 가장 먼저 생성되어야한다.

모든 기본키는 클러스터 색인이다?

        - 정렬되어 있어야 더 좋은 속도를 낼 수 있는 컬럼을 클러스터 색인으로 하는 것이 좋다.



비클러스터 색인(Nonclustered Index)

테이블의 논리적인 순서를 가리키는 객체를 생성한다.

        - 컬럼의 물리적인 순서와 색인된 순서가 다르다.

        색인의 리프는 순서와 색인된 순서가 다르다.

        - 일정한 범위를 주고 찾는 경우에는 Table Scan보다 더 느리다.

        - Covered Query의 경우에 유리하다.



고려사항

        - 테이블에 최대 249개의 비 클러스터 색인을 생성할 수 있다

        - 클러스터 색인을 가장 먼저 생성하는 것이 좋다.

        클러스터 색인을 생성한 뒤에 비 클러스터 색인을 생성해야한다.

        비클러스터 색인을 생성한 후에 클러스터 색인을 생성하면 기존의 모든 비 클러스터 색인을 재 생성하게 된다.

출처 : sqler.pe.kr

크리에이티브 커먼즈 라이센스
Creative Commons License
2003/04/22 14:41 2003/04/22 14:41

맨 위로

랜덤 레코드를 가져오는 SP

2003/04/15 23:44, 글쓴이 basaaja


SET NOCOUNT ON


-- CHECK FOR THE TABLE CALLED 'RETORNO'
IF EXISTS (SELECT * FROM DBO.SYSOBJECTS
WHERE ID = OBJECT_ID(N'[DBO].[RETORNO]')
AND OBJECTPROPERTY(ID, N'ISUSERTABLE') = 1)
        DROP TABLE [DBO].[RETORNO]

-- CREATES THE TABLE

CREATE TABLE RETORNO
(
        CAMPO  CHAR(50)
)


-- IF THE USER DON'T WANT SAME RESULTS ,
--CREATE A TEMPORARY TABLE
IF @REPETIR = 'N'
BEGIN
        CREATE TABLE #ALE
        (
                COD INT
        )
END

-- GET THE TOTAL NUMBER OF RECORDS ,
--USING THE SYSINDEXES TABLE
SELECT @TOTAL = ROWS FROM SYSINDEXES
WHERE ID = object_ID(@TABELA)
AND INDID < 2

-- IF THERE IS A TABLE....
IF @TOTAL IS NOT NULL
BEGIN
        
-- CLEAN THE COUNTER
SELECT @CONTADOR = 0
        
-- DO A LOOP SEVERAL TIMES TO GET THE NUMBER ,
--AND RECORDS , OF RANDOM RECORDS THAT THE USER WANT
WHILE @CONTADOR <> @VEZES
BEGIN

-- INCREASE THE COUNTER
SELECT @CONTADOR = @CONTADOR + 1

-- GET A RANDOM NUMBER USING THE DATE....
SELECT  @VAL = REVERSE((DATEPART(mm, GETDATE()) * 100000 )
          + (DATEPART(ss, GETDATE()) * 1000 )
          + DATEPART(ms, GETDATE()))
        
SELECT @AUX = CONVERT(CHAR,@VAL * ( @CONTADOR )  )
        
SELECT @AUX = REVERSE(SUBSTRING(@AUX,3,5))

SELECT @VALOR = (CONVERT(INT,@AUX)%@TOTAL)+1
        

-- IF THE USER DON'T WANT TO REPEAT DATA...
IF @REPETIR = 'N'
BEGIN
-- CHECK FOR THE USE OF THIS NUMBER
IF NOT EXISTS(SELECT COD FROM #ALE WHERE COD = @VALOR)
BEGIN
                
-- CREATE A DYNAMIC CURSOR WITH SOME RECORDS.
--THE LAST WILL BE THAT RANDOM
EXECUTE('DECLARE CUR_MEU CURSOR SCROLL FOR  SELECT TOP '
        + @VALOR + ' ' + @CAMPO+ ' FROM ' +@TABELA )

OPEN CUR_MEU
-- GO TO THE LAST RECORD
FETCH LAST FROM CUR_MEU INTO @NAME

-- INSERT THE DATA IN THE RETURN TABLE
INSERT INTO RETORNO VALUES(@NAME)

CLOSE CUR_MEU

DEALLOCATE CUR_MEU
                                
-- STORE THE RANDOM NUMBER IN A TABLE
--TO AVOID THE USE OF THIS NUMBER AGAIN
INSERT INTO #ALE VALUES(@VALOR)
                                
END
ELSE
BEGIN
-- IF THIS NUMBER WAS USED THEN
-- DECREASE THE COUNTER AND TRY AGAIN...
SELECT @CONTADOR = @CONTADOR - 1
END
                        
END                
ELSE
BEGIN
-- CREATE A DYNAMIC CURSOR WITH SOME RECORDS.
-- THE LAST WILL BE THAT RANDOM
EXECUTE('DECLARE CUR_MEU CURSOR SCROLL FOR  SELECT TOP '
   + @VALOR + ' ' + @CAMPO+ ' FROM ' +@TABELA )

OPEN CUR_MEU

-- GO TO THE LAST RECORD
FETCH LAST FROM CUR_MEU INTO @NAME

-- INSERT THE DATA IN THE RETURN TABLE
INSERT INTO RETORNO VALUES(@NAME)

CLOSE CUR_MEU

DEALLOCATE CUR_MEU
                                
END
                
END
        
SET NOCOUNT OFF
END

-- IF THE TABLE WAS CREATED , WE MUST DROP IT
IF @REPETIR = 'N'
BEGIN
        DROP TABLE #ALE
END


-- RETURN TO THE USER ALL RANDOM RECORDS
SELECT CAMPO FROM RETORNO

-- DROP THE TABLE WITH THE RANDOM RECORDS
DROP TABLE RETORNO

GO

/* END OF THE STORED PROCEDURE */
        

/* ----------------------------------
USE OF THE STORED PROCEDURE:
1-ARGUMENT: HOW MUCH RANDOM RECORDS
THE STORED PROCEDURE SHOULD RETURN
2-ARGUMENT: NAME OF THE TABLE WICH
THE RANDOM RECORDS SHOULD RETURN
3-ARGUMENT: FIELD ( COLUMN ) OF THE TABLE.
MUST BE A CHAR(50) OR LEAST. THIS CAN BE CHANGED
BY OTHERS DATATYPES WITH A FEW MODIFICATIONS

4?ARGUMENT:  
'S'-> THE PROCEDURE CAN RETORN SAME RANDOM RECORDS
              
'N'-> ALL RECORDS RETURNED SHOULD BE DIFFERENT

OBSERVATION: THIS FOLLOWING EXAMPLES ARE
TESTED BASED ON THE TABLES OF THE NORTHWIND DATABSES
CREATED BY THE INSTALATION PROGRAMAN OF
SQL SERVER 7.0 AND 2000

*/


EXEC PROC_RANDOM 10,'PRODUCTS' , 'PRODUCTNAME', 'S'

EXEC PROC_RANDOM 10,'SUPPLIERS' , 'COMPANYNAME'  , 'N'

EXEC PROC_RANDOM 10,'SUPPLIERS' , 'COMPANYNAME'  , 'S'

EXEC PROC_RANDOM 10,'SUPPLIERS' , 'CompanyName+contactName'  , 'S'

EXEC PROC_RANDOM 10,'SUPPLIERS' , 'CompanyName+contactName'  


/*******************************************/
/* END OF FILE */



크리에이티브 커먼즈 라이센스
Creative Commons License
2003/04/15 23:44 2003/04/15 23:44

맨 위로

SqlServer Sp - 해당월의 마지막일 구하기

2003/04/15 23:14, 글쓴이 basaaja
select dateadd(day,-datepart(dd,@idate),dateadd(month,1,@idate))
크리에이티브 커먼즈 라이센스
Creative Commons License
2003/04/15 23:14 2003/04/15 23:14

맨 위로