SQL Server中怎么查看每个数据库的日志大小,以及怎么确定数据库的日志文件,怎么用语句收缩日志文件
一,找到每个数据库的日志文件大小
SQL Server:查看SQL日志文件大小命令:dbcc sqlperf(logspace)
DBA 日常管理工作中,很重要一项工作就是监视数据库文件大小,及日志文件大小。如果你管理数据库的有很多的话,每天一个一个数据库的去查看文件大小就太费神了,那就写个SQL脚本吧,放到 SQL Agent 中,每天自动去查看各个数据库文件及日志文件的大小,然后再通过数据库邮件,Email 到我们手中,岂不快哉!当然,可以把每天的记录存放到数据库中去,这样数据库及日志文件的增长趋势,我们也就一目了然了。
这里,介绍下获取数据库日志文件大小的方法。其实很简单,就是执行 SQL Server DBCC 命令:dbcc sqlperf(logspace)

dbcc sqlperf(logspace) 可以获取实例中每个数据库日志文件大小,及使用情况。如果要保存SQL日志文件大小,则需要先创建一个数据表,然后动态执行dbcc sqlperf(logspace)命令:
--创建数据库日志文件信息表
CREATE TABLE [Control].[DatabaseLogSize](
[dbname] [nvarchar](100) NULL,
[dbid] [int] NULL,
[log_logical_name] [nvarchar](100) NULL,
[logsize] [decimal](30, 2) NULL,
[logused] [decimal](30, 2) NULL,
[status] [int] NULL
) ON [PRIMARY]
GO --借助dbcc sqlperf(logspace)将数据插入上面新建的表
INSERT INTO [Control].[DatabaseLogSize]([dbname],[logsize],[logused],[status])
EXECUTE('dbcc sqlperf(logspace)')
之后我们在表[DatabaseLogSize]中就有了 [dbname]、[logsize]、[logused]、[status]四列数据了
二、将每个数据库的日志文件逻辑名找出来
因为后面我们要使用DBCC SHRINKFILE命令执行日志收缩,这个命令必须提供数据库日志文件的逻辑名,所以现在我们要想办法将[DatabaseLogSize]表中的[log_logical_name]这一列值填上去,要找到数据库文件的日志逻辑名,首先要找到数据库的dbid。我们可以使用下面的语句找到[DatabaseLogSize]表中每个数据库的dbid:
SELECT dbid,name
FROM master..sysdatabases
WHERE
[name] IN (SELECT [dbname] FROM [Control].[DatabaseLogSize])

使用Update语句更新[DatabaseLogSize]表的[dbid]列即可:
UPDATE [Control].[DatabaseLogSize]
SET
[dbid]=T_DB_ID.[dbid]
FROM
[Control].[DatabaseLogSize]
INNER JOIN
(
SELECT [dbid],[name]
FROM master..sysdatabases
) AS T_DB_ID
ON [DatabaseLogSize].[dbname]=T_DB_ID.[name]
这样[DatabaseLogSize]表的[dbid]列就有值了:

接下来我们可以通过下面的语句根据每个数据库的dbid来找到每个数据库日志文件的逻辑名称,在本例中因为我们的每个数据库只有一个日志文件所以每个数据库只会找到一个日志文件逻辑名,如果你的情况是有数据库有多个日志文件,那么有些数据库就会找出多个日志文件逻辑名。
SELECT name,database_id
FROM sys.master_files
WHERE
database_id IN (SELECT [dbid] FROM [Control].[DatabaseLogSize])
AND
type = 1--这里的1表示我们要找的是.ldf日志文件,如果你要找的是.mdf数据库文件将这里改为0即可

这里补充一个知识点:SQL Server中一个数据库虽然可以通过创建多个数据文件组(FileGroup)来存放不同的.mdf和.ndf数据文件,但是日志文件组一个数据库有且只能有一个,也就是说一个数据库的所有.ldf日志文件都只能属于一个文件组,在下图中我们可以看到在SQL Server的SMSS管理器中如果你新建的是一个.ldf日志文件,那么其文件组这一列显示的是不适用,说明我们无法将SQL Server的.ldf日志文件放到多个文件组中,SQL Server只允许每个数据库拥有一个日志文件组,所有该数据库的.ldf日志文件都放在这个默认的日志文件组中:

之后同样我们用Update更新[DatabaseLogSize]表的[log_logical_name]列即可:
UPDATE [Control].[DatabaseLogSize]
SET
[log_logical_name]=T_DB_LOGNAME.[name]
FROM
[Control].[DatabaseLogSize]
INNER JOIN
(
SELECT [name],database_id
FROM sys.master_files
WHERE type = 1
) AS T_DB_LOGNAME
ON [DatabaseLogSize].[dbid]=T_DB_LOGNAME.database_id
这样[DatabaseLogSize]表的[log_logical_name]列也就有值了:

