数据库管理员较为普通(但非常重要)的监测任务之一是监视和管理文件的大小。数据
文件和日志文件的默认设置是自动增长,而且没有t 限。这可能并不是最理想的配置。一 般来说,在数据库的设计和规划阶段就已经确定了数据库的大小。这一决定中应标识数据
库文件的起始大小,以及每个文件类型的预计增长率。然而,意外增长,尤其是日志文件
的意外增长,是很常见的。这就使得监视文件人小尤为重要。如果一个数据文件容量到达

极限,那么将无法修改其数据。日志文件也是如此。
1 .磁盘使用情况报表
监视数据库文件大小的方法有很多种。SQL Server Management Studio中的磁盘使用情
况的报表(见图10-15)即是一种。该报表的信息丰富,可以用来找到占用最多空间的表以及
索引结构和文件。其缺点就是要想得到这个报表,就必须运行它。

监控文件操作 监控文档一般存在哪里_数据库

sp_spaceused
sp_spaceused存储过程也可以用来返回一些和磁盘使用报表类似的信息,但是如果没有 给它传递具体对象名称参数,该存储过程将只会返冋整个数据库的空间信息。下例显示了
如何运行sp spaceused存储过程从AventureWorks2008数据库或其中的一个表中检索信息:

SET NOCOUNT ON;
USE AdventureWorks2008;
GO
SELECT * AdventureWorks2008 Space Used Data * EXEC sp spaceused; - 一 Return total database size and available disk space
SELECT * Person.Person Space Used Data'
EXEC sp_spaceused 'Person.Person1; --Return allocation data for Person.Person


此脚本的结果如下所示(您的结果可能会有所不同,因为我对结果进行了排版使其

适合版面):
AdventureWorks2008 Space Used Data
database_name database'size unallocated space AdventureWorks2008 198.06 MB 15.40 MB reserved data index size unused 185000 KB 96312 KB 82112 KB 6576 KB
Person.Person Space Used Data
name rows reserved data index_size unused Person 19972 83752 KB 30488 KB 52560 KB 704 KB
sys.sysfiles
系统视图sys.sysfiles是检索数据库中的文件信息的另外一种很好的方法,但是其返回 的默汄数据不是最育观的。例如,size属性不是一个文件的大小,而是8K数据页的数目。 而如果没有指定最大值,那么maxsize属性会返冋-1 。要使结果更加简洁和易于阅读,可 以创建一个如下所示的脚本:
SELECT Name, FileName , CAST((Size * 8192 / 1048576) AS varchar(10)) + ,MB, AS FileSize , MaxSize = CASE MaxSize WHEN -1 THEN Unlimited'
ELSE CAST((Maxsize / 128) AS varchar(10)) +'MB'
END FROM sys.sysfiles;
该査询的结果很简洁,也易于理解(如图10-16所示)。它们也可以由应用程序和基于査
询结果做出的编程决策使用。

监控文件操作 监控文档一般存在哪里_SQL_02

2 .使用性能监视器监视文件
性能计数器可能是监视数据和日志文件中的空闲空间的最有效方法。SQL Server:Databases 性能对象有几个可以用来监视磁盘和日志文件大小的计数器。可以按照第8 章的介绍,使
用这些计数器创建膂报。这样SQL Server就能替您执行监视,并在数据文件超出预置的大
小或事务日志的填充程度超出一定百分比时通知您。

