2012. 10. 9. 15:31

시작시 늦어지는 경우 (Slow StartUP)

문제


SQL Server Reporting Services 2008 (SSRS 2008) 시작하고 일정 시간 지나면 점점 늦어지는 현상을 볼 수 있음. 


해결책 


1. SSRS Configuration 의 Recycle Time 변경

2. Memory Pressure


SSRS Configuration 


  - XML 구성 파일이 존재한다.  Recycle Time (재활용 시간 ??) 은 마지막 으로 SSRS가 사용자가 수동으로 다시 시작 되었을 때 기준으로 분 이다. 

Recycle Time이 발생하면 SSRS내의 유휴 자원이 해지 된다. 

기본으로는 720분 또는 12시간으로 구성 되어 있다. 


C:\Program Files\Microsoft SQL Server\MSRS10.MSSQLSERVER\Reporting Services\ReportServer


rsreportserver.config


‹Service›

   …

   …

   ‹RecycleTime›720‹/RecycleTime›

   …

   …


720분으로 셋팅되어 있기 때문에  초기 사용자는 느린 시작으로 연결이 되고 

720분 다시 발생 할 때까지 잘 사용되다가 720분이 되면 다시 유휴 자원이 이루어지어 느린 응답이 발생한다.


재활용 시간은 마지막 날짜를 사용하는 시간 SSRS은 그 참조 점으로 다시 시작했다.

SSRS은 구성 파일에서 재활용 시간을 예약 ,현재 날짜와 시간을 그 다시 시작 시간을 사용한다.

재활용 시간이 720분로 설정되어 있으며 SSRS이 12:00에 720분 후 다음 자정 0시에서 다시 시작하는 경우

 예를 들어, SSRS 자체를 재활용합니다. 이후 720분 후 자정에 0시의 SSRS 다시 재활용되며, 등등. 

SSRS의 재활용은 자원을 확보하기 위해 무기한 계속됩니다.



SSRS 재활용 시간에 가장 좋은 시간은 각 회사의 사용에 따라 달라진다.  그것은 SSRS가 많이 활용되지 않는 경우 몇 가지 분석을 수행하는 것이 가장 좋을 수 있습니다. 

기본적으로는 12 시간마다 재활용,하지만 요청이 처리되는가보고 있으면 더 기간 동안 SSRS를 운영 중 상태로 

유지하기 더 좋을 수 있다.


여러 지사를 가지고 있는데 시간대가 틀리게 사용되어 진다면, 720분은 많이 사용하는 시간에 유휴자원이 되어 초기화 될 수 있다.



SQL Server Reporting Services Memory Pressure


조직의 크기에 따라 SSRS를 독립적으로 사용하지 않고 SQL Server나 다른 응용프로그램과 같은 컴퓨터에 공용으로 사용할 수 있다. 

이때, 다른 응용 프로그램에서 메모리가 필요하면 Windows는 유휴 상태가 된 메모리를 빼앗는 작업을 하는데 그 피해자의 하나로서 SSRS를 결정한다.  

이 문제의 간단한 해결책은 더 많은 RAM을 추가 하는 것이지만, 대부분 가능한 상황이 아니다. 


이 방법을 해결하는 두번 째 방법은 Memory Pressure 관리할 수 있는 SSRS에 최소한 메모리를 조정하는 것이다. 

혹은 예약된 보고서를 작성하는것이다. 


최소한의 메모리를 조정하는 옵션은 "WorkingSetMinimu" 에 대한 SSRS 구성 파일에 추가하는 것이다. 


‹Service›

   …

   …

   ‹WorkingSetMinimum›250000‹/WorkingSetMinimum›

   …

   …




이 작업은 다른 응용 프로그램에 영향을 미칠 수 있음을 주의해야 하며, 메모리 소비수준을 꼭 모니터링 해서 결정해야 한다. 

오히려 이 수치가 높을 경우 응용프로그램 및 서버 자체가 느리거나 응답 하지 않을 수도 있다. 


'Reporting Service' 카테고리의 다른 글

배포 메일링 주소 변경  (0) 2014.09.02
공유 데이터 원본 Overwrite  (0) 2009.08.04
2012. 7. 26. 12:54

T-SQL:: 인덱스 압축 예상 Size

SQL Server 2008 이후 

인덱스 압축 했을 때 예상 사이즈 조회

  exec sp_estimate_data_compression_savings  
   @schema_name = 'dbo'
  ,@object_name = '테이블명'
  ,@index_id = 1
  ,@partition_number = null, @data_compression = 'page'  -- 압축 방법


'T-SQL' 카테고리의 다른 글

T-SQL::동적 PIVOT 생성  (3) 2012.11.02
Function to return a range of dats - 날짜 범위 펑션  (0) 2012.11.01
TSQL::월별 누적 건수를 구하기.  (0) 2012.01.29
T-SQL::테이블 확장속성  (0) 2011.10.05
2011. 1. 11. 07:22

