65.9K
CodeProject 正在变化。 阅读更多。
Home

截断 SQL Server 事务日志

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.21/5 (18投票s)

2005年8月19日

1分钟阅读

viewsIcon

127044

downloadIcon

1504

一种简单的方法,可以将事务日志文件截断到所需的大小。

Clearing Transaction Log

引言

本文档解释了如何在不知道逻辑日志文件名的情况下轻松截断事务日志文件。 代码解释了一种非常简单的方法,通过查看 sysfiles 表来截断事务日志文件。

使用代码

清除事务日志涉及两个步骤。 首先,我们需要使用 TRUNCATE_ONLY 选项备份日志,然后在下一步中使用 DBCC SHRINKFILE 函数来缩小到所需的大小。

以下代码片段展示了建立连接和首先备份日志文件的简单方法,然后在下一步执行 DBCC SHRINKFILE 命令以获得目标大小。

代码部分如下所示

try
{
    SqlConnection conn = new SqlConnection(GetConnectionString());
    conn.Open();
    DataSet ds = new DataSet();
    SqlCommand cmd = new SqlCommand("select name," + 
         "filename from sysfiles WHERE FILEID=2",conn);
    SqlDataAdapter Adaptor = new SqlDataAdapter(cmd);
    Adaptor.Fill(ds);

    string strLogName = ds.Tables[0].Rows[0][0].ToString().Trim();

    cmd.CommandText = GetBKUPSQL();
    cmd.ExecuteNonQuery();

    cmd.CommandText = GetTruncateSQL(strLogName);
    cmd.ExecuteNonQuery();

    MessageBox.Show("success");
}
catch(Exception ex)
{
    string strMessage = ex.Message;
    MessageBox.Show("Error : \n"+strMessage);
}

您可以配置应用程序,使其将经常使用的数据库服务器名称、目标大小以及用户 ID 和密码存储在配置文件中。 配置文件如下所示

<?xml version="1.0" encoding="Windows-1252"?>
<configuration>
  <appSettings>
    <add key="PWD" value="mypwd1!" />
    <add key="Size" value="2" />
    <add key="SQLServer" value="SQLSRV1" />
    <add key="UserID" value="sa" />
  </appSettings>
</configuration>

正如您从代码片段的第一部分看到的,我们使用三个私有函数来获取常规信息。

这包括:

  • GetConnectionString()

    此函数将返回连接到数据库的连接字符串。

    private string GetConnectionString()
    {
        StringBuilder strConn = new StringBuilder();
        strConn.Append("data source=").Append(Server.Text.Trim()).Append(";");
        strConn.Append("initial catalog=").Append(Database.Text.Trim()).Append(";");
        strConn.Append("user id=").Append(UserID.Text.Trim()).Append(";");
        strConn.Append("password=").Append(PWD.Text.Trim());
        return strConn.ToString();
    }
  • GetBKUPSQL()

    这将返回需要在缩小数据库文件之前执行的备份日志语句。

    private string GetBKUPSQL()
    {
        StringBuilder strSQL = new StringBuilder();
        strSQL.Append("backup log ");
        strSQL.Append(Database.Text.Trim());
        strSQL.Append(" with truncate_only");
        return strSQL.ToString();
    }
  • GetTruncateSQL()

    这将返回带有为所选数据库所需值的 DBCC SHRINKFILE 命令。

    private string GetTruncateSQL(string strLogName)
    {
        StringBuilder strSQL = new StringBuilder(); 
        strSQL.Append(" dbcc shrinkfile(");
        strSQL.Append(strLogName);
        strSQL.Append(",");
        strSQL.Append(txtSize.Text.Trim());
        strSQL.Append(")");
        return strSQL.ToString();
    }

附加说明

此代码不包含任何输入验证,因为它应该由具有一定知识的人员使用。

历史

  • 2005 年 8 月 15 日 - 版本 0.9。
© . All rights reserved.