MS SQL 비트연산(&)

DataBase/MS-SQL|2020. 12. 22. 10:42
반응형

사용 배경은 계속적으로 추가되는 Flag 컬럼에 대해 고민 중 하나의 공용 컬럼에 값을 다 넣어버리기로 함.

 

 

DECLARE @i INT
SET @i = 6
SELECT @i & 1  , 결과 => 0
SELECT @i & 2  , 결과 => 2 
SELECT @i & 4  , 결과 => 4
SELECT @i & 6  , 결과 => 6
SELECT @i & 8  , 결과 => 0

 

INT 타입의 컬럼에 정수형 데이터를 넣고 2진법으로 보아 계산을 하는 방법.

 

2번째 조회인 @i & 2 의 내용을 보면.

 

6 > 0110

2 > 0010

======

      0010  > 2

결과 값이 2가 나온다.

 

일반적으로 사용할 경우에는

 

SELECT *

FROM 테이블

WHERE 컬럼 & 2 > 0

위와 같이 0보다 크거나(True) 작은 경우(False)로 구분하여 사용된다.

 

 

ex)

취미 체크하기

ㅁ 축구(1) ㅁ농구(2) ㅁ독서(4)

 

위와 같이 체크박스가 있는 경우 취미가 축구와 독서일 경우

저장값은 두 값의 합을 넣는다.   >> 5 

 


DECLARE @i INT
SET @i = 5
SELECT @i & 1  , 결과 => 1
SELECT @i & 2  , 결과 => 0
SELECT @i & 4  , 결과 => 4

 

 

축구가 포함된 경우를 찾으려면


SELECT *
FROM TABLE

WHERE 취미 & 1 > 0 

 

위와 같이 찾는다.

 

 

댓글()

SSMS 완료시간 : 안 보여지도록 옵션 수정

DataBase/MS-SQL|2020. 12. 16. 09:32
반응형

SSMS(SQL Server Management Studio)

 

도구 - 옵션에 아래 옵션을 체크 해제 하면 됩니다.

 

쿼리실행 - SQL Server - 고급 - 완료 시간 표시 체크 해제

 

댓글()

디비 백업 프로시저 및 리포트 메일 발송 기능

DataBase/MS-SQL|2020. 10. 5. 22:30
반응형

전문가 분들은 광고 클릭후 닫아주시면 감사하겠습니다. :)

저와 같이 운영관리에 익숙치 않은 분들을 위한 실 사용 사례입니다.

 

 

1. master DB에 백업 기록을 위한 테이블을 생성했습니다.

