一,找到每个数据库的日志文件大小


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中怎么查看每个数据库的日志大小,以及怎么确定数据库的日志文件,怎么用语句收缩日志文件的更多相关文章

  1. sql server中如何查看执行效率不高的语句

    sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.   在测量功能时,先以下命令清除sql se ...

  2. [SQL] sql server中如何查看执行效率不高的语句

    sql server中,如果想知道有哪些语句是执行效率不高的,应该如何查看呢?下面就将为您介绍sql server中如何查看执行效率不高的语句,供您参考.在测量功能时,先以下命令清除sql serve ...

  3. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码

    参考文章:微信公众号文章 在sql中怎么查看一个字符的ascii编码,so easy !! select ASCII('a') SELECT CHAR(97) charNum SELECT UNICO ...

  4. SQL Server 中怎么查看一个字母的ascii编码或者Unicode编码(转载)

    在sql中怎么查看一个字符的ascii编码或Unicode编码: SELECT ASCII('a') AS [AsciiNum]--字符获取ASCII码 SELECT UNICODE(N'a') AS ...

  5. SQL Server中创建sde数据库

    在ArcCatalog或者ArcMap中打开ArcToolBox工具箱. 在工具箱中,找到创建企业级地理数据库工具,依次为数据管理工具→地理数据库管理→创建企业级地理数据库,如图所示. 双击打开创建企 ...

  6. 第十七周翻译-SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志

    SQL Server中事务日志管理的阶梯,级别5:以完全恢复模式管理日志 作者:Tony Davis,2012/01/27 翻译:赖慧芳 译文: 该系列   本文是Stairway系列的一部分:SQL ...

  7. 使用T-SQL导入多个文件数据到SQL Server中

    在我们的工作中,经常需要连续输入多个文件的数据到SQL Server的表中,有时需要从相同或者不同的目录中,同时将文件中的数据倒入.在这篇文章中,我们将讨论如何同时把一个目录中的文件的数据倒入到SQL ...

  8. SQL Server中数据库文件的存放方式,文件和文件组

    原文地址:http://www.cnblogs.com/CareySon/archive/2011/12/26/2301597.html   SQL Server中数据库文件的存放方式,文件和文件组 ...

  9. SQL Server中通用数据库角色权限处理

    SQL Server中通用数据库角色权限处理   最近和同事在做数据库权限清理的事情,主要是删除一些账号:取消一些账号的较大的权限等,例如,有一些有db_owner权限,我们取消账号的数据库角色db_ ...

随机推荐

  1. Vue + Element UI 实现权限管理系统 前端篇(九):接口格式定义

    接口请求格式定义 前台显示需要后台数据,我们这里先把前后端交互接口定义好,没有后台的时候,也方便用mock模拟. 接口定义遵循几个规范: 1. 接口按功能模块划分. 系统登录:登录相关接口 用户管理: ...

  2. java断言assert初步使用:断言开启、断言使用

    1 说明 java断言assert是jdk1.4引入的. jvm断言默认是关闭的. 断言可以局部开启的,如:父类禁止断言,而子类开启断言,所以一般说“断言不具有继承性”. 断言只适用复杂的调式过程. ...

  3. BackgroundWorker简单实用(简便的异步操作)

    微软提供了一个快捷使用多线程的帮助类BackgroundWorker,能够快速创建一个新的线程,并能报告进度,暂停,以及在线程完成后处理别的任务. 1.BackgroundWorker类介绍 1.1. ...

  4. Java 容器源码分析之集合类详解

    集合类说明及区别 Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap └W ...

  5. 200个最常见的JAVA面试问题(附答案)

    本文内容: 20个最常见的JAVA面试问题(附答案) 13个单例模式JAVA面试问题(附答案) 说说JVM和垃圾收集是如何工作的(附答案) 说说如何避免JAVA线程死锁(附答案) Java中HashS ...

  6. [转]解决ssh登录后闲置时间过长而断开连接

    本文转自: 转载自博客园wanghetao的博客 我们通过终端连接服务器时,当鼠标和键盘长时间不操作,服务器就会自动断开连接,我们还的需要重新连接,感觉很麻烦,总结一下解决此问题的方法 方法一 修改/ ...

  7. Linq 处理 List数据

    概述:LINQ又称为语言集成查询,是一种类似于SQL的一种查询语言.语言集成查询让开发人员可以使用.NET程序语言(如C#)去查询数据源,主要数据源为内存中的集合对象.ADO.NET数据集.数据库以及 ...

  8. 设计模式学习--面向对象的5条设计原则之单一职责原则--SRP

    一.SRP简介(SRP--Single-Responsibility Principle): 就一个类而言,应该只专注于做一件事和仅有一个引起它变化的原因.   所谓职责,我们可以理解他为功能,就是设 ...

  9. Oracle数据库基本常用命令汇总

    1.得到数据库名和创建日期SELECT name, created, log_mode, open_mode FROM v$database; 2.ORACLE数据库的计算机的主机名,ORACLE数据 ...

  10. MYSQL查询优化:Limit

    Limit语法: SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset LIMIT子句可以被用于强制 SELECT 语句返回指定的 ...