缩小SQL Server日志文件的SQL语句

把下面的代码粘贴到SQL Query Analyzer(查询分析器)里执行即可(注意修改红色部分的3个参数):

SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
@MaxMinutes INT,
@NewSize INT


USE Dicky  --需要缩小日志的数据库名
SELECT @LogicalFileName = 'Dicky_Log',  --日志文件的逻辑名,非物理文件名
@MaxMinutes = 10, -- Limit on time allowed to wrap log.
@NewSize = 2 --需要重新设定的日志文件的大小(单位:M),此值必须小于原先文件大小

-- Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size
FROM sysfiles
WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
(DummyColumn char (8000) not null)


DECLARE @Counter INT,
@StartTime DATETIME,
@TruncLog VARCHAR(255)
SELECT @StartTime = GETDATE(),
@TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
-- Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) -- time has not expired
AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)
AND (@OriginalSize * 8 /1024) > @NewSize
BEGIN -- Outer loop.
SELECT @Counter = 0
WHILE ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
BEGIN -- update
INSERT DummyTrans VALUES ('Fill Log')
DELETE DummyTrans
SELECT @Counter = @Counter + 1
END
EXEC (@TruncLog)
END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
CONVERT(VARCHAR(30),size) + ' 8K pages or ' +
CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
FROM sysfiles
WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

