请注意:本文档仅适用于使用 SQL 标准版的 PDM Professional。PDM Standard 仅可使用 SQL Express,不具备下述相关功能。
SQL 作业与维护计划可为数据库优化、定期备份、消除数据不一致等任务创建工作流。
“可是我已经使用工具对整台服务器做备份,为什么还需要专门创建 SQL 备份计划?” 如今很多人都会有这个疑问。但如果您阅读过我们的 SOLIDWORKS PDM 备份总览博客文章,就会明白:当 PDM 服务器发生故障时,仅依靠快照无法保证数据可完整恢复。受 PDM 的 SQL 数据库工作机制影响,快照还原后数据库可能处于事务中途状态,存在数据库损坏的风险。
除此之外,只有执行 SQL 感知型备份后,数据库日志文件才会被截断(完成、压缩并物理归档信息)。如果不执行该备份,日志文件会持续增长直至占满磁盘空间。备份是保障磁盘空间可用的必要手段。快照不具备 SQL 感知能力,不会暂停数据库活动,也不会截断日志。一旦进入灾难恢复场景,这会让您陷入被动。
自动化实现方式
通过 SQL Server 维护管理器配置维护计划与作业,能够实现备份自动化。频繁且定期的数据库备份,可以在故障发生时恢复数据。
SQL 中有两种备份配置方式:
维护计划(适用于 SQL 2022 及更早版本):SQL 2022 及更早版本中,SQL Server 集成服务(SSIS)可作为基础安装组件直接勾选。SSIS 包含 SQL Server 管理工具(SSMS)中的维护计划模块。因此 SQL 2022 及更早版本推荐使用维护计划。
作业(适用于 SQL 2025 及更高版本):从 SQL 2025 开始,SSIS 不再是核心组件,需要借助 Visual Studio 额外配置安装。这主要是因为微软已将维护计划划入 “遗留功能”,引导企业改用其他方案。维护计划可靠性高、上手简单,但在大型或复杂环境下可扩展性不足。因此面向未来,我们提供一种方案,让用户在安全备份库数据库的同时,使环境具备前瞻性。
前提条件
使用以上任意一种方案,都需要安装 SQL Server 管理工具(SSMS)。如未安装,可前往微软官网下载 SQL Server Management Studio。
同时必须保证 SQL 服务器上的 SQL Server 代理处于运行状态,用于执行各类任务。
操作方法:打开 SQL Server 配置管理器(可在 Windows 开始菜单搜索)。
在左侧菜单选择【SQL Server 服务】,确认 SQL Server 代理正在运行。
如未运行,右键单击,选择【启动】。
如果存在多个 SQL 实例,需要为对应实例开启代理服务。
维护计划
维护计划向导内置预设核心计划,但手动创建计划拥有更高执行灵活性。
另外,部署 SQL Server 维护计划时请注意:
运行维护计划,SQL Server 必须安装 SQL Server 集成服务。
修改 SQL 数据库前,请务必确认已完成有效备份。
禁止手动创建索引,或以其他方式直接编辑数据库。
库处于使用状态时也可运行维护计划,但计划执行期间整体性能会受到影响。建议安排在非工作时段执行。
1、安装完成后,打开 SSMS 并登录数据库引擎。

2、在 SSMS 窗口左侧的对象资源管理器,展开【管理】节点,右键单击【维护计划】。可选择【新建维护计划】或【维护计划向导】。新建计划支持手动创建。本文将介绍向导方式。

3、选择【维护计划向导】,在弹出窗口单击【下一步】。
4、设置计划属性:

输入计划名称。
运行身份:SQL Server 代理服务账户。
选择【整个计划使用单一计划或无计划】。
单击【更改】设置计划。
5、新建作业计划配置:

计划类型选择【重复执行】。
执行频率选择【每日】。
选择非高峰时段执行。
设置计划开始日期,单击【确定】。
6、在下一步页面,勾选需要执行的维护任务。本文介绍备份计划以及索引重组 / 重建计划。
创建备份任务
1、按照维护计划向导步骤操作。建议设置每日备份,最大化恢复保障。
2、在【选择维护任务】页面,勾选【备份数据库(完整)】与【维护清理任务】,单击【下一步】。

3、在【任务顺序】页面,确认备份任务排在第一位,清理任务排在第二位,单击【下一步】。

4、定义【备份数据库(完整)】任务
【常规】选项卡

下拉菜单选择【所有数据库】。
选择备份至磁盘,单击【下一步】。

【目标】选项卡
勾选【为每个数据库创建备份】。
选择备份文件存放目录,或保留默认路径。
确认文件扩展名为 bak,单击【下一步】。
5、定义【维护清理任务】

删除以下类型文件:选择【备份文件】。
文件名:选择【搜索文件夹并根据扩展名删除文件】。
填写扩展名 bak。
勾选【在任务运行时根据文件保留时长删除文件】。
设置备份文件保留时长,单击【下一步】。
6、【报告选项】

