4步追蹤導致事務日誌膨脹的SQL命令
-- 1. create LogSize and BufferSQL table
create table LogSize
(
ID int identity(1, 1),
DatabaseName varchar(100),
LogSize decimal(9, 2),
LogSpaceUsed decimal(9, 2),
Status tinyint,
Date datetime DEFAULT (getdate())
)
create table BufferSQL
(
ID int,
EventType varchar(50),
Parameters varchar(100),
EventInfo varchar(150),
Date datetime DEFAULT (getdate())
)
-- 2. create sp_GetBufferSQL procedure
alter PROCEDURE sp_GetBufferSQL(@ID int)
AS
BEGIN
declare @spid int,
@intCountProperties int,
@intCounter int
CREATE TABLE #tmp_process ( id int identity(1,1), spid smallint )
IF @@ERROR<>0 RETURN @@ERROR
CREATE TABLE #tmp_SQL
(
EventType varchar(50),
Parameters varchar(100),
EventInfo varchar(150)
)
IF @@ERROR<>0 RETURN @@ERROR
INSERT INTO #tmp_process( spid )
SELECT spid FROM sysprocesses WHERE dbid = DB_ID('DBName')
IF @@ERROR<>0 RETURN @@ERROR
SELECT @intCountProperties = Count(*), @intCounter = 1
from #tmp_process
IF @@ERROR<>0 RETURN @@ERROR
WHILE @intCounter <= @intCountProperties
BEGIN
select @spid = spid
from #tmp_process where id = @intCounter
INSERT INTO #tmp_SQL(EventType, Parameters, EventInfo)
EXECUTE sp_executesql N'DBCC INPUTBUFFER ( @v_spid )', int', @v_spid = @spid
INSERT INTO MemberData.dbo.BufferSQL(ID, EventType, Parameters, EventInfo, Date)
SELECT @ID, EventType, Parameters, EventInfo, getdate()
FROM #tmp_SQL
SET @intCounter = @intCounter + 1
END
DROP TABLE #tmp_process
DROP TABLE #tmp_SQL
RETURN 0
END
-- 3. creaet job to collect LogSize
BEGIN TRANSACTION
DECLARE @JobID BINARY(16)
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
IF (SELECT COUNT(*) FROM msdb.dbo.syscategories WHERE name = N'[Uncategorized (Local)]') < 1
EXECUTE msdb.dbo.sp_add_category @name = N'[Uncategorized (Local)]'
-- Delete the job with the same name (if it exists)
SELECT @JobID = job_id
FROM msdb.dbo.sysjobs
WHERE (name = N'TraceLogSize')
IF (@JobID IS NOT NULL)
BEGIN
-- Check if the job is a multi-server job
IF (EXISTS (SELECT *
FROM msdb.dbo.sysjobservers
WHERE (job_id = @JobID) AND (server_id <> 0)))
BEGIN
-- There is, so abort the script
RAISERROR (N'Unable to import job ''TraceLogSize'' since there is already a multi-server job with this name.', 16, 1)
GOTO QuitWithRollback
END
ELSE
-- Delete the [local] job
EXECUTE msdb.dbo.sp_delete_job @job_name = N'TraceLogSize'
SELECT @JobID = NULL
END
BEGIN
-- Add the job
EXECUTE @ReturnCode = msdb.dbo.sp_add_job @job_id = @JobID OUTPUT , @job_name = N'TraceLogSize', @owner_login_name = N'MSDOMAIN1LWANG2', @description = N'TraceLogSize', @category_name = N'[Uncategorized (Local)]', @enabled = 0, @notify_level_email = 0, @notify_level_page = 0, @notify_level_netsend = 0, @notify_level_eventlog = 2, @delete_level= 0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job steps
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobstep @job_id = @JobID, @step_id = 1, @step_name = N'Get LogSize', @command = N'insert into MemberData.dbo.LogSize(DatabaseName, LogSize, LogSpaceUsed, Status)
execute('dbcc sqlperf(logspace) with no_infomsgs'')', @database_name = N'master', @server = N'', @database_user_name = N'', @subsystem = N'TSQL', @cmdexec_success_code = 0, @flags = 0, @retry_attempts = 0, @retry_interval = 1, @output_file_name = N'', @on_success_step_id = 0, @on_success_action = 1, @on_fail_step_id = 0, @on_fail_action = 2
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXECUTE @ReturnCode = msdb.dbo.sp_update_job @job_id = @JobID, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the job schedules
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobschedule @job_id = @JobID, @name = N'every 15 minutes', @enabled = 1, @freq_type = 4, @active_start_date = 20091213, @active_start_time = 0, @freq_interval = 1, @freq_subday_type = 4, @freq_subday_interval = 15, @freq_relative_interval = 0, @freq_recurrence_factor = 0, @active_end_date = 20091230, @active_end_time = 235959
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
-- Add the Target Servers
EXECUTE @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @JobID, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
-- 4. create trigger to collect buffer SQL
CREATE TRIGGER [tr_LogSize_insert]
ON [dbo].[LogSize]
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
DECLARE @ID int
IF EXISTS(select 1 from MemberData.dbo.LogSize WHERE DatabaseName = 'DBName' and LogSpaceUsed > 75)
BEGIN
SELECT @ID = ID from inserted
EXEC sp_GetBufferSQL @ID
END
END
5. Check buffer SQL
select
a.ID, a.DatabaseName, a.LogSize, a.LogSpaceUsed,
a.Date, b.EventInfo, b.Parameters
from MemberData.dbo.LogSize a
inner join MemberData.dbo.BufferSQL b
on a.ID = b.ID
and b.EventType <> 'No Event'
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/66009/viewspace-1029661/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 日誌追蹤
- 日誌追蹤:log增加traceId
- SQL追蹤和事件追蹤SQL事件
- 通過日誌審計追蹤外部***
- 微服務追蹤SQL(支援Isto管控下的gorm查詢追蹤)微服務SQLGoORM
- 輕量級的分散式日誌追蹤利器,十分鐘即可接入,從此日誌追蹤無難事分散式
- Synchronized鎖及其膨脹synchronized
- 微服務架構 | 10.3 使用 Zipkin 視覺化日誌追蹤微服務架構視覺化
- C++中泛型使用導致的膨脹問題C++泛型
- 表膨脹的查詢方法
- PostgreSQL-亂序插入資料導致索引膨脹SQL索引
- 從 1.5 開始搭建一個微服務框架——日誌追蹤 traceId微服務框架
- Dubbo日誌鏈路追蹤TraceId選型
- 日誌收集和鏈路追蹤:skywalking
- log4j MDC實現日誌追蹤
- 微服務追蹤SQL上報至Jaeger(支援Istio管控下的gorm查詢追蹤)微服務SQLGoORM
- .NET Core 中的日誌與分散式鏈路追蹤分散式
- 日誌與追蹤的完美融合:OpenTelemetry MDC 實踐指南
- opencv 影像腐蝕、影像的膨脹OpenCV
- [程式設計題] 膨脹的牛牛程式設計
- 註解列印日誌和資料鏈路追蹤
- 膨脹的template class成員函式函式
- 路由追蹤命令詳解路由
- 部署Zipkin分散式效能追蹤日誌系統的操作記錄分散式
- [java][鎖]java鎖的膨脹和優化Java優化
- synchronized的實現原理——鎖膨脹過程synchronized
- OpenCV (iOS)中的腐蝕和膨脹(9)OpenCViOS
- 使用dbms_system 追蹤sqlSQL
- 當「SPA」應用遇上了膨脹的專案
- opencv中的影象形態學——腐蝕膨脹OpenCV
- SQL 事務日誌填滿的原因SQL
- ORACLE DML語句鎖機制導致事務等待示例Oracle
- 商城系統日誌與異常資訊追蹤機制設計_OctShop
- Spring中使用MDC和traceId實現日誌鏈路追蹤Spring
- 基於SLF4J MDC機制實現日誌的鏈路追蹤
- SQL Server 事務日誌傳輸SQLServer
- SQL Server事務日誌介紹SQLServer
- SQL Server 收縮事務日誌的方法SQLServer