반응형
반응형

AWE SQL Server 2005 Enterprise Edition에서 32비트 버전의 Microsoft Windows 운영 체제에서 실제 메모리를 4GB 이상 사용할 수 있도록 하는 기능입니다.

SQL Server 2005에서는 AWE(Address Windowing Extensions) API를 사용하여 구성된 가상 메모리에 설정된 한계보다 더 큰 실제 메모리 액세스를 제공할 수 있으며, 사용할 수 있는 메모리 양은 하드웨어 구성과 운영 체제 지원에 따라 달라집니다. Windows Server 2003 운영 체제부터 지원하는 실제 메모리 용량이 늘어났으며, AWE에서 액세스할 수 있는 실제 메모리 용량은 사용 중인 운영 체제에 따라 달라집니다.

운영 체제

AWE에서 액세스 가능한 실제 메모리 크기

Windows Server 2003 Standard Edition

4GB

Windows Server 2003 Enterprise Edition

32GB

Windows Server 2003 Datacenter Edition

64GB

 

AWE Enterprise Edition Developer Edition에서만 지원되며 32비트 운영 체제에만 적용됩니다. 64 bit 플랫폼의 경우에는 디폴트로 AWE가 활성화되기 때문에 /pae 옵션을 사용할 필요도 없으며 'awe enabled' 구성 옵션을 설정할 필요도 없습니다. SQL Server 2000과 달라진 점 중 하나입니다.


32 bit SQL Server 2005에서 4GB 이상의 실제 메모리를 지원하려면 다음과 같은 작업이 필요합니다.

1. /pae 매개 변수를 boot.ini 파일에 추가하고 컴퓨터를 다시 부팅합니다.

2.
"메모리의 페이지 잠그기(LOCK PAGE IN MEMORY)" 로컬 보안 정책에 SQL Server 서비스 계정으로 지정된 윈도우 사용자 계정을 추가합니다.

3. sp_configure를 사용하여 ‘awe enabled’ 옵션을 1로 설정합니다. ‘awe enabled’ 옵션은 고급 옵션으로서 ‘show advanced options’ 1로 설정해야만 변경할 수 있습니다. AWE를 적용하려면 SQL Server 인스턴스를 다시 시작해야 합니다
.

4. AWE를 구성한 다음에는 성능 모니터에서 SQL Server 인스턴스에게 할당된 메모리의 크기를 확인합니다.

 

SQL Server 버전과 운영 체제에 따라 동작이 달라지므로 AWE를 사용하기 전에 SQL Server 온라인 설명서에 기술되어 있는 운영 체제별 지침을 확인하기 바랍니다.

ms-help://MS.SQLCC.v9/MS.SQLSVR.v9.ko/udb9/html/d308d9cb-bb85-46f6-93c6-e2ddd0fa01c3.htm


AWE
를 활성화하는 경우에는 ‘max server memory’ 값을 설정하는 것을 권고합니다. Windows 2000의 경우 ‘max server memory’ 옵션에 값을 지정하지 않으면 실제 메모리를 128 MB 이하만 남겨 두고 대부분의 사용 가능한 메모리를 예약합니다. ‘max server memory’를 잘못 구성하면 심각한 문제가 발생할 수 있으며 다른 응용 프로그램에 지장을 줄 수 있으므로 ‘max server memory’ 구성 옵션의 설정은 신중하며 계획적으로 이루어져야 합니다. ‘max server memory’ 옵션 설정에 대해서는 별도로 다룰 예정입니다.

다양한 시스템들을 컨설팅하다 보면 실제 메모리를 증설하고서 AWE 구성을 하지 않아서 제대로 메모리 자원을 사용하지 못하는 경우를 볼 수 있습니다. 예를 들어, 실제 메모리는 8GB이고 사용자는 SQL Server가 실제 메모리를 잘 사용하고 있다고 생각하고 있는데, 실제로 확인해 보면 SQL Server는 약 2GB미만의 메모리만 사용하는 경우들이 있습니다. 이런 문제는 대부분 boot.ini 파일에 /pae 옵션을 지정하지 않거나 ‘awe enabled’ 옵션을 활성화하지 않아서 발생하며, 아주 드물지만 Enterprise Edition을 사용해야 하는데 Standard Edition을 사용함으로 인하여 서버에 장착된 실제 메모리를 제대로 사용하지 못하는 경우도 있습니다. 하드웨어 구성에 적합한 Edition을 구입해야 하며, 하드웨어 리소스를 충분히 활용할 수 있도록 환경을 구성해야 합니다.

 

다음은 AWE를 구성하는 예제 스크립트입니다.

1. ‘awe enabled’ 구성 옵션을 활성화합니다.

sp_configure 'show advanced options', 1;

RECONFIGURE

GO

sp_configure 'awe enabled', 1

RECONFIGURE

GO

 

2. SQL Server를 다시 시작합니다. ‘awe enabled’ 구성 옵션이 활성화되면 SQL Server 오류 로그 파일에 다음과 같은 메시지가 기록됩니다.

Address Windowing Extensions enabled

 

3. ‘max server memory’‘min server memory’ 구성 옵션을 시스템에 적절하게 구성합니다. 다음 예는 ‘min server memory’ 1GB, ‘max server memory’ 6GB로 구성한 예제입니다.

sp_configure 'min server memory', 1024;

RECONFIGURE

GO

sp_configure 'max server memory', 6144;

RECONFIGURE

GO

 

 

 

반응형
반응형

일반적으로 SQL Server 구성 옵션을 변경할 필요성이 그리 많지는 않습니다. 예를 들어 user connections, lock, open objects와 같은 구성 옵션들의 경우에는, 기본적으로 SQL Server가 동적으로 이 구성 옵션들을 튜닝하기 때문에 SQL Server 7.0부터는 사용자가 변경할 필요가 없습니다. 때로는 관리자가 SQL Server 구성 옵션을 잘못 설정하여 문제의 원인이 되기도 하며 대부분의 시스템에서는 기본값을 그대로 사용하는 것을 권고합니다만, 하드웨어 사양이나 시스템의 환경에 따라 SQL Server 구성 옵션의 조정이 필요한 경우들이 있습니다. 

SQL Server 구성 옵션 변경이 필요하다고 판단되면 매우 신중하게 작업을 수행해야 합니다. SQL Server 구성 옵션이 어떤 역할을 하는지 그리고 그 옵션의 변경이 SQL Server나 사용자들에게 어떤 영향을 미치는지를 충분히 확인해야 합니다. 값을 변경하는 경우에는 변경 전의 값을 기록해 두어야 합니다. 일반적으로 데이터베이스 시스템의 성능은 구성 옵션보다 데이터베이스 디자인, 어플리케이션, 인덱스, 관리 등에 의해 좌우됩니다만, 만일 성능 향상을 목적으로 SQL Server 구성 옵션을 변경하고자 한다면, 구성 옵션 변경 전에 성능을 수집 및 분석하고 구성 옵션 변경 후에 성능을 수집 및 분석하여 성능 개선을 확인할 것을 권고합니다.