三、收缩数据库日志文件
接下来我们就可以根据[DatabaseLogSize]表的值来收缩数据库日志文件了,这里我们使用循环判断如果[DatabaseLogSize]表中的数据库日志文件大小超过100MB了,我们就使用DBCC SHRINKFILE指令来收缩这个日志文件:
CREATE TABLE #LogNeedShrink
(
[dbname] NVARCHAR(100)
,[log_logical_name] NVARCHAR(100)
) INSERT INTO #LogNeedShrink
SELECT [dbname],[log_logical_name]
FROM [Control].[DatabaseLogSize]
WHERE [logsize]>100 --收缩超过100MB大小的日志文件 WHILE (SELECT COUNT(1) FROM #LogNeedShrink)>0
BEGIN
DECLARE @CurrentDbName NVARCHAR(100)
DECLARE @CurrentlogName NVARCHAR(100) SELECT TOP 1 @CurrentDbName=[dbname],@CurrentlogName=[log_logical_name] FROM #LogNeedShrink DECLARE @ShrinkScript NVARCHAR(1000); SET @ShrinkScript=N'
USE '+QUOTENAME(@CurrentDbName,N'[')+N'
DBCC SHRINKFILE (N'''+REPLACE(@CurrentlogName,N'''',N'''''')+N''' , 0, TRUNCATEONLY)' --这里如果不加TRUNCATEONLY参数,就是在告诉SQL Server将日志文件收缩为0,也就是让SQL Server能收缩多少就收缩多少
--这里要转义数据库日志文件名称中的单引号字符,因为DBCC SHRINKFILE的第一个参数本身就是在一个SQL字符串中,如果不转义单引号字符会使得SQL字符串意外结束而报错。另外我们用了QUOTENAME函数来转义数据库名称中的非法字符 BEGIN TRY
EXEC sp_executesql @ShrinkScript
END TRY
BEGIN CATCH
--如果SQL语句报错,输出显示报错的SQL语句
PRINT @ShrinkScript RAISERROR (50001, -- Message id.
12, -- Severity,
1, -- State,
N'Error occurred in above query.');
END CATCH DELETE FROM #LogNeedShrink WHERE [dbname]=@CurrentDbName AND [log_logical_name]=@CurrentlogName
END DROP TABLE #LogNeedShrink
参考文献:
DBCC SHRINKFILE (Transact-SQL)
DBCC SHRINKDATABASE (Transact-SQL)
SQL Server中怎么查看每个数据库的日志大小,以及怎么确定数据库的日志文件,怎么用语句收缩日志文件的更多相关文章
- sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考. 在测量功能时,先以下命令清除sql se ...
- [SQL] sql server中如何查看执行效率不高的语句
sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码
参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...
- SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)
在sql中怎么查看一个字符的ascii编码或Unicode编码: SELECT ASCII('a') AS [AsciiNum]--字符获取ASCII码 SELECT UNICODE(N'a') AS ...
- SQL Server中创建sde数据库
在ArcCatalog或者ArcMap中打开ArcToolBox工具箱. 在工具箱中,找到创建企业级地理数据库工具,依次为数据管理工具→地理数据库管理→创建企业级地理数据库,如图所示. 双击打开创建企 ...
- 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志
SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列 本文是Stairway系列的一部分:SQL ...
- 使用T-SQL导入多个文件数据到SQL Server中
在我们的工作中,经常需要连续输入多个文件的数据到SQL Server的表中,有时需要从相同或者不同的目录中,同时将文件中的数据倒入.在这篇文章中,我们将讨论如何同时把一个目录中的文件的数据倒入到SQL ...
- SQL Server中数据库文件的存放方式,文件和文件组
原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html SQL Server中数据库文件的存放方式,文件和文件组 ...
- SQL Server中通用数据库角色权限处理
SQL Server中通用数据库角色权限处理 最近和同事在做数据库权限清理的事情,主要是删除一些账号:取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_ ...
随机推荐
- Git和Gitlab协同工作
1.概述 在写这篇博客之前,为了更好的描述整个流程,本人亲自尝试了:从搭建到使用,下面就围绕这个流程来阐述整个过程,目录结构如下所示: Git的安装搭建 Git的常规操作 Gitlab的搭建 Gitl ...
- mysql sql语句最大长度设置方法
今天发现了一个错误:Could not execute JDBC batch update 最后发现原因是SQL语句长度大于1M,而我机器上的mysql是默认设置,也就是说mysql通讯的数据包大小设 ...
- linux-openvpn
1.安装openvpn 1)安装需要的依赖,需要用到epel源 #yum -y install epel-release 修改epel.repo文件enabled=1 #yum install ea ...
- 基于GoogLeNet的不同花分类微调训练案例
import tensorflow as tf from tensorflow.contrib.slim import nets slim = tf.contrib.slim import numpy ...
- _ViewStart文件应用
在这篇<MVC母版页_Layout.cshtml>http://www.cnblogs.com/insus/p/3380419.html中,把一些已经存在的视图或是新产生的视图加入母版中. ...
- MVC在filter中如何获取控制器名称和Action名称
使用ActionExecutingContext对象可以获取控制器名称.Action名称.参数名称以及参数值.路由和Action返回值不影响结果. 在代码中 [AttributeUsage(Attri ...
- vscode 自动提示Threejs
转自:https://blog.csdn.net/github_39125824/article/details/82633993 1.首先,你要安装Node.js 2.在vscode的 查看-> ...
- [日常] C语言中的字符数组和字符串
c语言字符数组和字符串:1.存放字符的数组称为字符数组 char str[]2.'\0'也被称为字符串结束标志3.由" "包围的字符串会自动在末尾添加'\0'4.逐个字符地给数组赋 ...
- [日常] Go语言圣经-函数递归习题
练习 5.1: 修改findlinks代码中遍历n.FirstChild链表的部分,将循环调用visit,改成递归调用. 练习 5.2: 编写函数,记录在HTML树中出现的同名元素的次数. 练习 5. ...
- Zipper(poj2192)dfs+剪枝
Zipper Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15277 Accepted: 5393 Descripti ...