IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('dbo.maintenance') AND sysstat & 0xf = 4) DROP PROCEDURE dbo.maintenance GO CREATE PROCEDURE maintenance @dbName VARCHAR(30) = 'bwtest', -- the database name on both systems @source VARCHAR(30) = 'prod', -- the source server name @sourcePassword VARCHAR(30) = ' ', -- sa password on source @dumpShare VARCHAR(30) = 'alle', -- source system drive share name @dumpFolder VARCHAR(30) = 'backup', -- source system top level directory @dumpMe VARCHAR(5) = 'true', -- flag to enable dump processing @mailto VARCHAR(30) = 'DBA', -- valid account in same Exchange Server @saPassword VARCHAR(30) = ' ', -- sa password for admin server @debug VARCHAR(5) = 'false' -- debug mode flag AS DECLARE @dumpPath VARCHAR(50), -- dump path @dumpDevice VARCHAR(80), -- fully qualified dump device @dumpArchive VARCHAR(80), -- source archive PATH @CMD VARCHAR(255), -- reusable command holder @CMDstatus INT, -- return status of command prompt @mailSubject VARCHAR(80), -- mail subject string @mailMessage VARCHAR(80), -- mail message string @myName VARCHAR(30), -- this stored procedure @results VARCHAR(80), -- file to hold outfile scan info @outfile VARCHAR(80), -- working var for qualified file name @drive varchar(5) -- the logical name of a shared drive /* Procedure will perform maintenance and dump of a database. The previous dump will be kept in a zipped archive along with the current dump. */ SET NOCOUNT ON SELECT @myName = "admin.maintenance" /* make sure the db is available else exit*/ EXEC @CMDstatus = isAdminUsingDB @dbName, @source, ' ', @debug IF @CMDstatus <> 0 BEGIN SELECT @CMD = 'An adminstrative subsystem process is already active in database ' + @dbName + '. Only one admin process may be active at any time.(' + @myName + ')' RAISERROR(@CMD,1,1) WITH SETERROR RETURN 1 END /* build file system paths used by this replication process */ SELECT @dumpPath = '\\' + @source + '\' + @dumpShare + '\' + @dumpFolder + '\' + @dbName SELECT @dumpDevice = @dumpPath + '\' + SUBSTRING(@dbName,1,4) +"dump.DAT" SELECT @dumpArchive = @dumpPath + '\archive' SELECT @results = @dumpPath + '\ck_outfiles.results' IF @debug <> 'true' BEGIN SELECT "@myName: ", @myName SELECT "@dumpPath: ", @dumpPath SELECT "@dumpDevice: ", @dumpDevice SELECT "@dumpArchive: ", @dumpArchive SELECT "@results: ", @results END /* verify necessary file systems for target server */ EXEC @CMDstatus = verify_sync_folders @dbName, @dumpPath, @dumpShare, @dumpFolder, @dumpArchive, @source, @debug IF (@CMDstatus <> 0) return @CMDstatus /* archive the maintenance output files */ SELECT @CMD = 'dir ' + @dumpPath + '\*.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus = 0) -- found BEGIN SELECT @CMD = 'dir ' + @dumpPath + '\*.001' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus = 0) -- found BEGIN SELECT @CMD = 'del ' + @dumpPath + '\*.001' EXEC @CMDstatus = dispatch @CMD, @myName, @debug END SELECT @CMD = 'ren ' + @dumpPath + '\*.out '+ '*.001' EXEC @CMDstatus = dispatch @CMD, @myName, @debug END /**************** MAINTENANCE PROCESSING *********************/ /* build scripts to set permissions as they now exist */ EXEC run_script_remote "permissions", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* build scripts to set users and alias as they now exist */ EXEC run_script_remote "users", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* build scripts to set row level locking as now exist */ EXEC run_script_remote"row_level_locks", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* Check the table allocation chain (capture elapsed time to outfile)*/ SELECT @CMD = 'isql -Usa -e -p -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"DBCC CHECKDB" -o' + @dumpPath + '\checkdb.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* Check the storage allocation chain (capture elapsed time to outfile)*/ SELECT @CMD = 'isql -Usa -e -p -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"DBCC NEWALLOC" -o' + @dumpPath + '\newalloc.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* Check the system tables allocation chain */ SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"DBCC CHECKCATALOG" -o' + @dumpPath + '\checkcatalog.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* get the sp_help info for the database */ SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"sp_helpdb ' + @dbName + '" -o' + @dumpPath + '\helpdb.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* check the space available in the database notify somebody if over 90% full*/ EXEC run_script_remote "check_space", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /************* MSDB ONLY *************/ IF @dbName = 'msdb' BEGIN /* get systasks info */ EXEC run_script_remote "tasks", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* if this msdb is local clean up systasks */ IF @source = @@SERVERNAME BEGIN SELECT @CMD = "admin..purgeMSDB @source = '" + @source + "', @sourcePassword = '" + @sourcePassword + "'" EXEC (@CMD) END END -- msdb database /************* MASTER ONLY *************/ IF @dbName = 'master' BEGIN /* get the reverse engineered database create script */ EXEC run_script_remote "devs_and_dbs", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* build create scripts for any user extended stored procedures */ EXEC run_script_remote "user_xps", @dbName, @source, @sourcePassword, @dumpPath, @saPassword, 'out', @debug SELECT @CMDstatus = @@ERROR IF (@CMDstatus <> 0) return @CMDstatus /* get the info from sysdatabase, sysdevices, and sysusages for critical failure recovery processing */ SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"select * from sysdatabases" -o' + @dumpPath + '\sysdatabases.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"select * from sysdevices" -o' + @dumpPath + '\sysdevices.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"select * from sysusages" -o' + @dumpPath + '\sysusages.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* get the SQL Server configuration info */ SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"sp_configure" -o' + @dumpPath + '\configure.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus /* get the memory usage info */ SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -d' + @dbName + ' -Q"DBCC MEMUSAGE" -o' + @dumpPath + '\memusage.out' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus END -- master database /**************** DUMP THE DATABASE ****************/ IF @dumpMe = "true" BEGIN /* cleanup the dump files */ EXEC @CMDstatus = delete_archive @dumpArchive, @debug IF (@CMDstatus <> 0) select @CMDstatus /* dump the database */ EXEC @CMDstatus = dumpDatabase @dbName, @source, @sourcePassword, @dumpDevice, @debug IF (@CMDstatus <> 0) RETURN @CMDstatus /* archive the dump */ EXEC convert_share_to_drive @dumpShare, @drive OUTPUT, @dumpPath, @source, @sourcePassword, @saPassword, @debug SELECT @CMD = @drive + '&cd ' + @dumpfolder + '\' + @dbName + '&pkzip ' + 'archive\' + SUBSTRING(@dbName,1,4) + 'dump.zip ' + SUBSTRING(@dbName,1,4) + 'dump.dat -b' + @drive SELECT @CMD = "master..xp_cmdshell '" + @CMD + "'" SELECT @CMD = 'isql -Usa -P' + @sourcePassword + ' -S' + @source + ' -dmaster -Q"' + @CMD + '"' EXEC @CMDstatus = dispatch @CMD, @myName, @debug IF (@CMDstatus <> 0) return @CMDstatus END /* Check for errors in the out files and mail results. Parse the maintenance output files for specific words that may indicate problems in the database. Mail the results. */ EXEC check_outfiles @dbName, @source, @dumpPath, @mailto, @saPassword, @debug RETURN 0 GO