如何安全的删除SQL-SERVER中的日志文件中的信息?(50分)

  • 主题发起人 主题发起人 hzzkf
  • 开始时间 开始时间
H

hzzkf

Unregistered / Unconfirmed
GUEST, unregistred user!
我的系统使用SQL-SERVER数据库,现在主数据库文件达到2G多,日志文件已达到8G之多。
服务器空间快不够了,有没有什么办法安全删除日志文件或其中的信息呢?谢谢
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1114770
 

返回社区 订阅杂志 欢迎投稿 关于杂志 联系我们 以前杂志

用户名: 密码:


回首页


截断并收缩事务日志,并且建立包含完全备份和事务日志备份的简单维护计划
作者:怡红公子(lucky@dev-club.com) 2002年5月



内容

前言
关于代码的说明
源代码
参考资料
关于作者


前言
  在数据库探讨中最常出现的问题之一就是,“我的日志文件增长到若干GB了,怎么缩小它呢?”在精华区里已经有好几种解决方案了,但是这都是治标的方法,如何标本兼治呢?这里提供一段缩小日志文件并且建立一个简单的备份计划的代码,供大家参考。


关于代码的说明
  因为代码中已经包括了详细的注释和使用方法,所以我们直接给出源码,并请各位网友在使用之前仔细阅读其注释,并理解程序的原理,作者不对因为错误使用本程序而来的后果负责。




源代码


/*****************************************************************************
* 用途:截断并收缩事务日志,并且建立包含完全备份和事务日志备份的简单维护计划
* 作者: 怡红公子@Dev-Club(开发者俱乐部) http://www.dev-club.com
* 使用环境:Microsoft SQL Server 2000 ,并且要处理的库只包含一个日志文件
* 注意事项: 1、使用前请仔细阅读本注意事项,并注意修改第17行和第25行的数据
* 库名称,第18行的事务日志预计要收缩的大小
* 2、可以对本代码进行复制,但请注意复制时不得修改原文,复制内容
* 须包含所有内容
* 3、本代码可以用于商业及其它用途,但不得以赢利为目的对本代码进
* 行传播,尤其是在传统媒体上刊登
* 4、本人不对此代码可能引起的对系统的破坏或者数据的损失承担任何
* 责任,执行此代码意味着你愿意承担任何风险
* 5、本人不对此代码提供任何技术支持,阅读注释并查阅Books Online,
* 你可以得到你所需要的全部信息
* 6、对本代码有任何建议或修改意见,请到开发者俱乐部
* (http://www.dev-club.com)的数据库探讨版面发言
*****************************************************************************/
DECLARE @DBName SYSNAME, @LogFileID SMALLINT, @TagLogSize SMALLINT
DECLARE @PlanID UNIQUEIDENTIFIER, @iResult INT
DECLARE @PlanName VARCHAR(128)
DECLARE @JobID1 BINARY(16), @JobID2 BINARY(16)
DECLARE @JobName SYSNAME, @JobCommand NVARCHAR(3200)
SET @DBName = 'devclub'
SET @TagLogSize = 256 --单位为兆字节

/*****************************************************************************
*截断并收缩日志
******************************************************************************/

--请注意修改下一行的数据库名称
USE devclub

--截断日志
BACKUP LOG @DBName WITH NO_LOG
--得到日志文件的FileID
IF (SELECT COUNT(*) FROM sysfiles WHERE status &amp; 0x40 = 0x40) <> 1
BEGIN
PRINT '日志文件的数目不对'
RETURN
END
ELSE
SELECT @LogFileID = fileid FROM sysfiles WHERE status &amp; 0x40 = 0x40
--收缩日志文件到指定大小
EXECUTE ('DBCC SHRINKFILE (' + @LogFileID + ', ' + @TagLogSize + ')')


USE msdb

SET @PlanName = @DBName + ' Maintenance Plan'

/*****************************************************************************
*建立维护计划
******************************************************************************/

--建立维护计划
EXECUTE @iResult = sp_add_maintenance_plan @PlanName, @PlanID OUTPUT
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能建立维护计划'
RETURN
END

--将数据库关联到维护计划
EXECUTE @iResult = sp_add_maintenance_plan_db @PlanID, @DBName
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能把数据库关联到维护计划'
RETURN
END

/*****************************************************************************
*建立完全备份作业
******************************************************************************/
SET @JobName = @PlanName + N'的完全备份作业'
/* Command的意义
* 备份日志到磁盘的默认备份目录下并校验,删除早于1周的备份文件,扩展名为BAK
* 若欲修改,请仔细阅读Books Online中关于sqlmaint 实用工具的语法说明*/
SET @JobCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + CONVERT(VARCHAR(40), @PlanID) +
' -VrfyBackup -BkUpMedia DISK -BkUpDB -UseDefDir -DelBkUps 1WEEKS -BkExt "BAK"'''

-- 添加作业
EXECUTE @iResult = sp_add_job @job_id = @JobID1 OUTPUT ,
@job_name = @JobName,
@owner_login_name = N'sa',
@description = N'No description available.',
@category_name = NULL,
@enabled = 1,
@notify_level_email = 0,
@notify_level_page = 0,
@notify_level_netsend = 0,
@notify_level_eventlog = 2,
@delete_level= 0
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能建立完全备份的作业'
RETURN
END