1 0 .3 审核
从根本上讲,审核就是监视和跟踪对系统的更改的过程。各组织也越来越多地要求
DBA实施审核来满足安全和业务需求。在很多情况下,监视对数据库数据的访问和更改是
为了依据HIPAA、SOX和其他控制性措施使之符合行业强制性要求。
审核属于那种在概念上非常简单,但实践起来非常困难的主题之一,它通常要求有自
定义的解决方案以及大量的时间和资源投入,达到不同程度的成功。而 SQL Server 2008
使审核成为了一个集成化程度更髙的、标准化的自动任务,同时增加了审核可靠性,并减
少了整体系统开销。
在新的审核功能的核心,SQL Server 2008引入了 SQL Server扩展事件引箏。扩展事件 引擎允许任何进程定义和引发事件,并允许使用者接收事件。事件是以完全去耦的方式进
行处理的,可以将单个事件有效地分派给多个使用者,同时确保事件不会丢失。
通过SQL Server提供的大景审核工具,数据库管理员可以轻松实现一个全面的、自定 义的审核策略来满足特定组织的要求。本节将介绍各种审核工具和进程,并介绍如何有效
地使用它们。
10.3.1 SQL Server 审核
SQL Server 2008企业版引入了一个称为“SQL Server审核”的新的自动审核选项。SQL
Server审核由许多不同的元素构成,它们一起用于跟踪和记录系统上发生的事件。这些元 素分别是SQL Server审核包、服务器审核规范、数据库审核规范和审核目标(也称为目标)。 要了解组成SQL Server审核的元素以及它们如何交互,可以将其与报表进行 对 比 。报 表是通过将报表定义和数据源相结合生成的输出。类似地,审核是通过将审核对象和审核
规范相结合生成的输出。
说明:
“审核”这个术语可能会让人混淆,因为这个词用于许多不同的上下文中。SQL Server 使 用 “审核”这个词描述审核包、审核过程本身以及审核过程的输出.所以肯定会让人感
到有些糊涂。
创建SQL Server审核的基本过程如下所示:
(1) 创建一个SQLServer审核包并定义输出目标。
(2) 创建一个服务器审核规范和/或一个或多个数据库审核规范,它们定义了审核事件

标准。
(3) 启用审核规范。
(4) 启用审核。
(5) 査看并分析捕获的审核事件。依据审核目标,可使用Windows事件査看器、SQL
Server Management Studio中的日志文件查看器或使用fti_get_audit_file函数查看结果。
在实际创建审核之前,本节将稍微详细地介绍一下各个元素。然后将提供一个组合使
用这些元素的示例。
1. 审核包
审核包定义一个审核,它作为捕获的审核事件的事件使用者,并将捕获的事件引向审
核目标。可以通过服务器实例的“安全性” | “审核”文件夹管理审核包。
除了审核目标外,还可更改另外两个设置:
• 队列延迟一 这一设置表明在强制处理事件前缓冲事件的毫秒数。默认值是1000(1
秒)。将这个值设置为0 将强制事件立即得到处理。缓冲有助于最小化审核对服务
器的影响,因此建议在大多数情况下使之保持为默认值。
• 在审核日志故障时关闭服务器—— 如果设置了此选项,SQL Server将在无法向目 标写事件时关闭。更为常见的是,这会在向其中写日志的磁盘卷空间不足时发生。
需要注意,如果设置了此选项,但是空间不足,那么只有在释放了额外的空间后,
或在启动SQL Server时使用-f标记禁用审核,才能重启服务器。 对于每个数据库,一个审核包至多可包含一个服务器审核规范和一个数据库审核规
范。如果有必要,可创建多个分别映射至不同目标的审核。
审核包总是在禁用状态下创建的。启用审核包后,它可以把捕获的事件发送至目标。
2. 服务器审核规范
服务器审核规范决定了在审核中应该包括哪些服务器级事件。一般在SQL Server实例 级别定义服务器审核规范,因此每个审核只能有一个服务器审核规范。服务器审核规范位
于每个服务器实例的“安全性” | “服务器审核规范”文件夹中。
服务器审核规范可包括多个服务器级操作组,其中每个组都是一个相关事件的预定义
集合。指定的事件包含在审核中并被保存至目标。本章后面将会说明,大部分操作组都有
一个等效的安全审核事件类。
表 10-7显示了可用的服务器级操作组并简单描述了其中包括的事件。

监控文件操作 监控文档一般存在哪里_数据库_03

监控文件操作 监控文档一般存在哪里_运维_04