SQL Server 2000에서는 구성 옵션의 수가 37개였는데, SQL Server 2005에서는 62개로 증가하였습니다. 기능의 추가, 보안의 강화, 성능 등의 이유로 꽤 많은 구성 옵션이 추가되었습니다. 이 구성 옵션에 대하여 관리자가 이해하고 있지 못하면, SQL Server 2000에서 실행되던 어플리케이션이 동작하지 않는 등의 문제가 발생할 수 있으므로 온라인 설명서나 기술 문서를 참조하여 SQL Server 구성 옵션을 숙지하시기 바랍니다.

SQL Server 구성 옵션은 SQL Server Management Studio 또는 sp_configure 시스템 저장 프로시저를 사용하여 최적화할 수 있습니다. 일부 구성 옵션은 SQL Server Surface Area Configuration 도구를 사용하여 구성할 수 있습니다. 자주 사용하는 서버 구성 옵션은 SQL Server Management Studio 를 통해 사용할 수 있으며 전체 구성 옵션을 한번에 확인하려면 sp_configure를 사용해야 합니다. 다시 말씀드리자만 구성 옵션을 변경하기 전에 시스템에 주는 영향을 신중히 고려해야 합니다. 또한 고급 옵션은 숙련된 데이터베이스 관리자나 인증된 SQL Server 기술 지원 담당자만이 변경하도록 해야 합니다.

다음은 SQL Server 2005에서 제공되는 구성 옵션 목록입니다. 이 중 고급 옵션은 'Show advanced option' 구성옵션의 값이 1인 경우에만 sp_configure로 확인가능합니다.

SQL Server
Configuration Option name
Minimum Maximum Config_value
Ad Hoc Distributed Queries 0 1 0
affinity I/O mask -2147483648 2147483647 0
affinity mask -2147483648 2147483647 0
Agent XPs 0 1 1
allow updates 0 1 0
awe enabled 0 1 0
blocked process threshold 0 86400 0
c2 audit mode 0 1 0
clr enabled 0 1 0
cost threshold for parallelism 0 32767 5
cross db ownership chaining 0 1 0
cursor threshold -1 2147483647 -1
Database Mail XPs 0 1 0
default full-text language 0 2147483647 1042
default language 0 9999 29
default trace enabled 0 1 1
disallow results from triggers 0 1 0
fill factor (%) 0 100 0
ft crawl bandwidth (max) 0 32767 100
ft crawl bandwidth (min) 0 32767 0
ft notify bandwidth (max) 0 32767 100
ft notify bandwidth (min) 0 32767 0
index create memory (KB) 704 2147483647 0
in-doubt xact resolution 0 2 0
lightweight pooling 0 1 0
locks 5000 2147483647 0
max degree of parallelism 0 64 0
max full-text crawl range 0 256 4
max server memory (MB) 16 2147483647 2147483647
max text repl size (B) 0 2147483647 65536
max worker threads 128 32767 0
media retention 0 365 0
min memory per query (KB) 512 2147483647 1024
min server memory (MB) 0 2147483647 0
nested triggers 0 1 1
network packet size (B) 512 32767 4096
Ole Automation Procedures 0 1 0
open objects 0 2147483647 0
PH timeout (s) 1 3600 60
precompute rank 0 1 0
priority boost 0 1 0
query governor cost limit 0 2147483647 0
query wait (s) -1 2147483647 -1
recovery interval (min) 0 32767 0
remote access 0 1 1
remote admin connections 0 1 1
remote login timeout (s) 0 2147483647 20
remote proc trans 0 1 0
remote query timeout (s) 0 2147483647 600
Replication XPs 0 1 0
scan for startup procs 0 1 0
server trigger recursion 0 1 1
set working set size 0 1 0
show advanced options 0 1 1
SMO and DMO XPs 0 1 1
SQL Mail XPs 0 1 0
transform noise words 0 1 0
two digit year cutoff 1753 9999 2049
user connections 0 32767 0
user options 0 32767 0
Web Assistant Procedures 0 1 0
xp_cmdshell 0 1 0

반응형
반응형

[Section 6] 로그 복원을 수행할 작업 설정

대상 서버에서 로그 복원을 수행할 작업을 생성합니다.

 

14. [대상 서버] Enterprise Manager에서 [관리] à [SQL Server 에이전트] à [작업]을 선택한 후, 새 작업을 추가합니다.

대상 서버에서는 두 개의 작업을 만들 것입니다. 하나는 반복해서 로그 파일을 원본 서버로부터 복사해 오는 역할을 하는 작업이며, 다른 하나는 로그 리스토어를 수행하는 작업입니다.

 

 

 

단계 탭에서 새로 만들기를 클릭하여 작업 단계를 아래와 같이 추가하신 후, 고급 탭에서 성공한 경우 동작성공 보고와 함께 작업 종료로 지정하고 확인을 눌러 창을 닫습니다.

 

 

 

일정 탭에서 새 일정을 클릭하여 로그 파일을 복사해 올 일정을 설정합니다. 로그 파일 복사는 복원과는 별도의 작업이기 때문에, 가급적이면, 로그 생성 주기와 비슷하게 지정하는 것이 좋습니다. 또한 로그 파일이 생성되는 데 소요되는 시간을 고려하여 로그 발생 시간과 약간의 시간 차를 두도록 합니다. (본 예제에서는 15분으로 설정하였습니다.)

 

 

 

 

여기까지가 로그 파일을 복사해 오는 작업입니다. 수동으로 작업을 실행시켜 정상적으로 로그 파일이 복사되어 오는지를 확인합니다.

 

 

 

로그 파일이 정상적으로 복사되면 msdb TB_LOGRESTORELIST 테이블에 다음과 같은 형식으로 데이터가 추가됩니다.

 

 

 

 

15. [대상 서버] 14에서와 유사한 방법으로 로그 리스토어를 수행하는 작업을 추가합니다.

 

 

 

 

 

일정은 로그 파일 복사 작업과는 달리 설정하셔도 됩니다. 다음은 오후 6부터 새벽 7까지 로그 리스토어를 수행하도록 설정한 것입니다.

 

 

 

로그 복원이 끝난 경우, 다음 그림과 같이 msdb TB_LOGRESTORELIST 테이블의 RestoreYN 열의 값이 N에서 Y로 변경됩니다.

 

 

 

 

 

 

 

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

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

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

반응형
반응형

[Section 5] 대상 서버에서 로그 복원을 수행할 테이블 및 프로시저 생성, 공유 폴더 설정

원본 서버에서 발생되는 트랜잭션 로그 파일을 저장할 공유 폴더를 설정하고, 로그 복원을 수행할 저장 프로시저를 생성합니다.

 

 

10. [대상 서버] 로그 백업 파일을 가져오기 위한 작업과 관련된 테이블과 저장 프로시저를 생성합니다. 쿼리 분석기에서 대상서버로 연결한 후, 다음 스크립트를 수행하여 테이블과 저장 프로시저를 생성합니다.

USE MSDB

GO

 

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

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

drop table [dbo].[TB_LOGRESTORELIST]

GO

 

CREATE TABLE [dbo].[TB_LOGRESTORELIST] (

             [No] [int] NOT NULL ,

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

             [RestoreYN] [char] (1) NOT NULL Default('N'),

             [CopyYN] [char] (1) NOT NULL Default('N'),

             [FileSize] [bigint] NOT NULL Default(0),

             [Start_Time] [datetime] NULL,

             [End_Time] [datetime] NULL,

             [Duration] AS ISNULL(DATEDIFF(SS, Start_Time, End_Time), 0)

) ON [PRIMARY]

