강의 컨설팅 트레이닝 무료진단 무료책자 마케팅편지 마케팅정보공유 다이어리 서비스제휴 고객센터

MSSQL Server DBA 가이드-4
작성자 : M 최고의하루
등록날짜 : 2008.12.26 10:49
3,492

서버 및 데이터베이스의 정보 확인

서버 이름, 버전, Edition 확인하기

<PRE>[구문] SERVERPROPERTY ( propertyname )</PRE>[따라하기] <PRE>SELECT SERVERPROPERTY('ServerName') AS ServerName, SERVERPROPERTY('MachineName') AS MachineName, SERVERPROPERTY('InstanceName') AS InstanceName, SERVERPROPERTY('Edition') AS Edition, SERVERPROPERTY('ProductVersion') AS ProductVersion, SERVERPROPERTY('ProductLevel') AS ProductLevelGO</PRE>

서버의 옵션 확인하기

서버의 구성 옵션과 구성 옵션의 최소값과 최대값, 설정된 대상 값, 설정값을 확인합니다.

<PRE>[구문] sp_configure [ [ @configname = ] 'name' ][ , [ @configvalue = ] 'value' ]</PRE>

[따라하기]

1. 서버 구성 옵션 확인하기 <PRE>EXEC sp_configureGO</PRE>2. 서버의 고급 구성 옵션 확인하기
서버의 일부 옵션은 고급으로 지정되어 있고, 이 값들도 변경할 수 있습니다. 고급 구성 옵션을 보기 위해서는 다음을 실행합니다. <PRE>USE masterGOEXEC sp_configure 'show advanced option', '1'RECONFIGURE WITH OVERRIDEGO</PRE>

데이터베이스 파일에 대한 I/O 통계 정보 확인하기

fn_virtualfilestats 함수는 시스템에서 기본으로 제공하는 함수로서, I/O에 대한 통계 정보를 제공합니다. 사용자들이 어떤 파일에 대하여 읽기나 쓰기를 수행하기 위하여 기다린 시간을 제공하므로 이 함수를 사용하면 어떤 파일들에 대하여 I/O가 많이 발생하는지 확인할 수 있습니다. IO로 인한 성능 저하가 의심되는 경우에는 fn_virtualfilestats 함수가 반환하는 IOStallMS를 점검할 것을 권고합니다.

<PRE>[구문] fn_virtualfilestats ( [@DatabaseID=] database_id , [ @FileID = ] file_id )</PRE>[따라하기]
1. 모든 데이터베이스의 파일들의 I/O 정보 확인하기 <PRE>SELECT * FROM ::fn_virtualfilestats(-1, -1)GO</PRE>2. 모든 데이터베이스의 파일들의 I/O 정보 확인하기 (시스템 함수 활용) <PRE>SELECT DB_NAME(Dbid) AS DBName, FileId, FILE_NAME(FileId) AS FileName, IoStallMS, NumberReads, NumberWrites, BytesRead, BytesWrittenFROM ::fn_VirtualFileStats (-1, -1) ORDER BY IoStallMS DESCGO</PRE>3. 특정 데이터베이스의 모든 파일들에 대한 I/O 정보 확인하기 (예제: tempdb) <PRE>SELECT * FROM ::fn_virtualfilestats(2, -1)GO</PRE>4. 특정 데이터베이스의 특정 파일의 I/O 정보 확인하기 (Tempdb의 Primary Data File) <PRE>SELECT * FROM ::fn_virtualfilestats(2, 1)GO</PRE>5. 특정 데이터베이스의 특정 파일의 I/O 정보 확인하기 (Tempdb의 로그 파일) <PRE>SELECT * FROM ::fn_virtualfilestats(2, 2)GO</PRE>

기본적인 파일 정보 확인하기

현재 데이터베이스와 연관된 파일의 물리적 이름과 특징을 반환합니다. 파일 이름을 지정하지 않으면, 데이터베이스내의 모든 파일에 대한 정보를 확인할 수 있습니다.

<PRE>[구문] sp_helpfile [ [ @filename = ] 'name' ]</PRE>[따라하기] <PRE>USE SampleEXEC sp_helpfile-- 또는EXEC Sample..sp_help</PRE>

기본적인 파일 그룹 정보 확인하기