除了服务器级操作组外,也可以在服务器审核规范中使用任意数据库操作组。当在服务
器级使用数据库操作组时,它会应用至服务器卜.的所冇数据库。下一节将介绍数据库操作组。
3 .数据库审核规范
数据库审核规范的工作方式与服务器审核规范类似,只是它工作在数据库级别。对于
服务器上的每个数据库来说,一个审核可以包含一个数据库审核规范。可以通过每个数据
库的“安全性” | “数据库审核规范”节点管理数据库审核规范。一个数据库审核规范可以
包含多个数据库级操作组或单个审核事件。
表 10-8显示了数据库级别可用的操作组并简单描述了它们表示的事件。

监控文件操作 监控文档一般存在哪里_操作系统_05

监控文件操作 监控文档一般存在哪里_监控文件操作_06

数据库审核规范的一个强人功能是可以审核由特定主体(用户或角色)对特定对象执行的
特定操作。可被审核的操作包括 DELETE、EXECUTE、INSERT、RECEIVE, REFERENCES>
SELECT 和 UPDATE。
如果在数据库审核规范中选择了一个特定操作,那么还必须指定对象名称和主体名
称。可以使用public主体来包含所有用户和角色,因为每个人都自动是public的成员。不 能保存包含不完整行的规范。
4 . 审核目标
审核目标决定了将把捕获的事件写入何处。审核的目标可以是下列选项之一:
• File— 将审核保存至文件。除了文件路径以外,还可以指定滚动更新文件的最大 数目、每个文件的最大大小和是否保留必要的空间。这一选择的安全性将取决于
指派给文件的文件系统权限。
• Security Log------将审核的事件写入Windows安全日志。对于髙安全性环境来说,
这可能是最好的选择,但在选择此目标之前,很可能需要修改几个系统策略。可
以参见“将安全日志作为目标” 一节获取更多信息。

• Application Log-----将审核目标设置为Windows应用程序日志。记住,如果选择该
目标,普通用户默认可读取应用程序日志。有些审核信息可能是敏感的,不适合
一般性使用。所以这一选择可能不适用于高安全性环境。
5 .将安全日志作为目标
为了将事件写入安全日志,需要将SQL Server服务帐户添加到“产生安全审核”策略中, 并为成功和失败启用“审核对象访问”安全策略。这可通过安全策略管理单元(secpol.msc)或
在 Windows Vista或 Server 2008中使用命令行审核策略程序(auditpol.exe)完成。
要使用安全策略管理单元启用安全日志目标,可遵循下列步骤。
(1) 选 择 “开始”丨“运行”命令,在 “运行”对话框中输入secpol.msc,打开安全策 略管理单元。
(2) 展 开 “本地策略”节点,然后单击“用户权利指派”文件夹。
(3) 打 开 “产生安全审核”策略,将 SQL Server服务帐户添加至本地安全设置。 (4) 接着,从左边面板中选择“审核策略”文件夹。
(5) 打 开 “审核对象访问”策略,选 中 “本地安全设置”选项卡上的“成功”和 “失
败”复选框。
(6) 关闭安全策略管理单元。
默认情况下,Local System、Local Service和 Network Service是 “产生安全审核”策
略的一部分。如果在这些帐户下运行SQL Server,将只需要配置“审核对象访问”策略。

试一试 审核安全事件
要审核安全事件,需遵循下列步骤:
(1 )打开 SQL Server Management Studio,连接至驻留 AdventureWorks2008 数据库的服
务器。展开“对象资源管理器”中的安全性节点,右击“审核”文件夹并选择“新建审核”
命令。创建一个新的审核,如 图 10-17所示。

监控文件操作 监控文档一般存在哪里_操作系统_07

