Skip to content

Commit 2e2168d

Browse files
committed
Merge remote-tracking branch 'refs/remotes/origin/dev'
2 parents 4d560f5 + 7b350f9 commit 2e2168d

12 files changed

+5520
-82
lines changed

Diff for: .github/ISSUE_TEMPLATE.md

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
**Do you want to request a *feature* or report a *bug*?**
2+
If you're reporting a bug, include the version number of the script you're using. If it's not the current version, upgrade to the current version and test that before reporting a bug - we fix a lot of stuff in each new build.
23

34
**What is the current behavior?**
45

Diff for: Documentation/Development/ReleaseProcess.md

+4
Original file line numberDiff line numberDiff line change
@@ -22,12 +22,16 @@ Well, useful is probably the wrong word. More like entertaining. Here we go.
2222
* Run _TestBed.sql: this has stored proc calls with common parameters. May have to add in new scenarios if new features are added.
2323
* If it passes, bump all the version numbers inside the scripts.
2424
* sp_foreachdb (no version number yet)
25+
* sp_BlitzTrace (no version number yet)
26+
* sp-BlitzRS (no version number yet)
2527
* sp_BlitzWho @Version and @VersionDate
2628
* sp_BlitzIndex @Version and @VersionDate
2729
* sp_BlitzFirst @VersionDate (no version)
2830
* sp_BlitzCache @Version and @VersionDate
2931
* sp_Blitz @Version and @VersionDate
3032
* sp_DatabaseRestore @Version and @VersionDate
33+
* sp_BlitzBackups @Version and @VersionDate
34+
* sp_BlitzQueryStore @Version and @VersionDate
3135

3236
## Push to Master
3337

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
DECLARE @database_name NVARCHAR(MAX), @backup_path NVARCHAR(MAX), @i INT
2+
3+
SET @database_name = 'ENTER YOUR DATABASE NAME'
4+
SET @backup_path = 'Path to your Ola Backups ROOT FOLDER (see the db name will be attached later)'
5+
SET @i = 0
6+
7+
EXECUTE dbo.DatabaseBackup
8+
@Databases = @database_name,
9+
@Directory = @backup_path,
10+
@BackupType = 'FULL',
11+
@Verify = 'Y',
12+
@Compress = 'Y',
13+
@CheckSum = 'Y',
14+
@CleanupTime = 24
15+
16+
/*Why do I add delays, IDK just wanted to make sure streams do not get crossed */
17+
WAITFOR DELAY '00:00:30'
18+
19+
EXECUTE dbo.DatabaseBackup
20+
@Databases = @database_name,
21+
@Directory = @backup_path,
22+
@BackupType = 'DIFF',
23+
@Verify = 'Y',
24+
@Compress = 'Y',
25+
@CheckSum = 'Y',
26+
@CleanupTime = 24
27+
28+
WAITFOR DELAY '00:00:30'
29+
30+
WHILE (@i <= 10)
31+
BEGIN
32+
SET @i += 1
33+
EXECUTE dbo.DatabaseBackup
34+
@Databases = @database_name,
35+
@Directory = @backup_path,
36+
@BackupType = 'LOG',
37+
@Verify = 'Y',
38+
@Compress = 'Y',
39+
@CheckSum = 'Y',
40+
@CleanupTime = 24
41+
WAITFOR DELAY '00:00:03'
42+
END
43+
44+
DECLARE @cmd NVARCHAR(4000), @BackupPathDiff NVARCHAR(MAX), @PointInTime NVARCHAR(4000), @full_path NVARCHAR(MAX), @diff_path VARCHAR(MAX), @log_path VARCHAR(MAX)
45+
DECLARE @FileList TABLE (BackupFile NVARCHAR(255))
46+
SET @full_path = @backup_path + '\' + @database_name + '\FULL\'
47+
SET @diff_path = @backup_path + '\' + @database_name + '\DIFF\'
48+
SET @log_path = @backup_path + '\' + @database_name + '\LOG\'
49+
50+
-- get list of files
51+
SET @cmd = 'DIR /b "'+ @log_path + '"';
52+
INSERT INTO @FileList (BackupFile)
53+
EXEC master.sys.xp_cmdshell @cmd;
54+
55+
SET @PointInTime = (SELECT TOP 1 * FROM @FileList ORDER BY NEWID())
56+
SET @PointInTime = REPLACE(LEFT(RIGHT(@PointInTime, 19),15), '_', '')
57+
PRINT @full_path
58+
PRINT @diff_path
59+
PRINT @log_path
60+
61+
EXEC dbo.sp_DatabaseRestore
62+
@Database = @database_name,
63+
@BackupPathFull = @full_path,
64+
@BackupPathDiff = @diff_path,
65+
@BackupPathLog = @log_path,
66+
@RestoreDiff = 1,
67+
@ContinueLogs = 0,
68+
@RunRecovery = 1,
69+
@StopAt = @PointInTime,
70+
@Debug = 1;

