initial commit

This commit is contained in:
Thierry Schork
2022-12-30 12:10:12 +01:00
commit 7cf858256a
127 changed files with 12534 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# SQL Server Management Studio Solution File, Format Version 18.00
VisualStudioVersion = 15.0.28307.421
MinimumVisualStudioVersion = 10.0.40219.1
Project("{4F2E2C19-372F-40D8-9FA7-9D2138C6997A}") = "OCTPDBA-353 - check commvault bckps", "OCTPDBA-353 - check commvault bckps.ssmssqlproj", "{08AAA460-70F1-4355-8AA1-3E31479AFD05}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Default|Default = Default|Default
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{09679D02-BCF2-44B5-AC03-534D21ECA9ED}.Default|Default.ActiveCfg = Default
{08AAA460-70F1-4355-8AA1-3E31479AFD05}.Default|Default.ActiveCfg = Default
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {FEF0AF96-E9E8-4E0C-B875-6DBDBD774AA7}
EndGlobalSection
EndGlobal

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<SqlWorkbenchSqlProject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" Name="SqlWorkbenchSqlProject">
<Items>
<LogicalFolder Name="Connections" Type="2" />
<LogicalFolder Name="Queries" Type="0" />
<LogicalFolder Name="Miscellaneous" Type="3" />
</Items>
</SqlWorkbenchSqlProject>

View File