현재 데이터베이스와 연관된 파일그룹의 이름과 특징을 반환합니다. 파일그룹의 이름을 지정하지 않으면, 데이터베이스내의 모든 파일그룹에 대한 정보를 확인할 수 있습니다.

<PRE>[구문] sp_helpfilegroup [ [ @filegroupname = ] 'name' ]</PRE>

기본적인 데이터베이스의 정보 확인하기

지정된 데이터베이스 또는 모든 데이터베이스 정보를 반환합니다.

<PRE>[구문] sp_helpdb [ [ @dbname= ] 'name' ]</PRE>
  • 데이터베이스를 지정하지 않았을 경우, 결과 집합입니다.
    컬럼명 내용
    Name 데이터베이스 이름
    Db_size 데이터베이스의 총 크기
    Owner 데이터베이스의 소유자
    Dbid 데이터베이스의 ID
    Created 데이터베이스의 생성일자
    Status 옵션의 값을 쉼표로 분리하여 나열한 것
    Compatibility_level 호환성 수준(60,65,70,80)
  • 데이터베이스를 지정했을 경우, 위의 결과 집합에 다음의 결과 집합이 추가로 나타납니다.
    Name 논리적 파일 이름
    Fileid 파일 ID
    Filename 파일의 물리적 경로와 이름
    Filegroup 파일이 속한 그룹
    Size 파일 크기
    Maxsize 파일이 증가할 수 있는 최대 크기
    Growth 파일의 증가량
    Usage 파일의 사용법

데이터베이스 옵션 또는 현재 설정 확인하기

지정한 Property에 따른 결과값이 반환됩니다. property의 값 목록과 그에 따른 결과의 종류는 BOL 참조해 주십시오.

<PRE>[구문] DATABASEPROPERTYEX(database_name, property)</PRE>

[따라하기]
1. Northwind 데이터베이스의 통계 자동 업데이트 옵션 설정 확인하기

<PRE>SELECT DATABASEPROPERTYEX ('Northwind','IsAutoUpdateStatistics') AS IsAutoUpdateStatisticsGO</PRE>2. Northwind 데이터베이스의 복구 모델 설정 확인하기 <PRE>SELECT DATABASEPROPERTYEX ('Northwind','Recovery') AS RecoveryGO</PRE>

데이터베이스 옵션 설정 확인하기

<PRE>[구문] sp_dboption [ [ @dbname = ] 'database' ][ , [ @optname = ] 'option_name' ][ , [ @optvalue = ] 'value' ]</PRE>[따라하기]
A. 설정 가능한 옵션의 목록 확인하기
인수를 지정하지 않습니다. <PRE>EXEC sp_dboptionGO</PRE>B. 지정한 데이터베이스의 설정 옵션 목록 확인하기
데이터베이스만을 지정합니다. Northwind데이터베이스의 설정 옵션 목록을 확인합니다. <PRE>EXEC sp_dboption 'Northwind'GO</PRE>C. 지정한 데이터베이스의 해당 옵션의 설정 상태 확인하기
데이터베이스와 해당 옵션을 설정합니다. Northwind데이터베이스의 자동 통계 갱신 옵션의 설정을 확인합니다. <PRE>EXEC sp_dboption 'Northwind', 'auto update statistics'GO</PRE> 데이터베이스 옵션의 종류
Auto create statistics
Auto update statistics
Autoclose
Autoshrink
ANSI null default
ANSI nulls
ANSI padding
ANSI warnings
Arithabort
concat null yields null
cursor close on commit
Dbo use only
default to local cursor
merge publish
numeric roundabort
Offline
Published
quoted identifier
read only
Recursive triggers
select into/bulkcopy
single user
Subscribed
Torn page detection
trunc. Log on chkpt.

Tempdb에 대한 공간 사용 정보 확인하기

<PRE>[구문] sp_tempdbspace</PRE>

테이블 크기 확인하기

<PRE>[구문] sp_spaceused [[@objname =] 'objname'][,[@updateusage =] 'updateusage']</PRE>[따라하기] Orders 테이블의 크기 확인하기 <PRE>EXEC sp_spaceused 'Orders'</PRE>

[참고] 테이블을 지정하지 않으면, 해당 데이터베이스의 크기가 반환됩니다.

로그 공간의 사용 정보 확인하기

서버 내에 존재하는 모든 데이터베이스의 로그 공간의 사용에 관한 통계를 확인합니다.

<PRE>[구문] DBCC SQLPERF ( LOGSPACE )</PRE>

