经常问的问题入门
如何开始使用SQL Server维护解决方案?
SQL Server维护解决方案入门很容易。跟着这些步骤。
下载MaintenanceSolution.sql。在脚本中,找到以下行:
SET @BackupDirectory = NULL
并将NULL替换为备份目录的路径。在脚本中,找到以下行:
SET @CleanupTime = NULL
并用清理时间替换NULL。清理时间是删除备份文件的小时数。执行MaintenanceSolution.sql。此脚本将创建所需的所有对象和作业。进入[SQL Server代理] / [作业]并启动已创建的作业。验证这些作业是否成功完成。验证是否正在创建备份文件。检查错误日志目录中的输出文件。安排工作。
是否需要在master数据库中创建对象?
可以在任何数据库中创建对象:master,msdb或用于数据库管理脚本的实用程序数据库。您只需要在MaintenanceSolution.sql中更改此行代码:
使用[主人]
指向将在其中创建对象的数据库。作业将自动配置为针对此数据库运行。
支持哪些版本的SQL Server?
SQL Server ,SQL Server ,SQL Server R2,SQL Server ,SQL Server ,SQL Server ,SQL Server ,Azure SQL数据库和Azure SQL数据库托管实例支持SQL Server维护解决方案。
支持哪些版本的SQL Server?
所有版本的SQL Server都支持SQL Server维护解决方案。
是否需要任何兼容级别?
要创建对象的数据库必须处于兼容级别90或更高级别。所有其他数据库可以处于任何兼容级别。
如何查看安装的版本?
存储过程的标头中有一个版本时间戳。
-------------------------------------------------- --------------------------------------------------
- //来源:https:// // -
- //许可证:https:///license.html // -
- // GitHub:https: ///olahallengren/sql-server-maintenance-solution // -
- //版本:-06-24 15:24:40 // -
----------- -------------------------------------------------- ---------------------------------------
这是一个可用于检查所有存储过程的脚本。
如何开始使用SQL Server Express上的SQL Server维护解决方案?
SQL Server Express没有SQL Server代理。因此,必须使用cmd文件和Windows计划任务来计划存储过程的执行。跟着这些步骤。
下载MaintenanceSolution.sql。执行MaintenanceSolution.sql。此脚本创建所需的存储过程。创建cmd文件以执行存储过程;例如:
sqlcmd -E -S。\ SQLEXPRESS -d master -Q“EXECUTE dbo.DatabaseBackup @Databases ='USER_DATABASES',@ Deirectory = N'C:\ Backup',@ BackupType ='FULL'” - b -o C:\登录\ DatabaseBackup.txt在Windows计划任务中,创建调用cmd文件的任务。安排任务。启动任务并验证它们是否已成功完成。
我在创建存储过程DatabaseBackup,DatabaseIntegrityCheck或IndexOptimize时收到此信息性消息:
“模块”取决于缺少的对象'mandExecute'。该模块仍将创建;但是,在对象存在之前它无法成功运行。“
我该怎么办?
DatabaseBackup,DatabaseIntegrityCheck和IndexOptimize正在使用存储过程CommandExecute。下载此对象并在同一数据库中创建它。
您还可以使用MaintenanceSolution.sql脚本,该脚本可创建所需的所有对象。
我正在使用旧版本的SQL Server维护解决方案。如何升级到最新版本?
若要升级到最新版本的SQL Server维护解决方案,请按照下列步骤操作。
下载MaintenanceSolution.sql。在脚本中更改此行,以便不创建作业:
SET @CreateJobs ='N'执行MaintenanceSolution.sql。该脚本删除旧版本的存储过程并创建新版本。启动作业并验证它们是否已成功完成。
SQL Server备份
如何备份到网络共享?
验证SQL Server和网络共享是否在同一个域中。在域帐户下运行SQL Server服务。在域帐户下运行SQL Server代理服务。授予SQL Server和SQL Server代理服务帐户对目录和网络共享的完全控制权。如果您在代理帐户下运行作业,则代理必须是域帐户。将该帐户添加到sysadmin服务器角色,并授予其对目录和网络共享的完全控制权。备份到UNC路径。DatabaseBackup不会删除旧的备份文件。问题是什么?
验证SQL Server和SQL Server代理服务帐户是否完全控制备份目录。如果该目录是网络共享,请验证SQL Server和SQL Server代理服务帐户是否完全控制网络共享。如果您使用的是代理帐户,请验证该帐户是否为sysadmin服务器角色的成员,并且该帐户可以完全控制备份目录和网络共享。验证文件未锁定在文件系统中;例如,备份或防病毒软件可能会锁定该文件。DatabaseBackup旨在不删除比最新的完整备份或差异备份更新的事务日志备份。这可以解释为什么不删除事务日志备份。如何从Azure Blob存储中删除旧的备份文件?
我无法找到从T-SQL存储过程中删除Azure Blob存储中的备份文件的方法。因此,在备份到URL时无法使用@CleanupTime参数。
您必须使用PowerShell脚本删除Azure Blob存储中的旧备份文件。这是你可以使用的一个。
DatabaseBackup备份到目录路径中包含SQL Server实例名称,数据库名称和备份类型的目录。我可以改变这种行为吗?
DatabaseBackup旨在仅在备份和验证成功时删除备份文件。即使这样,DatabaseBackup也只删除同一实例,数据库和类型的备份。因此,您可以保证始终在磁盘上拥有最新的备份。如果从目录路径中删除任何此类信息,则不再具有此保证。
这是因为xp_delete_file的工作原理:xp_delete_file是DatabaseBackup(和维护计划)用来删除备份文件的扩展存储过程。xp_delete_file根据目录,文件扩展名和修改日期删除备份文件。
DatabaseBackup备份到文件名中包含日期和时间的文件。我可以更改此行为,以便它始终备份到相同的文件名吗?
DatabaseBackup旨在仅在备份和验证成功时删除备份文件。它每次都备份到一个新的文件名。因此,您可以保证始终在磁盘上拥有最新的备份。如果备份到相同的文件名,则不再具有此保证。
如何配置DatabaseBackup备份可用性组?
首先,您需要确定要执行备份的位置;在主副本或辅助副本上。SQL Server有一个名为备份首选项的选项,您可以在可用性组上设置该选项。默认情况下,它设置为Prefer Secondary,但如果您愿意,可以将其更改为Primary。
辅助副本上不支持所有备份类型。以下是支持的备份类型:
仅复制完整备份日志备份(非复制)
DatabaseBackup将在首选备份副本上执行这些类型的备份。它使用函数sys.fn_hadr_backup_is_preferred_replica来确定当前副本是否是首选副本。
仅在主副本上支持完全备份(仅限非副本)和差异备份。DatabaseBackup将始终在主副本上执行这些类型的备份。
您可以使用以下一些不同的备份策略:
在主副本上执行所有备份。使用此策略,它就像任何数据库一样工作。您可以执行完整(仅限非复制),差异和日志备份。您需要做的就是为可用性组将备份首选项设置为Primary。
在辅助副本上执行所有备份。使用此策略,您只能执行仅复制完整备份和日志备份(仅限非复制)。您需要检查可用性组的备份首选项是否设置为Prefer Secondary。您还需要将@CopyOnly ='Y'添加到完整备份作业,并禁用差异备份作业。
在主副本上执行完全(仅限非复制)和差异备份,并在辅助副本上记录备份。您需要检查可用性组的备份首选项是否设置为Prefer Secondary。您无需向完整,差异或日志备份作业添加任何其他参数。
应该以相同的方式配置作业,并在所有副本上启用和计划作业。
SQL Server完整性检查
我应该如何配置DatabaseIntegrityCheck来检查可用性组?
默认情况下,DatabaseIntegrityCheck正在对所有副本执行检查。这是最佳实践,因为主副本具有不同的I / O子系统。
Paul Randal在这里写这篇文章。
“镜像的I / O子系统没有损坏,这与委托人的I / O子系统的健康状态无关。”
如果需要控制检查的副本,可以使用参数@AvailabilityGroupReplicas。
应该以相同的方式配置作业,并在所有副本上启用和计划作业。
SQL Server索引和统计维护
我应该如何为可用性组配置IndexOptimize?
只能重建或重组索引,并且仅在可用性组中的主副本上更新统计信息。IndexOptimize检查了这一点。
应该以相同的方式配置作业,并在所有副本上启用和计划作业。
执行IndexOptimize时,为什么没有重组或重建索引?
问题可能是索引太小或没有足够的碎片。
默认情况下,IndexOptimize不会重新组织或重建少于1000页的索引。如果要更改此设置,可以使用@MinNumberOfPages参数。
默认情况下,IndexOptimize不会重新组织或重建碎片小于5%的索引。如果要更改此设置,可以使用@ FragmentationLevel1参数。
当我刚刚执行IndexOptimize时,为什么我的某些索引仍然碎片化?
小指数有时甚至在重组或重建后立即显示出高度分散。这是因为页面存储在混合范围中。您可以在联机丛书中了解这种情况:
“一般来说,小型索引的碎片通常是无法控制的。小索引的页面存储在混合扩展区中。混合扩展区最多由八个对象共享,因此在重新组织或重建索引后,小索引中的碎片可能不会减少。
此外,非常小的表上的碎片不会影响性能。微软有一篇关于此的白皮书:
“通常,您不应该关注少于1,000页的索引的碎片级别。在测试中,包含超过10,000页的索引实现了性能提升,索引的增幅最大,页面数量明显增加(超过50,000页)。
默认情况下,IndexOptimize不会重新组织或重建少于1000页的索引。如果要更改此设置,可以使用@MinNumberOfPages参数。
最后,IndexOptimize仅用于索引,而不是堆(index_id = 0)。
碎片级别应该用于重组和重建索引?
Microsoft在联机丛书中提供了一些建议。IndexOptimize中的默认值基于这些建议。
是否有可用于检查索引碎片的脚本?
这是一个可用于检查索引碎片的脚本。
如何将IndexOptimize中的命令记录到表中,以便我可以分析哪些索引快速分段?
您可以使用@LogToTable ='Y'选项将命令记录到表中。然后,您可以使用此脚本来分析数据。
运行IndexOptimize作业时,事务日志变得非常大。我该怎么办?
确保事务日志备份作业正在运行。
检查事务日志是否具有所需的存储。您不应该缩小事务日志文件。这样做会花费资源来缩小并稍后重新生成文件。
工作执行
我应该在sqlcmd或T-SQL作业步骤中使用CmdExec作业步骤吗?
SQL Server ,和R2 R2中存在一个问题,即在第一个错误之后T-SQL作业步骤停止执行。解决方法是使用带有sqlcmd和-b选项的CmdExec作业步骤。
T-SQL作业步骤在SQL Server 及更高版本中运行良好。
您可以使用MaintenanceSolution.sql脚本来创建作业。它将在SQL Server ,和 R2上使用sqlcmd创建CmdExec作业步骤,在更高版本上使用T-SQL作业步骤。
我可以更改存储过程的默认参数值以适应我们的环境吗?
我建议您不要更改存储过程的默认参数值。这样做会使您更难以升级到新版本的存储过程。相反,我建议您将首选值作为参数传递给作业中的存储过程。
我应该按名称还是按位置将参数传递给存储过程?
我建议您按名称将参数传递给存储过程。在将来的存储过程版本中,我将始终保持参数的名称相同。
我的一个工作失败了。我查看了历史记录,但我看不出失败的原因。
视图历史记录仅显示存储过程的一小部分输出 - 并且它并不总是错误所在的部分。因此,您需要检查输出文件,这些文件与SQL Server错误日志位于同一目录中。
如果尚未配置输出文件,则可以使用MaintenanceSolution.sql脚本创建作业。将为您配置输出文件。
使用SQL Server代理令牌的目的是什么?
在sqlcmd命令中使用SQL Server代理令牌作为服务器名称可确保您针对本地SQL Server执行脚本。
在输出文件名中使用SQL Server代理令牌获取jobid,stepid,date和time可确保这些文件名是唯一的。
在输出文件路径中为日志目录使用SQL Server代理令牌可确保您可以在多服务器环境中使用这些作业。
您可以使用MaintenanceSolution.sql脚本来创建作业。然后将为您配置sqlcmd命令和带有令牌的输出文件。
我有一个多步骤的工作。如果任何步骤失败,如何配置作业以运行所有步骤并报告失败?
不幸的是,这项任务并不像看起来那么容易。如果要运行所有步骤,则必须在成功和失败时配置除[最后一步]之外的所有步骤,以防步骤失败。最后一步必须配置为[退出作业报告成功]成功和[退出作业报告失败]失败。问题是,在这种情况下,即使一个或多个前面的步骤失败,只要最后一步成功,作业就会报告成功。
作为解决方法,您可以在作业结束时添加一个步骤,以确定之前的步骤是否失败。
我希望在作业失败时收到电子邮件通知。我怎样才能做到这一点?
SQL Server代理具有内置支持,可在作业失败时发送邮件。您可以在联机丛书中阅读有关SQL Server代理邮件的信息。
我可以使用SQL Server代理以外的作业调度程序来安排存储过程的执行吗?
您可以使用任何作业计划程序安排执行存储过程。
调度
我该如何安排工作?
答案取决于您的维护窗口,数据库的大小,您可以容忍的最大数据丢失以及许多其他因素。以下是一些您可以开始使用的指南,但您需要根据您的环境进行调整。
用户数据库:
每周一天完整备份一周中所有其他日期的差异备份每小时进行事务日志备份完整性检查每周一天指数维护每周一天
系统数据库:
每天完整备份完整性检查每周一天
我建议您在索引维护后运行完整备份。以下差异备份将很小。我还建议您在完整性检查后执行完整备份。然后你知道备份的完整性是可以的。
清理:
sp_delete_backuphistory每周一天sp_purge_jobhistory每周一天CommandLog清理每周一天每周一天输出文件清理
记录
我正在使用该选项登录到表格。我还应该记录输出文件吗?
您应始终记录输出文件,以确保在出现错误时您拥有完整的信息。
您可以使用MaintenanceSolution.sql脚本来创建作业。然后将为您配置输出文件。
我正在使用该选项登录到表格。如果BACKUP DATABASE命令中存在错误,则表中只记录一个错误,即使该命令输出两个错误。为什么是这样?
SQL Server中的某些命令输出两个错误。不幸的是,您只能捕获最后一个错误。
您应始终记录输出文件,以确保在出现错误时您拥有完整的信息。
您可以使用MaintenanceSolution.sql脚本来创建作业。然后将为您配置输出文件。
我正在使用该选项登录到表格。如果BACKUP DATABASE命令中存在错误,则会记录错误编号,但不会记录错误消息。为什么?
要在SQL Server中捕获错误消息,您需要使用TRY CATCH和ERROR_MESSAGE()函数。遗憾的是,TRY CATCH与BACKUP DATABASE命令不兼容,后者输出两个错误(您只能捕获最后一个错误)。为了确保输出所有错误信息,我不在TRIB CATCH中使用DatabaseBackup中的BACKUP DATABASE命令。因此,错误消息不会记录到表中。
您应始终记录输出文件,以确保在出现错误时您拥有完整的信息。
您可以使用MaintenanceSolution.sql脚本来创建作业。然后将为您配置输出文件。
安全
SQL Server维护解决方案是否使用xp_cmdshell?
SQL Server维护解决方案不使用xp_cmdshell。
SQL Server维护解决方案需要哪些权限才能运行?
如果您使用的是SQL Server代理,则作业将在SQL Server代理服务帐户下运行,该帐户是sysadmin服务器角色的成员。如果您使用的是代理帐户,我建议该帐户是sysadmin服务器角色的成员。
如果您正在使用其他调度程序,我建议调度程序在作为sysadmin服务器角色成员的帐户下运行。
如果您需要让用户针对特定数据库临时执行存储过程,则需要以下权限:
DatabaseBackup:sysadminDatabaseIntegrityCheck:在dbo.DatabaseIntegrityCheck上执行,在mandExecute上查看定义,在所有目标数据库上查看mandLog,VIEW SERVER STATE,db_owner上的DEFINITIONIndexOptimize:在dbo.IndexOptimize上执行EXECUTE,在mandExecute上查看定义,在所有目标数据库上查看mandLog,VIEW SERVER STATE,db_owner上的DEFINITION
部署
我有一个非常大的SQL Server环境。如何在所有服务器上部署SQL Server维护解决方案?
在SQL Server Management Studio中,您可以并行地对多个服务器执行脚本。这是在所有服务器上部署SQL Server维护解决方案的简便方法。您还可以使用中央管理服务器创建服务器的中央列表。
要验证所有服务器上是否具有相同版本的SQL Server维护解决方案,可以检查版本时间戳和校验和。这是您可以使用的脚本。
卸载
如何卸载SQL Server维护解决方案?
这是一个可用于卸载SQL Server维护解决方案的脚本。
清理
sp_delete_backuphistory和sp_purge_jobhistory有什么作用?
您可以在联机丛书中阅读有关sp_delete_backuphistory和sp_purge_jobhistory的内容。
高可用性
SQL Server维护解决方案是否支持Always On Availability Groups?
SQL Server维护解决方案支持AlwaysOn可用性组。
在首选副本上执行仅复制完整备份和事务日志备份。在主副本上执行完全备份(非副本)和差异备份。
对所有副本执行完整性检查。索引和统计信息维护在主副本上执行。
您可以使用@AvailabilityGroups参数选择可用性组。
SQL Server维护解决方案是否支持数据库镜像?
SQL Server维护解决方案支持数据库镜像。在主体数据库上执行备份,完整性检查以及索引和统计信息维护。
SQL Server维护解决方案是否支持日志传送?
SQL Server维护解决方案支持日志传送。在主数据库上执行完全和差异备份,完整性检查以及索引和统计信息维护。不对日志传送中涉及的数据库执行事务日志备份。
SQL Server维护解决方案是否支持故障转移群集?
SQL Server维护解决方案支持故障转移群集。
云
Azure虚拟机是否支持SQL Server维护解决方案?
Azure虚拟机支持SQL Server维护解决方案。
Amazon EC2是否支持SQL Server维护解决方案?
Amazon EC2支持SQL Server维护解决方案。
Amazon RDS for SQL Server是否支持SQL Server维护解决方案?
Amazon RDS for SQL Server支持完整性检查以及SQL Server维护解决方案的索引和统计维护部分。备份由Amazon RDS的自动备份功能执行。
Azure SQL数据库是否支持SQL Server维护解决方案?
Azure SQL数据库支持完整性检查以及SQL Server维护解决方案的索引和统计信息维护部分。备份由Azure SQL数据库的自动备份功能执行。
您不能在Azure SQL数据库上使用MaintenanceSolution.sql。您需要将对象作为单独的脚本下载。
Azure SQL数据库托管实例是否支持SQL Server维护解决方案?
Azure SQL数据库托管实例支持SQL Server维护解决方案。
SQL Server维护解决方案是否支持Azure Blob存储的备份?
SQL Server维护解决方案支持Azure Blob存储的备份。
一般的问题
使用SQL Server维护计划不是更容易吗?
SQL Server维护计划在某些情况下很好,但并不总是提供您所需的。SQL Server维护解决方案可靠,易于部署,具有广泛的日志记录,并具有企业环境中经常需要的功能。
SQL Server维护解决方案需要多少费用?
SQL Server维护解决方案是免费的。您可以在此处阅读许可证。
是否可以在GitHub上使用SQL Server维护解决方案?
SQL Server维护解决方案可在GitHub上获得。
如何提醒有关SQL Server维护解决方案的更新?
您可以注册该简报,以获得有关SQL Server维护解决方案更新的警报。