说明:
如果文件路径不存在,那么在“创建审核”对话框中单击“确定”按钮时会引发错误。
如果有必要,可以使这个对话框保持打开,使用资源管理器创建所需的文件夹,然后完成该
对话框。
(2) 右 击 “服务器审核规范”文件夹,选 择 “新建服务器审核规范”命令。在 “审核”
下拉列表框中,选择上面创建的审核并添加下列操作组:
• SERVER_PRINCIPAL_CHANGE_GROUP
• SERVER_PRINCIPAL」MPERSONATION_GROUP
• LOGIN_CHANGE_PASSWORD_GROUP
(3) 保存审核规范,然后右击它并选择“启用服务器审核规范”命令。审核规范上的
图标将显示它已被启用。
(4) 展开AdVemureWOrks2008数据库,通 过 “安全性” | “数据库审核规范”文件夹创 建一个新的数据库审核规范。将这个规范映射至上面创建的审核包,然后添加下列操作组,
如 图 10-18所示。
• SELECT:对象类 “Schema” ,对象名称 “Person” ,主体名称 “public” • DATABASE_OBJECT_PERMISSION_CHANGE_GROUP

监控文件操作 监控文档一般存在哪里_操作系统_08

(5) 保存并启用该审核规范。数据库审核规范的阁标应更改为显示它已被启用。
(6) 现在启用审核以便开始接收包含的事件。在启用了审核后,将下列代码输入至一
个新的查询窗口并执行这些代码。

- - Create a new server login EXEC sp_addlogin 'Paul*, 'Microsoftl23•, *AdventureWorks2008';
GO
- - Exclude this login from OS policy constraints ALTER LOGIN Paul WITH CHECK_POLICY =OFF
GO
—— change password EXEC sp_password Gold = 1Microsoftl231 , @new = *Microsoft456', Qloginame = 'Paul *
GO
—— Allow this user to access AdventureWorks2008 USE AdventureWorks2008
GO
CREATE USER Paul FOR LOGIN Paul
GO
- - Try to select as Paul, no permissions yet!
EXECUTE AS LOGIN=, Pa u l , SELECT * FROM Person.Person WHERE BusinessEntityID=l;
REVERT
GO
—— Assign permissions GRANT SELECT ON Person.Person TO Paul;
GO
- - Now the select should succeed EXECUTE AS LOGIN=*Paul* SELECT * FROM Person.Person WHERE BusinessEntityID=l;
REVERT
GO
- - Clean up DROP USER Paul
GO
EXEC sp_droplogin 1 P a u l 1 ;
GO


注意,在运行脚本时,结果集和异常都显示了出来。这是我们意料之中的,这么做是
为了突出审核检测成功和失败的访问尝试的能力。当用户Paul试图在未获得权限之前从 Person.Person表中读取数据时,就产生了异常。 (7)最后,禁用该审核,然后右击审核并选择“查看审核日志”命令,在 “日志文件
査看器”中显示结果。结果应该与图10-19类似。

监控文件操作 监控文档一般存在哪里_监控文件操作_09

在审核结果中可注意到,所有的目标事件都被捕获,包括失败的SELECT尝试。
也可以使用新的fn_get_audit_file 函数以表形式査看审核结果。如果想尝试,可以在一 个新查询窗口中执行下列代码:

SELECT * FROM
fn_get_audit_file(*C:\SQLAudit\* *,default,default)


10.3.2登录审核
可以管理和实施的最基本的审核是登录审核。登录审核仅记录成功的登录尝试、失败
的登录尝试或两者都记录。对登录审核的支持内置于SQL Server中,可通过SQL Server Management Studio的 “服务器属性”对话框的“安全性”页启用,如 图 10-20所示。在更
改了登录审核级别后,只有重启服务器实例,新的设置才会生效。

监控文件操作 监控文档一般存在哪里_SQL_10

登录成功和失败事件被写入Windows应用程序日志以及SQL Server日志中。写入两 个日志的信息是一样的,但有一项例外。SQL Server日志针对失败的尝试接收额外的一项, 它包含一个较详细地描述了导致登录失败的原因的特殊状态码。常见的状态码值如表10-9
所示。

监控文件操作 监控文档一般存在哪里_数据库_11

 