syspolicy_purge_history JOB 실패

  
SQL Server 2008 이 후

1. 클러스터 장비 일 경우
-  가상 서버 이름으로 되어야 하는데 그렇지 못한 경우 서버를 찾을 수 없다는 error
http://support.microsoft.com/kb/955726/ko

2. PowerSheell 오류

단계 3 실행을 시작할 수 없습니다(원인: PowerShell 하위 시스템이 로드하지 못했습니다[자세한 내용은 SQLAGENT.OUT 파일 참조]. 작업이 일시 중지되었습니다.).  단계가 실패했습니다.

 경로 확인

SELECT * FROM msdb.dbo.syssubsystems WHERE start_entry_point ='PowerShellStart'

agent_exe 결과 확인

C:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\SQLPS.exe

해당 경로에 Tools\Binn 존재 하지 않습니다.

 경로 변경

Use msdb

go

 

exec sp_configure 'allow updates', 1 RECONFIGURE WITH OVERRIDE

 

UPDATE msdb.dbo.syssubsystems

SET agent_exe='D:\Program Files (x86)\Microsoft SQL Server\100\Tools\Binn\SQLPS.exe'올바르게 변경

WHERE start_entry_point ='PowerShellStart'

Agent Restart

-       agent 다시 시작 하지 않으면 저 경로 인식 하지 못합니다.

syspolicy_purge_history job 시작

 

 

참고)

해당 job은 한번 실행하고 나서 실패하면 다시 시작 할 수 없습니다.

job을 다시 삭제하고 만들어 주시던가, 아님 agent를 재 시작 해주셔야 합니다.

 job을 다시 만드는 법은 아래 구문 실행 해 주세요


DECLARE @jobId uniqueidentifier-- Obtain the current job identifier that is associated with the PurgeHistorySELECT @jobId = CAST(current_value AS uniqueidentifier)FROM msdb.dbo.syspolicy_configuration_internalWHERE name = N'PurgeHistoryJobGuid'-- Delete the job identifier association in the syspolicy configurationDELETE FROM msdb.dbo.syspolicy_configuration_internalWHERE name = N'PurgeHistoryJobGuid'-- Delete the offending jobEXEC msdb.dbo.sp_delete_job @job_id = @jobId-- Re-create the job and its association in the syspolicy configuration tableEXEC msdb.dbo.sp_syspolicy_create_purge_job
 


'SQL Agent' 카테고리의 다른 글

AGent::구성, 보안,Proxy  (0) 2010.06.04
2010. 8. 17. 18:03

SQL 2008:: 삭제 레지스터리


SQL Server 2008


HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SQL Server
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MSSQLSERVER
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MsDtsServer100

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Microsoft SQL Server.



SQL Server 2008 수동으로 제거

setup.exe  /SQL /INSTANCENAME = MSSQLSERVER

SQL Server 2008 수동으로 제거하려면 다음과 같이 하십시오.
  1. 명령 프롬프트에서 다음 명령을 입력한 다음 Enter 키를 누릅니다.
    CD %ProgramFiles%\Microsoft SQL Server\100\Setup Bootstrap\Release
  2. 다음 명령을 입력한 다음 Enter 키를 누릅니다.
    /ACTION setup.exe = 제거/FEATURES Feature_List/INSTANCENAME = Instance_Name =
    참고 이 명령은 Feature_List 자리 "AS, SQL, RS, 도구." 등의 기능 값이 없는 공간, 쉼표로 구분된 목록을 나타냅니다. Instance_Name 자리 설치된 SQL Server 2008의 명명된 인스턴스를 나타냅니다. 명명된 인스턴스를 사용하지 않은 경우, 명명된 인스턴스에 대해 "MSSQLSERVER" 사용할 수 있습니다.

http://support.microsoft.com/kb/955404/ko

'Install /Setup' 카테고리의 다른 글

SQL 2012 Intergration Service 구성 항목 설정  (0) 2014.08.21
Install Tip  (0) 2010.06.04
SQL Server 수동 시작  (1) 2010.01.22
2010. 6. 7. 23:43

SQL2008에서 SQL2000 DTS열기

SQL Server 2008에서는 DTS 패키지에 대한 디자인 타임 지원을 설치하지 않습니다. SQL Server 2008 도구를 사용하여 DTS 패키지를 열어서 보려면 다음 절차에 설명된 대로 이러한 디자인 타임 지원을 다운로드하고 설치해야 합니다.
참고:
다운로드할 수 있는 DTS 패키지 디자이너는 SQL Server 2008 도구를 사용하지만 디자이너의 기능은 SQL Server 2008용으로 업데이트되지 않았습니다.