테이블의 조각화 정보 확인하기

테이블의 조각화는 INSERT, UPDATE, DELETE문 등의 데이터를 수정할 때에 발생합니다. 이러한 수정들은 각 페이지의 채움 정도를 다르게 만들고, 테이블의 일부 또는 전부를 스캔하는 쿼리의 경우, 테이블 조각으로 인한 성능 저하가 발생할 가능성이 있습니다.

<PRE>[구문] DBCC SHOWCONTIG[ ( { table_name | table_id | view_name | view_id } [ , index_name | index_id ] ) ] [ WITH { ALL_INDEXES | FAST [ , ALL_INDEXES ] | TABLERESULTS [ , { ALL_INDEXES } ] [ , { FAST | ALL_LEVELS } ] } ]</PRE>[따라하기]
A. 지정한 테이블의 조각화 정보 확인하기
Orders 테이블의 조각화 정보를 확인합니다. <PRE>USE NorthwindGODBCC SHOWCONTIG ('Orders')GO</PRE>B. 지정한 테이블의 지정한 인덱스의 조각화 정보 확인하기
Orders 테이블의 CustomerID 인덱스에 대한 조각화 정보를 확인합니다. <PRE>USE NorthwindGODBCC SHOWCONTIG ('Orders', 'CustomerID')GO</PRE>C. 테이블 ID와 인덱스 ID로 조각화 정보 확인하기
테이블 이름과 인덱스 이름 대신, 테이블 ID와 인덱스 ID를 사용합니다. <PRE>USE NorthwindGODECLARE @ObjectId int, @IndexId intSELECT @ObjectId = OBJECT_ID ('Orders')SELECT @IndexId = indid FROM sysindexes WHERE id = @ObjectId DBCC SHOWCONTIG (@ObjectId, @IndexId)GO</PRE>D. 데이터베이스내의 모든 테이블의 모든 인덱스에 대한 조각화 정보 확인하기 <PRE>USE NorthwindGODBCC SHOWCONTIG WITH TABLERESULTS, ALL_INDEXESGO</PRE>E. 데이터베이스에 수행 결과를 저장하기 <PRE>-- 결과를 저장할 테이블 생성하기USE DBAdminGOCREATE TABLE ShowContig_Pubs( ObjectName sysname, ObjectId int, IndexName sysname, IndexId tinyint, Level tinyint, Pages int, Rows bigint, MinimumRecordSize smallint, MaximumRecordSize smallint, AverageRecordSize smallint, ForwardedRecords bigint, Extents int, ExtentSwitches numeric(10,2), AverageFreeBytes numeric(10,2), AveragePageDensity numeric(10,2), ScanDensity numeric(10,2), BestCount int, ActualCount int, LogicalFragmentation numeric(10,2), ExtentFragmentation numeric(10,2), CheckDate smalldatetime DEFAULT (GETDATE())) GO-- 시스템 저장 프로시저 생성하기USE masterGOCREATE PROCEDURE sp_DBCCSHOWCONTIGASDBCC SHOWCONTIG WITH TABLERESULTSGO-- 실행 예제USE PubsGOINSERT INTO DBAdmin..ShowContig_Pubs (ObjectName, ObjectId, IndexName, IndexId, Level, Pages, Rows, MinimumRecordSize, MaximumRecordSize,AverageRecordSize, ForwardedRecords, Extents, ExtentSwitches, AverageFreeBytes, AveragePageDensity, ScanDensity, BestCount, ActualCount, LogicalFragmentation, ExtentFragmentation) EXEC sp_DBCCSHOWCONTIGGO-- 실행 결과 확인하기SELECT * FROM DBAdmin..ShowContig_Pubs WHERE ObjectName = 'Authors' GOSELECT * FROM DBAdmin..ShowContig_Pubs WHERE LogicalFragmentation > 30 OR ExtentFragmentation > 30 GO</PRE>

[참고] WITH FAST 옵션을 사용하면, 인덱스의 잎 또는 데이터 수준 페이지를 읽지 않기 때문에, 생략된 정보를 빠르게 반환합니다.

[주의] 크기가 큰 테이블에 대해서는 서비스 중에 DBCC SHOWCONTIG를 수행하면 성능 저하를 유발할 수 있으므로 유의합니다.

[권고사항] 수행 결과를 확인하고 단편화가 심한 테이블들에 대해서는 인덱스 재구성 작업을 수행합니다.


