董晓涛(David Dong)

博客园 首页 新随笔 联系 订阅 管理
 

SQL SERVER资料之二:数据库执行管理任务

 

这是我初学时候的笔记,帖出来抛砖引玉!

为了简化数据库和系统维护,用户可以对管理任务做自动化处理。本单元提供了关于执行配置和常规管理任务的详细信息,以及如何通过创建作业,操作员和警报来实现任务自动化;
1
 配置任务:
为了使得SQL Server Agent能够执行作业并发出警报,那么它必须天候运行,并且配置让它意外停止时重新启动。为了它实现实现邮件的收发,也使它能够访问网络资源,我们要把它配置为域用户帐户!
SQL SERVER
通过两种服务来收发邮件,SQL SERVER使用自己的SQL MAIL处理邮件,它由许多扩展的存储过程组成,利用这些存储过程,我们可以接收邮件!SQL SERVER AGENT 使用自己的配置文件收发邮件,使用它我们可以在警报被触发时或者调度任务成功或者是失败时发送电子邮件或者是网络传送命令!我们后面将有一个实验就是实现这个!
为了实现SQL SERVER向其它的OLE DB数据源发送命令,我们可以使用链接服务器!
配置SQL SERVER与其它服务共享内存资源,如最小内存量,最大内存量,对它们进行配置过之后要进行监视!下面我们用SQL MailSQL Agent Mail来实现邮件的发送,我们利用outlook来接收邮件!

实验1:利用SQL MAIL来发送来发送邮件
1
 首先,2 我们用SQL Server的服3 务帐号(sqlservice)登录服4 务器。安装Outlook并设置配置信息(这将产生一个配置文件,5 SQL Mail将通过此配置文件与邮件系统连接。设置方法参见本书前面的内容)。启动Outlook并对邮件的收发进行测试。确认无误后,6 退出登录,7 重新以管理员帐号登录服8 务器。
9
  启动Enterprise Manager10 找到要进行SQL Mail设置的服11 务器并打开其Support Services容器。右击其下的SQL Mail对象,12 从弹出的快捷菜单中选择Properties选项。就会弹出SQL Mail属性对话框,13 Profile name下拉列表框中选择我们在前一步建立的邮件配置文件。点击Test按钮来对此设置进行测试。如果测试成功,14 会出现一个提示SQL Mail设置成功的对话框。如果存在问题,15 则需要重新执行前面的步骤。直到测试成功
16
 通过SQL Mail发送邮件
    SQL Mail
会在两种情况之下发送邮件。一种是当系统发生警报时间时,会向预先为警报定义的操作员发送警报信息邮件(我们将在下一节中对此问题做详细的讨论)。另一种是通过扩展存贮过程xp_sendmail来发送邮件。如果我们想要在SQL Server应用中完成发送邮件功能的话,就需要使用此存贮过程。它的语法结构如下:
    master..xp_sendmail @recipients ='David@dongxiaotao.com',
    @message = 'this is a test' ,
 @query='select * from employee'  ,
    @subject = 'test' ,
  @attach_results = 'false',
@set_user ='dbo',
    @dbuse = 'pubs'
    
其中各参数的含义分别如下:
    recipients:为邮件指定的接收人,可以同时将邮件发给多个用户。各用户的邮件地址用分号分割。此参数必须指定,而其他参数都为可选参数。
    message:邮件中的信息,其最长不得超过7990字节。
    query:一段SQL语句,其结果集将附在邮件之中。它的长度不得超过8000字节。
    copy_recipients:用来指定此邮件抄送到哪些用户。即我们在邮件程序中常见的CC to:功能。
    subject:邮件的标题。如果不指明,默认为"SQL Server Message"
    attach_results:指明是否将SQL语句的执行结果作为一个附件进行发送。其取值为TRUEFALSE。默认值为FALSE
    set_user:指明执行SQL语句的用户,默认为guest。此参数所指定的用户应该在master数据库中存在。
 dbuse:指 SQL语句在哪个数据库上执行, 默认为set_user 定的用户的省缺数据库。