勾选【将报告写入文本文件】。
选择报告保存路径,单击【下一步】。
7、单击【完成】结束向导。
创建索引重建与索引重组任务
库数据库内的表包含索引,用于高效检索数据。当底层数据发生插入、更新、删除操作时,SQL Server 会自动维护索引。但随着数据量增长,索引会产生碎片。更新并刷新索引可以处理碎片严重的场景。维护计划能够提升文件库检索、浏览及其他交互操作的性能。
1、沿用上述维护计划向导操作步骤。建议设置每周执行一次,保障库处于健康状态。
2、在【选择维护任务】页面,勾选【重组索引】与【重建索引】,单击【下一步】。

3、在【任务顺序】页面,确认重组任务在前,重建任务在后,单击【下一步】。

4、定义【重组索引】任务:

下拉菜单选择【所有数据库】,单击【下一步】。
5、定义【重建索引】任务:

下拉菜单选择【所有数据库】,单击【下一步】。
6、【报告选项】

勾选【将报告写入文本文件】。
选择报告保存路径,单击【下一步】。
7、单击【完成】结束向导。
修改维护计划
1、在 SSMS 窗口左侧对象资源管理器,依次展开【管理】节点与【维护计划】节点。
2、右键单击需要修改的计划,选择【修改】。

3、SSMS 右侧面板会显示流程图。可从工具箱拖动新任务添加至流程图。

4、如需调整执行顺序,选中任务框,会出现绿色箭头。拖动箭头连接至下一个操作框。
5、选中操作框或箭头,按下键盘删除键即可移除。
作业
创建作业
1、在 SQL 服务器上,通过 SSMS 登录 SQL 实例。
2、在对象资源管理器,展开【SQL Server 代理】,右键单击【作业】>【新建作业…】。

3、【常规】页面:
填写作业名称,建议使用易于识别的名称,例如 “PDM 数据库备份(夜间)”。
所有者设置为 sa。
类别保持【未分类】。
如未默认勾选,请勾选【已启用】。
设置完成后,在左侧页面列表单击【步骤】。

备份步骤
1、在【步骤】页面,单击【新建…】。

2、第一个步骤用于执行备份,命名为 “备份 - 库”(将库替换为您的库名称)。
如果存在多个库,需要在作业中为每个库数据库单独创建步骤。
类型:Transact-SQL 脚本。
运行身份:留空。
数据库:保持 Master。
在命令框粘贴下方 SQL 脚本,务必完整复制并保留格式。
将两处 [VaultName] 替换为库数据库名称。服务器上每一个库都需要新增独立步骤。
将 [Path] 替换为备份文件写入路径(包含盘符),保留路径两侧文本。
默认路径:“C:\Program Files\Microsoft SQL Server\MSSQL##.MSSQLSERVER\MSSQL\Backup”。

```
DECLARE @FilePath NVARCHAR(500);
DECLARE @DateSuffix NVARCHAR(50);
-- 获取当前日期,格式化为YYYYMMDD
SET @DateSuffix = FORMAT(GETDATE(), 'yyyyMMdd');
-- 拼接带日期后缀的完整文件路径
SET @FilePath = '[Path]\[VaultName]_'+ @DateSuffix +'.bak';
-- 使用动态SQL执行备份
BACKUP DATABASE [VaultName]
TO DISK = @FilePath
WITH INIT;
```
步骤配置完成后,单击【确定】返回主步骤页面。每个数据库都重复此操作。
清理步骤
环境中所有数据库步骤添加完成后(至少 2 个:一个库数据库、一个 ConisioMasterDb),需要新增步骤清理旧备份文件。仅需一个清理步骤,即可删除指定文件夹下全部 “.bak” 文件。
1、在【步骤】页面,单击【新建…】。
2、新步骤命名为 “删除旧备份”。
类型:Transact-SQL 脚本。
运行身份:留空。
数据库:保持 Master。
在命令框粘贴下方 SQL 脚本,完整复制并保留格式。
将 [Path] 替换为前面定义的备份文件上级目录。
例如前面备份路径为 “C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Backup\Vault_”,旧备份删除路径填写 “C:\Program Files\Microsoft SQL Server\MSSQL17.MSSQLSERVER\MSSQL\Backup”。
脚本中的数字 30 代表保留天数,可按需修改。如需删除超过两周的文件,则改为:SET @cutoff = DATEADD (DAY, -14, GETDATE ());
```
-- 删除超过30天的备份文件
DECLARE @cutoff DATETIME;
SET @cutoff = DATEADD(DAY, -30, GETDATE());
EXEC xp_delete_file 0, N'[path]', N'bak', @cutoff, 1;
```

步骤配置完成后,单击【确定】返回主步骤页面。
计划
1、全部步骤添加完毕,切换到【计划】页面,单击【新建…】。
2、备份作业设置:
计划类型:重复执行
执行频率:每日(建议至少每日在非工作时段运行一次)
执行时间:例如凌晨 00:00:00(根据您的环境调整)
持续时间:立即启动,不设置结束日期