대기 정보 확인하기

각 waittype별 대기 시간을 확인합니다. 가장 대기가 많은 유형을 확인하고, 작업 부하에 따른 대기 유형의 변화도 확인합니다.

<PRE>[구문] DBCC SQLPERF (WAITSTATS)</PRE>

인덱스 재구성하기

인덱스 조각화로 인한 성능 저하를 방지하기 위해서는 주기적으로 인덱스 조각화가 진행된 테이블들에 대한 조각화 제거 작업이 필요합니다. 가능한 한 인덱스 재구성 작업을 자동화하여 주기적으로 용이하게 수행할 수 있는 체계를 갖출 것을 권고합니다.

[주의] DBCC DBREINDEX 작업은 서비스 휴지 시간에 수행해야 합니다.

[예제 스크립트] 다음은 인덱스 조각화 제거를 위해 활용할 수 있는 예제 스크립트입니다. 아래 예제 스크립트를 시스템의 환경에 적합하도록 수정 보완하여 활용하기 바랍니다.

----------------------------------------------------------------------------------------------------------------
-- Written by Kimberly L. Tripp - all rights reserved.
-- For more scripts, sample code and Kimberly's schedule check out
-- www.SQLSkills.com
-- For "More than Just Training," see the Industry Experts at
-- www.SolidQualityLearning.com
-- Disclaimer - Thoroughly test this script, execute at your own risk.
----------------------------------------------------------------------------------------------------------------
/*
Execute this whole script to create the sp_RebuildIndexes stored procedure in Master.
Best Viewed with Courier New 12pt. and Tabs saved as 4 spaces not 8. (Tools, Options, Editor)
To use the sp_RebuildIndexes procedure once created use:
sp_RebuildIndexes
To Rebuild All Indexes on All Tables for all that have a Scan Density < 100%
sp_RebuildIndexes @ScanDensity = 80
To Rebuild All Indexes on All Tables with a Scan Density of < 80%
sp_RebuildIndexes 'Authors'
To Rebuild All Indexes on the authors table - for a Scan Density of < 100%
sp_RebuildIndexes 'Authors', 80
To Rebuild All Indexes on the authors table - for a Scan Density of < 80%
Object Name and ScanDensity are both optional parameters.
ScanDensity must be a whole number between 1 and 100.
*/
USE master
GO
IF OBJECTPROPERTY(object_id('sp_RebuildClusteredIndex'), 'IsProcedure') = 1
DROP PROCEDURE sp_RebuildClusteredIndex
GO

IF OBJECTPROPERTY(object_id('sp_RebuildIndexes'), 'IsProcedure') = 1
DROP PROCEDURE sp_RebuildIndexes
GO