데이터 변환 서비스 패키지를 위한 디자인 타임 지원을 설치하려면 ·

         인터넷 브라우저에서 Microsoft SQL Server 2005용 기능 팩 페이지를 열고 Microsoft SQL Server 2000 DTS 디자이너 구성 요소를 다운로드하여 설치합니다.
기본적으로 32비트 컴퓨터에서 SQL Server 2000의 이진 파일은 %ProgramFiles%\Microsoft SQL Server\80\Tools\Binn 폴더에 있으며, SQL Server 2008의 이진 파일은 %ProgramFiles%\Microsoft SQL Server\100\Tools\Binn 폴더에 있습니다. 이러한 기본 위치를 사용하면 PATH 환경 변수에서 SQL Server 2000 이진 파일의 경로가 SQL Server 2008 이진 파일의 경로 앞에 올 수 있습니다. 이러한 경우 DTS 디자이너를 사용하려고 하면 오류 메시지가 표시될 수 있습니다. 이러한 오류를 해결하려면 다음 절차에 설명된 대로 디자이너에 필요한 파일을 새로운 위치로 복사합니다.
참고:
64비트 컴퓨터의 경우 다음 절차에서 %ProgramFiles%를 %ProgramFiles(x86)%로 대체하십시오.

SQL Server Management Studio에서 DTS 디자이너를 사용할 수 있도록 하려면

1.       %ProgramFiles%\Microsoft SQL Server\80\Tools\Binn 폴더에 있는 SEMSFC.DLL, SQLGUI.DLL 및 SQLSVC.DLL 파일을 %ProgramFiles%\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE 폴더로 복사합니다.
2.       %ProgramFiles%\Microsoft SQL Server\80\Tools\Binn\Resources 폴더에 있는 SEMSFC.RLL, SQLGUI.RLL 및 SQLSVC.RLL 파일을 %ProgramFiles%\Microsoft SQL Server\100\Tools\Binn\VSShell\Common7\IDE\Resources\%lang_id% 폴더로 복사합니다. 예를 들어 미국 영어이면 lang_id 하위 폴더는 "1033"입니다.



Business Intelligence Development Studio에서 DTS 디자이너를 사용할 수 있도록 하려면

1.       %ProgramFiles%\Microsoft SQL Server\80\Tools\Binn 폴더에 있는 SEMSFC.DLL, SQLGUI.DLL 및 SQLSVC.DLL 파일을 %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE 폴더로 복사합니다.
2.       %ProgramFiles%\Microsoft SQL Server\80\Tools\Binn\Resources 폴더에 있는 SEMSFC.RLL, SQLGUI.RLL 및 SQLSVC.RLL 파일을 the %ProgramFiles%\Microsoft Visual Studio 9.0\Common7\IDE\Resources\%lang_id% 폴더로 복사합니다. 예를 들어 미국 영어이면 lang_id 하위 폴더는 "1033"입니다


 


1. SQLServer2005_DTS.msi 설치

http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=11988


2.  파일 복사

  FROM : C:\Program Files\Microsoft SQL Server\80\Tools\Binn

   TO : C:\Program Files\Microsoft SQL Server\100\Tools\Binn

3. SSMS 재 시작



.

'Business Inteligence (SSIS)' 카테고리의 다른 글

SSIS 데이터 이관 속도  (0) 2012.08.09
SSIS::플랫 파일 가져오기 에러.  (0) 2012.02.09
For컨테이너-무한루프  (0) 2010.06.03
스크립트task사용  (0) 2010.06.03
2010. 4. 5. 00:01

DMV::Index



SQL SERVER 2005 이상

SQL 2005는 DMV를 통해서 실시간으로 인덱스의 사용빈도, 변경 횟수, lock 현황, missing 된 인덱스 정보를 제공한다.

이 자료를 바탕으로 튜닝과 관리 모니터링이 가능하다.

DMV의 정보는 마지막으로 SQL 인스턴스가 시작된 후로 누적된 값이다.

 사용하고 있는 INDEX 무엇인가?

 DDL 문을 통해 인덱스를 생성하게 되면 인덱스가 카탈로그는 업데이트 된다.

 그렇다고 이 인덱스가 "USE" 사용되는 것은 아니다.  인덱스가 select, insert, update가 될 때 sys.dm_db_index_usage_stats 에서 정보를 찾을 수 있다.

 마지막으로 SQL SERVER를 방금 재 시작 했다면 sys.dm_db_index_usage_stats 정보를 찾을 수 없을 수도 있다.

 

user_seeks : 사용자 쿼리별 검색(Seek) 수입니다.

user_scans : 사용자 쿼리별 검색(Scan) 수입니다.

user_lookups :  사용자 쿼리별 책갈피 조회 수입니다.

user_updates :  사용자 쿼리별 업데이트 수

 

