[Section 2] 원본 서버에서 백업 정보를 저장할 테이블 및 프로시저 생성, 공유 폴더 설정

원본 서버에서 로그 백업을 수행할 저장 프로시저 및 로그 백업을 수행한 결과를 저장할 테이블을 생성하며, 로그 파일을 저장할 폴더를 지정하는 단계입니다.

 

 

4. [원본 서버] 원본 서버의 TestDB에 대해 로그 백업을 수행하는 저장 프로시저 및 로그 백업 수행 정보를 기록하는 테이블을 msdb에 생성합니다. 별도의 관리 DB가 있는 경우, msdb 대신 해당 관리 DB를 사용하여도 됩니다.

USE MSDB

GO

 

--로그 백업 수행 정보를 보관하는 테이블

if EXISTS (SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].[TB_LOGBACKUPLIST]') AND OBJECTPROPERTY(id, N'IsUserTable') = 1)

drop table [dbo].[TB_LOGBACKUPLIST]

GO

 

CREATE TABLE [dbo].[TB_LOGBACKUPLIST] (

             [No] [int] IDENTITY (1, 1) NOT NULL ,

             [List] [varchar] (128) COLLATE Korean_Wansung_CI_AS NOT NULL ,

             [ErrorNum] [int] NOT NULL,

             [DelYN] [char] (1) NOT NULL DEFAULT('N')

) ON [PRIMARY]

GO

 

CREATE CLUSTERED INDEX CIX_TB_LOGBACKUPLIST ON TB_LOGBACKUPLIST(No)

GO

 

 

5. [원본 서버] 로그 파일이 저장될 폴더를 생성한 후, 대상 서버에서 해당 서버를 접근할 수 있도록 공유합니다. 이 때, 공유 권한은 가급적이면 읽기 전용으로 설정합니다. 본 예제에서는 D:\LogBackup 이라는 폴더를 만든 후, 이를 공유하도록 설정합니다

 

 

 

6. [원본 서버] 이제 원본 서버에서 로그 백업을 수행하도록 하는 저장 프로시저를 생성합니다. 쿼리 분석기에서 다음 스크립트를 실행시켜 저장 프로시저를 생성합니다.

------------------------------------------------------------------------------------

--TestDB 로그백업스크립트

------------------------------------------------------------------------------------

USE MSDB

GO

 

--원본 서버에서 로그 백업을 수행하는 프로시저

CREATE PROCEDURE USP_TestDB_LogBackup AS                              