@@ -0,0 +1,270 @@
/*
Server: ssunb006db01.sunstore.ch
Format: GCM
Business: TPPHAR
type: VALI
Version: 22.1.11010.00065
24.10.2022, TSC
*/
USE master;
BEGIN TRANSACTION;
SET XACT_ABORT ON;
SET NOCOUNT ON;
--#region variables
DECLARE @dbs TABLE (dbName VARCHAR(400),
have_commvault_bkp BIT
DEFAULT 0,
have_system_bkp BIT
DEFAULT 0,
last_system_backup DATETIME,
backup_type VARCHAR(50) NULL);
DECLARE @tbl_log_msg TABLE (tstamp DATETIME NOT NULL
DEFAULT CURRENT_TIMESTAMP,
msg VARCHAR(500) NOT NULL);
--#endregion
--#region fetch list of db's
INSERT INTO @dbs (dbName)
SELECT name
FROM sys.databases d
WHERE name NOT IN ( N'master', N'tempdb', N'model', N'msdb' );
--#endregion
--#region fetch backups in the last week
IF OBJECT_ID('tempdb..#bkps') IS NOT NULL
BEGIN
DROP TABLE #bkps;
END
SELECT CONVERT(CHAR(100), SERVERPROPERTY('Servername')) AS SERVER,
bs.database_name,
bs.backup_start_date,
bs.backup_finish_date,
bs.expiration_date,
bs.backup_size,
mf.logical_device_name,
mf.physical_device_name,
bs.name AS backupset_name,
bs.description,
CASE
WHEN bs.type = 'D' THEN 'Database'
WHEN bs.type = 'I' THEN 'Differential'
WHEN bs.type = 'L' THEN 'Log'
WHEN bs.type = 'F' THEN 'File or filegroup'
WHEN bs.type = 'G' THEN 'Differential file'
WHEN bs.type = 'P' THEN 'Partial'
WHEN bs.type = 'Q' THEN 'Differential partial'
ELSE 'Unknown' END AS backup_type,
CASE
WHEN CHARINDEX(':', mf.physical_device_name, 0) > 0 THEN 1
WHEN mf.logical_device_name IS NOT NULL THEN 2
ELSE 0 END AS to_file,
CASE
WHEN bs.name LIKE '%commvault%'
AND CHARINDEX(':', mf.physical_device_name, 0) = 0
AND mf.logical_device_name IS NULL THEN 1
ELSE 0 END AS is_commVault_bkp
INTO #bkps
FROM msdb.dbo.backupmediafamily mf
INNER JOIN msdb.dbo.backupset bs
ON mf.media_set_id = bs.media_set_id
WHERE (CONVERT(DATETIME, bs.backup_start_date, 102) >= GETDATE() - 7)
AND bs.type = 'D' --ignore log backups
ORDER BY bs.database_name,
bs.backup_finish_date;
--#endregion
--#region Look for commvault backups for each databases
UPDATE d
SET d.have_commvault_bkp = 1,
d.backup_type = b.backup_type
FROM @dbs d
INNER JOIN #bkps b
ON b.database_name = d.dbName
WHERE b.is_commVault_bkp = 1;
--#endregion
--#region Look for system backups for each databases
UPDATE d
SET d.have_system_bkp = 1,
d.last_system_backup = lastBkp.backup_finish_date,
d.backup_type = b.backup_type
FROM @dbs d
INNER JOIN #bkps b
ON b.database_name = d.dbName
INNER JOIN ( SELECT b2.database_name,
MAX(b2.backup_finish_date) AS backup_finish_date
FROM #bkps b2
GROUP BY b2.database_name) lastBkp
ON lastBkp.database_name = b.database_name
WHERE b.is_commVault_bkp = 0;
--#endregion
SELECT d.dbName,
d.have_commvault_bkp,
d.have_system_bkp,
d.last_system_backup,
d.backup_type
FROM @dbs d;
--#region check if we are on a REF or AAI server
DECLARE @is_ref_srv BIT = 0;
DECLARE @is_aai_srv BIT = 0;
IF (@@SERVERNAME IN (
--sun
'ssunbrefde02.sunstore.ch\apssql', 'ssunbrefde02\apssql', 'ssunbreffr02.sunstore.ch\apssql', 'ssunbreffr02\apssql',
--cvi
'scvnbrefdb01.coop-vitality.ch\apssql', 'scvnbrefdb01\apssql', 'scvnbrefdb02.coop-vitality.ch\apssql', 'scvnbrefdb02\apssql',
--ama
'samnbrefde02.amavita.ch\apssql', 'samnbrefde02\apssql', 'samnbreffr02.amavita.ch\apssql', 'samnbreffr02\apssql',
--aai, should not be used anyhow
'saainbref02.aai.local\apssql', 'saainbref02\apssql'))
BEGIN
SET @is_ref_srv = 1;
PRINT 'We are on a REF server.';
END
IF(OBJECT_ID('master.cfg.Identity'))IS NOT NULL BEGIN
IF EXISTS(SELECT 1 FROM master.cfg.[Identity] [i] WHERE i.[Format] = 'AAI')
BEGIN
SET @is_aai_srv = 1;
PRINT 'We are on a AAI server.'
END
END
ELSE BEGIN
PRINT 'No table identity in master, skipping AAI detection.'
END
--#endregion
--#region populate list of jobs to drop and fetch job_id
DECLARE @tbl_job_name TABLE (job_id UNIQUEIDENTIFIER NULL,
job_name VARCHAR(500) NOT NULL,
treated BIT NOT NULL
DEFAULT 0);
INSERT INTO @tbl_job_name (job_name)
VALUES ('D91040 - Backup of simple databases'),
('D91050 - Backup of full databases'),
('D91010 - Backup of several databases'),
('DR91020 - Log-backup');
UPDATE tjn
SET tjn.job_id = j.job_id
FROM msdb.dbo.sysjobs j
INNER JOIN @tbl_job_name tjn
ON tjn.job_name = j.name;
--#endregion
--#region Check for unknown backup job
INSERT INTO @tbl_log_msg (tstamp,msg)
SELECT DISTINCT
CURRENT_TIMESTAMP AS tstamp,
'job doing a "backup database ... to file" ' + j.name AS msg
--SELECT
-- DISTINCT 'Jobs making a backup not in the recognized jobs' AS msg,
-- j.name,
-- j.enabled,
-- s.schedule_id,
-- LTRIM(SUBSTRING(js.command, CHARINDEX('to disk', js.command) - 40, 100)) AS command_fragment
FROM msdb.dbo.sysjobs j
INNER JOIN msdb.dbo.sysjobsteps js
ON js.job_id = j.job_id
INNER JOIN msdb.dbo.sysjobschedules s
ON s.job_id = j.job_id
WHERE js.command LIKE '%backup database%to disk%'
AND j.name <> 'D91030 - Backup ActivePos_Read'
AND NOT EXISTS (SELECT 1 FROM @tbl_job_name tjn WHERE tjn.job_name = j.name);
--#endregion
--#region check that all db's have commvault backups before dropping jobs
DECLARE @is_commvault_active BIT = 0;
SELECT @is_commvault_active = CASE
WHEN MAX(dbCnt.cnt) = COUNT(1) AND MAX(dbCnt.cnt) > 0 THEN 1
ELSE 0
END
FROM @dbs d
CROSS APPLY (
SELECT COUNT(1) AS cnt
FROM @dbs d2
) AS dbCnt
WHERE d.have_commvault_bkp = 1
;
If @is_commvault_active = 0
PRINT 'Commvault is not active on all db''s.'
--#endregion
IF @is_ref_srv = 0 AND @is_aai_srv = 0 AND @is_commvault_active = 1
BEGIN
--#region delete jobs known to be stopped
/* declare variables */
DECLARE @job_id UNIQUEIDENTIFIER,
@job_name VARCHAR(500);
DECLARE delDisabledBkpJob CURSOR FAST_FORWARD READ_ONLY FOR
SELECT tjn.job_id,
tjn.job_name
FROM @tbl_job_name tjn
WHERE tjn.treated = 0
AND tjn.job_id IS NOT NULL;
OPEN delDisabledBkpJob;
FETCH NEXT FROM delDisabledBkpJob
INTO @job_id,
@job_name;
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC msdb.dbo.sp_delete_job @job_id = @job_id, -- uniqueidentifier
@job_name = NULL, -- sysname
@originating_server = NULL, -- sysname
@delete_history = 1, -- bit
@delete_unused_schedule = 1; -- bit
INSERT INTO @tbl_log_msg (tstamp,msg)
VALUES (GETDATE(), 'Dropped job ' + @job_name);
UPDATE @tbl_job_name
SET treated = 1
WHERE job_id = @job_id;
PRINT 'Deleted job ' + @job_name + ' (job id: ' + CONVERT(VARCHAR(100), @job_id) + ')';
FETCH NEXT FROM delDisabledBkpJob
INTO @job_id,
@job_name;
END
CLOSE delDisabledBkpJob;
DEALLOCATE delDisabledBkpJob;
--#endregion
END
ELSE BEGIN
INSERT INTO @tbl_log_msg (tstamp,msg)
SELECT
CURRENT_TIMESTAMP
,CASE
WHEN @is_ref_srv = 1 THEN 'Not dropping jobs on pharmacy reference servers...'
WHEN @is_aai_srv = 1 THEN 'Not dropping jobs on AAI servers...'
WHEN @is_commvault_active = 0 THEN 'Not dropping jobs where CommVault is not active...'
ELSE 'Skipping job deletion'
END AS msg
;
END
SELECT
tld.tstamp,
tld.msg
FROM @tbl_log_msg tld;
ROLLBACK TRANSACTION;