사용하지 않는 테이블 & 인덱스

  1. -- unused tables & indexes.

  2. DECLARE @dbid INT

  3. SET @dbid = DB_ID('AdventureWorks')

  4.  

     

  5. SELECT OBJECT_NAME(IDX.object_id) as object_name,

  6.        IDX.name AS index_name,

  7.        CASE WHEN IDX.type = 1 THEN 'Clustered'

  8.           WHEN IDX.type = 2 THEN 'Non-Clustered'

  9.           ELSE 'Unknown' END Index_Type

  10. FROM sys.dm_db_index_usage_stats  AS DIS

  11.       RIGHT OUTER JOIN sys.indexes AS IDX  ON DIS.object_id = IDX.object_id AND DIS.index_id = IDX.index_id

  12.       JOIN sys.objects AS OBJ  ON IDX.object_id = OBJ.object_ID

  13. WHERE  OBJ.type IN ('U', 'V') AND DIS.object_id IS NULL

  14. ORDER BY OBJECT_NAME(IDX.object_id), IDX.name

     

 

드물게 사용하는 인덱스

 

  1. DECLARE @dbid INT

  2. SET @dbid = DB_ID('AdventureWorks')

  3.  

  4. --- rarely used indexes appear first

  5. SELECT OBJECT_NAME(DIS.object_id) as object_name,

  6.        IDX.name AS index_name, IDX.index_id,

  7.        CASE WHEN IDX.type = 1 THEN 'Clustered'

  8.           WHEN IDX.type = 2 THEN 'Non-Clustered'

  9.           ELSE 'Unknown' END Index_Type,

  10.         DIS.user_seeks, DIS.user_scans, DIS.user_lookups, DIS.user_updates

  11. FROM sys.dm_db_index_usage_stats AS DIS

  12.             JOIN sys.indexes AS IDX ON DIS.object_id = IDX.object_id AND DIS.index_id = IDX.index_id

  13. WHERE DIS.database_id = @dbid AND objectproperty(DIS.object_id,'IsUserTable') = 1

  14.             --AND DIS.user_updates > 0 AND DIS.user_seeks = 0

                 --AND DIS.user_scans = 0 AND DIS.user_lookups  = 0  --(업데이트는 일어나는 사용되지 않은것, 관리 부담만 있다.)

  15. ORDER BY (DIS.user_updates + DIS.user_seeks + DIS.user_scans + DIS.user_lookups ) asc

 

인덱스에 lock 이 걸려있는 지 확인

  1.  declare @dbid int
  2. select @dbid = db_id()
  3. Select dbid=database_id, objectname=object_name(s.object_id)
    , indexname=i.name, i.index_id       --, partition_number
    , row_lock_count, row_lock_wait_count
    , [block %]=cast (100.0 * row_lock_wait_count / (1 + row_lock_count) as numeric(15,2))
    , row_lock_wait_in_ms
    , [avg row lock waits in ms]=cast (1.0 * row_lock_wait_in_ms / (1 + row_lock_wait_count) as numeric(15,2))
    from sys.dm_db_index_operational_stats (@dbid, NULL, NULL, NULL) s,   sys.indexes i
    where objectproperty(s.object_id,'IsUserTable') = 1
    and i.object_id = s.object_id
    and i.index_id = s.index_id
    order by row_lock_wait_count desc

 

실시간 LOCK 확인 -- 다른 LOOK 쿼리 확인. 구분 이해하기

위에 부분은 실시간으로 처리되는 것이 아니라 누적된 결과를 보는 쿼리 이다. 실시간으로 락이 걸려있는 상태를 확이낳려면 프로시저를 생성하고 처리 결과를 보는것도 좋은 방법이다.

  1. create proc sp_block_info
    as
    set rowcount ON
    select t1.resource_type as [lock type]
                ,db_name(resource_database_id) as [database]
                ,t1.resource_associated_entity_id as [blk object]
                ,t1.request_mode as [lock req]                                          --- lock requested
                ,t1.request_session_id as [waiter sid]                                  --- spid of waiter
                ,t2.wait_duration_ms as [wait time]        
                ,(select text from sys.dm_exec_requests as r                           --- get sql for waiter
                            cross apply sys.dm_exec_sql_text(r.sql_handle)
                            where r.session_id = t1.request_session_id) as waiter_batch
                ,(select substring(qt.text,r.statement_start_offset/2,
                                        (case when r.statement_end_offset = -1
                                        then len(convert(nvarchar(max), qt.text)) * 2
                                        else r.statement_end_offset end - r.statement_start_offset)/2)
                            from sys.dm_exec_requests as r
                            cross apply sys.dm_exec_sql_text(r.sql_handle) as qt
                            where r.session_id = t1.request_session_id) as waiter_stmt    --- statement blocked
                 ,t2.blocking_session_id as [blocker sid]                                 -- spid of blocker
         ,(select text from sys.sysprocesses as p                                         --- get sql for blocker
                            cross apply sys.dm_exec_sql_text(p.sql_handle)
                            where p.spid = t2.blocking_session_id) as blocker_stmt
                from
                sys.dm_tran_locks as t1,
                sys.dm_os_waiting_tasks as t2
    where  t1.lock_owner_address = t2.resource_address
    set rowcount OFF
    go

 


 SEE ALSO : http://blogs.msdn.com/sqlcat/archive/2005/12/12/502735.aspx