BEGIN               

             DECLARE @LogBak varchar(256), @path varchar(128), @filename varchar(60),                              

                    @nowtime datetime, @InsList varchar(1000), @InsList2 varchar(128)

                                     

             SET @nowtime = getdate()                             

                                   

             --s + ms까지저장

             SET @filename = 'TestDB_log_' + CONVERT(varchar(8),@nowtime,112) +                              

               CONVERT(varchar(2),@nowtime,108) + substring(CONVERT(varchar(5),@nowtime,108),4,2) +                        

               RIGHT('00000' + CONVERT(varchar, DATEPART ( s ,    getdate() ) ), 2) +                       

               RIGHT('00000' + CONVERT(varchar, DATEPART ( ms , getdate() ) ), 3) + '.Trn'                       

                                    

                                          

             SET @path = '''D:\LogBackup\' + @filename + ''''                             

             SET @LogBak = 'BACKUP LOG TestDB TO disk =' + @path                              

                                      

             --msdb.dbo.TB_LOGBACKUPLIST Insert

             SET @InsList = ' if @@error=0   BEGIN INSERT msdb.dbo.TB_LOGBACKUPLIST(List,ErrorNum) values(''' + @filename +''',@@error)' + ' end '                             

              

             EXEC  (@LogBak +@InsList)

END

GO

 

 

------------------------------------------------------------------------------------

--TestDB 로그 백업 파일 삭제 프로시져 (최근 100개의 파일만 보관)

------------------------------------------------------------------------------------

USE MSDB

GO

 

--원본 서버에서 로그백업 파일을 최근100개만 보관 및 로그가 저장되는 공간이 3 GB 이하인 경우, 30개만 보관하도록 수행

CREATE PROCEDURE USP_TestDB_LogBackup_Del AS

BEGIN               

 

 

--정상적인경우: 디스크 공간이 충분한 상태 시작

             DECLARE CUR CURSOR

             READ_ONLY

             FOR SELECT NO, LIST FROM TB_LOGBACKUPLIST (NOLOCK)

               WHERE DELYN = 'N' AND

                NO <=(SELECT MAX(NO) FROM TB_LOGBACKUPLIST (NOLOCK)) - 100  ORDER BY NO

                --최근 100개 이전의 리스트 목록 중, 삭제가 되지 않은 대상을 읽어옴

            

             DECLARE @NO INT, @LIST VARCHAR(128), @DelStr VARCHAR(300), @FilePathStr VARCHAR(300)

             OPEN CUR

            

             FETCH NEXT FROM CUR INTO @NO, @LIST

             WHILE (@@fetch_status <> -1)

             BEGIN

                           IF (@@fetch_status <> -2)

                           BEGIN

                                        DECLARE @Error INT

 

                                        SET @FilePathStr = 'D:\LogBackup\' + @LIST

                                       

                                        --현재 작업 할 파일이 존재하는지 확인

                                        CREATE TABLE #FileExists (FileExists int, FileIsDir int, ParentDirExists int)

                                        INSERT #FileExists

                                        EXEC master..xp_fileexist @FilePathStr

            

                                        IF EXISTS (SELECT * FROM #FileExists WHERE FileExists = 1) -- 파일이 존재하는 경우

                                                     BEGIN                

                                                                  SET @DelStr = 'DEL ' + @FilePathStr

                                                                  EXEC @Error = master..xp_cmdshell @DelStr, NO_OUTPUT       

                                                                  IF @Error = 0 -- 삭제 작업이 정상적으로 수행된 경우 DELYN = 'Y'로변환

                                                                     UPDATE TB_LOGBACKUPLIST SET DELYN = 'Y' WHERE NO = @NO

                                                     END

                                        ELSE -- 파일이 존재하지 않는 경우 (대상 서버에서 파일을 삭제해 준 경우) : DELYN = 'Y'로변환

                                                     BEGIN

                                                                  UPDATE TB_LOGBACKUPLIST SET DELYN = 'Y' WHERE NO = @NO

                                                     END

 

                                        DROP TABLE #FileExists

 

                           END

                           FETCH NEXT FROM CUR INTO @NO, @LIST

             END

             CLOSE CUR

             DEALLOCATE CUR

--정상적인 경우: 디스크 공간이 충분한 상태 종료

 

 

--디스크의 여유 공간이 3기가 이하인 경우30개 이전의 파일 삭제 작업시작

             CREATE TABLE #Drives (Drive char(1), FreeSpace int)

            

             INSERT #Drives

             EXEC master..xp_fixeddrives

            

             IF (SELECT FreeSpace FROM #Drives WHERE Drive = 'D')<=3072

                          -- D 드라이브의 여유 공간이 3GB 이하인 경우

             BEGIN

 

                           DECLARE CUR CURSOR

                           READ_ONLY

                           FOR SELECT NO, LIST FROM TB_LOGBACKUPLIST (NOLOCK)

                             WHERE DELYN = 'N' AND

                              NO <=(SELECT MAX(NO) FROM TB_LOGBACKUPLIST (NOLOCK)) - 30  ORDER BY NO

 

                           OPEN CUR                       

                           FETCH NEXT FROM CUR INTO @NO, @LIST

                           WHILE (@@fetch_status <> -1)

                           BEGIN

                                        IF (@@fetch_status <> -2)

                                        BEGIN   

                                                     SET @FilePathStr = 'D:\LogBackup\' + @LIST                                                   

                                                     --현재 작업할 파일이 존재하는지 확인

                                                     CREATE TABLE #FileExists1 (FileExists int, FileIsDir int, ParentDirExists int)

                                                     INSERT #FileExists1

                                                     EXEC master..xp_fileexist @FilePathStr

                          

                                                     IF EXISTS (SELECT * FROM #FileExists1 WHERE FileExists = 1)

                                                    --파일이 존재 하는경우

                                                       BEGIN                           

                                                         SET @DelStr = 'DEL ' + @FilePathStr

                                                          EXEC @Error = master..xp_cmdshell @DelStr, NO_OUTPUT 

                                                         IF @Error = 0

                                                          --삭제 작업이 정상적으로 수행된 경우 DELYN = 'Y'로변환

                                                           UPDATE TB_LOGBACKUPLIST SET DELYN = 'Y' WHERE NO = @NO

                                                         END

                                                     ELSE

                                                    --파일이 존재하지 않는 경우 (대상 서버에서 파일을 삭제해 준 경우) : DELYN = 'Y'로변환

                                                       BEGIN

                                                         UPDATE TB_LOGBACKUPLIST SET DELYN = 'Y' WHERE NO = @NO

                                                       END

            

                                                     DROP TABLE #FileExists1  

                                        END

                                        FETCH NEXT FROM CUR INTO @NO, @LIST

                           END

                           CLOSE CUR

                           DEALLOCATE CUR            

             END      

             DROP TABLE #Drives

--디스크의 여유공간이 3GB 이하인 경우 30개 이전의 파일 삭제 작업종료

END

GO

 

 

 

-------------------------------------------------------------

SQLLeader.com / ADConsulting / 한대성 (olaper@지메일.)

-------------------------------------------------------------

+ Recent posts