-- 添加作业步骤
EXECUTE @iResult = sp_add_jobstep @job_id = @JobID1,
@step_id = 1,
@step_name = N'第 1 步',
@command = @JobCommand,
@database_name = N'master',
@server = N'',
@database_user_name = N'',
@subsystem = N'TSQL',
@cmdexec_success_code = 0,
@flags = 4,
@retry_attempts = 0,
@retry_interval = 0,
@output_file_name = N'',
@on_success_step_id = 0,
@on_success_action = 1,
@on_fail_step_id = 0,
@on_fail_action = 2
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能建立完全备份的作业步骤'
RETURN
END

EXECUTE @iResult = sp_update_job @job_id = @JobID1, @start_step_id = 1
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加完全备份的作业步骤'
RETURN
END

-- 添加作业调度,每天一次,2:17分开始,懒得写成变量了,如果要改自己改@active_start_time
-- 如果要改周期,请仔细阅读Books Online中sp_add_jobschedule的说明后修改@freq开头的几个参数
EXECUTE @iResult = sp_add_jobschedule @job_id = @JobID1,
@name = N'第 1 调度',
@enabled = 1, @freq_type = 4,
@active_start_date = 20000101,
@active_start_time = 21700, @freq_interval = 1,
@freq_subday_type = 1, @freq_subday_interval = 0,
@freq_relative_interval = 0, @freq_recurrence_factor = 0,
@active_end_date = 99991231, @active_end_time = 235959
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加完全备份的作业调度'
RETURN
END

-- 添加目标服务器
EXECUTE @iResult = sp_add_jobserver @job_id = @JobID1, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加完全备份的目标服务器'
RETURN
END

--把作业关联到维护计划
EXECUTE @iResult = sp_add_maintenance_plan_job @PlanID, @JobID1
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能把完全备份的作业关联到维护计划'
RETURN
END

/****************************************************************************
*建立事务日志备份作业
*****************************************************************************/
SET @JobName = @PlanName + N'的事务日志备份作业'
/* Command的意义
* 备份日志到磁盘的默认备份目录下与库同名的目录并校验,删除早于4天的备份文件,扩展名为TRN
* 若欲修改,请仔细阅读Books Online中关于sqlmaint 实用工具的语法说明*/
SET @JobCommand = N'EXECUTE master.dbo.xp_sqlmaint N''-PlanID ' + CONVERT(VARCHAR(40), @PlanID) +
' -VrfyBackup -BkUpMedia DISK -BkUpLog -UseDefDir -DelBkUps 4DAYS -CrBkSubDir -BkExt "TRN"'''

-- 添加作业
EXECUTE @iResult = sp_add_job @job_id = @JobID2 OUTPUT ,
@job_name = @JobName,
@owner_login_name = N'sa',
@description = N'No description available.',
@category_name = NULL,
@enabled = 1,
@notify_level_email = 0,
@notify_level_page = 0,
@notify_level_netsend = 0,
@notify_level_eventlog = 2,
@delete_level= 0
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能建立事务日志备份的作业'
RETURN
END

-- 添加作业步骤
EXECUTE @iResult = sp_add_jobstep @job_id = @JobID2,
@step_id = 1,
@step_name = N'第 1 步',
@command = @JobCommand,
@database_name = N'master',
@server = N'',
@database_user_name = N'',
@subsystem = N'TSQL',
@cmdexec_success_code = 0,
@flags = 4,
@retry_attempts = 0,
@retry_interval = 0,
@output_file_name = N'',
@on_success_step_id = 0,
@on_success_action = 1,
@on_fail_step_id = 0,
@on_fail_action = 2
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能建立事务日志备份的作业步骤'
RETURN
END

EXECUTE @iResult = sp_update_job @job_id = @JobID2, @start_step_id = 1
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加事务日志备份的作业步骤'
RETURN
END

-- 添加作业调度,每小时一次,32分开始,懒得写成变量了,如果要改自己改@active_start_time
-- 如果要改周期,请仔细阅读Books Online中sp_add_jobschedule的说明后修改@freq开头的几个参数
EXECUTE @iResult = sp_add_jobschedule @job_id = @JobID2,
@name = N'第 1 调度', @enabled = 1, @freq_type = 4,
@active_start_date = 20000101, @active_start_time = 3200,
@freq_interval = 1, @freq_subday_type = 8,
@freq_subday_interval = 1, @freq_relative_interval = 0,
@freq_recurrence_factor = 0, @active_end_date = 99991231, @active_end_time = 235959
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加事务日志备份的作业调度'
RETURN
END

-- 添加目标服务器
EXECUTE @iResult = sp_add_jobserver @job_id = @JobID2, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能添加事务日志备份的目标服务器'
RETURN
END

--把作业关联到维护计划
EXECUTE @iResult = sp_add_maintenance_plan_job @PlanID, @JobID2
IF (@@ERROR <> 0 OR @iResult <> 0)
BEGIN
PRINT '不能把事务日志备份的作业关联到维护计划'
RETURN
END

PRINT '代码已成功执行,感谢您使用本代码'





参考资源
  SQL Server Book Online。


关于作者
  怡红公子,ChinaASP创始人之一。MSSQL专家,开发了国内最大的Microsoft SQL Server应用。您可以通过lucky@dev-club.com与他联系。






开发者俱乐部 2002 by Dev-club.com



 
1.在数据库的属性里限制日志的最大空间。
2.数据库的日志是和备份配合使用,用来恢复数据库的,是必要的。
你最好从备份策略入手,确定一个数据库备份恢复方案。
删除日志语句:
backup log database with truncate_only
backup log database with no_log


 
后退
顶部