-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy path02_VLF_UpdateInfo.sql
More file actions
152 lines (125 loc) · 3.92 KB
/
Copy path02_VLF_UpdateInfo.sql
File metadata and controls
152 lines (125 loc) · 3.92 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
CREATE PROCEDURE [dbo].[VLF_UpdateInfo]
AS
SET NOCOUNT ON
DECLARE
@DBName SYSNAME,
@vlfcount INT,
@activevlfcount INT,
@DBCCQuery varchar(1000),
@currentlogsizeMB INT
CREATE TABLE #VLFSummary
(
DBName SYSNAME ,
NumOfVLFs INT ,
ActiveVLFs INT ,
RecoveryMode VARCHAR(99) ,
LogSizeMB INT
)
-- Need to accomodate SQL Server 2012 (version 11.0)
DECLARE @MajorVersion VARCHAR(20)
SET @MajorVersion = CAST(SERVERPROPERTY('ProductMajorVersion') AS tinyint)
-- Solution to get the major version on non-updated / patched SQL Servers.
-- SERVERPROPERTY('ProductMajorVersion') was first implemented in late 2015
IF (@MajorVersion IS NULL)
BEGIN
CREATE TABLE #checkversion (
version nvarchar(128),
common_version AS SUBSTRING(version, 1, CHARINDEX('.', version) + 1 ),
major AS PARSENAME(CONVERT(VARCHAR(32), version), 4),
minor AS PARSENAME(CONVERT(VARCHAR(32), version), 3),
build AS PARSENAME(CONVERT(varchar(32), version), 2),
revision AS PARSENAME(CONVERT(VARCHAR(32), version), 1)
);
INSERT INTO #checkversion (version)
SELECT CAST(SERVERPROPERTY('ProductVersion') AS NVARCHAR(128)) ;
SET @MajorVersion = (SELECT TOP 1 CAST(Major AS TINYINT) from #checkversion)
END
IF(@MajorVersion >= 11)
BEGIN
-- Use the new version of the table
CREATE TABLE #VLFInfo2012
(
[RecoveryUnitId] INT NULL,
[FileId] INT NULL,
[FileSize] BIGINT NULL,
[StartOffset] BIGINT NULL,
[FSeqNo] INT NULL,
[Status] INT NULL,
[Parity] TINYINT NULL,
[CreateLSN] NUMERIC(25, 0) NULL
)
END
ELSE
BEGIN
-- Use the old version of the table
CREATE TABLE #VLFInfo2008
(
[FileId] INT NULL,
[FileSize] BIGINT NULL,
[StartOffset] BIGINT NULL,
[FSeqNo] INT NULL,
[Status] INT NULL,
[Parity] TINYINT NULL,
[CreateLSN] NUMERIC(25, 0) NULL
)
END
IF(@MajorVersion >= 14)
BEGIN
INSERT INTO #VLFSummary
SELECT name, dls.total_vlf_count, dls.active_vlf_count, d.recovery_model_desc, dls.total_log_size_mb
FROM sys.databases d
CROSS APPLY sys.dm_db_log_stats(d.database_id) dls
END
ELSE
BEGIN
DECLARE csr CURSOR FAST_FORWARD READ_ONLY
FOR
SELECT name
FROM master.sys.databases
WHERE database_id <> 2
AND [state] = 0
AND is_read_only = 0
OPEN csr
FETCH NEXT FROM csr INTO @DBName
WHILE (@@fetch_status <> -1)
BEGIN
SET @DBCCQuery = REPLACE(REPLACE(
'DBCC loginfo ("{{DatabaseName}}") WITH NO_INFOMSGS, TABLERESULTS'
,'"','''')
,'{{DatabaseName}}', @DBName)
IF(@MajorVersion >= 11)
BEGIN
TRUNCATE TABLE #VLFInfo2012
INSERT INTO #VLFInfo2012
EXEC (@DBCCQuery)
SET @vlfcount = @@rowcount
SELECT @activevlfcount = COUNT(*)
FROM #VLFInfo2012
WHERE [Status] = 2
END
ELSE
BEGIN
TRUNCATE TABLE #VLFInfo2008
INSERT INTO #VLFInfo2008
EXEC (@DBCCQuery)
SET @vlfcount = @@rowcount
SELECT @activevlfcount = COUNT(*)
FROM #VLFInfo2008 WHERE [Status] = 2
END
SELECT @currentlogsizeMB = (size/128)
FROM master.sys.master_files
WHERE type_desc = 'log'
AND DB_NAME(database_id)=@DBName
INSERT INTO #VLFSummary
VALUES(@DBName, @vlfcount, @activevlfcount, CONVERT(VARCHAR(7),DATABASEPROPERTYEX(@DBName, 'Recovery')), @currentlogsizeMB)
FETCH NEXT FROM csr INTO @DBName
END
CLOSE csr
DEALLOCATE csr
END
TRUNCATE TABLE dbo.VLFInfo
INSERT INTO dbo.VLFInfo (DBName, NumOfVLFs, ActiveVLFs, RecoveryMode, LogSizeMB)
SELECT DBName, NumOfVLFs, ActiveVLFs, RecoveryMode, LogSizeMB
FROM #VLFSummary
DROP TABLE #VLFSummary
GO