When a SnapManager backup failed I …
– manually ran the SQL job – which failed again
– remoted onto the server and read the logs (start/ NetApp/ SnapManager for SQL Management) – there weren’t any for that day!
– fired up SnapDrive (start/ NetApp/ SnapDrive) and examined the Disks – there weren’t any (dum dum duuuum)
– restarted all Snap~ services (x3)
– found the disks had re-appeared in Snapdrive
– manually started the sql backup job – success!
Month: February 2015
Pruning SQL 2005 backup history
When trying to prune the backup history of a SQL 2005 Server (sp3) I kept getting the error.
Msg 547, Level 16, State 0, Line 1
The DELETE statement conflicted with the REFERENCE constraint “FK__backupfil__backu__793DFFAF”.
The conflict occurred in database “msdb”, table “dbo.backupfilegroup”, column ‘backup_set_id’.
The FIX was to drop the constraints, do the dirty deed, then re-create the constraints.
Here’s the code I used …
--PruneBackupHistory_2005.sql
-- remove foreign keys
use msdb
go
--ALTER TABLE [restorefile] drop CONSTRAINT FK__restorefi__resto__00DF2177;
ALTER TABLE [restorefilegroup] drop CONSTRAINT FK__restorefi__resto__02C769E9;
ALTER TABLE [backupmediafamily] drop CONSTRAINT FK__backupmed__media__72910220;
ALTER TABLE [backupset] drop CONSTRAINT FK__backupset__media__76619304;
ALTER TABLE [backupfilegroup] drop CONSTRAINT FK__backupfil__backu__793DFFAF;
ALTER TABLE [backupfile] drop CONSTRAINT FK__backupfil__backu__7C1A6C5A;
ALTER TABLE [restorehistory] drop CONSTRAINT FK__restorehi__backu__7EF6D905;
go
-- empty tables
truncate table backupfile
truncate table backupfilegroup
truncate table backupmediafamily
truncate table backupmediaset
truncate table backupset
truncate table restorefile
truncate table restorefilegroup
truncate table restorehistory
go
-- replace foreign keys
--ALTER TABLE [restorefile] ADD CONSTRAINT FK__restorefi__resto__00DF2177 FOREIGN KEY (restore_history_id) REFERENCES restorehistory (restore_history_id);
ALTER TABLE [restorefilegroup] ADD CONSTRAINT FK__restorefi__resto__02C769E9 FOREIGN KEY (restore_history_id) REFERENCES restorehistory (restore_history_id);
ALTER TABLE [backupmediafamily] ADD CONSTRAINT FK__backupmed__media__72910220 FOREIGN KEY (media_set_id) REFERENCES backupmediaset (media_set_id);
ALTER TABLE [backupset] ADD CONSTRAINT FK__backupset__media__76619304 FOREIGN KEY (media_set_id) REFERENCES backupmediaset (media_set_id);
ALTER TABLE [backupfilegroup] ADD CONSTRAINT FK__backupfil__backu__793DFFAF FOREIGN KEY (backup_set_id) REFERENCES backupset (backup_set_id);
ALTER TABLE [backupfile] ADD CONSTRAINT FK__backupfil__backu__7C1A6C5A FOREIGN KEY (backup_set_id) REFERENCES backupset (backup_set_id);
ALTER TABLE [restorehistory] ADD CONSTRAINT FK__restorehi__backu__7EF6D905 FOREIGN KEY (backup_set_id) REFERENCES backupset (backup_set_id);
go
dbcc shrinkdatabase ('msdb')
go
Its a bit of a sledge-hammer, but that’s just the sort of day I had.
Estimated Execution Plan
The Estimated execution plan is the one that runs.
However, whilst running sometimes the plan needs to be changed on-the-fly. For instance a tables statistics may change as data is being inserted into it. Thus a chosen index may become second best.
The Actual execution plan is the log of what actually ran.
SQL Server Statistics – my definition
STATISTICS is metadata that indicates to the query-optimizer how many rows it needs to read to get a representative sample of all (relevant) data in a table.
Indexes that return a smaller number of rows are not used for the current query.
Update multiple XLSM spreadsheets using VBA
As part of a migration I needed to change the hard-code connections within a ‘WSSI’ application (a suit of dynamic spreadsheets used for stock-control). In essence this was a folder in a shared-location containing hundreds of ‘xlsm’ spreadsheets in sub-folders.
To do this manually I would have had to open each spreadsheet one-by-one, press ALT-F11, navigate down the tree in the top-left pane, opening MODULES then CONSTANTS. Then change the hard-coded values EG: [Public Const DB_SERVER As string = “Old-Name”] and type in the “New-Name” before saving.
** This would have taken days as there were hundreds of them **
I was able to semi-automated the process and completed it in an hour. Here’s how …
– I copied the root folder to my C-Drive
– Created a new XLSM spreadsheet on my desktop
– Opened this File \ Options \ Trust Center \ Trust Center Settings \ Macro Settings
– and ticked “Trust access to the VBA project model”
– saved it as [wssi_mod.xlsm]
– selected any cell and typed ALT-F11 (to develop)
– In the top-left pane I right-clicked on “Sheet1”, Insert \ Module
– in the right-hand pane I pasted this VBA
Option Explicit
Sub Test()
Dim Path As String, FName As String
Dim SearchFor As String, ReplaceWith As String, Contents As String
Dim Wb As Excel.Workbook
Dim vbComp As Object 'VBIDE.VBComponent
Dim Changed As Boolean
'Customize this:
Path = "C:\WSSI_2014\Dairy\"
SearchFor = "Public Const DB_SERVER As String = ""old-name"""
ReplaceWith = "Public Const DB_SERVER As String = ""new-name"""
'Prepare Excel
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
Application.DisplayAlerts = False
'Find the first file
FName = Dir(Path & "*.xlsm")
'While found
Do While FName ""
'Open the file
Set Wb = Workbooks.Open(Path & FName, False, False)
Changed = False
'For each module
For Each vbComp In Wb.VBProject.VBComponents
With vbComp.CodeModule
'Any lines?
If .CountOfLines > 0 Then
'Get them
Contents = .Lines(1, .CountOfLines)
If InStr(1, Contents, SearchFor, vbTextCompare) > 0 Then
Contents = Replace(Contents, SearchFor, ReplaceWith, , , vbTextCompare)
'Replace the contents with the modified string
.DeleteLines 1, .CountOfLines
.InsertLines 1, Contents
'Clean empty lines at the top and bottom
Do While Len(Trim$(.Lines(1, 1))) = 0
.DeleteLines 1, 1
Loop
Do While Len(Trim$(.Lines(.CountOfLines, 1))) = 0
.DeleteLines .CountOfLines, 1
Loop
Changed = True
End If
End If
End With
Next
'Close the file, save if necessary
Wb.Close Changed
'Next file
FName = Dir
Loop
'Done
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub
– I customized the “Customize this” section as appropriate
– saved and closed [wssi_mod.xlsm]
– then ran it by opening it and typing ALT-F8 (run)
– I noticed the “Date modified” property of the files had all been updated
– and opened a few to confirmed the changes had been completed correctly
– then I changed the path in the “Customize this” to the next sub-folder before saving and running again
– lastly I coped the whole lot back to the shared-drive