USE [master]
GO
-- 시작안되는 경우도 발생하기 때문에 startDt 기본값을 넣지 않음.  
CREATE TABLE [dbo].[tblBackupDB](
	[dbName] [varchar](50) NULL,
	[startDt] [datetime] NULL,
	[endDt] [datetime] NULL,
	[msg] [ntext] NULL,
	[mdfSize] [int] NULL,
	[ldfSize] [int] NULL
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

 

 

2. 백업을 위한 프로시저 생성, DATEPART를 이용해 특정 요일마다 풀백업과 차등백업을 반복하도록 설정.

 

샘플을 위해 특정 요일에 풀백업 그 외 차등백업으로 규정하였으나

 

적절한 풀백업과 차등백업을 번갈아가며 환경에 맞는 주기를 설정합니다.

 

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_DataBaseBackup]
AS
BEGIN
	
	DECLARE @dbName varchar(4000), @SQL varchar(4000) 
	DECLARE @yoil int , @mdfSize int , @ldfSize int 
	
	SELECT @yoil = DATEPART(WEEKDAY,GETDATE())
	 
	-- 백업대상 기록 , 시스템 디비는 제외
	INSERT INTO master.dbo.tblBackupDB(dbName) 
		SELECT name 
			FROM sys.databases 
			WHERE UPPER(name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')

	-- 서버 아이피 체크
	declare @ip_v4 varchar(16) 
	SELECT DISTINCT @ip_v4 = local_net_address
	FROM sys.dm_exec_connections
	WHERE local_net_address IS NOT NULL and local_net_address <> '127.0.0.1' 

	DECLARE bk_cursor CURSOR FOR 
		SELECT name 
			FROM sys.databases 
			WHERE UPPER(name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')
	OPEN bk_cursor

	FETCH NEXT FROM bk_cursor 
	INTO @dbName 

	WHILE @@FETCH_STATUS = 0
	BEGIN
		BEGIN TRY
			-- mdf 파일 사이즈
			SELECT @mdfSize = SUM(size)*8/1024	--MB
			FROM sys.databases   
			JOIN sys.master_files  
			ON sys.databases.database_id=sys.master_files.database_id  
			WHERE sys.databases.name = @dbName and type='0'
			 
			-- ldf 파일 사이즈
			SELECT @ldfSize = SUM(size)*8/1024	--MB
			FROM sys.databases   
			JOIN sys.master_files  
			ON sys.databases.database_id=sys.master_files.database_id  
			WHERE sys.databases.name = @dbName and type='1'

			-- 백업시작 기록/용량 기록 
			UPDATE master.dbo.tblBackupDB 
				SET startDt = GETDATE() , mdfSize = @mdfSize, ldfSize = @ldfSize
				WHERE dbname = @dbName 
					AND startDt is null

			IF @yoil = 7 -- 토요일은 풀백업 
				BEGIN
					--풀백업	
					SET @SQL = 'BACKUP DATABASE ['+@dbName+'] TO DISK = N''D:\Backup\'+convert(varchar(30), getdate(),112)+'_'+@dbName+'.bak'' WITH COMPRESSION, INIT, NAME = '''+@dbName+' - Backup'', SKIP, NOREWIND, NOUNLOAD, STATS = 10;'
				END 
			ELSE	 -- 주간은 차등백업
				BEGIN
					--차등백업			
					SET @SQL = 'BACKUP DATABASE ['+@dbName+'] TO  DISK = N''D:\Backup\'+convert(varchar(30), getdate(),112)+'_'+@dbName+'.bak'' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'''+@dbName+' - Backup'', SKIP, NOREWIND, NOUNLOAD,  STATS = 10;'
				END 
			--print @SQL
			EXEC (@SQL)
		
			-- 백업종료 기록 
			UPDATE master.dbo.tblBackupDB 
				SET endDt = GETDATE()
				WHERE dbname = @dbName 
					AND CONVERT(CHAR(10),startDt,23) = CONVERT(CHAR(10),GETDATE(),23)  
					AND endDt IS NULL  

		END TRY
		BEGIN CATCH
				-- 에러 기록 
				UPDATE master.dbo.tblBackupDB 
					SET msg = 'ERROR_NUMBER : ' + CAST(ERROR_NUMBER() AS VARCHAR) + '
						 ERROR_MESSAGE: ' + ERROR_MESSAGE()
					WHERE dbname = @dbName 
						AND CONVERT(CHAR(10),startDt,23) = CONVERT(CHAR(10),GETDATE(),23)  
						AND endDt IS NULL  
		END CATCH

		FETCH NEXT FROM bk_cursor 
		INTO @dbName 
	END 
	CLOSE bk_cursor;
	DEALLOCATE bk_cursor;

	-- FREEPROCCACHE 는 메모리 상에 전체 캐시를 비우기 
	-- https://bit.ly/3icmJ85
	DBCC FREEPROCCACHE; 
END

 

 

 

3. 백업 후 남겨진 기록과 msdb.dbo.backupset 테이블 데이터를 참조하여 리포팅 메일 발송.

메일 발송을 위해 데이터베이스 메일 구성이 되어있어야 합니다.

 html 코딩은 개인 취향대로.. msdb.dbo.backupset 에는 생각보다 많은 정보가 들어있습니다.

bit.ly/2Gxce24 참고

 

USE [master]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
 
ALTER PROCEDURE [dbo].[spSendBackupReport]
AS
BEGIN 
	SET NOCOUNT ON; 

	DECLARE @dbName varchar(100),@sDt datetime , @eDt datetime , @result nvarchar(50)
	DECLARE @html varchar(max) , @ip_v4 varchar(16) , @subject varchar(200)
	DECLARE @idx int , @mdfSize int , @ldfSize int  , @backupSize int ,@totalBackupSize bigint , @BackupType nvarchar(20)

	SET @idx = 1

	SELECT DISTINCT @ip_v4 = local_net_address
	FROM sys.dm_exec_connections
	WHERE local_net_address IS NOT NULL and local_net_address <> '127.0.0.1' 

	SET @subject =  'DB Server Backup Report - '+ @ip_v4
	SET @totalBackupSize = 0

	SET @html = ' 
		<div><h2>시스템에서 자동 발송되는 DB 백업 결과 메일입니다.</h2></div>
		<div><h3> IP : '+@ip_v4+'</h3></div>
		<div><h3> DATE : '+ CONVERT(VARCHAR(10) , GETDATE(),121) +'</h3></div>
		<div><h3> Total Backup Size : #TOTALBACKUPSIZE#   ( ※ 단순참고용, 연산에 의한 오차발생 ) </h3></div>
		<table style="border-collapse: collapse;font-size: small;">
			<tr>
				<td colspan="6">&nbsp;</td>
			</tr>
			<tr "class="tr">
				<td style="width:20px;border: 1px solid black;text-align:center;padding: 5px;">#</td>
				<td style="width:150px;border: 1px solid black;text-align:center;padding: 5px;">DB</td>
				<td style="width:150px;border: 1px solid black;text-align:center;padding: 5px;">DB Size</td>
				<td style="width:180px;border: 1px solid black;text-align:center;padding: 5px;">Backup Size<br/>/ Type</td>
				<td style="width:100px;border: 1px solid black;text-align:center;padding: 5px;">Start<br/>/ End</td>
				<td style="width:100px;border: 1px solid black;text-align:center;padding: 5px;">Processing Time (Min.)</td>
				<td style="width:70px;border: 1px solid black;text-align:center;padding: 5px;">Result</td>
			</tr>
	'

	-- https://bit.ly/2Gxce24 // msdb.dbo.backupset 백업셋 데이터 테이블 참조 

	DECLARE vendor_cursor
	CURSOR FOR
		SELECT D.name ,B.startDt , B.endDt 
		, case when B.endDt is null then '<span style="color:red;font-weight:bold;">실패</span>' else '성공' end as result
		, B.mdfSize ,  B.ldfSize
		, BS.compressed_backup_size 
		, case Type when  'I' then N'차등백업' when 'D' then N'풀백업' end as BackupType
		FROM sys.databases D 
			LEFT OUTER JOIN tblbackupDB B 
				ON D.name = DBNAME  AND CONVERT(CHAR(10),endDt,23) = CONVERT(CHAR(10),GETDATE(),23)
			LEFT OUTER JOIN msdb..backupset BS 
				ON D.name = BS.database_name AND  CONVERT(CHAR(10),BS.backup_start_date,23) = CONVERT(CHAR(10),GETDATE(),23)
		WHERE UPPER(D.name) NOT IN ('MASTER','MODEL','MSDB','TEMPDB')
	OPEN vendor_cursor
	FETCH NEXT FROM vendor_cursor
	INTO @dbName ,@sDt , @eDt, @result , @mdfSize , @ldfSize , @backupSize , @BackupType

	WHILE @@FETCH_STATUS = 0
		BEGIN
		SET @html +='
		<tr>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ cast(@idx as varchar) +'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+@dbName+'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">DATA : '+ CAST(FORMAT(isnull(@mdfSize,0)/1024, N'#,0') AS VARCHAR)+' GB <br/>Log : '+ CAST(FORMAT(isnull(@ldfSize,0), N'#,0') AS VARCHAR)+' MB</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ CAST(FORMAT(isnull(@backupSize,0)/1024/1024, N'#,0') AS VARCHAR)+' MB<br/>'+ @BackupType+'</td> 
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+ltrim(rtrim(isnull(CONVERT(CHAR(8), @sDt, 8),'-')))+'<br/>'+ltrim(rtrim(isnull(CONVERT(CHAR(8), @eDt, 8),'-')))+'</td> 
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+case when ltrim(rtrim(isnull(DATEDIFF(MINUTE,@sDt,@eDt),'-'))) = '0' then N'1 미만' else ltrim(rtrim(isnull(DATEDIFF(MINUTE,@sDt,@eDt),'-')))  end +'</td>
			<td style="border: 1px solid black;text-align:center;padding: 5px;">'+@result+'</td>
		</tr>
		'

		SET @totalBackupSize += @backupSize
		SET @idx = @idx + 1
		FETCH NEXT FROM vendor_cursor
		INTO @dbName ,@sDt , @eDt, @result, @mdfSize , @ldfSize  , @backupSize , @BackupType
	END
	CLOSE vendor_cursor;
	DEALLOCATE vendor_cursor;

	SET @html += '</table>'

	SET @html = replace(@html,'#TOTALBACKUPSIZE#',CAST(FORMAT(isnull(@totalBackupSize,0)/1024/1024, N'#,0') AS VARCHAR)+' MB')
	  
	EXEC msdb. dbo.sp_send_dbmail	-- sp_send_dbmail 상세 >> https://bit.ly/30zkdTj 
		@profile_name='메일프로필',
		@body_format = 'HTML' , -- 바디타입
		@recipients= '받을사람',
		@blind_copy_recipients= '숨김참조',
		@subject = @subject,
		@body =@html
END

 

 

4. 결과적으로 시스템에서 발송해서 수신된 메일은 아래와 같습니다.

 

 

 

적당히 내용을 수정하여 입맛에 맛도록 수정 사용하시기 바랍니다.

댓글()

저장하지 않은 쿼리 확인 하는 방법 , 강제 종료 시 쿼리 복구

DataBase/MS-SQL|2020. 9. 29. 23:34
반응형

때때로 ssms가 강제 종료 된다거나 저장하지 않고 닫았을 때

SQL 쿼리를 복구 해야하는 경우 아래의 쿼리에서 일정 시간동안 쿼리 확인이 가능합니다.

 

Use <database>
SELECT execquery.last_execution_time AS [Date Time], execsql.text AS [Script] FROM sys.dm_exec_query_stats AS execquery
CROSS APPLY sys.dm_exec_sql_text(execquery.sql_handle) AS execsql
ORDER BY execquery.last_execution_time DESC

 

 

참조 Url : qastack.kr/programming/15034832/recover-unsaved-sql-query-scripts

댓글()

SQL Server 에이전트에 등록된 작업 목록 조회

DataBase/MS-SQL|2020. 8. 5. 17:10
반응형

SQL Server 에이전트에 등록된 작업 목록을 조회 하는 SQL 입니다.

SELECT
	A.name,
	case description when '설명이 없습니다.' then '' else description end as description,   
  CASE convert(
    nvarchar(3), 
    [freq_type], 
    3
  ) WHEN 4 THEN N' 매일' WHEN 8 THEN N' 매주 ' + CASE WHEN [freq_interval] & 1 = 1 THEN N'일' ELSE '' END 
	+ CASE WHEN [freq_interval] & 2 = 2 THEN ' 월' ELSE '' END + CASE WHEN [freq_interval] & 4 = 4 THEN ' 화' ELSE '' END + CASE WHEN [freq_interval] & 8 = 8 THEN ' 수' ELSE '' END + CASE WHEN [freq_interval] & 16 = 16 THEN N' 목' ELSE '' END + CASE WHEN [freq_interval] & 32 = 32 THEN N' 금' ELSE '' END + CASE WHEN [freq_interval] & 64 = 64 THEN N' 토' ELSE '' END WHEN 16 THEN N'하루 한번 ' 
	+ CAST(
    [freq_interval] AS VARCHAR(3)
  ) + N' 매달 ' + CAST(
    [freq_recurrence_factor] AS VARCHAR(3)
  ) + N' 매달' WHEN 32 THEN N'발생 ' + CASE [freq_relative_interval] WHEN 1 THEN N'첫째' WHEN 2 THEN N'둘째' WHEN 4 THEN N'셋째' WHEN 8 THEN N'넷째' WHEN 16 THEN N'마지막' END + ' ' + CASE [freq_interval] WHEN 1 THEN N'일' WHEN 2 THEN N'월' WHEN 3 THEN N'화' WHEN 4 THEN N'수' WHEN 5 THEN N'목' WHEN 6 THEN N'금' WHEN 7 THEN N'토' WHEN 8 THEN N'일' WHEN 9 THEN N'평일' WHEN 10 THEN N'주말' END + N' 모든 ' + CAST(
    [freq_recurrence_factor] AS VARCHAR(3)
  ) + N' 매달' END AS [Recurrence], 
  CASE convert(
    nvarchar(3), 
    [freq_subday_type], 
    3
  ) WHEN 1 THEN  STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 2 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 초(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 4 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 분(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) WHEN 8 THEN N'주기적 발생 ' + CAST(
    [freq_subday_interval] AS VARCHAR(3)
  ) + N' 시간(s) 간격 ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_start_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) + ' & ' + STUFF(
    STUFF(
      RIGHT(
        '000000' + CAST(
          [active_end_time] AS VARCHAR(6)
        ), 
        6
      ), 
      3, 
      0, 
      ':'
    ), 
    6, 
    0, 
    ':'
  ) END [Frequency],  D.step_id, D.step_name, D.command 
FROM msdb.dbo.sysjobs A 
	INNER JOIN msdb.dbo.sysjobschedules B ON A.job_id = B.job_id 
	INNER JOIN msdb.dbo.sysschedules C ON B.schedule_id = C.schedule_id 
	INNER JOIN msdb.dbo.sysjobsteps D ON A.job_id = D.job_id  
ORDER BY A.name

 

실행 결과는 대략 아래와 같이 조회가 됩니다.

 

댓글()

백업 혹은 복구중인 데이터베이스 진행률 확인

DataBase/MS-SQL|2020. 8. 5. 10:03
반응형

백업 혹은 복구 중인 데이터 베이스의 진행 상태나 진행률을 확인하는 SQL 입니다.

 

경과된 시간 , 남은 시간 , 예상 소요 시간등을 확인 할 수 있습니다.

 

SELECT r.session_id,r.command
,cast(CONVERT(NUMERIC(6,2),r.percent_complete)  as varchar) + ' %' AS [Percent Complete]
,CONVERT(VARCHAR(20),DATEADD(ms,r.estimated_completion_time,GetDate()),20) AS [ETA Completion Time]
,CONVERT(NUMERIC(10,2),r.total_elapsed_time/1000.0/60.0) AS [Elapsed Min]
,CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0) AS [ETA Min]
,CONVERT(NUMERIC(10,2),r.estimated_completion_time/1000.0/60.0/60.0) AS [ETA Hours]
,CONVERT(VARCHAR(1000),(SELECT text FROM sys.dm_exec_sql_text(sql_handle))) AS [SQL] 
FROM sys.dm_exec_requests r WHERE command IN ('RESTORE DATABASE','BACKUP DATABASE')

 

댓글()

프로시저(sp)에서 사용하는 테이블 목록 , 특정 테이블을 참조하는 프로시저 목록

DataBase/MS-SQL|2020. 8. 4. 18:05
반응형

테이블의 속성이 변경되었을 때

혹은 컬럼 속성이 변경되었을 때 

아니면 테이블의 용도나 정체(?)를 알 수 없을 때

관련된 sp를 확인하기 위해서 개인적으로 자주 사용하는 SQL 입니다.

 

특정 프로시저에서 사용하는 테이블 목록을 조회하는 SQL 문입니다.

 

-- 프로시저에서 사용하는 테이블 목록
;WITH stored_procedures AS 
(   

    SELECT oo.name AS table_name,   o.name,
		ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row   
    FROM sysdepends d   
	    INNER JOIN sysobjects o ON o.id=d.id   
	    INNER JOIN sysobjects oo ON oo.id=d.depid   
    WHERE o.xtype = 'P' AND o.name LIKE '%프로시저명%' 
)  

SELECT name,Table_name FROM stored_procedures  
WHERE row = 1

 

반대로 특정 테이블을 참조하는 프로시저 목록을 조회하는 SQL문 입니다.

 

-- 특정 테이블을 참조하는 프로시저 목록
;WITH stored_procedures AS 
(   

    SELECT oo.name AS table_name,   o.name,
		ROW_NUMBER() OVER(partition by o.name,oo.name ORDER BY o.name,oo.name) AS row   
    FROM sysdepends d   
	    INNER JOIN sysobjects o ON o.id=d.id   
	    INNER JOIN sysobjects oo ON oo.id=d.depid   
    WHERE o.xtype = 'P' AND oo.name = '테이블명' 
)  

SELECT name,Table_name FROM stored_procedures  
WHERE row = 1

댓글()

MSSQL 차등백업 방법 및 SQL

DataBase/MS-SQL|2020. 4. 13. 17:01
반응형

차등 백업은 전체 백업 마지막 시점을 기준으로 이후에 수정된 내용을 백업는 방법입니다.

기본적인 내용과 SQL문을 공유합니다.

 

-- 전체 백업

BACKUP DATABASE [test] TO  DISK = N'D:\Backup\test_full.bak' WITH NOFORMAT, NOINIT,  NAME = N'test-전체 데이터베이스 백업', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

 

 

-- 차등백업 1 

BACKUP DATABASE [test] TO  DISK = N'D:\Backup\test_1.bak' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'test-전체 데이터베이스 백업', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

 

 

-- 차등백업 2 

BACKUP DATABASE [test] TO  DISK = N'D:\Backup\test_2.bak' WITH  DIFFERENTIAL , NOFORMAT, NOINIT,  NAME = N'test-전체 데이터베이스 백업', SKIP, NOREWIND, NOUNLOAD,  STATS = 10

GO

 

 

 

-- 기본 전체 백업 + 차등 복구

문법

RESTORE DATABASE [디비명] FROM DISK = N'풀백업위치'

               WITH MOVE '논리적 DB명' TO 'mdf 복구위치'

                            ,MOVE '논리적 LOG명' TO 'ldf 복구위치',  NORECOVERY,  NOUNLOAD,  STATS = 5;

RESTORE DATABASE [tes디비명] FROM  DISK = N'차등백업위치' WITH  FILE = 1,  NOUNLOAD,  STATS = 5

 

 

RESTORE DATABASE [test3] FROM DISK = N'D:\Backup\test_full.bak'

               WITH MOVE 'test' TO 'C:\DATABASE\MSSQL15.MSSQLSERVER\MSSQL\DATA\test3.mdf'

                            ,MOVE 'test_log' TO 'C:\DATABASE\MSSQL15.MSSQLSERVER\MSSQL\DATA\test3.ldf',  NORECOVERY,  NOUNLOAD,  STATS = 5;

RESTORE DATABASE [test3] FROM  DISK = N'D:\Backup\test_2.bak' WITH  FILE = 1,  NOUNLOAD,  STATS = 5

 

 

 

백업 및 복구 시점별 데이터 체크 

test : 풀백업  ,  test1 : 풀백업+차등1st ,  test2 : 풀백업+차등2nd

 

 

개인적인 생각에서

 

장점은 백업 용량이 데이터 변화에 비례하기 때문에 수정이 적다면 용량도 적어집니다.

수정된 데이터와 용량은 비례하게 됩니다.

 

단점은 전체 백업이 소실되면 복구가 불가능함. 전체 백업본이 있어야 차등백업본이 의미가 있기 때문에

무슨일이 있어도 전체 백업은 잘 보관해야합니다.

 

적당주기별 전체 백업과 차등백업을 처리한다면...스토리지가 좋아합니다.

댓글()