配置完成,单击计划页面【确定】。
检查作业配置确认无误,单击【确定】保存并关闭作业。
索引维护作业
索引重建与索引重组需要单独创建作业,因为一份作业内所有步骤只能共用一套计划。备份我们建议每日执行;但索引重建与重组频繁运行会引发性能问题,通常最多每周执行一次。大多数环境每月执行一次即可。
1、沿用上述步骤新建作业并命名,之后添加新步骤。
2、步骤命名为 “索引维护 / 库”,将库替换为库名称便于管理。
3、类型:Transact-SQL。
4、运行身份:留空,或设置为 SA。
5、数据库:保持 Master。
6、在命令框粘贴下方脚本,完整复制并保留格式。
将 [VaultName] 替换为库数据库名称。服务器上每一个库都需要新增独立步骤。
![将 [VaultName] 替换为库数据库名称。服务器上每一个库都需要新增独立步骤 将 [VaultName] 替换为库数据库名称。服务器上每一个库都需要新增独立步骤](/uploads/allimg/20261008/1-26100Q6021NH.png)
```
/* SOLIDWORKS官方索引维护脚本(知识库编号 QA00000123139)
检查每个索引碎片率,按阈值执行操作:
- 低于5%:不执行操作
- 5% ~ 30%:重组(轻量,在线操作)
- 高于30%:重建(完整重建)
仅处理页数大于1000的索引(小型索引无需维护) */
USE [VaultName]
DECLARE
@id int,
@dbname SYSNAME,
@cmd1 nvarchar(max)
SET @dbname = DB_NAME();
IF OBJECT_ID('tempdb..#work_table') IS NOT NULL DROP TABLE #work_table
CREATE TABLE #work_table
(
Task int IDENTITY (1,1) NOT NULL,
ObjectName sysname,
IndexName sysname,
SchemaName sysname,
IndexFragm float
)
SET @Cmd1= N'USE ['+ @dbname + N'] ;
INSERT INTO #work_table
SELECT
o.name AS objectName,
i.name AS indexName,
s.name AS schemaname,
p.avg_fragmentation_in_percent
FROM sys.dm_db_index_physical_stats (DB_ID(), NULL, NULL, NULL, null) AS p
INNER JOIN sys.objects AS o ON p.object_id = o.object_id
INNER JOIN sys.schemas AS s ON s.schema_id = o.schema_id
INNER JOIN sys.indexes AS i ON p.object_id = i.object_id
AND i.index_id = p.index_id
WHERE p.page_count > 1000
AND p.avg_fragmentation_in_percent > 5
AND p.index_id > 0
AND s.name <> ''sys'';'
EXEC sp_executesql @CMD1
DECLARE
@Object_name sysname,
@index_name sysname,
@SchemaName sysname,
@Fragmentation float,
@command1 nvarchar(max),
@command2 nvarchar(max),
@task int
SET @task = 1
WHILE (1=1)
BEGIN
SELECT
@Object_name = ObjectName,
@index_name = IndexName,
@SchemaName = SchemaName,
@Fragmentation = IndexFragm
FROM #work_table
WHERE task = @task
IF @@ROWCOUNT = 0
BREAK
IF (@Fragmentation > 30) -- 重建
BEGIN
SET @Command1 = N'USE [' + @Dbname + '] ; ALTER INDEX [' + @index_name + '] ON '
+ @SchemaName + '.[' + @Object_name + ']'
+ N' REBUILD WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF,
ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)'
PRINT (@Command1)
EXEC sp_executesql @command1
END
IF (@Fragmentation > 5 AND @Fragmentation < 30) -- 重组
BEGIN
SET @Command2 = N'USE [' + @Dbname + ']; ALTER INDEX [' + @index_name + '] ON '
+ @SchemaName + '.[' + @Object_name + ']'
+ N' REORGANIZE WITH (LOB_COMPACTION = ON)'
PRINT @command2
EXEC sp_executesql @command2
END
SET @task = @task + 1
END
DROP TABLE #work_table
```
7、切换到【计划】页面,单击【新建…】。
8、索引维护作业设置为每周或每月在非工作时段运行(推荐周末夜间执行)。

9、配置完成,单击【确定】。
10、检查作业配置确认无误,单击【确定】保存并关闭作业。
结语
遇到任何问题,请访问智诚科技ICT支持页面获取帮助!我们很乐意为您提供支持。
您也可以加入智诚问答社区,参与讨论、发布论坛帖子,回答其他 SOLIDWORKS 用户的问题。
部分文章来源网络或用户投稿,如有侵权请联系本站删除!
获取SW正版免费试用,有任何疑问咨询热线:400-886-6353或 联系在线客服
未解决你的问题?请到「问答社区」反馈你遇到的问题,专业工程师为您解答!