4.
打开outlook 现在我们通过它接收david的所有邮件,会看到一个新邮件!
实验2.利用SQL SERVER AGENT发送邮件。SQL Server 使用两种服务处理邮件。MSSQLServer 处理所有邮件存储过程的邮件。SQLServerAgent 并不用 SQL 邮件发送电子邮件。而是使用自己的与 SQL 邮件分开配置和操作的邮件功能。
1
 展开企业管理器-管理-代理--属性,2 现在我们要把SQLServerAgent的启动帐号设为我们的邮件配置帐户,3 重启之后,4 我们就可以为使用SQLServerAgnet来发送邮件!
5
  新建一个操作员,6 为它的电子邮件名7 称中输入一个邮件帐号,8 点测试!
9
 outlook中接收到用户的邮件,10 就可以收到一封邮件!
.SQL SERVER常规管理任务:数据库管理员主要的职责就是维护SQL SERVER及其数据库,其中包括已规划的任务,如备份数据库,导入/志出数据等;还包括识别并响应潜在的故障,如监视数据库和日志空间,监视性能等,这个就要用到我们下面讲的警报!
      
常规管理任务:当我们创建作业的时候,我们要验证我们有权限执行作业,因为作业中可以包括T-SQL作业,OS命令作业,脚本作业和复制作业,我们一定要确认我们有权限执行这些作业。为了让作业正常运行,必须启用作业!为了让作业自动执行,我们可以为它创建调度,让它在启动SQL SERVER AGENT的时候启动,空闲的时候启动,按循环启动或者是特定时间启动。我们也可以为一个作业创建多个调度,也就是多重调度!
        
为了实现作业出现错误或者是成功的时候进行通知,我们还必须创建操作员,当我们创建操作员的时候,我们应该测试每种通知操作员的方法,确保用户能够收到!我们还要为他们指定工作调度,如果通知和工作调度相冲突,知道将失败!
        SQL Server Agent
能够捕获全部的作业活动,为将它们存储在系统表sysjobhistory中,我们可以利用企业管理器查看单个作业历史记录,这个我们只要在作业上右键-查看历史纪录就作业历史信息,包括作业的创建时间,成败,持续时间和错误消息等;此外我们也可以配置作业的历史尺寸,默认情况下,最大尺寸为1000行,每个作业最大尺寸为100行,当作业达到最大尺寸的时候,系统表sysjobhistory将按照先进先出的方法删除相关行!    
实验3:创建作业和操作员
1
 创建操作员:在企业管理器中展开企业管理器-管理-SQL SERVER AGNET-OPERATOR-NEW OPERATOR,创建一个操作员David,邮件为David@dongxiaotao.com,网络发送地址为create2 并测试它们,3 我们现在可以收到一条net send信息,4 打开outlook5 可以收到帐户David的一封新邮件!(注意这儿发送邮件用的是SQLAGNETMAIL6 )
7
 创建作业:企业管理器-TOOL-Wizard--Management-Create Job Wizard,利用语句执行备8 份操作(backup database pubs to disk='d:\pubs.bak' with init)9 调度作业并通知操作员,10 我们一定要保证操作员中启用的!
11
 我们利用企业管理器作业中右键我们刚才新建的作业-启动运行,12 我们会收到一条消息,13 打开outlook,我们接收david邮件,14 会收到一新邮件,15 它们都是提示作业成功的。
16
 我们现在把pubs脱机,17 启动作业,18 我们也会像上面一样收到消息和邮件,19 但是消息说作业失败!(当然我们也能够配置让成功时发送电子邮件,20 失败时发送网络消息)
 
创建警报:通过创建响应SQL SREVER错误,用户自定义错误或是SQL SERVER性能条件等的警报,SQL SERVER允许用户响应潜在故障。警报能够响应已写到WINDOWS应用程序日志中的SQL SERVER错误或是自定义错误!其实它的处理过程很简单,就是当SQL Agent Mail起到的时候,就会向Windows事件查看器注册,怎样理解这个注册呢,可以这样想,就想SQL Server AgentEvent Log说,我是你的人,以后有什么关于我的消息给说一声,就这样当消息写入事件日志的时候就会通知SQL Server Agent说,注意了,老兄,你那儿有问题了,于是SQL Server Agent就把Event Log中的错误号与系统表sysalerts相比较;并检查系统表sysoperators来发送作业通知和查看sysnotifications来发送电子邮件!从上面的处理过程可以看出只有写到WINDOWS事件日志的消息才能引发警报!
我们可以利用错误严重级别定义错误,也可以利用错误号定义错误,但是一个给定事件只能够触发一个事件,SQL  Server Agent只触发最确切定义的警报!如果用户为数据库的错误(严重级别为17)创建警报,此外还为错误号9002(严重级别为17)创建了警报,那么错误9002将只触发将只触发为其指定的警报!
利用错误严重级别来定义警报:

---董晓涛


利用错误号定义警报: 
实验4.创建警报:我们能够利用创建警报向导来创建警报,也可以创建用户自定义错误消息的警报!
1. 
利用创建警报向导来创建警报.tool-wizard-management
2. 
创建用户自定义错误消息的警报。我们首先创建用户自定义错误消息,3. 4. 务器-右键-所有任务-管理SQL SERVER消息。消息号为500015. 严重级别为0106. 选择始终写入WINDOWS事务日志,7. 消息定义为“The units in stock for %s has reached %d.please recorder!”
8. 
新建一警报,9. 当上面的错误发生时向用户David发送邮件和网络传送命令!警报名10. 称为recorder inventory,错误号为50001,数据库为northwind,通知操作员David!
4
,在查询分析器中执行下面的代码:
/*
** Lab 5, Reorder.sql
** Stored procedure to test user-defined error
** message 50001 to set reorder inventory levels. 
*/

USE Northwind
GO

IF OBJECT_ID('dbo.ReOrder') IS NOT NULL --If the object already exists, drop it
   DROP PROCEDURE dbo.ReOrder
GO

CREATE PROC ReOrder @prodid int = null
AS

IF @prodid IS NULL
   BEGIN
      PRINT 'Enter a product #. For example: reorder 2'
      RETURN
   END

IF @prodid > (SELECT MAX(ProductID) FROM Products)
   BEGIN
      PRINT 'You must enter a valid product #'
      RETURN
   END

DECLARE @prodname nvarchar(40)
SET @prodname = 
   (SELECT ProductName FROM Products 
    WHERE ProductID = @prodid)

DECLARE @unitsinstock smallint
SET @unitsinstock = 
   (SELECT ReorderLevel FROM Products 
    WHERE ProductID = @prodid)

UPDATE Products
SET UnitsInStock = @unitsinstock
WHERE ProductID = @prodid

RAISERROR (50001, 10, 1, @prodname, @unitsinstock)
再执行:
use Northwind
exec ReOrder
@prodid=2


利用错误号定义警报: 
实验4.创建警报:我们能够利用创建警报向导来创建警报,也可以创建用户自定义错误消息的警报!
1. 
利用创建警报向导来创建警报.tool-wizard-management
2. 
创建用户自定义错误消息的警报。我们首先创建用户自定义错误消息,3. 4. 务器-右键-所有任务-管理SQL SERVER消息。消息号为500015. 严重级别为0106. 选择始终写入WINDOWS事务日志,7. 消息定义为“The units in stock for %s has reached %d.please recorder!”
8. 
新建一警报,9. 当上面的错误发生时向用户David发送邮件和网络传送命令!警报名10. 称为recorder inventory,错误号为50001,数据库为northwind,通知操作员David!
4
,在查询分析器中执行下面的代码:
/*
** Lab 5, Reorder.sql
** Stored procedure to test user-defined error
** message 50001 to set reorder inventory levels. 
*/

USE Northwind
GO

IF OBJECT_ID('dbo.ReOrder') IS NOT NULL --If the object already exists, drop it
   DROP PROCEDURE dbo.ReOrder
GO

CREATE PROC ReOrder @prodid int = null
AS

IF @prodid IS NULL
   BEGIN
      PRINT 'Enter a product #. For example: reorder 2'
      RETURN
   END

IF @prodid > (SELECT MAX(ProductID) FROM Products)
   BEGIN
      PRINT 'You must enter a valid product #'
      RETURN
   END

DECLARE @prodname nvarchar(40)
SET @prodname = 
   (SELECT ProductName FROM Products 
    WHERE ProductID = @prodid)

DECLARE @unitsinstock smallint
SET @unitsinstock = 
   (SELECT ReorderLevel FROM Products 
    WHERE ProductID = @prodid)

UPDATE Products
SET UnitsInStock = @unitsinstock
WHERE ProductID = @prodid

RAISERROR (50001, 10, 1, @prodname, @unitsinstock)
再执行:
use Northwind
exec ReOrder
@prodid=2

posted on 2004-11-26 11:29  董晓涛  阅读(918)  评论(1编辑  收藏  举报