CREATE PROCEDURE sp_RebuildClusteredIndex
(
@TableName sysname = NULL,
@IndexName sysname = NULL
)
AS
-- Written by Kimberly L. Tripp of SYSolutions, Inc.
-- For more code samples go to http://www.sqlskills.com
-- NOTE: If your clustered index is NOT unique then rebuilding the clustered
-- index will cause the non-clustered indexes to be rebuilt.
-- If the nonclustered indexes were fragmented
-- then this series of scripts will build them again.
IF @TableName IS NOT NULL
BEGIN
IF (OBJECTPROPERTY(object_id(@TableName), 'IsUserTable') = 0
AND OBJECTPROPERTY(object_id(@TableName), 'IsView') = 0)
BEGIN
RAISERROR('Object: %s exists but is NOT a User-defined Table.
This procedure only accepts valid table names to process for index rebuilds.', 16, 1, @TableName)
RETURN
END
ELSE
BEGIN
IF OBJECTPROPERTY(object_id(@TableName), 'IsTable') IS NULL
BEGIN
RAISERROR('Object: %s does not exist within this database. Please check the table name and location (which database?).
This procedure only accepts existing table names to process for index rebuilds.', 16, 1, @TableName)
RETURN
END
END
END

IF @IndexName IS NOT NULL
BEGIN
IF INDEXPROPERTY(object_id(@TableName), @IndexName, 'IsClustered') = 0
BEGIN
RAISERROR('Index: %s exists but is a Clustered Index.
This procedure only accepts valid table names and their clustered indexes for rebuilds.', 16, 1, @IndexName)
RETURN
END
ELSE
BEGIN
IF INDEXPROPERTY(object_id(@TableName),
@IndexName, 'IsClustered') IS NULL
BEGIN
SELECT @TableName, @IndexName,
INDEXPROPERTY(object_id(@TableName),
@IndexName, 'IsClustered')
RAISERROR('There is no index with name:%s on this table.
Please check the table name and index name as well as location (which database?).
This procedure only accepts existing table names and their clustered indexes for rebuilds.', 16, 1, @IndexName)
RETURN
END
END
END

-- So now we have a valid table, a valid CLUSTERED index and we're ready to rebuild.
-- Here's a quick overview of what this code will do:
-- Get the Column List and Index Defintion (Use the output from sp_helpindex)
-- Figure out if it's UNIQUE - to specify in CREATE INDEX statement
-- Build and Execute the CREATE INDEX command through dynamic string execution

DECLARE @ExecStr nvarchar(4000)
-- more than enough even if 16 cols of 128 chars,
-- Tablename of 128 and Indexname of 128...
-- but if this is the case you have other problems :).
, @ColList nvarchar(3000)
, @Unique nvarchar(7)
-- Will be either '' or 'Unique ' and added to CR Index String
, @FillFactor nvarchar(100)

CREATE TABLE #IndexInfo
(
IndexName sysname,
IndexDesc varchar(210),
IndexKeys nvarchar(2126)
)

INSERT INTO #IndexInfo EXEC sp_helpindex @TableName

SELECT @ColList = IndexKeys
, @Unique = CASE
WHEN IndexDesc LIKE 'clustered, unique%'
THEN 'Unique '
ELSE ''
END --CASE Expression
, @FillFactor = ', FILLFACTOR = ' + NULLIF(convert(nvarchar(3)
, (SELECT OrigFillFactor
FROM sysindexes
WHERE id = object_id(@TableName) AND Name = @IndexName)), 0)
FROM #IndexInfo
WHERE IndexName = @IndexName

SELECT @ExecStr = 'CREATE ' + @Unique + 'CLUSTERED INDEX '
+ QUOTENAME(@IndexName, ']') + ' ON '
+ QUOTENAME(@TableName, ']') + '(' + @collist
+ ') WITH DROP_EXISTING ' + ISNULL(@FillFactor, '')
-- For testing the String
-- SELECT @ExecStr

-- Create the Clustered Index
EXEC(@ExecStr)
GO

CREATE PROCEDURE sp_RebuildIndexes
(
@TableName sysname = NULL,
@ScanDensity tinyint = 100
)
AS
-- Written by Kimberly L. Tripp of SYSolutions, Inc.
-- For more code samples go to http://www.sqlskills.com
-- This procedure will get the Fragmentation information for all tables and indexes
-- within the database.
-- Programmatically it will then walk the list rebuilding all indexes that have a scan
-- density less than the value passed in - by default any less than 100% contiguous.
-- Use this script as a starting point. Modify it for your options, ideas, etc.
-- and then schedule it to run regularly.
-- NOTE - This gathers density information for all tables and all indexes.
-- This might be time consuming on large databases.
-- DISCLAIMER - Execute at your own risk. TEST THIS FIRST.
SET NOCOUNT ON

IF @ScanDensity IS NULL
SET @ScanDensity = 100

IF @ScanDensity NOT BETWEEN 1 AND 100
BEGIN
RAISERROR('Value supplied:%i is not valid. @ScanDensity is a percentage.
Please supply a value for Scan Density between 1 and 100.', 16, 1, @ScanDensity)
RETURN
END
IF @TableName IS NOT NULL
BEGIN
IF OBJECTPROPERTY(object_id(@TableName), 'IsUserTable') = 0
BEGIN
RAISERROR('Object: %s exists but is NOT a User-defined Table.
This procedure only accepts valid table names to process for index rebuilds.', 16, 1, @TableName)
RETURN
END
ELSE
BEGIN
IF OBJECTPROPERTY(object_id(@TableName), 'IsTable') IS NULL
BEGIN
RAISERROR('Object: %s does not exist within this database.
Please check the table name and location (which database?).
This procedure only accepts existing table names to process for index rebuilds.', 16, 1, @TableName)
RETURN
END
END
END

-- Otherwise the Object Exists and it is a table so we'll continue from here.
-- First thing to do is create a temp location for the data returned from
-- DBCC SHOWCONTIG

CREATE TABLE #ShowContigOutput
(
ObjectName sysname,
ObjectId int,
IndexName sysname,
IndexId tinyint,
[Level] tinyint,
Pages int,
[Rows] bigint,
MinimumRecordSize smallint,
MaximumRecordSize smallint,
AverageRecordSize smallint,
ForwardedRecords bigint,
Extents int,
ExtentSwitches numeric(10,2),
AverageFreeBytes numeric(10,2),
AveragePageDensity numeric(10,2),
ScanDensity numeric(10,2),
BestCount int,
ActualCount int,
LogicalFragmentation numeric(10,2),
ExtentFragmentation numeric(10,2)
)

IF @TableName IS NOT NULL
-- then we only need the showcontig output for that table
INSERT #ShowContigOutput
EXEC('DBCC SHOWCONTIG (' + @TableName + ') WITH FAST, ALL_INDEXES, TABLERESULTS')
ELSE
-- All Tables, All Indexes Will be processed.
INSERT #ShowContigOutput
EXEC('DBCC SHOWCONTIG WITH FAST, ALL_INDEXES, TABLERESULTS')
PRINT N' '
-- Quick test to see if everything is getting here correctly
-- SELECT * FROM #ShowContigOutput
-- Walk the showcontig output table skipping all replication tables
-- as well as all tables necessary for
-- the UI. This is also where you can list large tables
-- that you don't want to rebuild all at one time.
-- NOTE: If you take out a large table from rebuilding this script may have
-- already checked density
-- meaning that the expense in terms of time may have been
-- expensive.
-- Also, you should use a different procedure to rebuild a large table
-- specifically.
-- Even when you pass in the tablename it will be avoided here if
-- MANUALLY added to the list by you.
-- Test, Test, Test!

DECLARE @ObjectName sysname,
@IndexName sysname,
@QObjectName nvarchar(258),
@QIndexName nvarchar(258),
@IndexID tinyint,
@ActualScanDensity numeric(10,2),
@InformationalOutput nvarchar(4000),
@StartTime datetime,
@EndTime datetime

DECLARE TableIndexList CURSOR FAST_FORWARD FOR
SELECT ObjectName, IndexName, IndexID, ScanDensity
FROM #ShowContigOutput AS sc JOIN sysobjects AS so ON sc.ObjectID = so.id
WHERE sc.ScanDensity < @ScanDensity
AND (OBJECTPROPERTY(sc.ObjectID, 'IsUserTable') = 1
OR OBJECTPROPERTY(sc.ObjectID, 'IsView') = 1)
AND so.STATUS > 0
AND sc.IndexID BETWEEN 1 AND 250
AND sc.ObjectName NOT IN ('dtproperties')
-- Here you can list large tables you do not WANT rebuilt.
ORDER BY sc.ObjectName, sc.IndexID

OPEN TableIndexList
FETCH NEXT FROM TableIndexList INTO @ObjectName, @IndexName, @IndexID, @ActualScanDensity
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
SELECT @QObjectName = QUOTENAME(@ObjectName, ']')
SELECT @QIndexName = QUOTENAME(@IndexName, ']')
SELECT @InformationalOutput = N'Processing Table: '
+ RTRIM(UPPER(@QObjectName))
+ N' Rebuilding Index: ' + RTRIM(UPPER(@QIndexName))
PRINT @InformationalOutput
IF @IndexID = 1
BEGIN
SELECT @StartTime = getdate()
EXEC sp_RebuildClusteredIndex @ObjectName, @IndexName
SELECT @EndTime = getdate()
SELECT @InformationalOutput = N'Total Time to process = '
+ convert(nvarchar, datediff(ms, @StartTime, @EndTime))
+ N' ms'
PRINT @InformationalOutput
END
ELSE
BEGIN
SELECT @StartTime = getdate()
EXEC('DBCC DBREINDEX(' + @QObjectName + ', '
+ @QIndexName + ') WITH NO_INFOMSGS')
SELECT @EndTime = getdate()
SELECT @InformationalOutput = N'Total Time to process = '
+ convert(nvarchar, datediff(ms, @StartTime, @EndTime))
+ N' ms'
PRINT @InformationalOutput
END
PRINT N' '
FETCH NEXT FROM TableIndexList
INTO @ObjectName, @IndexName, @IndexID, @ActualScanDensity
END
END
PRINT N' '
SELECT @InformationalOutput = N'** All Indexes have been rebuilt. ** '
PRINT @InformationalOutput
DEALLOCATE TableIndexList
GO

오류 로그 보기

SQL Server에서는 이벤트를 SQL Server 오류 로그 및 응용 프로그램 로그에 기록합니다. 문제가 발생하였을 경우, 오류 로그에 기록되어 있는 정보를 사용하여, 문제의 원인을 찾을 수 있습니다.

  • SQL Server 오류 로그 보기

    SQL Server 로그는 응용 프로그램의 상태 정보를 알기 위한 훌륭한 자료입니다. SQL Server 로그는 서비스가 시작할 때부터 서비스가 중지될 때까지 계속 메시지를 기록합니다.
    모니터링 관리의 효율을 위하여 모니터링 담당자가 SQL Server 로그에서 찾아야 할 것을 정의합니다. 이 로그는 심각도 수준 19~25의 값을 가진 모든 오류를 기록합니다. 모니터링할 때, SQL Server 로그에서 심각도 수준 19~25 사이의 값을 가진 오류는 반드시 체크해야 합니다. 이 심각도 수준을 가진 오류는 트랜잭션을 실패하게 하고 응용 프로그램이 적절하게 운영되지 않도록 합니다. 심각도 수준 20에서 25사이의 오류는 치명적입니다. 만일 이 오류가 발생되면, 클라이언트 연결은 오류 메시지를 받은 후에 종료됩니다.
    또한, RAISERROR…WITH LOG 문법을 사용하여 각각의 오류를 발견해 낼 수 있습니다. 이것은 오류 정보를 SQL Server 로그에 나타나게 합니다.

    [따라하기]

    1. EM에서 원하는 데이터베이스 서버를 선택합니다.

    2. [관리]폴더를 클릭하고, [SQL Server 로그]를 클릭합니다.

    guide_img07.gif

    3. 원하는 로그파일을 클릭하면, 오른쪽 창에 로그가 나타납니다.

    [참고] 로그 파일의 정보 확인 및 개수 변경하기
    SQL Server 로그 파일의 개수는 현재 기록하고 있는 로그와 이전의 6개의 로그에 대한 백업을 가지고 있습니다. 이 로그 파일의 수를 크게 설정하면 SQL Server 재시작으로 인하여 문제를 진단하는데 단서가 될 수 있는 ERRORLOG 파일이 overwrite되어 유실되는 것을 방지할 수 있습니다. 이 로그의 개수는 레지스트리 값을 수정하여 변경할 수 있습니다.

    <PRE>-- 오류 로그 파일들의 파일 정보 확인EXEC master..xp_enumerrorlogsGO-- 3번째 로그 파일 내용 보기EXEC sp_readerrorlog 3GO-- 로그 파일의 개수 20으로 변경하기 EXEC master..xp_regwrite 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 'NumErrorLogs', 'REG_DWORD', 20 GO-- 확인EXEC master..xp_regread 'HKEY_LOCAL_MACHINE', 'SOFTWARE\Microsoft\MSSQLServer\MSSQLServer', 'NumErrorLogs'GO</PRE>

    [참고] SQL Server 재시작 없이 새 오류 로그 생성하기
    새 오류 로그는 SQL Server가 시작되는 경우에 생성되지만, SQL Server의 재시작 없이도 새 로그를 생성할 수 있습니다. 어떤 이유로 ERRORLOG 파일의 크기가 지나치게 커진 경우에는 sp_cycle_errorlog를 사용하여 새로운 ERRORLOG 파일을 생성할 것을 권고합니다.

    <PRE>-- 새 로그 생성EXEC sp_cycle_errorlogGO-- 오류 로그 파일별 정보 조회EXEC master..xp_enumerrorlogsGO</PRE>
  • 응용 프로그램 로그 보기

    이벤트 뷰어는 사용자가 응용 프로그램, 보안, 시스템 로그에 기록되는 이벤트를 모니터링할 수 있도록 합니다. 이 로그는 SQL Server 로그와 SQL 에이전트 로그로 분리시켜 추가적인 정보를 제공합니다. SQL Server 메시지는 응용 프로그램 로그에서 발견됩니다.
    SQL Server 메시지는 "MSSQLSERVER" 또는 "SQLSERVERAGENT"라는 원본을 가진 메시지로 구별될 수 있습니다. RAISERROR 메시지도 여기에서 볼 수 있습니다.

    [따라하기]

    1. [시작] → [설정] → [관리도구] → [이벤트 뷰어]를 선택합니다. (OS마다 다름)

    guide_img08.gif

    2. 디폴트로 로컬컴퓨터의 로그가 나타난다. 다른 컴퓨터의 [연결]을 클릭하여 원격 컴퓨터의 로그를 확인합니다.

    guide_img09.gif

    3. 원하는 사항을 더블 클릭하면, 자세한 정보를 얻을 수 있습니다.

  • SQL Server 에이전트 오류 로그 보기

    SQL Server 에이전트 서비스는 작업 및 복제를 관리합니다.

    1. EM에서 원하는 데이터베이스 서버를 선택합니다.

    2. [관리] 폴더를 클릭합니다.

    guide_img10.gif

    3. [SQL Server 에이전트]에 마우스를 대고 오른쪽 버튼을 클릭하고, [오류 로그 표시]를 선택합니다.

    guide_img11.gif

    4. 오류를 선택하여 목록을 확인합니다.

"쇼핑몰·홈페이지·오픈마켓
블로그·페이스북·이메일 등의 각종 마케팅 글쓰기,
각종 광고, 영업, 판매, 제안서, 전단지
반응율 3배×10배 이상 높이는 마법의 8단계 공식"
자세히보기

Comments

번호 제목 글쓴이 날짜 조회
3105 ABCUpload4와 MySQL4 13 김영철 01.29 3597
3104 업로드시 그림 파일명이 한글일경우 이름 자동 변경하기 13 김영철 01.14 3594
3103 이것은 AI파일 미리보기입니다. 댓글3 M 최고의하루 01.15 3587
3102 jpgraph사용법 13 김영철 01.14 3583
3101 CD ISO 이미지로 추출하고 M 최고의하루 01.03 3581
3100 [ JS ] 버튼을 이용한 이미지 넘기기 ( 이미지 리스트 ) 99 단국강토 01.02 3578
3099 [ ASP ] 최근 글에 New 표시하기 [ 최근 , 새글 , New , newDate() ] M 최고의하루 12.18 3577
3098 간단한 sugest 기능 2 kkkkkkk 02.16 3575
3097 jpgraph 사용법 13 김영철 01.14 3573
3096 PHP 업로드진행바(Pregress Bar) 구현 13 김영철 01.14 3572
3095 오라클과 MSSQL 의 날짜 비교 13 김영철 01.24 3565
3094 마우스 오른쪽 버튼막아 놓은 사이트에서 M 최고의하루 12.18 3564
3093 mysql의 최대 성능 향상 방법 99 단국강토 01.05 3562
3092 이미지미리보기pds파일미리보기파일입니다^^ 99 단국강토 01.14 3562
3091 Micro Gradient Button 10 액션쟁이 12.30 3549
3090 c강좌 (20) 자기참조 구조체 13 김영철 01.29 3545
3089 리눅스 팁 13 김영철 01.29 3544
3088 Date Types_7_7_08 99 단국강토 01.12 3541
3087 공유기 차단 무력화 시키는 법 99 단국강토 01.13 3541
3086 [포토샵]종이 찢어진 효과 만들기 10 액션쟁이 01.13 3540
3085 sitemesh 를 활용하자 2 huro 01.15 3526
3084 포토샵/일러스트레이터 갑자기 한글입력 안될때 2 천진난만 02.20 3524
3083 포토샵 - 낡은 폴라로이드 효과 (낡은사진효과) 10 액션쟁이 01.21 3521
3082 최대공약수 최소공배수 구하기 13 김영철 01.15 3519
3081 iframe 대신 object 로 외부파일을 불러옵니다 99 단국강토 01.12 3516
3080 [mssql]성능 측정을 위한 설정 13 김영철 01.23 3516
3079 Modern stylish text 10 액션쟁이 12.30 3497
열람중 MSSQL Server DBA 가이드-4 M 최고의하루 12.26 3493
3077 OpenRowSet 이용하여 엑셀파일 DB로 저장하기 13 김영철 01.23 3491
3076 랜덤으로 DB 추출 php + mysql 13 김영철 01.13 3490
마케팅
특별 마케팅자료
다운로드 마케팅자료
창업,경영
기획,카피,상품전략
동기부여,성취