Diff for: README.md

+40-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ Navigation
1717
- [Advanced sp_BlitzIndex Parameters](#advanced-sp_blitzindex-parameters)
1818
- [sp_BlitzFirst: Real-Time Performance Advice](#sp_blitzfirst-real-time-performance-advice)
1919
- [Advanced sp_BlitzFirst Parameters](#advanced-sp_blitzfirst-parameters)
20+
- [sp_BlitzBackups](#sp-blitzbackups)
2021
- [Parameters Common to Many of the Stored Procedures](#parameters-common-to-many-of-the-stored-procedures)
2122
- [License MIT](#license)
2223

@@ -209,7 +210,7 @@ In addition to the [parameters common to many of the stored procedures](#paramet
209210
[*Back to top*](#header1)
210211

211212
=======
212-
## DatabaseRestore: Easier Multi-File Restores
213+
## sp_DatabaseRestore: Easier Multi-File Restores
213214

214215
If you use [Ola Hallengren's backup scripts](http://ola.hallengren.com), DatabaseRestore.sql helps you rapidly restore a database to the most recent point in time.
215216

@@ -219,7 +220,7 @@ Parameters include:
219220
* @RestoreDatabaseName
220221
* @BackupPathFull
221222
* @BackupPathLog
222-
* @MoveFiles, @MOveDataDrive, @MoveLogDrive
223+
* @MoveFiles, @MoveDataDrive, @MoveLogDrive
223224
* @TestRestore
224225
* @RunCheckDB
225226
* @ContinueLogs
@@ -228,6 +229,43 @@ Parameters include:
228229
For information about how this works, see [Tara Kizer's white paper on Log Shipping 2.0 with Google Compute Engine.](https://BrentOzar.com/go/gce)
229230
>>>>>>> refs/remotes/origin/dev
230231
232+
<<<<<<< HEAD
233+
[*Back to top*](#header1)
234+
235+
=======
236+
## sp_BlitzBackups
237+
238+
Checks your backups and reports estimated RPO and RTO based on historical data in msdb, or a centralized location for [msdb].dbo.backupset.
239+
240+
Parameters include:
241+
242+
* @HoursBack -- How many hours into backup history you want to go. Should be a negative number (we're going back in time, after all). But if you enter a positive number, we'll make it negative for you. You're welcome.
243+
* @MSDBName -- if you need to prefix dbo.backupset with an alternate database name.
244+
* @AGName -- If you have more than 1 AG on the server, and you don't know the listener name, specify the name of the AG you want to use the listener for, to push backup data. This may get used during analysis in a future release for filtering.
245+
* @RestoreSpeedFullMBps --[FIXFIX] Brent can word this better than I can
246+
* @RestoreSpeedDiffMBps -- Nothing yet
247+
* @RestoreSpeedLogMBps -- Nothing yet
248+
249+
* @PushBackupHistoryToListener -- Turn this to 1 to skip analysis and use sp_BlitzBackups to push backup data from msdb to a centralized location (more the mechanics of this to follow)
250+
* @WriteBackupsToListenerName -- This is the name of the AG listener, and **MUST** have a linked server configured pointing to it. Yes, that means you need to create a linked server that points to the AG Listener, with the appropriate permissions to write data.
251+
* @WriteBackupsToDatabaseName -- This can't be 'msdb' if you're going to use the backup data pushing mechanism. We can't write to your actual msdb tables.
252+
* @WriteBackupsLastHours -- How many hours in the past you want to move data for. Should be a negative number (we're going back in time, after all). But if you enter a positive number, we'll make it negative for you. You're welcome.
253+
254+
An example run of sp_BlitzBackups to push data looks like this:
255+
256+
```
257+
EXEC sp_BlitzBackups @PushBackupHistoryToListener = 1, -- Turn it on!
258+
@WriteBackupsToListenerName = 'AG_LISTENER_NAME', -- Name of AG Listener and Linked Server
259+
@WriteBackupsToDatabaseName = 'FAKE_MSDB_NAME', -- Fake MSDB name you want to push to. Remember, can't be real MSDB.
260+
@WriteBackupsLastHours = -24 -- Hours back in time you want to go
261+
```
262+
263+
In an effort to not clog your servers up, we've taken some care in batching things as we move data. Inspired by Michael J. Swart (michaeljswart.com/2014/09/take-care-when-scripting-batches/), we only move data in 10 minute intervals.
264+
265+
The reason behind that is, if you have 500 databases, and you're taking log backups every minute, you can have a lot of data to move. A 5000 row batch should move pretty quickly.
266+
267+
>>>>>>> refs/remotes/origin/dev
268+
231269
## Parameters Common to Many of the Stored Procedures
232270

233271
* @Help = 1 - returns a result set or prints messages explaining the stored procedure's input and output. Make sure to check the Messages tab in SSMS to read it.

Diff for: sp_Blitz.sql

+30-29
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,8 @@ AS
3131
SET NOCOUNT ON;
3232
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
3333
DECLARE @Version VARCHAR(30);
34-
SET @Version = '5.3';
35-
SET @VersionDate = '20170501';
34+
SET @Version = '5.4';
35+
SET @VersionDate = '20170603';
3636
SET @OutputType = UPPER(@OutputType);
3737

3838
IF @Help = 1 PRINT '
@@ -626,7 +626,7 @@ AS
626626
AND d.name NOT IN ( SELECT DISTINCT
627627
DatabaseName
628628
FROM #SkipChecks
629-
WHERE CheckID IS NULL )
629+
WHERE CheckID IS NULL OR CheckID = 1)
630630
/*
631631
The above NOT IN filters out the databases we're not supposed to check.
632632
*/
@@ -683,7 +683,7 @@ AS
683683
AND d.name NOT IN ( SELECT DISTINCT
684684
DatabaseName
685685
FROM #SkipChecks
686-
WHERE CheckID IS NULL )
686+
WHERE CheckID IS NULL OR CheckID = 2)
687687
AND NOT EXISTS ( SELECT *
688688
FROM msdb.dbo.backupset b
689689
WHERE d.name COLLATE SQL_Latin1_General_CP1_CI_AS = b.database_name COLLATE SQL_Latin1_General_CP1_CI_AS
@@ -1091,7 +1091,7 @@ AS
10911091
AND name NOT IN ( SELECT DISTINCT
10921092
DatabaseName
10931093
FROM #SkipChecks
1094-
WHERE CheckID IS NULL)
1094+
WHERE CheckID IS NULL OR CheckID = 12)
10951095
END
10961096

10971097

@@ -1121,7 +1121,7 @@ AS
11211121
AND name NOT IN ( SELECT DISTINCT
11221122
DatabaseName
11231123
FROM #SkipChecks
1124-
WHERE CheckID IS NULL);
1124+
WHERE CheckID IS NULL OR CheckID = 13);
11251125
END
11261126

11271127

@@ -1149,7 +1149,7 @@ AS
11491149
FROM sys.databases
11501150
WHERE page_verify_option < 2
11511151
AND name <> ''tempdb''
1152-
and name not in (select distinct DatabaseName from #SkipChecks) OPTION (RECOMPILE);'
1152+
and name not in (select distinct DatabaseName from #SkipChecks WHERE CheckID IS NULL OR CheckID = 14) OPTION (RECOMPILE);'
11531153
EXECUTE(@StringToExecute)
11541154
END;
11551155
END
@@ -1181,7 +1181,7 @@ AS
11811181
AND name NOT IN ( SELECT DISTINCT
11821182
DatabaseName
11831183
FROM #SkipChecks
1184-
WHERE CheckID IS NULL)
1184+
WHERE CheckID IS NULL OR CheckID = 15)
11851185
END
11861186

11871187
IF NOT EXISTS ( SELECT 1
@@ -1210,7 +1210,7 @@ AS
12101210
AND name NOT IN ( SELECT DISTINCT
12111211
DatabaseName
12121212
FROM #SkipChecks
1213-
WHERE CheckID IS NULL)
1213+
WHERE CheckID IS NULL OR CheckID = 16)
12141214
END
12151215

12161216

@@ -1240,7 +1240,7 @@ AS
12401240
AND name NOT IN ( SELECT DISTINCT
12411241
DatabaseName
12421242
FROM #SkipChecks
1243-
WHERE CheckID IS NULL)
1243+
WHERE CheckID IS NULL OR CheckID = 17)
12441244
END
12451245

12461246

@@ -1269,7 +1269,7 @@ AS
12691269
WHERE is_parameterization_forced = 1
12701270
AND name NOT IN ( SELECT DatabaseName
12711271
FROM #SkipChecks
1272-
WHERE CheckID IS NULL)
1272+
WHERE CheckID IS NULL OR CheckID = 18)
12731273
END
12741274

12751275

@@ -1299,7 +1299,7 @@ AS
12991299
AND name NOT IN ( SELECT DISTINCT
13001300
DatabaseName
13011301
FROM #SkipChecks
1302-
WHERE CheckID IS NULL)
1302+
WHERE CheckID IS NULL OR CheckID = 20)
13031303
END
13041304

13051305

@@ -1328,7 +1328,7 @@ AS
13281328
(''Database ['' + [name] + ''] has Transparent Data Encryption enabled. Make absolutely sure you have backed up the certificate and private key, or else you will not be able to restore this database.'') AS Details
13291329
FROM sys.databases
13301330
WHERE is_encrypted = 1
1331-
and name not in (select distinct DatabaseName from #SkipChecks) OPTION (RECOMPILE);'
1331+
and name not in (select distinct DatabaseName from #SkipChecks WHERE CheckID IS NULL OR CheckID = 21) OPTION (RECOMPILE);'
13321332
EXECUTE(@StringToExecute)
13331333
END;
13341334
END
@@ -1692,7 +1692,8 @@ AS
16921692
AND DB_NAME(database_id) NOT IN (
16931693
SELECT DISTINCT
16941694
DatabaseName
1695-
FROM #SkipChecks )
1695+
FROM #SkipChecks
1696+
WHERE CheckID IS NULL OR CheckID = 26 )
16961697
END
16971698

16981699

@@ -2334,7 +2335,7 @@ AS
23342335
AND name NOT IN ( SELECT DISTINCT
23352336
DatabaseName
23362337
FROM #SkipChecks
2337-
WHERE CheckID IS NULL);
2338+
WHERE CheckID IS NULL OR CheckID = 55);
23382339
END
23392340

23402341
IF NOT EXISTS ( SELECT 1
@@ -2440,7 +2441,7 @@ AS
24402441
WHERE name NOT IN ( SELECT DISTINCT
24412442
DatabaseName
24422443
FROM #SkipChecks
2443-
WHERE CheckID IS NULL)
2444+
WHERE CheckID IS NULL OR CheckID = 62)
24442445
AND compatibility_level <= 90
24452446
END
24462447

@@ -3016,7 +3017,7 @@ AS
30163017
AND d.name NOT IN ( SELECT DISTINCT
30173018
DatabaseName
30183019
FROM #SkipChecks
3019-
WHERE CheckID IS NULL)
3020+
WHERE CheckID IS NULL OR CheckID = 148)
30203021
END
30213022

30223023
/* Reliability - Database Files Stored in Azure */
@@ -3046,7 +3047,7 @@ AS
30463047
AND d.name NOT IN ( SELECT DISTINCT
30473048
DatabaseName
30483049
FROM #SkipChecks
3049-
WHERE CheckID IS NULL)
3050+
WHERE CheckID IS NULL OR CheckID = 149)
30503051
END
30513052

30523053

@@ -3899,7 +3900,7 @@ IF @ProductVersionMajor >= 10
38993900
AS Details
39003901
FROM #dbcc_events_from_trace d
39013902
WHERE d.[dbcc_event_trunc_upper] NOT IN (
3902-
N'DBCC CHECKCB', N' DBCC CHECKALLOC' , N'DBCC CHECKTABLE', N'DBCC CHECKCATALOG', N'DBCC CHECKFILEGROUP', --CHECKDB related
3903+
N'DBCC CHECKDB', N' DBCC CHECKALLOC' , N'DBCC CHECKTABLE', N'DBCC CHECKCATALOG', N'DBCC CHECKFILEGROUP', --CHECKDB related
39033904
N'DBCC TRACEON', N'DBCC TRACEOFF', N'DBCC DBINFO', N'DBCC LOGINFO', N'DBCC INPUTBUFFER', N'DBCC TRACESTATUS', --Usually monitoring tool related
39043905
N'DBCC CHECKIDENT', N'DBCC SHOW_STATISTICS', N'DBCC CHECKCONSTRAINTS', --Probably rational
39053906
N'DBCC CLEANTABLE', N'DBCC CHECKPRIMARYFILE', N'DBCC OPENTRAN', 'DBCC SHOWFILESTATS' --Weird but okay
@@ -4324,7 +4325,7 @@ IF @ProductVersionMajor >= 10
43244325
WHERE name NOT IN ( SELECT DISTINCT
43254326
DatabaseName
43264327
FROM #SkipChecks
4327-
WHERE CheckID IS NULL)
4328+
WHERE CheckID IS NULL OR CheckID = 19)
43284329
AND is_published = 1
43294330
OR is_subscribed = 1
43304331
OR is_merge_published = 1
@@ -4695,7 +4696,7 @@ IF @ProductVersionMajor >= 10
46954696
AND dbname NOT IN ( SELECT DISTINCT
46964697
DatabaseName
46974698
FROM #SkipChecks
4698-
WHERE CheckID IS NULL)
4699+
WHERE CheckID IS NULL OR CheckID = 72)
46994700
DROP TABLE #partdb
47004701
END
47014702

@@ -4903,7 +4904,7 @@ IF @ProductVersionMajor >= 10
49034904
FROM [?].sys.database_scoped_configurations dsc
49044905
INNER JOIN #DatabaseScopedConfigurationDefaults def1 ON dsc.configuration_id = def1.configuration_id
49054906
LEFT OUTER JOIN #DatabaseScopedConfigurationDefaults def ON dsc.configuration_id = def.configuration_id AND (dsc.value = def.default_value OR dsc.value IS NULL) AND (dsc.value_for_secondary = def.default_value_for_secondary OR dsc.value_for_secondary IS NULL)
4906-
LEFT OUTER JOIN #SkipChecks sk ON def.CheckID = sk.CheckID AND (sk.DatabaseName IS NULL OR sk.DatabaseName = DB_NAME())
4907+
LEFT OUTER JOIN #SkipChecks sk ON (sk.CheckID IS NULL OR def.CheckID = sk.CheckID) AND (sk.DatabaseName IS NULL OR sk.DatabaseName = DB_NAME())
49074908
WHERE def.configuration_id IS NULL AND sk.CheckID IS NULL ORDER BY 1
49084909
OPTION (RECOMPILE);';
49094910
END
@@ -5360,7 +5361,7 @@ IF @ProductVersionMajor >= 10
53605361
DatabaseName
53615362
FROM
53625363
#SkipChecks
5363-
WHERE CheckID IS NULL)
5364+
WHERE CheckID IS NULL OR CheckID = 68)
53645365
AND CONVERT(DATETIME, DB2.Value, 121) < DATEADD(DD,
53655366
-14,
53665367
CURRENT_TIMESTAMP)
@@ -5525,7 +5526,8 @@ IF @ProductVersionMajor >= 10
55255526
AND DB_NAME(a.database_id) NOT IN (
55265527
SELECT DISTINCT
55275528
DatabaseName
5528-
FROM #SkipChecks )
5529+
FROM #SkipChecks
5530+
WHERE CheckID = 75 OR CheckID IS NULL)
55295531
AND a.size > 125000 /* Size is measured in pages here, so this gets us log files over 1GB. */
55305532
AND a.size > ( SELECT SUM(CAST(b.size AS BIGINT))
55315533
FROM sys.master_files b
@@ -5565,7 +5567,7 @@ IF @ProductVersionMajor >= 10
55655567
AND name NOT IN ( SELECT DISTINCT
55665568
DatabaseName
55675569
FROM #SkipChecks
5568-
WHERE CheckID IS NULL)
5570+
WHERE CheckID IS NULL OR CheckID = 76)
55695571
AND collation_name <> ( SELECT
55705572
collation_name
55715573
FROM
@@ -5601,10 +5603,9 @@ IF @ProductVersionMajor >= 10
56015603
FROM sys.databases dSnap
56025604
INNER JOIN sys.databases dOriginal ON dSnap.source_database_id = dOriginal.database_id
56035605
AND dSnap.name NOT IN (
5604-
SELECT DISTINCT
5605-
DatabaseName
5606-
FROM
5607-
#SkipChecks )
5606+
SELECT DISTINCT DatabaseName
5607+
FROM #SkipChecks
5608+
WHERE CheckID = 77 OR CheckID IS NULL)
56085609
END
56095610

56105611
IF NOT EXISTS ( SELECT 1

0 commit comments

Comments
 (0)