GO

 

CREATE CLUSTERED INDEX CIX_TB_LOGRESTORELIST ON TB_LOGRESTORELIST(No)

GO

 

 

11. [대상 서버] 원본 서버의 트랜잭션 로그 파일을 가져와서 저장할 폴더를 생성하고, 이 폴더를 공유합니다. 공유 권한은 읽기 및 쓰기로 지정 되어야 합니다. 본 예제에서는 D:\LogBackup_Target 이라는 폴더를 이용하겠습니다.

 

 

 

12. [대상 서버] 원본 서버에 있는 로그 리스토어 정보 테이블을 읽어오기 위해 대상 서버와 원본 서버 간의 연결을 설정해 줘야 합니다. 다음과 같은 방식으로 대상 서버에서 연결을 설정합니다.

--대상 서버(ADC2)에서 원본 서버(ADC1)으로 Linked Server를 설정합니다

 

sp_addlinkedserver 'ADC1'

GO

 

sp_addlinkedsrvlogin 'ADC1', 'false', NULL, '<로그인 아이디>', '<로그인 패스워드>'

GO

 

 

13. [대상 서버] 이제 로그 백업 파일을 복사해 오는 작업을 수행할 저장 프로시저와, 로그 백업을 수행하기 전에 해당 DB의 사용자를 모두 Kill 시키는 프로시저, 로그 백업 정보를 이용하여 복원을 수행하는 프로시저를 생성하겠습니다. 쿼리 분석기를 이용하여 다음 스크립트를 실행하여 프로시저 들을 생성합니다.

 

USE MSDB

GO

 

--대상 서버(ADC2)에서 로그 리스토어를 수행하기 전에 해당DB(TestDB)를 사용하는 프로세스를 KILL하는 프로시저

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

drop procedure [dbo].[USP_KillSPIDUsing_TestDB]

GO

 

 

CREATE PROC USP_KillSPIDUsing_TestDB

AS     

BEGIN      

             SET NOCOUNT ON      

             DECLARE  @spid  smallint, @str  varchar(50)     

 

             SELECT spid INTO  #SPID_USING_USERDB      

             FROM master..sysprocesses      

             WHERE dbid=db_id('TestDB') AND cmd NOT LIKE 'RESTORE LOG%' -- Log Restore Process는제외    

             AND program_name NOT LIKE 'SQLAgent%' AND program_name NOT LIKE 'DTS%'   

               -- SQLAgent 관련Process는제외    

             UNION

             SELECT spid FROM master..sysprocesses a  

             WHERE EXISTS (SELECT 1 FROM master..syslocks

                          WHERE spid = a.spid AND dbid = db_id('TestDB')) AND

                          cmd NOT LIKE 'RESTORE LOG%' AND -- Log Restore Process는제외    

                          program_name NOT LIKE 'SQLAgent%' AND program_name NOT LIKE 'DTS%' 

 

             DECLARE spid_cursor CURSOR      

             FOR SELECT spid FROM #SPID_USING_USERDB FOR READ ONLY     

            

             OPEN spid_cursor     

             FETCH NEXT FROM spid_cursor INTO @spid     

                           WHILE @@FETCH_STATUS = 0     

                                        BEGIN     

                                                     SET @str = 'kill ' + CONVERT (char(5), @spid)      

                                                     EXECUTE (@str)     

                                                     FETCH NEXT FROM spid_cursor INTO @spid     

                                        END     

               

             CLOSE spid_cursor     

             DEALLOCATE spid_cursor     

             END   

GO

 

 

USE MSDB

GO

 

--원본서버(ADC1)에서 대상서버(ADC2)로 로그 파일을 복사하는 스크립트

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

drop procedure [dbo].[USP_LOGCOPY]

GO

 

CREATE PROCEDURE USP_LOGCOPY AS