'T-SQL' 카테고리의 다른 글

T_SQL::CONSTRAINT조사  (1) 2010.06.03
SQL Server 2005 and 2008 Ranking Functions  (0) 2010.04.05
T-SQL::특정 objects 찾기  (0) 2010.04.04
T-SQL::Attach  (1) 2009.12.01
2010. 4. 4. 23:39

T-SQL::특정 objects 찾기

Problem

In the course of any database development project, searching for database objects is something you will probably do.  It can be any kind of search which is done using some text as the search mechanism. Some of the examples of search that a developer / DBA may make within a database or database server are: searching for a database object, searching for occurance of particular text within database objects, searching within the schema of a database object, search within the results of query results or entire tables, etc..

In this tip, we look at different mechanisms that can be used to facilitate this type of searching.

Solution

Searching is generally required across database objects, across databases, and also across database servers. There are different mechanism that can be used for different kinds of search requirements.  For this tip I will be using SQL Server Management Studio (SSMS) 2008.

We will look at four different ways for our search that cover various search requirements.

  1. SSMS Object Search
  2. T-SQL Scripts
  3. SQL Search Add-in
  4. SSMS Tools Pack Add-in
1) SSMS Object Search:

As a part of the enhancements in SSMS 2008, object explorer details window has a nice object search toolbar which allows context sensitive searching of database objects. As show in the below screenshot, I attempted searching database object named "Address".  It fetched all the tables that it found with the same name. But there can be many database object having the text "Address" within it, or "Address" text can also appear in the definition of the database object. Also you can use '%' as a wild card character along with the text that you want to search in the same way as you use it with "like" for T-SQL.



2) T-SQL Scripts:

This one is the most flexible to search anything you would like to search within your database server. Using this mechanism, you have the flexibility to interrogate any schema or data level information that you would like, but the only down-side is that you need to create code and create a set of scripts to search across databases. You can create parameterized stored procedures to faciliate the search. But if a change is required, either you need to create your stored procedures with all the parameters based on how you would like to slice and dice your search or you will need to change the code.

In the below screen-shot, I attempted searching the text "Address" within "AdventureWorks" database. I found a stored-procedure containing "Address" text within it's name. Then I created a query to search text "Address" within all the stored-procedures in this database. There is no limit to the kind of scripts that can be created for searching using this technique as long as you know which catalog views to use.



3) SQL Search Add-in:

This is a free SSMS add-in from Red Gate Software and can be downloaded from here. Once installed, it becomes visible on the toolbar. This search requires no explanation and the benefit is that you just type the text and see the results. You can also limit the scope for a database or type of database objects as per your requirement. It also shows you if the text you are searching for appeared in the name of the database object and definition of the database object.

In the screenshot below, you can see that I attempted searching "Address" keyword within "AdventureWorks" database, and then tried locating the stored procedure that we looked at using the T-SQL Script. It shows this stored procedure twice in the search result, as "Address" is a part of the name of this stored procedure and also "Address" appears in the definition of the stored procedure. Not only does it list the object, but also highlights the places where the text appeared in the definition.

The only downside is that it won't can not copy the search results from the grid. I have requested this feature from Red Gate Software and I heard back that there is a good possibility that this feature will get added.



4) SSMS Tools Pack Add-in:

This is another free SSMS add-in and can be downloaded from here. After installation, it can be accessed from the object explorer by right-clicking as shown below.  Also at context specific areas, it is availalbe by right-clicking. If we extend our search to the next level, say we want to search the entire database including all tables and every column for a text that contains "Napa", and we need a report of the same. See the screen-shot below, where I did a right-click on database and did a search on the entire database data for any text that contains the word "Napa". This add-in has a lot of featuers, I leave it to the reader to browse the rest of these features.

'T-SQL' 카테고리의 다른 글

SQL Server 2005 and 2008 Ranking Functions  (0) 2010.04.05
DMV::Index  (0) 2010.04.05
T-SQL::Attach  (1) 2009.12.01
T-SQL::테이블 ROWCOUNT, 사이즈  (0) 2009.11.27
2009. 12. 28. 15:37

SQL 2008-변경 내용 추적


SQL Sever 2008 이후

MSDN에서 발췌한 내역입니다.

http://msdn.microsoft.com/ko-kr/library/bb933875.aspx

 