10.3.3 C2审核模式
C2审核模式是最初由美国国防部制定的•组应用于计算机系统中的安全级别的等级,
所依据的是它们的审核和访问控制能力。SQL Server 2000之后的版本都支持兼容C2。政 府机构和承包商可能必须使用这种模式。
C2审核所涉及的不仅仅是简单的服务器事件,如登录和注销,而是扩展至包含访问所
有语句和对象的成功和失败的尝试。如果您想标识出可能存在的违反安全的行为,这是很
有用的,但是可以想到,它也会消耗大量存储空间以及对性能有负面影响。在大容量环境
中,C2日志可能会比数据库本身大得多。
如果使用了 C2审核模式,日志文件用完了服务器的物理存储空间,那 SQL Server会 自行关闭来保持审核完整性。如果出现这种情况,那么要想重启SQLServer,只有释放额 外空间,或在启动服务器实例时使用-f标记禁用审核。 要启用C2审核模式,右 击 SSMS的对象资源管理器中的服务器实例,选 择 “属性”
命令,然后选择“安全性”页,再选择“启用C2审核跟踪”设置。要禁用C2审核跟踪,
取消选择“启用 C 2审核跟踪”复选框即可。在更改这一设置后,必须重启服务器实例,
这样设置才能生效。
也可以使用T-SQL启用或禁用C2审核跟踪,如下所示。

- - E n ab le c2 a u d it mode s p _ c o n fig u re * show ad v an ced o p tio n s *, 1
GO
RECONFIGURE
GO
sp一configure * c2 audit mode', 1 GO
RECONFIGURE
GO
- - Disable c2 audit mode sp_configure 'show advanced options,, 1 GO
RECONFIGURE
GO
sp_configure * 1 2 3 4 c2 audit mode、 0 GO
RECONFIGURE
GO


和 SMSS方法一样,在更改C2审核模式设置后,必须重启服务器实例,才能使设置
生效。
C 2 审核日志跟踪文件总是存储在服务器实例的数据目录中。可以使用SQL Server
Profiler或 sys.fn trace gettable系统函数阅读这塾文件。
10.3.4安全审核事件类别
SQL Profiler可以用来监视各种安全审核事件,比如成功和失败的登录尝试、新用户和 密码更改。当选择要包含进跟踪的事件时,可以在Security Audit部分看到这些事件。 安全审核事件使您可以有选择地监视和完整的C 2审核几乎同样的信息,但是在使用
SQL Profiler时,可以挑选确实想监视的内容并只在必要时进行监视。
试一试 使用SQL Server Profiler审核安全事件
要使用SQL Server Profiler审核安全事件,可以遵循下列步骤: (1) 启 动 SQL Server Profiler,使 用 “空白”模板创建一 个 新 的 名 为 SecurityAudit的跟
踪。在 “事件选择”选项卡的Security Audit部分选择下列事件:
• Audit Add DB User Event • Audit Add Member to DB Role Event • Audit Login Change Password Event • Audit Server Principal Management Event (2) 单 击 “组织列”按钮。找到 EventSubClass、TargetLoginName、TargetUserName> RoleName和 ObjectName列,将它们移动至列列表顶部并排在EventClass列之后,以便于
阅读结果。
(3) 单 击 “运行”按钮启动这一跟踪。
(4) 在 SQL Server Management Studio中打开•个新的查询窗口。输入并执行下列代码:

- - Create a new server login EXEC sp_addlogin ’Paul’, 'Microsoftl23•, *AdventureWorks2008*; GO
- - Exclude this login from OS policy constraints ALTER LOGIN Paul WITH CHECK_POLICY = OFF GO
- - change password EXEC sp_password @old = *Microsoftl23 *, @new =*Microsoft456 ’,Qloginame = • Paul * GO
- - Allow this user to access AdventureWorks2008 USE AdventureWorks2008 GO
CREATE USER Paul FOR LOGIN Paul GO
EXEC sp addrolemember N'db owner1, 'Paul * GO
- - Clean up DROP USER Paul GO
EXEC sp_droplogin * Paul *; GO