SET NOCOUNT ON                   

 DECLARE @list varchar(128), @copystr varchar(256), @no int, @maxno int     

     

 --TB_LOGRESTORELIST 에서의최종No를구한다.      

 SELECT @maxno = isnull(MAX(No), 0) FROM TB_LOGRESTORELIST WITH (NOLOCK)     

     

 --ADC1 서버로부터 새로 추가된 리스트 정보를 입력 받아서 TB_LOGRESTORELIST에 저장    

 INSERT msdb.dbo.TB_LOGRESTORELIST(No, List)     

 SELECT No, List FROM ADC1.msdb.dbo.TB_LOGBACKUPLIST     

 WHERE No>@maxno     

     

     

 DECLARE  cur cursor  for                 

 SELECT NO, LIST FROM TB_LOGRESTORELIST WITH (NOLOCK) WHERE CopyYN = 'N'     

 ORDER BY  NO     

 -- logbackuplist에서 CopyYN = 'N' 인것을가져온다.     

                  

 OPEN cur                 

 FETCH  NEXT FROM cur  INTO  @no, @list          

                  

 WHILE  @@fetch_status =  0      

 BEGIN 

 

 -- 파일을 복사하기 전 CopyYN = 'C'로 설정  

     UPDATE TB_LOGRESTORELIST SET CopyYN = 'C' WHERE NO = @no     

 

  SET @copystr = 'COPY \\ADC1\LogBackup\' + @list +' \\ADC2\LogBackup_Target\'           

     EXEC master..xp_cmdshell @copystr, NO_OUTPUT      

 

   IF @@ERROR = 0

     BEGIN

          UPDATE TB_LOGRESTORELIST SET CopyYN = 'Y' WHERE NO = @no     

 

 

          --Copy 해온파일의Size를계산시작

          DECLARE @tmpStr varchar(500), @tmpResultStr varchar(500)

 

          CREATE TABLE #TEMPSIZE(RESULTSTR VARCHAR(1000))

 

          SET @tmpStr = 'dir \\ADC2\LogBackup_Target\' + @List + ' |find "' + @List + '"'

 

          INSERT #TEMPSIZE

          EXEC master..xp_cmdshell @tmpStr

 

          DELETE FROM #TEMPSIZE WHERE RESULTSTR IS NULL

 

          IF EXISTS (SELECT 1 FROM #TEMPSIZE)

            BEGIN

              SET @tmpResultStr = (SELECT TOP 1 RESULTSTR FROM #TEMPSIZE)

 

               SET @tmpResultStr = REPLACE(REPLACE(REPLACE(SUBSTRING(@tmpResultStr, 19, LEN(@tmpResultStr)), @List, ''), ' ',''),',','')

 

              IF ISNUMERIC(@tmpResultStr) = 1

                 BEGIN

                           UPDATE TB_LOGRESTORELIST SET FileSize = CAST(@tmpResultStr AS INT) WHERE NO = @no

                 END

            END

 

          DROP TABLE #TEMPSIZE

          --Copy 해온 파일의 Size 계산 종료

 

        END

     

  FETCH  NEXT FROM cur  INTO  @no, @list          

 END     

 

 CLOSE  cur                 

 DEALLOCATE  cur       

GO

 

 

 

USE MSDB

GO

 

--대상 서버(ADC2)에서 로그 리스토어를 수행하는 프로시저

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

drop procedure [dbo].[USP_LOGRESTORE]

GO

 

 

CREATE PROCEDURE USP_LOGRESTORE AS           

           

DECLARE @list varchar(128), @restorestr varchar(256), @no int, @err int ,

               @delstr varchar(256)  , @error int     

               

 EXEC DBO.USP_KILLSPIDUSING_TestDB 

   

 DECLARE  cur cursor  for               

 SELECT NO, LIST FROM TB_LOGRESTORELIST WITH (NOLOCK) WHERE RestoreYN <>'Y' AND CopyYN = 'Y'    

 ORDER BY  NO   

 -- logbackuplist에서 RestoreYN'Y'가 아니며, CopyYN = 'Y' 인 것을 가져온다.   

                

 OPEN cur               

 FETCH  NEXT FROM cur  INTO  @no, @list        

                

 WHILE  @@fetch_status =  0    

 BEGIN                  

  UPDATE TB_LOGRESTORELIST SET restoreYN = 'C', start_time=getdate() WHERE no=@no -- 시작 시간을 업데이트  

  SET @restorestr = 'restore log TestDB FROM disk=''\\ADC2\LogBackup_Target\' + @list +''''               

    + ' with standby=''D:\DBData\TestDB_Standby.tdf''' -- Standby옵션으로 TestDB서버에있는 로그를 restore한다.               

                

  EXEC (@restorestr)   

  SET @error  = @@error     

      

  if @error = 0               

   BEGIN         

    UPDATE TB_LOGRESTORELIST   

    SET restoreYN = 'Y', end_time = getdate()  -- 에러가 없으면 restoreY 필드를 'Y'로 채운다.               

    WHERE  no = @no      

            

    --리스토어가 정상적으로 수행 되었으면 해당파일을 삭제.     

    SET @delstr ='master..xp_cmdshell ''del \\ADC2\LogBackup_Target\' + @list + ''''       

    EXEC (@delstr)        

   END   

   

  FETCH  NEXT FROM cur  INTO  @no, @list        

 END   

 CLOSE  cur               

 DEALLOCATE  cur     

GO

 

 

 

 

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

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

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

반응형
반응형

[Section 4] 대상 서버에서 전체 백업 파일을 이용한 복원 수행

대상 서버에서 전체 백업 파일을 이용하여 복원을 수행합니다.

 

 

9. [대상 서버] 3단계에서 생성된 TestDB의 전체 백업 파일을 대상 서버로 복사한 후, 이를 복원합니다. 복원 시, 데이터 파일 및 로그 파일의 위치는 원본 서버와 다르게 지정할 수 있습니다.

우선, 전체 백업 파일을 D:\Backup 폴더로 복사해 옵니다.

 

--복원할 로그 파일의 구성 상태를 확인합니다.

RESTORE FILELISTONLY FROM DISK='D:\Backup\TestDB_backup1.bak'

/*

LogicalName        PhysicalName      Type      FileGroupName     Size       MaxSize

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

TestDB_Data         D:\Data\TestDB_Data.mdf D           PRIMARY             31457280 35184372080640

TestDB_Log          D:\Data\TestDB_Log.ldf    L            NULL      10485760 35184372080640

*/

 

--TestDB_DataD:\DBData\TestDB_Data.mdf,

--TestDB_LogD:\DBData\TestDB_Log.ldf 로 위치를 이동하여 복원을 수행하며,

--대기 상태로 설정하기 위해 Standby 옵션을 사용합니다.

 

RESTORE DATABASE TestDB

FROM DISK='D:\Backup\TestDB_backup1.bak',

DISK='D:\Backup\TestDB_backup2.bak',

DISK='D:\Backup\TestDB_backup3.bak'

WITH

             MOVE 'TestDB_Data' TO 'D:\DBData\TestDB_Data.mdf',

             MOVE 'TestDB_Log' TO 'D:\DBData\TestDB_Log.ldf',

STANDBY='D:\DBData\TestDB_Standby.tdf'

GO

/*

1 파일에서'TestDB' 데이터베이스, 'TestDB_Data' 파일에 대해 112 페이지를 처리했습니다.

1 파일에서'TestDB' 데이터베이스, 'TestDB_Log' 파일에 대해 1페이지를 처리했습니다.

RESTORE DATABASE() 113 페이지를 0.299(3.075MB/)만에 처리했습니다.

*/

 

 

Standby 옵션을 이용한 복원이 정상적으로 종료되면, Enterprise Manager에서 다음과 같이 읽기 전용 상태인 TestDB를 확인할 수 있습니다.

 

 

 

 

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

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

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

 

반응형
반응형

[Section 3] 로그 백업을 수행할 작업 설정

원본 서버에서 정기적으로 로그 백업을 수행할 작업을 생성합니다.

 

 

7. [원본 서버] Enterprise Manager에서 [관리] à [SQL Server 에이전트] à [작업]을 선택한 후, 새 작업을 추가합니다.

 

 

단계 탭에서 새로 만들기를 클릭한 후, 다음과 같이 작업 단계를 추가합니다.

 

 

이 후, 한 번 더 새로 만들기를 클릭하여 작업 단계를 다음과 같이 추가합니다.

 

 

고급 탭에서 성공한 경우 동작 부분에서 성공 보고와 함께 작업 종료로 설정한 후 확인을 눌러 창을 닫습니다.

 

 

일정 탭에서 로그 백업을 수행할 일정을 설정합니다. 상황에 따라 적절히 일정을 설정하시면 됩니다.

본 예제에서는 매 시간마다 로그 백업을 수행하도록 일정을 설정하겠습니다.

 

 

8. [원본 서버] 해당 작업을 수동으로 실행 시킨 후, 정상적으로 로그가 발생했는지를 확인합니다.

 

 

 

이제, 매 시간마다 원본 서버의 D:\LogBackup 폴더에 로그 백업 파일이 생성되며, msdbTB_LOGBACKUPLIST 테이블에 로그 백업이 수행된 정보가 기록 될 것입니다.

 
 

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

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

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

반응형
반응형

[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@지메일.)

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

반응형
반응형

SQL Server 2000에서의 로그 전달 환경(Log Restore) 구축

 

로그 전달 환경을 구축하면 원본 서버의 데이터베이스와 동일한 데이터베이스를 생성하고 정기적으로 동기화시킬 수 있습니다. 동기화 작업은 원본 DB에서 발생한 트랜잭션 로그 파일을 이용하여 수행합니다.

 

본 강좌에서는 SQL Server 2000에서 로그 전달 환경을 구축하는 방법을 설명합니다. 백업 파일 생성 및 복원, 로그 파일 백업뿐만 아니라, SQL Agent를 이용해서 자동으로 백업과 파일 복사, 복원을 수행할 수 있는 방법을 포함하고 있습니다.

 

본 예제에서는 임의로 생성한 테스트 DB를 이용하여 구성합니다. 실제 운영 환경에서는 서버 명 및 DB , 메타 정보를 관리할 테이블 명 등을 수정하셔서 사용하시기 바랍니다. 기본적으로 본 예제에서는 로그인 설정 부분은 생략하였습니다. 로그 전달 환경 운영 및 설정에 관련되어 별도의 강좌로 설명하겠습니다.

 

 

 

 

[Section 1] 임시 데이터베이스 생성 및 임시 데이터 발생 및 백업 수행

원본 서버에 테스트 DB를 생성한 후, DB를 전체 백업하는 작업을 수행합니다.

 

1. [원본 서버] 원본 서버에서 임시 데이터베이스를 다음과 같이 생성합니다.

-- 임시 데이터베이스(TestDB) 생성

CREATE DATABASE TestDB

ON

             (            Name = 'TestDB_Data',

                           FileName = 'D:\Data\TestDB_Data.mdf',

                           Size = 30MB

             )

LOG ON

             (            Name = 'TestDB_Log',

                           FileName = 'D:\Data\TestDB_Log.ldf',

                           Size = 10MB

             )

GO

/*

CREATE DATABASE 프로세스에서'TestDB_Data' 디스크에 30.00MB를 할당하는 중입니다.

CREATE DATABASE 프로세스에서'TestDB_Log' 디스크에 10.00MB를 할당하는 중입니다.

*/

 

 

--생성한 데이터베이스의 복원 모드를 전체 모드(FULL Recovery)로 설정

ALTER DATABASE TestDB

SET RECOVERY FULL

GO

 

 

2. [원본 서버] 생성한 임시 데이터베이스에 테스트 데이터 발생시킵니다.

USE TestDB

GO

 

--테스트 테이블 생성

CREATE TABLE TestTable

(

             Seq int identity NOT NULL,

             Col1 int default(CAST(rand()*10000 AS INT))

)

GO

--테스트 데이터 입력 10000

SET NOCOUNT ON

GO

DECLARE @I AS INT

SET @I = 1

WHILE @I<=10000

BEGIN

             INSERT TestTable DEFAULT VALUES

 

             SET @I = @I + 1

END

GO

SET NOCOUNT OFF

GO

 

 

3. [원본 서버] 원본 데이터베이스에 대해 전체 백업을 수행합니다.

BACKUP DATABASE TestDB

TO disk='D:\TestDB_backup1.bak',

             disk='D:\TestDB_backup2.bak',

             disk='D:\TestDB_backup3.bak'

WITH INIT

GO

-- TestDB 전체 백업을 세 개의 파일로 나눠서 수행

-- 데이터베이스가 큰 경우, 이와 같이 여러 파일로 나누어서 백업을 하는 것이 안정적임

/*

1 파일에서'TestDB' 데이터베이스, 'TestDB_Data' 파일에 대해 112 페이지를 처리했습니다.

1 파일에서'TestDB' 데이터베이스, 'TestDB_Log' 파일에 대해 1페이지를 처리했습니다.

BACKUP DATABASE() 113페이지를 0.417(2.205MB/)만에 처리했습니다.

*/

 

 

 

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

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

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

반응형
반응형


use master
go

if object_id('master..sp_search') is not null begin
 drop proc sp_search
end
go


create proc sp_search
(
@searchText varchar(100)
, @type int = 0
)
as
if @type <> 1 begin
select  a.name
from sysobjects a
where exists
        (select *
                from syscomments
                where a.id = id
                and text like '%' + @searchText + '%'
        )
and xtype ='P' and category =0
end else begin
select  a.name
from sysobjects a
where exists
        (select *
                from syscomments
                where a.id = id
                and text like '%' + @searchText + '%'
        )
and (xtype ='V') and category =0
end

반응형
반응형
CREATE TRIGGER 트리거 이름
ON { 테이블이름 | 뷰이름}
[ WITH ENCRYPTION ]
{ FOR | AFTER | INSTEAD OF }
{ [ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ] }
AS
    실행할 SQL 문들

* WITH ENCRYPTION : 트리거의 내용을 암호화시켜서 추후에 내용을 확인할 수 없도록 한다.
* FOR | AFTER | INSTEAD OF : AFTER를 지정하면 해당 테이블에 작업이 수행되고 작업이 정상적으로
 끝난 후에 트리거의 내용이 실행된다. AFTER는 테이블에 대해서만 지정할 수 있으며, 뷰에 대해서는
 지정할 수 없다.
 INSTEAD OF는 테이블 및 뷰에 지정할 수 있지만 뷰에 많이 사용된다. INSTEAD OF를 지정하고 해당
 테이블이나 뷰에 지정한 SQL(INSERT, UPDATE, DELETE)이 작동하면 시도된 SQL은 무시되고
 트리거에 지정된 SQL문이 대신 작동하게 된다. FOR는 AFTER와 동일한 것으로 생각하면 된다.
* INSERT | UPDATE | DELETE : 트리거가 실행되는 이벤트를 지정한다. 하나 이상으로 조합해서
 작동시킬 수 있다.
반응형
반응형
DECLARE cursorTbl_cursor CURSOR
    FOR SELECT LineTotal FROM cursorTbl;

DECLARE @result CURSOR
EXEC sp_describe_cursor @cursor_return = @result OUTPUT,
        @cursor_source = N'GLOBAL',  -- 커서임을 지정
    @cursor_identity = N'cursorTbl_cursor'  -- 커서 이름 지정

FETCH NEXT from @result
WHILE (@@FETCH_STATUS <> -1)
        FETCH NEXT FROM @result



결과중 model :
1 - STATIC(정적)
2 - KEYSET(키 집합)
3 - DYNAMIC(동적)
4 - FAST_FORWARD(빠른 전진)

concurrency :
1 - READ_ONLY(읽기전용)
2 - SCROLL_LOCKS(스크롤 잠금)
3 - OPTIMISTIC(낙관적)

status :
-1 - 커서가 아직 열리지 않은 상태

cursor_scope :
1 - 지역커서
2 - 전역커서

반응형
반응형
EXEC sp_rename '테이블이름.필드', '바뀔필드명', 'COLUMN'
반응형

'연구개발 > SQL2005' 카테고리의 다른 글

DML 트리거의 사용  (0) 2009.06.15
커서 정보 확인  (0) 2009.06.12
시스템 저장 프로시저(Transact-SQL)  (0) 2009.06.11
저장된 프로시저의 이름 및 내용 확인  (0) 2009.06.11
잠금정보 확인  (0) 2009.06.10
반응형
http://msdn.microsoft.com/ko-kr/library/ms187961.aspx

시스템 저장 프로시저(Transact-SQL)

SQL Server에서는 시스템 저장 프로시저를 통해 다양한 관리 및 정보 작업 수행할 수 있습니다. 시스템 저장 프로시저는 다음 표에 표시된 범주별로 그룹화됩니다.

범주 설명

Active Directory 저장 프로시저

SQL Server 인스턴스 및 SQL Server 데이터베이스를 Microsoft Windows 2000 Active Directory에 등록합니다.

카탈로그 저장 프로시저

ODBC 데이터 사전 기능을 구현하고 ODBC 응용 프로그램을 원본 시스템 테이블 변경으로부터 격리합니다.

변경 데이터 캡처 저장 프로시저

변경 데이터 캡처 개체를 사용하도록 설정 또는 해제하거나 해당 개체에 대해 보고합니다.

커서 저장 프로시저

커서 변수 기능을 구현합니다.

데이터베이스 엔진 저장 프로시저

SQL Server 데이터베이스 엔진의 일반적인 유지 관리에 사용됩니다.

데이터베이스 메일 및 SQL 메일 저장 프로시저

SQL Server 인스턴스 내의 전자 메일 작업을 수행합니다.

데이터베이스 유지 관리 계획 저장 프로시저

데이터베이스 성능을 관리하는 데 필요한 주요 유지 관리 태스크를 설정합니다.

분산 쿼리 저장 프로시저

분산 쿼리를 구현하고 관리합니다.

전체 텍스트 검색 저장 프로시저

전체 텍스트 인덱스를 구현하고 쿼리합니다.

로그 전달 저장 프로시저

로그 전달 구성을 구성, 수정 및 모니터링합니다.

자동화 저장 프로시저

표준 Transact-SQL 일괄 처리에서 표준 자동화 개체를 사용할 수 있도록 합니다.

복제 저장 프로시저

복제를 관리합니다.

보안 저장 프로시저

보안을 관리합니다.

SQL Server 프로파일러 저장 프로시저

SQL Server 프로파일러에서 성능 및 작업을 모니터링하는 데 사용합니다.

SQL Server 에이전트 저장 프로시저

SQL Server 에이전트가 예약된 이벤트 기반 작업을 관리하는 데 사용합니다.

XML 저장 프로시저

XML 텍스트 관리에 사용합니다.

일반 확장 저장 프로시저

다양한 유지 관리 작업을 위해 SQL Server 인스턴스에서 외부 프로그램으로의 인터페이스를 제공합니다.

ms187961.note(ko-kr,SQL.100).gif참고:
 특별히 지정되지 않는 한 모든 시스템 저장 프로시저는 성공을 의미하는 값 0을 반환합니다. 실패에 대해서는 0이 아닌 값이 반환됩니다.

ADO, OLE DB 및 ODBC 응용 프로그램에 대해 SQL Server 프로파일러를 실행하는 사용자는 이러한 응용 프로그램이 Transact-SQL 참조에서 다루지 않는 시스템 저장 프로시저를 사용한다는 사실을 알 수 있습니다. 이러한 저장 프로시저는 Microsoft SQL Server 네이티브 클라이언트 OLE DB 공급자 및 SQL Server 네이티브 클라이언트 ODBC 드라이버에서 데이터베이스 API 기능을 구현하는 데 사용합니다. 이러한 저장 프로시저는 사용자 요청을 SQL Server에 전달하기 위해 공급자 또는 드라이버가 사용하는 메커니즘으로 공급자 또는 드라이버에서 내부적으로만 사용하도록 되어 있습니다. SQL Server 기반 응용 프로그램에서 이들을 명시적으로 호출할 수는 없습니다.

SQL Server 기반 응용 프로그램은 이러한 저장 프로시저가 지원하는 API 기능을 통해 그 기능을 완전하게 이용할 수 있습니다. 예를 들어 sp_cursor 시스템 저장 프로시저의 커서 기능은 OLE DB API 커서 속성 및 메서드를 통해 OLE DB 응용 프로그램에 사용할 수 있으며 ODBC 커서 특성 및 함수를 통해서는 ODBC 응용 프로그램에 사용할 수 있습니다.

다음 저장 프로시저는 ADO, OLE DB 및 ODBC의 커서 기능을 지원합니다.

sp_cursor

sp_cursorclose

sp_cursorexecute

sp_cursorfetch

sp_cursoropen

sp_cursoroption

sp_cursorprepare

sp_cursorunprepare

 

다음 시스템 저장 프로시저는 ADO, OLE DB, ODBC에서 Transact-SQL 문을 실행하는 준비/실행 모델을 지원합니다.

sp_execute

sp_prepare

sp_unprepare

sp_createorphansp_droporphans 저장 프로시저는 ODBC ntext, textimage 처리에 사용됩니다.

sp_reset_connection 저장 프로시저는 SQL Server에서 트랜잭션의 원격 저장 프로시저 호출을 지원하는 데 사용됩니다. 이 저장 프로시저는 연결 풀에서 연결이 다시 사용될 때 Audit Login 및 Audit Logout 이벤트도 실행합니다.

다음 표에 있는 시스템 저장 프로시저는 SQL Server 인스턴스 내부 또는 클라이언트 API를 통해서만 사용되며 일반적인 용도로는 사용되지 않습니다. 이 표의 내용은 변경될 수 있으며 호환성을 보장하지 않습니다.

다음 저장 프로시저는 SQL Server 온라인 설명서에 문서화되어 있습니다.

sp_catalogs

sp_column_privileges

sp_column_privileges_ex

sp_columns

sp_columns_ex

sp_databases

sp_datatype_info

sp_fkeys

sp_foreignkeys

sp_indexes

sp_pkeys

sp_primarykeys

sp_server_info

sp_special_columns

sp_sproc_columns

sp_statistics

sp_table_privileges

sp_table_privileges_ex

sp_tables

sp_tables_ex

다음 저장 프로시저는 문서화되어 있지 않습니다.

sp_assemblies_rowset

sp_assemblies_rowset_rmt

sp_assemblies_rowset2

sp_assembly_dependencies_rowset

sp_assembly_dependencies_rowset_rmt

sp_assembly_dependencies_rowset2

sp_bcp_dbcmptlevel

sp_catalogs_rowset

sp_catalogs_rowset;2

sp_catalogs_rowset;5

sp_catalogs_rowset_rmt

sp_catalogs_rowset2

sp_check_constbytable_rowset

sp_check_constbytable_rowset;2

sp_check_constbytable_rowset2

sp_check_constraints_rowset

sp_check_constraints_rowset;2

sp_check_constraints_rowset2

sp_column_privileges_rowset

sp_column_privileges_rowset;2

sp_column_privileges_rowset;5

sp_column_privileges_rowset_rmt

sp_column_privileges_rowset2

sp_columns_90

sp_columns_90_rowset

sp_columns_90_rowset_rmt

sp_columns_90_rowset2

sp_columns_ex_90

sp_columns_rowset

sp_columns_rowset;2

sp_columns_rowset;5

sp_columns_rowset_rmt

sp_columns_rowset2

sp_constr_col_usage_rowset

sp_datatype_info_90

sp_ddopen;1

sp_ddopen;10

sp_ddopen;11

sp_ddopen;12

sp_ddopen;13

sp_ddopen;2

sp_ddopen;3

sp_ddopen;4

sp_ddopen;5

sp_ddopen;6

sp_ddopen;7

sp_ddopen;8

sp_ddopen;9

sp_foreign_keys_rowset

sp_foreign_keys_rowset;2

sp_foreign_keys_rowset;3

sp_foreign_keys_rowset;5

sp_foreign_keys_rowset_rmt

sp_foreign_keys_rowset2

sp_foreign_keys_rowset3

sp_indexes_90_rowset

sp_indexes_90_rowset_rmt

sp_indexes_90_rowset2

sp_indexes_rowset

sp_indexes_rowset;2

sp_indexes_rowset;5

sp_indexes_rowset_rmt

sp_indexes_rowset2

sp_linkedservers_rowset

sp_linkedservers_rowset;2

sp_linkedservers_rowset2

sp_oledb_database

sp_oledb_defdb

sp_oledb_deflang

sp_oledb_language

sp_oledb_ro_usrname

sp_primary_keys_rowset

sp_primary_keys_rowset;2

sp_primary_keys_rowset;3

sp_primary_keys_rowset;5

sp_primary_keys_rowset_rmt

sp_primary_keys_rowset2

sp_procedure_params_90_rowset

sp_procedure_params_90_rowset2

sp_procedure_params_rowset

sp_procedure_params_rowset;2

sp_procedure_params_rowset2

sp_procedures_rowset

sp_procedures_rowset;2

sp_procedures_rowset2

sp_provider_types_90_rowset

sp_provider_types_rowset

sp_schemata_rowset

sp_schemata_rowset;3

sp_special_columns_90

sp_sproc_columns_90

sp_statistics_rowset

sp_statistics_rowset;2

sp_statistics_rowset2

sp_stored_procedures

sp_table_constraints_rowset

sp_table_constraints_rowset;2

sp_table_constraints_rowset2

sp_table_privileges_rowset

sp_table_privileges_rowset;2

sp_table_privileges_rowset;5

sp_table_privileges_rowset_rmt

sp_table_privileges_rowset2

sp_table_statistics_rowset

sp_table_statistics_rowset;2

sp_table_statistics2_rowset

sp_tablecollations

sp_tablecollations_90

sp_tables_info_90_rowset

sp_tables_info_90_rowset_64

sp_tables_info_90_rowset2

sp_tables_info_90_rowset2_64

sp_tables_info_rowset

sp_tables_info_rowset;2

sp_tables_info_rowset_64

sp_tables_info_rowset_64;2

sp_tables_info_rowset2

sp_tables_info_rowset2_64

sp_tables_rowset;2

sp_tables_rowset;5

sp_tables_rowset_rmt

sp_tables_rowset2

sp_usertypes_rowset

sp_usertypes_rowset_rmt

sp_usertypes_rowset2

sp_views_rowset

sp_views_rowset2

sp_xml_schema_rowset

sp_xml_schema_rowset2

반응형

'연구개발 > SQL2005' 카테고리의 다른 글

커서 정보 확인  (0) 2009.06.12
테이블 필드명 변경  (0) 2009.06.12
저장된 프로시저의 이름 및 내용 확인  (0) 2009.06.11
잠금정보 확인  (0) 2009.06.10
index 체크 유무  (0) 2009.06.08
반응형
sys.objects 및 sys.sql_modules

SELECT o.name, m.definition
FROM sys.sql_modules m
 JOIN sys.objects o
 ON m.object_id = o.object_id AND o.type = 'P';


EXECUTE sp_helptext usp_error(프로시저이름);
반응형

'연구개발 > SQL2005' 카테고리의 다른 글

테이블 필드명 변경  (0) 2009.06.12
시스템 저장 프로시저(Transact-SQL)  (0) 2009.06.11
잠금정보 확인  (0) 2009.06.10
index 체크 유무  (0) 2009.06.08
조직도 나타내기 - 재귀적호출  (0) 2009.05.26
반응형

SELECT resource_type, resource_database_id, resource_associated_entity_id, request_mode
FROM sys.dm_tran_locks
반응형
반응형

CREATE PROCEDURE sp_IndexInfo
 @tablename sysname
AS
SELECT @tablename AS '테이블이름',
 I.name AS '인덱스이름',
 I.type_desc AS '인덱스타입',
 A.data_pages AS '페이지개수',
 A.data_pages * 8 AS '크기(KB)',
 P.rows AS '행개수'
FROM sys.indexes I
 INNER JOIN sys.partitions P
  ON P.object_id = I.object_id
   AND object_id(@tablename) = I.object_id
   AND I.index_id = P.index_id
 INNER JOIN sys.allocation_units A
  ON A.container_id = P.hobt_id


EXEC sp_IndexInfo 'TEST'
반응형
반응형

재귀적이란 자기 자신을 호출하는 것을 말한다.

USE sqlDB
GO
CREATE TABLE empTbl (emp NCHAR(3), manager NCHAR(3), department NCHAR(3))
GO

INSERT INTO empTbl VALUES ('나사장', NULL, NULL)
INSERT INTO empTbl VALUES ('김재무', '나사장', '재무부')
INSERT INTO empTbl VALUES ('김부장', '김재무', '재무부')
INSERT INTO empTbl VALUES ('이부장', '김재무', '재무부')
INSERT INTO empTbl VALUES ('우대리', '이부장', '재무부')
INSERT INTO empTbl VALUES ('지사원', '이부장', '재무부')
INSERT INTO empTbl VALUES ('이영업', '나사장', '영업부')
INSERT INTO empTbl VALUES ('한과장', '이영업', '영업부')
INSERT INTO empTbl VALUES ('최정보', '나사장', '정보부')
INSERT INTO empTbl VALUES ('윤차장', '최정보', '정보부')
INSERT INTO empTbl VALUES ('이주임', '윤차장', '정보부')

SELECT * FROM empTbl;

WITH empCTE (empName, mgrName, dept, level)
AS
(
 SELECT emp, manager, department, 0
 FROM empTbl
 WHERE manager IS NULL --상관이 없는 사람이 바로 사장
 UNION ALL
 SELECT AA.emp, AA.manager, AA.department, BB.level+1
 FROM empTbl AS AA INNER JOIN empCTE AS BB
  ON AA.manager = BB.empName
)
SELECT * FROM empCTE ORDER BY dept, level;


--수정
WITH empCTE (empName, mgrName, dept, level)
AS
(
 SELECT emp, manager, department, 0
 FROM empTbl
 WHERE manager IS NULL --사장
 UNION ALL
 SELECT AA.emp, AA.manager, AA.department, BB.level + 1
 FROM empTbl AS AA INNER JOIN empCTE AS BB
  ON AA.manager = BB.empName
)
SELECT replicate('    ', level) + '*' + empName AS [직원이름], dept AS [직원부서]
FROM empCTE ORDER BY dept, level

반응형
반응형

CREATE TABLE test (GBN CHAR(1),VAL CHAR(3))
INSERT test VALUES('A','001')
INSERT test VALUES('A','002')
INSERT test VALUES('A','003')
INSERT test VALUES('A','004')
INSERT test VALUES('A','005')
INSERT test VALUES('A','011')
INSERT test VALUES('B','007')
INSERT test VALUES('B','004')
INSERT test VALUES('B','005')
INSERT test VALUES('B','010')
INSERT test VALUES('C','011')
INSERT test VALUES('C','001')
INSERT test VALUES('C','002')
INSERT test VALUES('C','003')

-------------------------------------------------------
SELECT DISTINCT GBN,
       STUFF((SELECT ',' + VAL AS [text()]
                FROM test b
               WHERE b.GBN = a.GBN
               ORDER BY VAL
                 FOR XML PATH('')),1,1,'') AS VAL
FROM test a

/*
GBN  VAL
---- -----------------------------
A    001,002,003,004,005,011
B    004,005,007,010
C    001,002,003,011
반응형
반응형

프로시저 안에서 다른 프로시저를 호출하고 처리할 경우
호출된 다른 프로시저들은 각각의 프로시저 안에서 트랜잭션이 커밋된 상태일 때
상위 프로시저가 에러 발생시 롤백을 하게 되면 하위 프로시저들은 (중첩된 프로시저) 전체 롤백을 한다.

CREATE PROC test1
BEGIN TRAN
    EXEC PRC_Test2 ''
    EXEC PRC_Test3 '', ''
    IF (@err1 <> )
        BEGIN
            ROLLBACK TRAN
        END
    ELSE
        BEGIN
            COMMIT TRAN
        END
반응형
반응형
BACKUP LOG northwind WITH TRUNCATE_ONLY
GO
USE northwind
GO

sp_helpdb 'northwind' --정보확인
GO

DBCC SHRINKFILE (northwind_LOG, 1, TRUNCATEONLY)
GO

ALTER DATABASE northwind
MODIFY FILE
(
    NAME = 'northwind_LOG'
   ,SIZE = 8000MB --적당한 사이즈로
   ,FILEGROWTH = 100
)
GO

dbcc sqlperf (logspace)

--점검시간에 할 것
--운영중에 실행시 사이즈 완전 축소 후 virtuallog 파일 개수를 줄이는 작업을 같이 하게 됨으로 성능에 좋지 않음.

-- 2008에서는 지원하지 않음
반응형
반응형


mkex.pe.kr 에 '허동석' 님이 작성해 주신 글을 옮겨 옵니다.

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

페이징 쿼리 종류별로 성능을 비교한 좋은 자료가 있어서 상당부분 인용했습니다.

"ex)"에 들어가는 샘플 쿼리는 바투 락커룸 DB에 파일첨부(TB_AttachFile) 테이블을 대상으로 페이징 쿼리를 작성해 봤습니다.

5번에 표시된 내용이 데이터 건수에 상관없이 실질적으로 가장 빠르지만 우리 시스템에 적용할 수 있는지는 의문이 갑니다. 테이블 별로 인덱스 생성이 필요할 수 있고 중간에 데이터가 삭제되거나 어떤 반응이 생길 때 문제가 될 소지가 있는지도 조사해야 할 것 같습니다.

참고로 웹젠 빌링에서 사용하던 페이징 쿼리는 4번을 이용했었습니다.
그리고 2번에 샘플 쿼리를 보면 TB_AttachFile 테이블에 FileGuid가 None Clustered Index로 걸려 있어서 서브쿼리 내에서도 ORDER BY FileGuid DESC를 해줘야합니다.(즉 ORDER BY 를 2번 해야한다는..)
대부분의 기본키들이 None Clustered Index 라 이 점에 대한 이슈도 있습니다.

1. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]  

  레코드셋의 AbsolutePage를 이용해서 페이징을 했습니다.

ex)

SELECT TOP 10 FileGuid, FileName, Capacity, RegDate
FROM TB_AttachFile



2. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]
   WHERE [글번호필드] NOT IN (SELECT TOP [제거할 게시물수] [글번호필드] FROM [테이블명])

   예전에 태요 사이트에서 보았던 쿼리 구문입니다.. NOT IN 때문에.. 문제시 되었던 쿼리구문이죠.

ex)

SELECT TOP 10 FileGuid, FileName, Capacity, RegDate
FROM TB_AttachFile
WHERE FileGuid NOT IN
(
 SELECT TOP 0 FileGuid
 FROM TB_AttachFile
 ORDER BY FileGuid DESC
)
ORDER BY FileGuid DESC


3. SELECT TOP [불러올 총 게시물수] [출력 필드명] FROM [테이블 명]
   WHERE [글번호] IN (SELECT TOP [페이지출력 갯수] [글번호] FROM
   (SELECT TOP [불러올 총 게시물수] [글번호] FROM [테이블 명]) AS A ORDER BY [글번호])
   ORDER BY [글번호] DESC

   이 쿼리 구문은 2번의 쿼리 구문의 문제점을 보완한 구문입니다. NOT IN 대신에 IN을 사용 했습니다.

ex)

SELECT TOP 10 FileGuid, FileName, Capacity, RegDate
FROM TB_AttachFile
WHERE FileGuid IN
(
 SELECT TOP 123 FileGuid -- 총 데이터수 - ( (페이지수 - 1) * 10) // 1페이지 : 123 - 0, 2페이지 : 123 - 10 ...
 FROM
 (
  SELECT FileGuid
  FROM TB_AttachFile
 )AS A
 ORDER BY FileGuid
)
ORDER BY FileGuid DESC


4. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블 명]
   WHERE [글번호] <= (SELECT MIN([글번호])
   FROM (SELECT TOP [제거할 게시물수] + 1 [글번호] FROM [테이블명]) AS A)

   4번째 쿼리 구문은 IN, NOT IN이 아닌 출력할 마지막 글번호 바로 앞이 글번호를 찾아서 처리를 해주는
   쿼리 구문입니다.

ex)

SELECT TOP 10 FileGuid, FileName, Capacity, RegDate
FROM TB_AttachFile
WHERE FileGuid <=
(
 SELECT MIN(FileGuid)
 FROM
 (
  SELECT TOP 11 FileGuid -- (현재페이지수-1) * 10 + 1 
  FROM TB_AttachFile
  ORDER BY FileGuid DESC
 )AS A
)
ORDER BY FileGuid DESC


5. SELECT TOP [페이지 출력갯수] [출력 필드명] FROM [테이블명]
   WHERE [글번호] <= (SELECT MIN([글번호])
   FROM (SELECT TOP [제거할 게시물수] + 1 [글번호]
   FROM [테이블명] WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]) AS A
   WHERE [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호])
   AND [인덱스] = [시작인덱스번호] AND [인덱스] = [끝인덱스번호]

   5번재 쿼리는.. 글에 인덱스(가칭)라는 필드를 하나 더 추가 해서.. 글 기본 2000개마다 (가변적입니다)
   인덱스를 증가 시켰습니다. 즉 2000개를 하나의 묶음으로 만든것입니다.
   그 인덱스를 기준으로 처리를 해주었습니다.

ex)

SELECT TOP 10 FileGuid, FileName, Capacity, RegDate
FROM TB_AttachFile
WHERE FileGuid <=
(
 SELECT MIN(FileGuid)
 FROM
 (
  SELECT TOP 11 FileGuid -- (현재페이지수-1) * 10 + 1 
  FROM TB_AttachFile
  WHERE IDX_FileGuid > 350  -- 350은 이전 페이지의 끝 게시물 번호. (350보다 큰 10개를 얻음.)
  ORDER BY FileGuid DESC
 )AS A
)
ORDER BY FileGuid DESC


결과.

게시물은 100만개를 넣고 테스트를 했습니다
서버정보 : CPU : p4-1.8, RAM : 768Mb, 컴팩 프리자리오 2820AP, 환경 : 윈도우2003 MSSQL2000
처음페이지(1), 마지막 페이지(50000) 처리 시간이 아래와 같습니다.(단위 ms)
 첫페이지 실행    끝페이지 실행
1 :  273                 11476.56
2 :  289                 4406.25
3 :  289                 2695.31
4 :  289                 1218.75
5 :  7.81                23.44

반응형

+ Recent posts

반응형