사용자 테이블에 대해 어떤 행이 변경되었는가?
행이 변경되었다는 사실만 필요하며, 행이 변경된 횟수 또는 중간 변경의 값은 필요하지 않습니다.
최신 데이터는 추적되는 테이블에서 직접 얻을 수 있습니다.
행이 변경되었는가?
행이 변경되었다는 사실, 그리고 이 변경에 대한 정보가 있어야 하며 동일한 트랜잭션에 변경이 수행된 시점에 이 사항이 기록되어야 합니다.


1. 변경 내용 추적 작동 방법

 

 - 변경 내용 추적이 테이블에 대해 구성되면 해당 테이블의 행에 영향을 미치는 DML 문이 수정된 각 행에 대한 변경 내용 추적을 기록합니다.

-  추적되는 테이블에서 변경 내용 정보와 함께 기록되는 유일한 정보는 기본 키 열의 값입니다. 이러한 값은 변경된 행을 식별합니다. 이러한 행에 대한 최신 데이터를 얻으려면 응용 프로그램에서는 기본 키 열 값을 사용하여 원본 테이블을 추적되는 테이블에 조인하면 됩니다.

- 각 행에 대해 수행된 변경에 대한 정보도 변경 내용 추적을 사용하여 얻을 수 있습니다.

 

ALTER DATABASE AdventureWorks
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
;

ALTER TABLE Person.Contact
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON)
;

-- 해지
ALTER TABLE Person.Contact
DISABLE CHANGE_TRACKING;

ALTER DATABASE AdventureWorks
SET CHANGE_TRACKING = OFF

 

작업 변경 내용 추적이 설정된 경우

DROP TABLE

삭제된 테이블에 대한 모든 변경 내용 추적 정보가 제거됩니다.

ALTER TABLE DROP CONSTRAINT

PRIMARY KEY 제약 조건을 삭제하려는 시도가 실패합니다. 변경 내용 추적을 해제해야 PRIMARY KEY 제약 조건을 삭제할 수 있습니다.

ALTER TABLE DROP COLUMN

삭제된 열이 기본 키의 일부일 경우 변경 내용 추적과 관계없이 해당 열을 삭제할 수 없습니다.

삭제된 열이 기본 키의 일부가 아닐 경우 해당 열을 삭제할 수 있습니다. 그러나 이 데이터를 동기화하는 응용 프로그램에 미치는 영향에 대해 먼저 이해해야 합니다. 테이블에 열 변경 내용 추적이 설정되어 있을 경우 삭제된 열이 여전히 변경 내용 추적 정보의 일부로 반환될 수도 있습니다. 삭제된 열은 응용 프로그램에서 처리해야 합니다.

ALTER TABLE ADD COLUMN

변경 내용 추적이 설정된 테이블에 새 열이 추가될 경우 이 열 추가 작업은 추적되지 않습니다. 새 열에 대해 수행된 업데이트 및 변경 내용만 추적됩니다.

ALTER TABLE ALTER COLUMN

기본 키가 아닌 열의 데이터 형식 변경 내용은 추적되지 않습니다.

ALTER TABLE SWITCH

테이블 중 하나 또는 둘 모두에 변경 내용 추적이 설정된 경우 파티션 전환에 실패합니다.

DROP INDEX 또는 ALTER INDEX DISABLE

기본 키를 강제 적용하는 인덱스는 삭제 또는 해제할 수 없습니다.

TRUNCATE TABLE

테이블 잘라내기는 변경 내용 추적이 설정된 테이블에서 수행할 수 있습니다. 그러나 이 작업으로 삭제된 행은 추적되지 않으며 유효한 최소 버전이 업데이트됩니다. 응용 프로그램이 버전을 검사할 때 해당 버전이 너무 오래되어 다시 초기화해야 한다고 나타납니다. 이는 해당 테이블의 변경 내용 추적이 해제된 다음 다시 설정되는 것과 동일합니다.

 


'Common Admin' 카테고리의 다른 글

Admin::SQL Server wait types  (0) 2010.03.28
Admin::DB 주의대상 일때.  (0) 2010.03.06
sql2008::CDC(Change Data Capture)  (1) 2009.12.28
SQL2008::데이터 변경 내용 추적  (0) 2009.12.28
2009. 12. 28. 14:25

sql2008::CDC(Change Data Capture)

SQL SERVER 2008 이후


MSDN을 발췌한 내역입니다.

http://msdn.microsoft.com/ko-kr/library/cc645937.aspx

 

[기본 개요]

 

- 변경 데이터 캡처는 SQL Server 테이블에 적용되는 삽입, 업데이트 및 삭제 작업을 기록합니다

-  SQL Server Enterprise, Developer 및 Evaluation Edition에서만 사용할 수 있습니다.