在该查询完成后,停止跟踪并检査结果。可注意到,所选的每个安全相关事件都被记
录下来。输出结果类似于图10-21所示。

监控文件操作 监控文档一般存在哪里_SQL_12

同样,如果保存了跟踪文件,可使用sys.fn_trace_gettable系统函数以表的形式査看跟 踪数据。

10.3.5 SQL 跟踪
SQL跟踪提供了使用SQL Server Profiler捕获事件的另外一种方式。通过SQL跟踪,
可以使用T-SQL系统存储过程定义跟踪。这对于想开发自己的自定义审核解决方案的组织
来说特别有用。
创建SQL跟踪的基本步骤如下所示:
(1) 使 用 sp_trace_create存储过程创建一个跟踪。
(2) 使用sp_traCe_SeteVent存储过程添加想包含的事件。在添加事件时,必须为想包含 进跟踪中的每个事件和列组合执行一次该存储过程。SQL Server联机从书提供了事件和列 ID号的完整列表。
(3) 如果有需要,可以使用sp_traCe_SetfUte r 存储过程为捕获的事件定义一个筛选器。 创建好跟踪后,可以使用sp_traCe_setstatus存储过程启动、停止和关闭它。 下列代码将创建和启动一个“安_全审核事件类别” 一节所包含的SQL Server Profiler 示例等效的跟踪。这个跟踪将一直运行,直到使用sp_trace_setstatus存储过程停止它或者 服务器实例重启。

- - Create a new trace Declare @id int exec sp一trace_create @id output, 0, N 1C :\ProfilerTraces\SecurityAudit select @id *traceid* -- Display the trace id
- - Add some events Declare @0n bit SET @0n=l - - Event 109 = Audit Add DB User Event exec sp_trace_ setevent @id. 109, 21, @0n -- EventSubClass
exec sp_trace_ setevent @id, 109, 42, @0n -- TargetLoginName exec s p t r a c e setevent @id. 109, 39, @0n -一 TargetUserName exec s p t r a c e setevent @id. 109, 38, @0n -- RoleName
exec sp_trace_ setevent @id. 109, 34, @0n —- ObjectName - - Event 104 ==Audit Add Login Event exec sp_trace setevent @id. 104, 21, @0n -- EventSubClass
exec sp trace setevent 6idr 104, 42r @Qn -- TargetLoginName
exec sp_trace setevent @id, 104, 39, @0n -- TargetUserName exec sp_trace_ setevent @id, 104, 38, @0n -- RoleName exec sp_trace_ setevent @id. 104, 34; @0n -- ObjectName - - Event 110 :=Audit Add Member to DB Role Event
exec sp_trace setevent @id, 110, 21, @0n -- EventSubClass exec sp__trace_ setevent @idr 110, 42, @0n -一 TargetLoginName
exec sp_trace setevent @id, 110, 39, @On -- TargetUserName exec sp_trace setevent @id. 110, 38, @On -- RoleName exec sp_trace setevent @id. 110, 34r @0n -- ObjectName- - Event 107 = Audit Login Change Password Event exec sp_ trace setevent @id, 107r 21, 0On --, EventSubClass exec sp_ trace setevent @id, 107, 42, @0n --■ TargetLoginName exec sp_•trace*•setevent 107, 39, @0n --• TargetUserName exec sp_ trace setevent 107, 38, @0n --• RoleName exec sp_ trace_ setevent @id, 107, 34, @0n --• ObjectName
- - Start the trace exec sp trace_setstatus @traceid=@id, @status=l -一 Starts the trace GO


下列代码将停止和关闭跟踪。要确保替换了启动跟踪时所返回的跟踪ID。

—— Stop and close the trace Declare @id int SET @id=3 —— enter the value recorded above
exec sp_trace_setstat-us @traceid=@id, @status=0 -- Stops the trace exec sp_trace_setstatus @traceid=@id, @status=2 Closes the trace 
GO