/* 서버의 로그 파일 중 10MB가 넘을 경우 새로 작성
이유 : 파일이 너무 클 경우 읽는데 시간이 많이 걸리므로
*/
CREATE PROC [dbo].[sm_cycle_errorlog]
AS
DECLARE @sql nvarchar(1000)
DECLARE @size int
CREATE TABLE #temp (archive int, [date] datetime, size int)
SET @sql = N'EXEC master.sys.xp_enumerrorlogs'
INSERT INTO #temp EXEC(@sql)
SELECT @size = size FROM #temp WHERE archive = 0
IF (@size > 10485760)
BEGIN
    EXEC master.sys.sp_cycle_errorlog
END

--2시간 전부터 현재까지의 SQL ERROR LOG 를 가져오는 프로시저
CREATE PROCEDURE [dbo].[sm_read_error_log]
AS
SET NOCOUNT ON
DECLARE @no tinyint
DECLARE @seq int
DECLARE @db_version char(1)
SET @db_version = REPLACE(SUBSTRING(@@version, charindex('.0', @@version) - 2, 2), SPACE(1), space(0))

CREATE TABLE #errorlog
(
    seq    int identity(1, 1) PRIMARY KEY
    ,logDate  datetime
    ,processinfo  varchar(100)
    ,error_txt  varchar(4000)
)
CREATE TABLE #errorlog_staging
(
    seq    int identity
    ,errlog  varchar(4000)
    ,cr     tinyint
)

IF @db_version = '8'   -- SQL 2000
BEGIN
    IF @no = 0
        INSERT INTO #errorlog_staging (errlog, cr)
            EXEC master.dbo.xp_readerrorlog    -- SQL 2000에서는 xp_readerrorlog 에 0을 넣으면 에러남
    ELSE
        INSERT INTO #errorlog_staging (errlog, cr)
            EXEC master.dbo.xp_readerrorlog @no
        INSERT INTO #errorlog (logDate, processinfo, error_txt)
        SELECT
            CASE WHEN ISDATE(left(errlog, 22)) = 1 THEN CONVERT(smalldatetime, LEFT(errlog, 22))  ELSE null END
            ,CASE WHEN ISDATE(left(errlog, 22)) = 1 THEN SUBSTRING(errlog, 24, charindex(space(1), errlog, 24) - 24) ELSE null END
            ,CASE WHEN ISDATE(left(errlog, 22)) = 1 THEN SUBSTRING(errlog, charindex(space(2), errlog) + 3, LEN(errlog)) ELSE errlog END
        FROM #errorlog_staging
        TRUNCATE TABLE #errorlog_staging    
END
ELSE
BEGIN
    INSERT INTO #errorlog (logDate, processinfo, error_txt)
    EXEC master.dbo.xp_readerrorlog @no
END

SELECT logDate, processinfo, error_txt FROM #errorlog
WHERE DATEADD(HOUR, 1, logDate) > GETDATE()
ORDER BY seq ASC

DROP TABLE #errorlog
DROP TABLE #errorlog_staging

실행
EXEC sm_read_error_log


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

트랜잭션이 걸려있는지 확인  (0) 2010.07.16
PROCEDURE 에서 FILTERED INDEX 쓰는 방법  (0) 2010.07.16
백업확인  (0) 2010.07.15
DBA 가이드  (0) 2010.07.08
사용하지 않는 인덱스 확인  (0) 2010.07.07

+ Recent posts