-  이 기술의 대상이 될 수 있는 좋은 데이터 소비자 예로 ETL(추출, 변환 및 로드) 응용 프로그램을 들 수 있습니다. ETL 응용 프로그램은 증분식으로 SQL Server 원본 테이블의 변경 데이터를 데이터 웨어하우스 또는 데이터 마트로 로드합니다. 데이터 웨어하우스 내에서 원본 테이블의 표현은 해당 원본 테이블의 변경 내용을 반영해야 하지만 원본 복제본을 새로 고치는 종단 간 기술은 적합하지 않습니다. 대신 소비자가 다른 종류의 데이터 대상 표현에 적용할 수 있도록 구조화된 안정적인 변경 데이터 스트림이 필요합니다. SQL Server 변경 데이터 캡처가 이 기술을 제공합니다.

 

1. 기본 흐름

 

변경 데이터 원본은 SQL Server 트랜잭션 로그입니다.

 

추적된 원본 테이블에 삽입, 업데이트 및 삭제가 적용되면 이러한 변경을 설명하는 항목이 로그에 추가됩니다.

 

로그는 변경 데이터 캡처 프로세스에 대한 입력으로 사용됩니다. 이 프로세스는 로그를 읽고 변경에 대한 정보를 추적된 테이블의 관련 변경 테이블에 추가합니다.

 

지정된 범위에서 변경 테이블에 나타나는 변경을 열거하여 해당 정보를 필터링된 결과 집합의 형태로 반환하는 함수가 제공됩니다.

 

 

 

 

 

-  sys.sp_cdc_enable_db 사용하여 데이터베이스에 변경 데이터를 캡처 사용하도록 명시적 설정

- sys.sp_cdc_enable_table 사용하여 원본 테이블을 추적된 테이블로 식별할 수 있도록 명시적 설정

- 캡처 인스턴스는 변경테입르과 두개의 쿼리 함수로 구성

- cdc 스키마 , cdc 사용자, SQL Agent 작업 2개 (cdc.database.capture, cdc.database.cleanup) , 메타데이터 테이블, 변경 테이블 생성

 

- 원본 테이블에 적용되는 각 삽입 또는 삭제 작업은 변경 테이블 내에 단일 행으로 나타납니다.

- 삽입 작업의 결과로 생성되는 행의 데이터 열에는 삽입 이후의 열 값이 포함되며 삭제 작업의 결과로 생성되는 행의 데이터 열에는 삭제 이전의 열 값이 포함됩니다. 업데이트 작업의 경우 하나의 행 항목에서 업데이트 이전의 열 값을 식별하고 다른 행 항목에서 업데이트 이후의 열 값을 식별해야 합니다.

- 열 __$operation은 변경 내용과 관련된 1 = 삭제, 2 = 삽입, 3 = 업데이트(이전 이미지) 및 4 = 업데이트(이후 이미지) 작업을 기록합니다.

 

2. 데이터 베이스에 대한 변경 데이터 캡처 유효성 간격

 

-  캡처 인스턴스에 변경 데이터를 사용할 수 있는 시간입니다.

유효성 간격은 데이터베이스 테이블에 대한 첫 번째 캡처 인스턴스가 만들어질 때 시작되어 현재 시간까지 지속됩니다.

- 캡처 프로세스에서 관련 로그 항목을 처리할 때까지 변경 데이터를 사용할 수 없다는 점을 알아두는 것이 중요합니다.  (대기시간이 존재함)

 

3. 캡처 인스턴스에 대한 변경 데이터 뱁처 유효성 간격

 

- 캡처 인스턴스의 유효성 간격은 캡처 프로세스에서 캡처 인스턴스를 인식하여 해당 변경 테이블에 대한 관련 변경 내용을 기록하기 시작할 때 시작합니다. 따라서 여러 캡처 인스턴스가 서로 다른 시간에 만들어지는 경우 각 인스턴스는 처음에 서로 다른 하위 끝점을 포함하게 됩니다

- 시간이 지나도 새 캡처 인스턴스가 만들어지지 않으면 모든 개별 인스턴스에 대한 유효성 간격이 데이터베이스 유효성 간격과 일치하게 됩니다.

- sys.fn_cdc_get_min_lsn : 캡처 인스턴스의 대한 현재 최소 LSN 값을 검색

- sys.fn_cdc_get_max_lsn : 최대 LSN 값을 검색하는데 사용

- 변경 데이터를 쿼리할 때 지정 LSN 범위가 이러한 두 LSN 값 내에 포함되지 않은 경우 변경 데이터 캡처 쿼리 함수가 실패합니다.

 

4. 원본 테이블에 대한 변경 내용 처리

 

-  원본테이블의 열이 데이터 형식이 변경되면 변경테이블로 전파되어 데이터 손실이 생성되지 않는다.

- 원본 테이블열이 삭제되면, 후속 변경 항목의 열에 대해서는 NULL값이 제공된다.

