SQL Server 2008的完整维护计划
SQL Server维护计划,可以在多个服务器上备份和还原数据库文件,根据时间重新组织或重建索引
优化数据库
本节专门用于保持数据库的优化。在这个例子中,我们将要设置代码以执行以下操作(请参阅服务器连接方式的简要说明);
- 将数据库从实时服务器备份到共享备份文件夹
- 重新索引数据库
- 杀死所有连接并在报告服务器上恢复数据库。
- 链接的服务器将会在一个单独的文章中
- 日志发货将在一个单独的文章中
在执行跨服务器时,您将需要允许SQL Server运行的帐户访问目标服务器文件系统。
所有SQL代码都从一个实用程序数据库运行,而模式设置为“main”
有很多其他文章,我们在下面写下您可能会感兴趣的。
完整维护计划
现在我们可以使用另一个过程来管理所有这些单独的代码段,这些过程将以正确的顺序调用它们,这将被放在实时服务器中。代码运行如下;
- 锻炼时间
- 如果是晚上重新索引数据库
- 运行数据库的备份(添加您需要的位置)
- 如果晚上备份其他数据库(添加您需要的位置)
- 杀死连接并恢复数据库(添加您需要的位置)
此代码已经过测试并运行了几个月,没有任何问题。
请注意,日志文件和数据库文件的缩小应通过运行备份您正在清空日志(尽管它将保留使用的空间)保持最小。如果需要在正常工作时间以外运行。
SQL Code
Use [utilities]
GO
CREATE PROC [maint].MaintenancePlan AS BEGIN
DECLARE @BackupType VARCHAR(1)='E'
IF DATEPART(HOUR,GETDATE()) BETWEEN 5 AND 21 BEGIN
SET @BackupType='D'
END
--EXEC ('USE TempDb; DBCC SHRINKFILE(templog, 0)');--This is only needed when space is at a premium!
--Re-index Live
IF @BackupType='E' EXEC [maint].DatabaseReIndex 'dbname'
--Create Backup
BACKUP DATABASE TO DISK=N'{backuplocation}{dbname}.bak'
WITH NOFORMAT, INIT, NAME =N'{dbname}', SKIP, NOREWIND, NOUNLOAD, STATS= 10;
--EXEC ('USE ; DBCC SHRINKFILE(_log, 0)');--This is only needed when space is at a premium!
--Backup Other Files at Night
IF @BackupType='E' BEGIN
EXEC [maint].DatabaseReIndex 'dbname'
--Backup Others
BACKUP DATABASE [databasename] TO DISK=N'{backuplocation}{dbname2}.bak'
WITH FORMAT,INIT, NAME =N'{dbname2}',SKIP, NOREWIND, NOUNLOAD, STATS= 10
END
--Restore Backups on other server
EXEC [server].[utilities].[maint].KillConnections 'dbname';
GO
CREATE PROC [maint].MaintenancePlan AS BEGIN
DECLARE @BackupType VARCHAR(1)='E'
IF DATEPART(HOUR,GETDATE()) BETWEEN 5 AND 21 BEGIN
SET @BackupType='D'
END
--EXEC ('USE TempDb; DBCC SHRINKFILE(templog, 0)');--This is only needed when space is at a premium!
--Re-index Live
IF @BackupType='E' EXEC [maint].DatabaseReIndex 'dbname'
--Create Backup
BACKUP DATABASE TO DISK=N'{backuplocation}{dbname}.bak'
WITH NOFORMAT, INIT, NAME =N'{dbname}', SKIP, NOREWIND, NOUNLOAD, STATS= 10;
--EXEC ('USE ; DBCC SHRINKFILE(_log, 0)');--This is only needed when space is at a premium!
--Backup Other Files at Night
IF @BackupType='E' BEGIN
EXEC [maint].DatabaseReIndex 'dbname'
--Backup Others
BACKUP DATABASE [databasename] TO DISK=N'{backuplocation}{dbname2}.bak'
WITH FORMAT,INIT, NAME =N'{dbname2}',SKIP, NOREWIND, NOUNLOAD, STATS= 10
END
--Restore Backups on other server
EXEC [server].[utilities].[maint].KillConnections 'dbname';
EXEC [server].[utilities].[maint].RestoreDatabase_{dbname};
--Restore Backups on other server for db_2 etc
IF @BackupType='E' BEGIN
EXEC [server].[utilities].[maint].KillConnections 'dbname2';
IF @BackupType='E' BEGIN
EXEC [server].[utilities].[maint].KillConnections 'dbname2';
EXEC [server].[utilities].[maint].RestoreDatabase_{dbname2};
ENDEND
GO
GO
备份数据库
要获取代码来备份数据库,最简单的方法是从SSMS中编写代码。
按照您通常使用的过程,然后选择“脚本操作到新查询窗口”。
将此代码复制到维护计划中。
重新索引数据库
接下来我们可以添加一些代码重新索引我们的数据库,这又是一个共享存储过程,只需要告诉系统的名称。
为避免代码重复,您可以在下面的链接中阅读。
杀死连接
在数据库上执行恢复时,您只能有一个连接(执行还原的进程),因此我们可以创建一个存储过程,以将当前进程之外的所有连接关闭。我们再次为此创建了一个单独的文章。
恢复数据库
此代码也可以从SQL Server Management Studio脚本化。如果将此代码添加到存储过程中,则可以从其他进程甚至其他服务器轻松调用它。我们已将其移至单独的文章中,以涵盖更多选项。