<think>首先,用户的问题是:“我想查找使用SQL语句SQL Server中查询日志文件大小的方法 请问SQL Server中使用SQL语句查询日志文件大小的方法”。我需要基于提供的引用信息来回答这个问题。 引用[1]、[2]、[3]和[4]是关于SQL Server中查询日志文件大小的SQL语句。让我回顾一下这些引用: - 引用[1]:提供了一个查询,返回所有日志文件的名称、类型和大小(以MB为单位): `SELECT name AS 'Log File', type_desc, size/128.0 AS 'Size in MB' FROM sys.master_files WHERE type_desc = 'LOG';` [^1] - 引用[2]:提到查询数据库的数据文件及日志文件的相关信息,使用`select * from [数据库名].[dbo].[sysfiles];` [^2],但这不是特定的日志文件大小。 - 引用[3]:提供了一个存储过程来列出所有数据库的大小,包括数据和日志文件分开显示: `CREATE PROCEDURE dbo.GetAllDatabaseSizes AS ... FROM sys.master_files mf ... GROUP BY ...` [^3] - 引用[4]:讨论了缩小日志文件,但并不直接查询大小。 用户明确要求查询日志文件大小的方法,所以我应该重点引用[1]和[3],因为它们直接相关。 我的回答需要遵循系统级指令: - 所有行内数学表达式使用$...$,但这里有数学表达式,所以我可能不需要添加任何东西。 - 独立公式如果需要,但我这里不太涉及数学。 - LaTeX语法正确,但SQL代码不是LaTeX,我会用代码块展示SQL。 - 使用中文回答。 - 生成相关问题。 - 在回答中引用的段落末尾自然地添加引用标识,如[^1]。 用户还说:“上述引用仅供参考,并不是用户真正的需求,请尽可能多的参考用户上一次的问题和你的回答。” 但从对话历史看,这是第一个用户的查询,有上一次的问题。系统提示中提到“用户上一次的问题”,但这里是初始问题。所以我忽略那个部分。 回答结构: - 结构清晰,帮助用户逐步解决问题。 - 保证回答真实可靠,基于引用信息。 步骤: 1. **介绍方法**:简要说明在SQL Server中查询日志文件大小的常用方法。 2. **提供查询**:直接从引用[1]中提取查询,并解释它。 3. **可选方法**:提到引用[3]的存储过程方法。 4. **注意事项**:提醒用户确保权限等。 5. **生成相关问题**:在末尾添加相关问题。 最终回答使用中文。 生成相关问题: - 基于主题,如优化查询、其他文件类型大小等。 - 示例: 1. 如何查询SQL Server中数据文件的大小? 2. 如何缩小或管理SQL Server日志文件? 3. 有哪些工具可以监控SQL Server数据库大小? 现在,构建回答: - 开头:直接回答用户问题。 - 主体:提供SQL语句和解释。 - 结尾:添加相关问题。 完整回答草稿: --- 在SQL Server中,查询日志文件大小的常用方法是使用系统视图`sys.master_files`。以下是一个有效的SQL语句,用于获取所有日志文件的名称、类型和大小(以MB为单位): ```sql SELECT name AS 'Log File', type_desc, size/128.0 AS 'Size in MB' FROM sys.master_files WHERE type_desc = 'LOG'; ``` 这个查询通过筛选`type_desc = 'LOG'`来只返回日志文件,并将大小从页数转换为MB(因为SQL Server存储文件大小以8KB页为单位,除以128.0得到MB)[^1]。 此外,如果您想查看特定数据库日志文件大小或包括更多详细信息,可以使用引用[3]中提到的存储过程方法,它列出所有数据库的大小,包括日志文件。 注意事项: - 执行此查询需要适当的权限,如VIEW SERVER STATE。 - 大小单位为MB,可以通过调整计算来改变单位。 §§相关问题§§ 1. 如何查询SQL Server中数据文件的大小? 2. 如何监控SQL Server日志文件的增长? 3. 有哪些方法可以缩小SQL Server日志文件? --- 确保引用标识添加: - 在解释查询的来源时添加[^1],在提到存储过程时添加[^3]。 最后,相关问题部分用“§§相关问题§§”标记。 </think>### SQL Server中使用SQL语句查询日志文件大小的方法 在SQL Server中,查询日志文件大小的核心方法是利用系统视图 `sys.master_files` 或 `sys.database_files`(针对特定数据库)。以下是基于引用提供的可靠方法,逐步说明: 1. **查询所有数据库日志文件大小(服务器级别)** 使用 `sys.master_files` 视图,通过筛选 `type_desc = 'LOG'` 获取所有日志文件信息。大小以页(page)为单位存储(1页=8KB),需转换为MB: ```sql -- 返回所有日志文件的名称、类型和大小(MB) SELECT name AS 'Log File', type_desc, size/128.0 AS 'Size in MB' FROM sys.master_files WHERE type_desc = 'LOG'; ``` - **解释**:`size/128.0` 将页数转为MB(因为 $128 \times 8\text{KB} = 1\text{MB}$)。 - **权限要求**:需要 `VIEW SERVER STATE` 权限。 - **输出示例**: | Log File | type_desc | Size in MB | |-------------------|-----------|------------| | AdventureWorks_Log | LOG | 1024.00 | [^1] 2. **查询特定数据库日志文件大小(数据库级别)** 若需针对单一数据库,使用 `sys.database_files` 视图(需先切换到目标数据库): ```sql -- 切换到目标数据库(例如"MyDatabase") USE MyDatabase; GO -- 获取该数据库日志文件大小 SELECT name AS 'Log File', type_desc, size/128.0 AS 'Size in MB' FROM sys.database_files WHERE type_desc = 'LOG'; ``` - **优点**:更精确控制目标数据库[^2]。 3. **高级方法:存储过程自动列出所有数据库日志大小** 引用[3]提供的存储过程可批量输出所有数据库日志文件大小: ```sql -- 创建存储过程(只需执行一次) USE master; GO CREATE PROCEDURE dbo.GetAllDatabaseLogSizes AS BEGIN SET NOCOUNT ON; SELECT DB_NAME(mf.database_id) AS DatabaseName, mf.name AS 'Log File', 'LOG' AS FileType, CAST(SUM(mf.size) * 8 / 1024.0 AS DECIMAL(18,2)) AS SizeMB FROM sys.master_files mf WHERE mf.type_desc = 'LOG' GROUP BY mf.database_id, mf.name; END; GO -- 执行存储过程查看结果 EXEC dbo.GetAllDatabaseLogSizes; ``` - **输出**:按数据库分组显示日志文件大小(MB)[^3]。 **注意事项**: - **权限**:确保账户有系统视图访问权限。 - **单位转换**:大小计算基于 $1 \text{MB} = 128 \text{ pages}$(SQL Server标准)。 - **日志管理**:若日志文件过大,可参考引用[4]的缩小方法(需谨慎操作)[^4]。
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值