- 단일 원본 테이블에 동시에 연결할 수 있는 최대 캡처 인스턴스 수는 두 개입니다.

- 기본적으로 3일 분량의 데이터가 보존 됩니다.

 

5. 데이터베이스 미러링

- 변경 데이터 갭처가 설정된 데이터베이스에 미러링 걸 수 있습니다.

 *  agent가 실행중인지 확인합니다.

 * 보안 주체가 미러로 장애 조치를 수행하면 미러에서 갭처 작업 및 정리작업을 만듭니다.

 

6. 트랜잭션 복제

 - 변경 데이터 겹처 및 트랜잭션 복제는 동일한 데이터베이스에 함께 존재할 수 있습니다.

- sp_replcmds 가 배포 데이터베이스의 테이블과 캡처에 의한 변경 테이블에 모두 값을 채웁니다. 복제가 해지되면 로그 판독기 에이전트가 제거되고 캡처 작업이 다시 만들어 집니다.

 

7. 변경 데이터 캡처가 설정된 데이터베이스 복원 또는 연결

 - 데이터베이스가 동일한 서버에 동일한 데이터베이스 이름으로 복원되는 경우 변경 데이터 캡처는 설정된 상태를 유지합니다.
 - 데이터베이스가 다른 서버로 복원되는 경우에는 기본적으로 변경 데이터 캡처가 해제되고 관련된 모든 메타데이터가 삭제됩니다. 변경 데이터 캡처를 유지하려면 데이터베이스를 복원할 때 KEEP_CDC 옵션을 사용합니다.
- 데이터베이스가 분리된 후 다시 동일한 서버 또는 다른 서버에 연결될 경우 변경 데이터 캡처는 설정된 상태를 유지합니다.

- 데이터베이스가 KEEP_CDC 옵션을 사용하여 Enterprise 이외의 다른 버전에 연결 또는 복원된 경우 변경 데이터 캡처에 SQL Server Enterprise가 필요하기 때문에 작업이 차단됩니다. 오류 메시지 932가 표시됩니다.
sys.sp_cdc_disable_db 를 사용하여 제거 할 수 있습니다.

 

 

'Common Admin' 카테고리의 다른 글

Admin::DB 주의대상 일때.  (0) 2010.03.06
SQL 2008-변경 내용 추적  (0) 2009.12.28
SQL2008::데이터 변경 내용 추적  (0) 2009.12.28
SQL 2008 개선된 기능, DBMS Trends  (0) 2009.12.24
2009. 12. 28. 11:16

SQL2008::데이터 변경 내용 추적

MSDN 자료를 발췌한 내역입니다.

http://msdn.microsoft.com/ko-kr/library/bb933994.aspx

 

일반적으로 응용 프로그램 개발자는 데이터 변경을 확인하기 위해 응용 프로그램에서 트리거, 타임스탬프, 열 및 추가 테이블의 조합으로 사용자 지정 추적 방법을 구현해야 했습니다. 이러한 응용 프로그램을 만드는 데는 일반적으로 많은 구현 작업과 스키마 업데이트가 필요했으며 성능 오버헤드도 높은 경우가 많았습니다.

SQL Server 2008은 다음과 같은 새로운 기술을 제공합니다. 응용 프로그램 개발자는 이러한 기술을 사용하여 데이터 변경을 추적하고 응용 프로그램에서 변경된 데이터만 추적하도록 할 수 있습니다.

 

1. 변경 데이터 캡처

 - DML 변경이 적용되었다는 사실과 변경된 실제 데이터 모두를 캡처하여 사용자 테이블에 대한 기록 변경 정보를 제공합니다.

- 트랜잭션 로그를 읽고 시스템에 대한 영향이 적은 비동기 프로세스를 사용합니다.

 

 

사용자 테이블에 적용된 변경은 해당 변경 테이블에서 캡처됩니다. 이러한 변경 테이블은 시간에 따라 변경을 기록하여 보여 줍니다. SQL Server에서 제공하는 변경 데이터 캡처 함수를 사용하면 변경 데이터를 쉽고 체계적으로 사용할 수 있습니다.

 

2. 변경 내용 추적

 - 변경 내역 추적은 테이블 행을 변경했다는 사실은 캡처 하지만 변경된 데이터를 캡처하지는 않습니다.

-  변경 내역을 필요로 하지 않을 경우 오버해드가 적습니다.

-  동기 추적 매터니즘을 사용하여 변경 내용을 추적합니다.


 

 

기능 변경 데이터 캡처 변경 내용 추적

추적된 변경 내용

 

 

DML 변경

추적된 정보

 

 

기록 데이터

아니요

열 변경 여부

DML 유형

 

2009. 12. 24. 16:49

SQL 2008 개선된 기능, DBMS Trends